The platform is the product.
Robnu's foundation is multi-tenant from day one, Org → Seller → SellerUser → MarketplaceAccount with generic FK targets and per-marketplace satellites. AWS S3 with per-seller KMS aliases. AWS SQS + BullMQ hybrid queueing. Postgres RLS as defense in depth. Every other Robnu surface, Process, Reconciliation, Claims, RobnuAI, sits on this.
- Seller is the tenant root. SellerUser is a teammate. MarketplaceAccount is a connection. Multi-account is free.
- AWS S3 with SSE-KMS using per-seller KMS aliases when AWS_S3_PER_SELLER_KMS=true.
- AWS SQS FIFO + Standard for marketplace dispatch; BullMQ for cron-style sweeps.
- Postgres RLS on seller_id is enforced via withSellerScope, defense in depth, always on.
The five surfaces of the platform.
Multi-tenant model
Org → Seller → SellerUser → MarketplaceAccount. Super-admin impersonation built in.
Marketplace adapters
Generic MarketplaceAccount + per-marketplace satellites. One registry, four adapters.
Storage
AWS S3 with SSE-KMS, per-seller KMS aliases. Raw payloads queryable via Glue + Athena.
Queues
BullMQ for cron sweeps. AWS SQS FIFO + Standard for marketplace dispatch and execution.
RLS isolation
Postgres Row-Level Security as defense in depth on seller_id. Always-on, no opt-out.
Adding a marketplace doesn't ripple through the schema.
The generic MarketplaceAccount parent means every leaf table, orders, shipments, returns, payouts, schedules, listings, FKs to the same place regardless of marketplace. New marketplaces ship as a new Marketplace row + a new satellite table + an adapter implementation in the registry. Zero changes to leaf tables.
- · AJIO is live; Meesho, Amazon, Flipkart adapters are scaffolded.
- · Adapter contract: syncOrders, syncReturns, syncPayouts, pushInventory, fullProcessing.
- · Registry dispatch is by Marketplace.code, not class identity.
Honest answers about the foundation.
Two reasons. First, sellers asking 'is this safe' deserve a real answer instead of a 'we take security seriously' page. Second, partners and integrators asking 'how does this scale' need the architectural shape, not a brochure.
Seller is the unit of business, the tenant root. SellerUser is each human teammate with an RBAC role (OWNER | ADMIN | OPERATOR | FINANCE | VIEWER). MarketplaceAccount is each connection, multi-account is free; one seller can have N AJIO accounts and M Meesho accounts on the same plan.
Each marketplace has different identifiers and credential shapes. The generic MarketplaceAccount table is the FK target for everything (orders, shipments, returns, payouts, schedules, listings). 1:1 satellite tables (ajio_account_details, meesho_account_details, amazon_account_details, flipkart_account_details) carry the marketplace-specific fields with strong typing.
BullMQ is great at cron-style sweeps inside Node. AWS SQS is great at durable, observable, per-account FIFO dispatch with DLQ semantics. The hybrid uses each for what it does best, see /platform/queues for the layout.
Application-layer scope assumes every code path remembers to filter by seller_id. RLS makes the database refuse to return cross-tenant rows even if a code path forgets. Defense in depth, not redundancy.
The platform is what makes everything else possible.
Read each surface in detail, then start using the product that sits on top.

