B2B SaaS & procurement
A vendor portal that replaced 11,000 emails a month
Quote requests, comparison, approval and invoicing for an industrial procurement business — built as a product, not a project, so it could be sold to their customers.
- RFQ cycle time
- cut by roughly three-quarters
- Email threads per month
- cut by nearly 90%
- Second tenant onboarded in
- about a week, no code change
- Sector
- Industrial procurement
- Scale
- ~1,900 vendors, 40,000+ SKUs
- Engagement
- Product build, then a retained pod
- Duration
- 8 months to first customer, ongoing
Stack
- NestJS
- PostgreSQL
- Row-level security
- React
- Redis
- Elasticsearch
- Keycloak
- Kubernetes
- Terraform
Practices involved
Discuss a similar problemThe situation
The business ran industrial procurement for mid-market manufacturers. The process was email: a request arrived, a buyer forwarded it to vendors, quotes came back as PDFs and images, a comparison was built in a spreadsheet, approval happened in a reply-all, and the purchase order was typed into an ERP. It worked because the buyers were good at it, and it did not scale for the same reason.
The constraint
The client wanted to sell this capability to their larger customers as a product. That meant every decision had to be made twice: once for their own operation, once for a tenant they had not met yet. It also meant vendors — small suppliers, often one person with a phone — had to be able to respond without training or a login they would forget.
What we built
Tenancy decided on day four
Shared schema with PostgreSQL row-level security, tenant context enforced at the connection level rather than in application code. Per-tenant restore was the requirement that nearly pushed us to schema-per-tenant; we solved it with tenant-scoped logical backups instead, and wrote down why.
A vendor experience with almost no product in it
Vendors receive a link, see one request, enter prices and lead times or upload their usual quote document, and submit. No account required for the first response. Document uploads run through extraction to pre-fill the structured fields, which the vendor confirms. Adoption depended entirely on this being lighter than replying to an email.
Comparison and approval that match the org chart
Normalised comparison across quotes including landed cost, an approval matrix configurable per tenant by value band, category and cost centre, and full audit history. Deviations from lowest price require a recorded reason — which turned out to be the feature finance teams cared about most.
Catalogue ingestion that expects mess
Vendor catalogues arrive as spreadsheets in every conceivable shape. Mapping templates per vendor, fuzzy matching against the master catalogue, and a review queue for anything below a confidence threshold. Nothing auto-merges silently.
ERP integration without a bespoke build per tenant
An outbound event model with adapters, so a new tenant's ERP is an adapter and a mapping rather than a fork of the product.
What changed
RFQ cycle time fell sharply, and the second tenant went live in under a week without a code change — the test that mattered, because it turned an internal tool into something the business could sell.
What we would do differently
We built notification preferences late, and for two months every stakeholder received every update. Several buyers filtered the notifications into a folder and stopped reading them, which took real effort to undo. Notification design is product design, not a settings screen.
Outcomes
- RFQ cycle time
- cut by roughly three-quarters
- Email threads per month
- cut by nearly 90%
- Second tenant onboarded in
- about a week, no code change
Client identity withheld under a mutual NDA. Figures are illustrative — rounded and directional, meant to show the shape of the change rather than an audited result. We will walk through the real numbers, and how they were measured, under NDA on a call.
More work
Other engagements.
Case studiesCutting stockouts across 240 stores with a forecast the buyers trust
A hierarchical demand forecast, a promo-aware feature store and a replenishment workflow the category team can override — because a model nobody overrides is a model nobody uses.
Read the case studyShipping firmware to 6,000 imaging consoles without a truck roll
A signed, resumable, rollback-safe update channel for regulated ultrasound hardware sitting on hospital networks that block almost everything.
Read the case studyA reproducible pipeline for a diagnostics lab that had outgrown its scripts
Genomic and assay data moving from instruments to reportable results, with provenance for every derived value and a turnaround clock the lab director can see.
Read the case studyNext step
Tell us what you're trying to ship.
Send the brief, the RFP, or three messy sentences about the problem. You get a written point of view from an architect within two working days — not a sales deck.