How We Replaced Phone-and-Email Order Processing With One Platform Wired Into NetSuite
JFA sells automotive parts to wholesale buyers. The catalogue is vehicle-specific, the orders are large and repeat often, and the inventory and transaction data live in NetSuite. What did not exist was a place for any of it to meet. Orders arrived by phone and email and were keyed in by hand. Invoices were raised separately from the payments that settled them. Nobody could say what revenue looked like this month without assembling it. We built one platform carrying a customer portal, an admin portal, Stripe payments, automated invoicing, and a live NetSuite sync underneath all of it.
JFA supplies automotive parts and accessories to wholesale buyers: repair shops, fleet operators, and independent retailers who order in volume and order often. Michael and Vivian came to us with a business that worked and a process that had stopped scaling with it.
They were not asking for a storefront. The buying side needed a catalogue their customers could navigate without knowing a part number in advance, and the operating side needed orders, invoices, payments, and inventory to stop living in four different places.
Orders arrived by phone and email, and somebody keyed each one in by hand. Every re-key is a chance to transpose a part number, and in a catalogue where one digit separates a brake rotor that fits from one that does not, the error surfaces after the part has shipped and the freight has been paid.
There was no central customer record. Credit terms sat in one place, contact details in another, order history in a third. A rep answering “what did they order last time” had to go looking for it.
Invoicing ran separately from payment. An invoice was raised, sent, and then chased, with no shared status either side could see. Reconciling what had been paid against what had shipped was a monthly exercise rather than a live number.
And NetSuite held the inventory and transaction data everything else depended on, with no connection to any of it. Stock shown to a buyer was only as current as the last manual export.
The brief described a B2B e-commerce platform. The part we pushed on first was the ERP connection, because in a parts business the catalogue is inventory, and inventory shown wrong costs a distributor more than inventory not shown at all.
NetSuite as the System of Record
We built the sync before any customer-facing screen existed. SKUs, customer data, and transaction records flow from NetSuite rather than being maintained twice, so the catalogue a buyer sees and the stock the warehouse holds are the same data rather than two copies drifting apart.
A Catalogue Organised Around the Vehicle
Wholesale buyers do not arrive knowing a part number. They arrive knowing a vehicle. We built the search around year, make, model, and category so the catalogue narrows the way a parts counter conversation narrows, which removes the interchange lookup that used to happen before an order was ever placed.
Two Portals on One Data Model
The customer portal and the admin portal read and write the same records. An admin looking at an order sees exactly what the buyer sees, with the controls the buyer does not have. That decision is why order status means one thing across the business rather than one thing per system.
Checkout That Respects Credit Terms
B2B buying does not settle like retail. We built pay-now and pay-later into the same Stripe checkout, so a buyer on terms keeps the credit line the relationship was built on and a card buyer clears immediately, without two separate purchase paths to maintain.
Invoicing With a Status Attached
We recognised the pattern from other distribution businesses: the invoice is where B2B disputes get settled, so it needs a lifecycle rather than a PDF. Automated issuance, SendGrid delivery, webhook-driven payment updates, and a status both sides read from the same place.
Admin Ordering on Behalf of the Buyer
Not every wholesale customer moves to self-serve, and the ones who keep phoning are often the largest. We built order creation into the admin portal so a phoned-in order lands in the same system as a self-serve one rather than reopening the manual channel the platform was meant to close.
Each module maps to a role and a function. The services layer sits under both portals.
The NetSuite integration went into development ahead of the portals. An ERP sync that fails quietly is the failure mode that costs a distribution business the most, because wrong stock and wrong pricing both ship before anyone notices. Proving that connection early meant the catalogue, the cart, and the order record were all built against live data rather than fixtures.
Payments were built webhook-first. Stripe confirms asynchronously, and an invoice that marks itself paid on redirect rather than on the webhook will eventually mark an abandoned checkout as settled. The invoice lifecycle listens to the webhook service, so the status reflects the money rather than the browser.
Caching and session management went in alongside the catalogue rather than after it. A vehicle-filtered query across a parts catalogue is expensive, and a wholesale buyer running twenty lookups in a sitting will feel every uncached one.
Audit logging and document management were scoped as first-class modules from the start. In B2B distribution, a disputed order six months old is a routine event, and the platform has to be able to answer what was ordered, what was invoiced, what was paid, and who changed what.
An order placed in the customer portal, or created by an admin on behalf of a buyer who phoned, produces the same record. That record carries its line items, its invoice, its payment status, and its position in the order lifecycle, and both sides of the transaction read it from the same place.
Stock and pricing come from NetSuite rather than from a copy of it, so what a buyer adds to a cart reflects what the business can actually ship. Product updates reach the catalogue through the sync or through CSV bulk upload, which means a price change across hundreds of SKUs is an upload rather than an afternoon.
Reporting is now a screen rather than an assembly job. Customer-wise, product-wise, and revenue reports run against live order and invoice data, and the admin dashboard answers the questions that previously required someone to go and total them.
“We asked for a web store. What we got back in the first conversation was a question about our ERP, which nobody had asked us before. That turned out to be the whole project.”
We have built this before, and we know which connection to prove first.
Start the conversation