Service Buddy
Multi-tenant SaaS CRM and operations platform.
A CRM and operations platform used by thousands of people a day across 100+ business clients. I built the bulk product-ingestion pipeline on AWS SQS, NestJS APIs with RBAC and tenant isolation, and reusable data-table and ordering systems.
5,000+
SKUs per bulk import
100+
business clients on the APIs
Millions
of event-log entries

01
Why I built it
Businesses onboarding to the platform needed to bring their whole catalogue in at once. Uploading thousands of products synchronously blocked requests, overloaded the database and created duplicates whenever a client retried. The import had to be safe to run twice and impossible to take the platform down with.
02
The problem
- Large CSV imports (5,000+ SKUs) blocked the API and spiked database load.
- Retries and partial failures created duplicate products.
- Every query had to stay isolated per tenant across 100+ businesses.
- Inventory, billing, proposals and scheduling all needed the same table and ordering UI.
03
System design
- 1
CSV upload
Column mapping, validation and a preview before anything is written.
- 2
AWS SQS
Validated rows are queued instead of written inline.
- 3
Workers
Consume batches and upsert each SKU idempotently.
- 4
MongoDB
Indexed for inventory-heavy queries; every read is tenant-scoped.
- 5
NestJS API
Modular services with RBAC and multi-tenant data isolation.
04
Decisions & trade-offs
Queue the import on SQS instead of writing inline
Why: The request returns immediately and workers absorb the load at a controlled rate, so one big import can't starve the rest of the platform.
Trade-off: Import results are eventual: the UI needs progress and failure reporting instead of a single response.
Idempotent SKU upserts
Why: Re-running an import, or a message being delivered twice, updates the same product instead of creating a duplicate.
Trade-off: Every SKU needs a stable identity key, and the mapping step has to enforce it.
05
Backend & frontend
Backend
- Bulk ingestion pipeline on AWS SQS with idempotent upserts.
- Modular NestJS APIs with RBAC and multi-tenant isolation for 100+ business clients.
- MongoDB indexing and query optimisation for inventory-heavy workflows.
Frontend
- Reusable data-table and drag-and-drop ordering systems used across inventory, billing, proposals and scheduling.
- CSV mapping, validation and preview UI for bulk imports.
06
Design
- Import flow designed around a preview step, so users see problems before they commit.
07
Results
- Bulk imports of 5,000+ SKUs without duplicates or API overload.
- One table and ordering system reused across four product modules.
What's next
- Per-row import reports that clients can download.