The starting point. Distributors could place an order, but nobody could follow it afterward, and nothing reconciled with the ERP. Payment, proof, approval and fulfilment lived in email.
What we built.
- Checkout and order creation. Cart, customer order number, shipping address and method, order review. The order is created before payment and becomes the anchor for everything that follows.
- Export-control declaration. For restricted destinations the flow inserts an end-use declaration. The distributor signs in the browser; the signature is rendered into a PDF and stored with the order.
- Three payment methods. Card through an external gateway. Wire transfer, where the system issues a pro-forma document, accepts the distributor's proof of payment and routes it to finance. Credit line, for customers on agreed terms, with hold status and limits read from the ERP.
- Finance verification. Staff review uploaded proof in the back office and approve or reject with a reason. Rejections go back to the distributor with what to fix; the order stays alive.
- Production tracking. Estimated lead time per part, status through manufacturing, and email at every transition.
- Quotations. A parallel quote flow with its own validity window and a conversion path that locks quoted pricing into a new order.
- Multi-currency and minimum order value, applied per account and read from the ERP.
The ERP. The portal runs against the client's Priority ERP. Orders flow out after payment; billing profiles, customer terms, credit balances, lead times and the full spare-parts catalogue flow in. The engineering problem is not the sync, it is the contract: there is no documentation and no developer on the ERP side. We determine actual API behaviour by observation, write it down, and build against what is true rather than what is claimed. That documentation is now the reference both sides use.
The shape of the engagement. One senior engineer and one developer, around 80 hours a month, for years. In the last two months alone: 36 shipped changes, from a duplicate-order race fix under concurrent payment confirmations to a Drupal 11.4 upgrade on both sites.