Export invoices, technical specifications and conformity certificates were being assembled by hand, cell by cell. Every one of them carried codes, weights and totals where a single transposed digit means a rejected shipment.
The documents were the system of record. An invoice existed as a spreadsheet, and the spreadsheet was the only place the line items, the classification codes and the weights lived. Producing the next document meant copying the last one and editing it.
That works until it does not. Totals drift from their line items after an edit. A classification code gets carried over from a product that is no longer on the invoice. Net and gross weights stop reconciling. None of these are visible on the page — they are visible at a border, days later, when the shipment is held.
And the checking was the expensive part. Producing a document was the quick part; verifying that it was internally consistent took longer, and was done by the person least able to be objective about it, namely the person who had just typed it.
The fix is not a better template. It is moving the source of truth out of the document and into the data the document is rendered from.
A pipeline where structured data is authoritative and every document is a rendering of it. Line items, classification codes, per-item and aggregate weights, currency, and delivery terms are computed once and reused across every document type that needs them.
Validation runs before anything is rendered, not after. Do the line weights sum to the declared total? Does every item carry a valid classification code? Do the extended amounts reconcile to the invoice total? A document that fails those checks is never produced, so it can never be sent.
One structured record per consignment holds items, quantities, unit values, weights, codes and terms. The invoice, the packing specification and the certificate are three views of that record rather than three files that must be kept in agreement by hand.
Arithmetic and completeness checks run before render: totals reconcile to line items, weights sum, every item has a classification code, required fields for the destination are present. Failing the gate stops the document — the error surfaces at the desk, not at the border.
Each output format is a template over the same data. Adding a new document — a different market’s customs form, a buyer’s preferred layout — is a template, not a project.
Codes, weights and totals are computed, never generated by a language model. Where AI helps is in the soft parts — drafting descriptions, matching a product to a likely classification for a human to confirm. Numbers that a customs officer will check are arithmetic, and stay arithmetic.
Built and validated against a real consignment.
The expensive half of the work — checking — largely disappeared. The document is consistent by construction, so the human review is about commercial judgement rather than arithmetic.
Adding a document type became cheap. The second and third outputs cost a fraction of the first, because they read the same data.
The failure mode moved earlier and got louder. A missing classification code is now a message at the desk instead of a phone call from a freight forwarder.
Any business producing repetitive, high-consequence documents from data that already exists somewhere structured: export and customs paperwork, quotations and proposals, technical specifications, conformity and test certificates, recurring compliance filings.
It is a poor fit for documents that are genuinely bespoke every time. If no two outputs share a structure, there is nothing to template and the honest answer is to keep writing them.
Tell us what's not working. The first conversation is free — whether it's a build, a long-term partnership, or just questions, you'll get an honest read and a clear next step.
Start the conversation →