A Vendure and Next.js storefront for Janvey, built so the catalog,
the prices, the customers and the orders all stay the ERP's version of the truth.
NetSuite is the system of record; nothing in the storefront gets to disagree with it.
NetSuiteItems, customer pricing, contacts, images, sales orders
RESTletsFive custom endpoints under one token-based integration role
VendureCustom sync plugin, Postgres, job queue, admin dashboard
Next.jsStorefront, account area, approval queue, checkout
- Catalog sync
- Every NetSuite web item imports as a product with an optionless variant, so SKU,
price and availability live where Vendure expects them without showing a variant
picker. Items arriving without a valid online price are disabled rather than sold
for zero.
- Category hierarchy
- NetSuite class values map to a staff-editable collection tree. The exact class
string is pinned as a private key, so merchandisers can rename, re-parent and
re-describe a category and the next sync refreshes membership without stomping
their work. An unrecognized class lands in a private Needs Classification bucket
and gets reported — it never fails the run.
- Account pricing
- Contacts belong to a NetSuite account, and the storefront serves that account's
negotiated price rather than list. Eligibility is checked on both the account and
the contact link, so a suspended account stops transacting immediately.
- Order approval
- Approval-required contacts submit a checked-out cart into a pending state it
can't leave on its own. Approvers see only their own account's requests, can edit
quantities, lines and ship-to, comment, approve or reject — and every action is
audited with actor, timestamp and totals. Edits run inside one transaction and
reprice authoritatively before returning to pending.
- Order export
- Orders export only after their final business decision, never on submission.
Each gets one ledger row keyed on an external ID the RESTlet checks before it
creates anything, so a retried job returns the existing transaction instead of a
duplicate. If NetSuite's total disagrees with Vendure's, the row is flagged rather
than quietly accepted.
- Fail-closed by default
- Export ships disabled, then dry-run, then live. Dry-run authenticates and
validates the whole payload without saving a transaction, and flipping to live
doesn't promote the dry-run backlog — a human picks each one. First live order
went through on 7 October 2026.