The history came along.
The first time a customer logs into the new store, their invoices from 2018 are already there — searchable, itemized, with the payments that settled them — looking like they were born on this platform. This entry is about what that costs.
New platforms usually arrive with amnesia. The store is fast and the checkout is slick and your account is a blank slate, as if the years you spent buying from this company happened to someone else. For wholesale customers that’s not a cosmetic gap — they reorder from old invoices, chase warranty questions against old orders, and reconcile against old payments. So we set a bar early: the day the new store opens, a customer’s history walks in with them.
The interesting part was discovering what history actually is. The platform’s native models describe orders in progress — a cart becomes an order becomes an invoice, one thread. Historical documents don’t work like that: a single order might carry several invoices from split shipments, credits exist with no order behind them at all, and some documents are invoice-only. An early attempt to pour history into the native order model failed for exactly these reasons. The design that held is a hybrid: open, living orders use the platform’s native machinery, while historical documents live in purpose-built models that store what the legacy system actually recorded — order identity and invoice identity on the same record, payments and how they applied, comments, freight, the works. Same lesson as last week’s address fix: stop forcing data to be something it isn’t.
On top of those models, the portal treats both eras as one world. Orders and invoices from 2018 sit in the same lists as last week’s, behind the same filters — who placed it, when — and the same document search. Payments show with how they applied, credits get their own tab, the account statement is computed from this same history, and every document wears the branded letterhead and product thumbnails, whether it was minted yesterday or before this platform was a plan. There is deliberately no “legacy archive” section. History isn’t a feature; it’s just your account.
The cost of “effortless” is paid in archaeology, and regular readers have already met some of the invoices’ lies: the field labeled tax that stored the goods amount, credit documents whose signs pointed the wrong way, split payments rendering as phantom rows. This entry adds a favorite to the collection: in the legacy comment table, the column named for the order number holds the invoice number, and the column named “real order number” holds the order number — a swap verified across six hundred thousand rows before a single comment was trusted. Every one of these cost a day of detective work so that a customer looking at their own history never has to think about any of it.
Status, plainly: this all runs on staging today, feeding the statements, search, and portal pages described in recent recaps, with customers arriving at cutover. The last piece in design is the quality-of-life one: customers’ pre-migration purchases feeding their “previously purchased” lists automatically — built self-backfilling, so an account created years from now still inherits its history without anyone running a script.
A migration’s best compliment isn’t “the new system is impressive.” It’s a customer finding their 2018 invoice in thirty seconds and not finding that remarkable at all.