Migration recap · week of September 7 · 2026

Ship-tos are places, not people.

A week of invoice payments arriving in the portal, a checkout bug that turned into a small philosophy lesson, and the rarest fix of all: our own documentation, proven wrong by an experiment and corrected on the spot.

Customer-visible first: invoices can now be paid in the portal — including several at once. Single-invoice payment had broken because four links were being hand-assembled instead of asking the platform for its own tokened payment URL; the fix deleted code and used the built-in. Multi-invoice “Pay Selected” is new construction: check the invoices, review a summary, make one payment that covers them all, with each invoice properly linked to the transaction and the amounts validated server-side. Both payment bugs flagged in last week’s threads are closed. For wholesale customers who settle a stack of invoices at a time, this is the feature.

Now the philosophy lesson. A colleague’s test order bounced checkout into a half-completed address form — no error, just a form nobody asked for. The dig found the platform’s core checkout requiring email and phone on every address, including delivery addresses. Our migrated ship-to addresses are docks, warehouses, and storefronts: they have streets and zip codes, not inboxes. The fix encodes the insight in the title: delivery addresses are places, so email and phone are no longer required there — while billing addresses, which belong to people who receive invoices, stay strict. Checkout now accepts a warehouse for what it is.

The part of that fix I’ll remember longest: our own standards document claimed this category of override flatly doesn’t work on this platform version — written down months ago after a painful afternoon, believed ever since. Rather than trust it, we shipped the override with a temporary probe line that would prove at runtime whether it fired. It fired. The documentation was wrong, and got rewritten the same day with the actual mechanics. New standing rule from the experience: the first use of any new override pattern ships with a probe, so belief never outruns evidence — not even belief in our own docs.

The two-developer pipeline kept moving: the sync-monitoring module — built by the colleague who owns the legacy integration — promoted from development to staging through the full process: sixty-five of sixty-five files byte-verified against the source commit, twenty-eight new tracking columns in place, and testing scoped to a known control set of orders before anything runs broad. The monitor from two entries ago is now a real module moving through a real pipeline.

Smaller motions. An executive flagged “Immediate Payment” as the wrong thing to print on customer documents; investigation showed it’s a stock platform record, and the entire fix was renaming it “Due on Receipt” in configuration — zero code, one line on the cutover checklist. The portal took a polish batch: statement balances now agree with the legacy rollup on every screen, historical invoices carry properly derived due dates, a Credits tab, sortable columns validated server-side, and an abandoned-carts view for staff. And the pre-launch purchase-history backfill advanced from recon to a chosen mechanism — self-backfilling, so a customer who signs up next year gets their decades of history automatically instead of depending on a script somebody ran once.

A payment feature built by deleting code, a checkout fixed by respecting what an address is, and a documentation bug caught by refusing to trust ourselves. The theme holds: evidence over belief, even our own.