B&J data model — first-class entities, including TANKS (the most quotable architecture decision)

This is the single most interesting story for the case study.

Generic CRMs treat fuel customers as accounts with an address. Reality is more structured than that — and we modeled it that way.

First-class entities in the B&J CRM schema

Entity Why it is first-class (and why a generic CRM gets it wrong)
Accounts Tagged by segment (residential / agricultural / fleet / construction). Carries payment terms, credit limit, rep, acquisition source. A generic CRM has accounts — but does not enforce segmentation in the data model, so segmentation degrades to a free-text field.
Locations / Sites One account ↔ many locations. A farm customer has a farmhouse, a barn, a shop, and a remote field tank — each with its own delivery access notes and degree-day zone. Generic CRMs do not model multi-site accounts as a first-class relation; they treat addresses as a property of a contact.
Tanks Each location has one or more tanks. Each tank carries fuel type, capacity, ownership (customer-owned vs B&J-owned), inspection date, and reorder point. The reorder point is what drives automatic delivery scheduling. No generic CRM models tanks at all.
Contacts Multiple contacts per account, each tagged with role and communication preferences. The bookkeeper gets invoices; the operations manager gets delivery notifications; the owner is the decision-maker on contract renewals.
Price contracts Per-account, per-product, with type (fixed / capped / market rate / budget billing), rate, and effective/expiry dates. Fuel pricing is contract-driven and contract types are nontrivial. Generic CRMs do not model price contracts.
Products Unified catalog of fuels, lubricants, additives, and services.
Delivery orders The operational heart. Date, product, quantity, price-at-delivery, driver, truck, status, classification (automatic / will-call / emergency).
Invoices Line items, HST, due date, payment status. Linked to one or more delivery orders.
Payments Amount, method, date, reference. Drives AR reporting.
Interactions Calls, emails, complaints, site visits. The relationship layer.

[Verified — crm_project_plan.docx §2.1]

The two most quotable lines

"We treat tanks as first-class objects, not free-text fields."

That one decision is the architectural difference between a fuel CRM and a CRM with fuel pasted onto it.

"Multi-site accounts, fuel-type-specific contracts, degree-day zones, and delivery type are all data, not notes."

See B&J architectural decision: custom platform vs Manage Petro / PDI / Cargas — why custom won for why this needed to be built rather than bought, and B&J architectural decisions worth surfacing in case-study narrative — eight, ranked for how this fits among other case-study-worthy decisions.