Wholesale

Quote to order for a B2B wholesaler

A wholesaler builds a quote for a business customer with customer-specific pricing, sends it for approval, and turns the accepted quote into an order. Prices differ per customer and must never be visible to another customer.

Automatically generated draft

Written by machine against our own engineering playbook. The company is invented; the decisions are the ones we would make on a real build. A reviewed blueprint goes further — nine sections, agreed line by line, and it is what the build is tested against.

Section 01 · What has to work

A wholesale portal where business customers view and convert customer-specific quotes into orders without exposing private pricing tiers to other accounts.

Section 03 · Screens

Every screen, and what it is for.

  • ›Quote Builder — Sales reps select customers and line items, calculating dynamic pricing instantly upon item addition.
  • ›Quote Review — Business customers view terms, itemized totals, and accept or reject quotes instantly.
  • ›Order Dashboard — Operations staff track accepted quotes transitioned to fulfillment, viewing status instantly.
  • ›Customer Price Sheet — Admins upload and verify account-specific discount matrices, viewing update status instantly.

Anything not on this list is not in version one. That is what keeps a fixed price fixed.

Section 04 · The data model

What it stores, and who can read a row.

quote

id uuid, customer_id uuid, rep_id uuid, status enum(draft,sent,accepted,rejected,expired), total_amount numeric(10,2), expires_at timestamptz, created_at timestamptz

Access · Customers read own rows; reps and admins read all rows.

quote_item

id uuid, quote_id uuid, product_id uuid, quantity int, unit_price numeric(10,2), line_total numeric(10,2)

Access · Customers read if associated quote belongs to their customer_id.

customer_pricing

id uuid, customer_id uuid, product_id uuid, custom_price numeric(10,2), effective_date date

Access · Only admins and reps read rows matching specific customer_id.

order

id uuid, quote_id uuid, customer_id uuid, fulfillment_status enum(pending,processing,shipped,cancelled), placed_at timestamptz

Access · Customers read own orders; operations staff read all orders.

Those access rules belong in the database, not in the screens. Someone who edits the address bar still cannot read a row that is not theirs — and the test that proves it blocks delivery if it fails.

Section 05 · States

draft → sent → accepted → order_created | rejected | expired

Most scope arguments three weeks into a build are really arguments about a state nobody named at the start.

Section 06 · Where this breaks

What bites products like this one.

A database query leak exposes customer-specific pricing matrices across different tenant accounts.

Enforce row-level security policies in PostgreSQL filtering every pricing query by the authenticated user's customer_id.

Catalog prices change between quote creation and customer acceptance, causing fulfillment loss.

Snapshot calculated unit_prices directly into the quote_item entity upon creation so they remain immutable.

Section 08 · Deliberately left out

What version one does not do.

  • ×Multi-tier approval workflows with management sign-offs — adds heavy state logic, defer to v2 when enterprise deal sizes demand it.
  • ×Automated PDF quote generation and email delivery — adds template rendering overhead, rely on web view and print-to-PDF initially.

This is the section that protects the date, and the only place in the document where somebody says no. It is also why clients trust the rest of it.

Still open

What we would ask before quoting.

  • How should quotes behave when an underlying product price changes before the customer accepts the quote?
  • Do quotes require an expiration date that automatically transitions them to expired status?

Half of this already exists

Doc Intake

The paperwork half of this is a solved problem: documents read on arrival, validated against your rules, and a person asked only about what does not add up.

It is one of our pre-built products: the code is handed over to you, adapted to your own wording and rules, and the rest of the specification above is built on top of it rather than from scratch.

Your product, not this one

Get this written for what you are actually building.

Describe it in a sentence and the generator returns the same sections for your own product. Free, no email, nothing saved to a list.

Next step

Find out if your idea fits in 10 working days.

Tell us what you want to build. We reply the same day with a straight yes, no, or here is what we would cut.

NDA available on request