Fulfillment invoice reconciliation · Windows desktop · Early access
Stop trusting your3PL invoice.Verify it.
BillDelta recomputes a fulfillment invoice from your contracted rates and your own operational exports, then shows you the invoice line, the activity records, the contract rule and the arithmetic behind every difference it reports.
Runs on your Windows machine. Your invoice, contract and activity files stay there.

A fulfillment invoice is a claim, not a receipt.
A 3PL invoice arrives as thousands of lines: per-order fees, pick and pack, receiving, storage, returns, markups, project hours, tier adjustments, minimums. It tells you what the provider decided to charge.
It does not tell you what the contract entitles them to charge, and it does not tell you whether the quantities behind those charges actually happened. Those two questions live in two other places — the rate card you signed, and the exports your own systems produce.
Answering them by hand means rebuilding a month of warehouse activity in a spreadsheet, against a rate card with effective dates, and doing it again next month.
What a line has to be checked against
| On the invoice | Contract question | Activity question |
|---|---|---|
| Per-order fulfillment | The contracted rate in force on the service date | Your order or shipment export |
| Pick and pack | First-unit and additional-unit rates, and any cap | Order line quantities |
| Storage | Pallet, bin, shelf or cubic-foot rate and its basis | A periodic inventory snapshot |
| Inbound receiving | Unit, carton, pallet or container rate | A receipt or ASN export |
| Return handling | Per-return rate plus any per-restocked-unit rate | A return or RMA export |
| Percentage markup | The percentage and the declared base category | The provider's own billed base |
| Volume tier | Graduated or flat-cliff brackets over the period | The whole period, not a single order |
| Period minimum | The threshold over its declared eligible rules | Every other charge in the period |
Carrier postage sits on the same invoice and is deliberately never recomputed — it is shown for balance and excluded from anything claimed.
Three inputs. One deterministic answer.
BillDelta does not score an invoice or flag anomalies. It recomputes what each charge should have been, and subtracts.
- I
The provider invoice
A CSV or XLSX export of the invoice. You map its columns once; the mapping is saved as a reusable profile.
What you were billed
- II
The contracted rates
Your rate card as structured rules — eight priced primitives, volume tiers and period minimums, each with the dates it is in force.
What was agreed
- III
Your operational exports
Orders, receipts, inventory snapshots, returns — from your own systems, not the provider’s. This is what turns a rate check into a quantity check.
What actually happened
Every line lands in one of three states
The state is decided by how the expected quantity was obtained — never by how confident a match looks.
- L1 Rate checked
The rate and the arithmetic are checked against the contract. The quantity is still the provider’s own figure.
Enough to dispute a rate that does not match the contract, or a multiplication that does not hold. Not enough to dispute the quantity.
CONTRACT_VALIDATED
- L2 Activity substantiated
The quantity was rebuilt from your own exports, with row-level links back to the records that produced it.
The strongest claim the product makes, because the number came from your systems rather than from the invoice being audited.
ACTIVITY_SUBSTANTIATED
- L3 Supporting detail required
The available evidence cannot settle it either way. BillDelta says so, and excludes it from the claim.
A legitimate final answer, not a failure. Ask the provider for backup rather than claiming it.
UNVERIFIABLE
The potential-overcharge total may contain Level 1 and Level 2 differences and nothing else. That is not a policy someone can relax in a settings pane — the totals refuse to be computed if an unverifiable finding is flagged as recoverable.
One finding, traced all the way down.
This is a storage line from the sample audit that ships with the product. Nothing about it is a mock-up: the figures below are the figures the engine produced, and the screenshot is the pane the application shows.
- Charge code
- STO-DAY
- Description
- Daily pallet storage
- Service date
- 2026-06-30
- Quantity
- 3931 pallet_day
- Unit rate
- USD 0.55
- Amount
- USD 2162.05
- Provider invoicerow 7572
- Activity records30 snapshots
- Contract ruleUSD 0.55 / pallet-day
- Arithmetic3651 × 0.55
- Explained deltaUSD 154.00

No black-box scoring. Every finding has a traceable calculation.
A finding identifies its billed source rows, its activity source rows, the rule and version applied, and the operands of the calculation. A result you cannot trace is treated as a defect in the product, not as an insight.
What a month looks like.
Set the contract up once. After that, a period is three steps and a report.
- 01
Map the exports
Choose the provider invoice and your own activity exports. You pick the header row, the delimiter and which column means what. Date and number conventions are declared, not guessed — 1.234 is a different number in Rotterdam and in Denver.
Columns that look like personal data — a customer name, an address, an e-mail — are dropped before the preview is even built, and cannot be mapped at all.
Sample audit - 02
State the rates
Your rate card becomes structured rules: eight priced primitives, volume tiers and period minimums, each with a contract reference and the dates it is in force. A rate change is an amendment — a new revision, with the previous one kept.
Rate rules are structured data. No formulas, no scripts, no inferred terms.
Sample audit - 03
Run the preflight
Before it computes anything, BillDelta checks that a staged invoice exists, that exactly one contract revision covers the period, and that your rules actually price every day and every charge code on the invoice. Anything missing is named.
Charges billed on a day no rule covers are reported as needing supporting detail and are never claimed. An incomplete rate card is the product’s problem, not evidence against your provider.
Sample audit - 04
Work the findings
Filter, sort and search a full period of findings, then open the evidence for any one of them. Mark a line disputed, accepted or excluded; the review decision is stored separately and can never change a billed, expected or recoverable amount.
The sample run holds 7,578 findings. Filtering to the 126 in the claim, sorted by largest difference, is answered by the database rather than by loading them all.
Sample audit - 05
Send something defensible
Export the ledger as CSV or XLSX, or produce the dispute pack — a printable HTML document, or a PDF printed locally — that opens with what is being claimed and closes with the manifest the recipient needs to reproduce it.
The pack separates dispute candidates from differences that merely need detail, so the conversation with your provider starts where it can actually be defended.
Sample audit
What BillDelta recomputes — and what it will not.
The rate domain is deliberately frozen at eight priced primitives and two period modifiers. If your contract contains a term that is not on this list the product does not approximate it: the charge stays unmapped and is reported as needing supporting detail.
| Contract term | Priced on | Strongest evidence | Needs |
|---|---|---|---|
| Flat recurring fee | A fixed amount per period — a monthly account fee | L1 Rate checked | Nothing but the contract |
| Per order | Each qualifying order or shipment, optionally by channel | L2 Activity substantiated | An order or shipment export |
| Pick and pack | First unit, additional units, optionally lines, optional cap | L2 Activity substantiated | Order line quantities |
| Inbound receiving | Receipts by unit, carton, pallet or container | L2 Activity substantiated | A receipt or ASN export |
| Storage | Pallet, bin, shelf or cubic foot — daily, monthly average or end of month | L2 Activity substantiated | A periodic inventory snapshot |
| Return handling | Per return, plus optionally per restocked unit | L2 Activity substantiated | A return or RMA export |
| Percentage markup | A percentage of a declared billed base category | L1 Rate checked | The provider’s billed base |
| Hourly or project | Provider-reported hours or units at a contracted rate | L1 Rate checked | The provider’s billed quantity |
Percentage markup and hourly or project work can never reach Level 2 by definition: the quantity comes from the provider’s own invoice, so the multiplier can be checked and the underlying claim cannot.
Two period modifiers
- Volume tier
- Attaches to per-order or pick-and-pack pricing. Graduated prices each bracket’s own slice; a flat cliff reprices the whole volume at the bracket the total lands in. The two differ by real money at every boundary, so the mode is a required field — under a flat cliff the 1,001st order can make the total cheaper than 1,000 orders.
- Period minimum
- A threshold over a declared set of eligible rules, evaluated in a second pass after everything else and applied once. When spend clears the threshold it expects zero — so a provider who bills the minimum fee anyway is caught.
Deliberately out of scope
- Carrier transportation
- Postage, parcel zones, dimensional weight, fuel surcharges and service guarantees are shown on the invoice for balance and are never recomputed. Parcel audit is a different, well-served product; this one covers the warehouse’s own services.
- Arbitrary formulas
- No expression language, no user-supplied code, no formula strings, no regex pricing. Adding a primitive is a product decision, not something a spreadsheet cell can do.
- Proration of a recurring fee
- If a monthly fee’s rule covers only part of the billing period, the product reports it as unverifiable rather than inventing a fraction.
- Two currencies in one run
- A workspace has one base currency. A line billed in another blocks the run rather than being converted at a rate nobody agreed.
Not every difference is an overcharge.
The most damaging thing invoice-audit software can do is turn “we could not check this” into “you billed for nothing”. BillDelta is built so that cannot happen quietly.

Sample auditThe totals band of the sample run. 440.70 is claimable; 43,500.00 needs supporting detail and is excluded from it; 60.00 is a timing difference and is excluded too.
Missing data is never zero
If a rule cannot be evaluated — no storage snapshots, a receipt recorded in cartons against a pallet rate, a project line billed without hours — the affected scope becomes unverifiable and says why. It never becomes an expected charge of $0.00.
Only Level 1 and Level 2 can be claimed
The potential-overcharge total may contain nothing else. In the sample run, 43,500.00 of billed value needs supporting detail and sits outside the claim, next to 440.70 that does not.
Timing differences are separated out
Activity falling just outside the billing period but inside the grace window is legitimately billed. It is reported, and it is excluded from the recoverable total.
Differences in your provider’s favour are reported too
A charge you expected that does not appear on the invoice is shown as expected but not billed. It is never claimed, and it is never quietly netted off.
“BillDelta shows what can be demonstrated, what needs clarification, and the evidence behind each finding.”
Your billing data does not leave the machine.
BillDelta is a desktop application. The reconciliation path contains no network call, no telemetry, no analytics and no remote asset — not as a setting you switch on, but as a property of how it is built.
Your files
The provider invoice and your own operational exports, wherever they already sit on disk.
BillDelta on your Windows PC
Parsing, mapping, the rate engine and the audit all run in local processes. The original workbook is hashed and read; it is never copied into application storage.
A local workspace
Canonical records and completed runs are held in a SQLite file on your machine. One workspace, one user, no accounts, no sync.
Local exports
CSV, XLSX, a printable HTML dispute pack and a locally printed PDF — written where you choose to write them.
Nothing in that diagram leaves the box. There is no account to create, no workspace to sync and no reconciliation service to upload to — the product would not work any differently with the network cable pulled out.
Personal data has nowhere to live
A column reaches storage only by being mapped to one of a fixed list of canonical operational fields. That list holds identifiers, dates, quantities and money. It holds no customer name, e-mail, telephone, street address, city or postcode — so the schema gives that information nowhere to go. A mapping that would pull personal data into a canonical field is refused, and dropped columns are named in the import report so you can see they were discarded rather than merely ignored.
What we do not claim
- That your data is encrypted. Your operating system may encrypt the disk; that is a different statement, and it is not ours to make.
- That the early-access build is code-signed. It is not yet — the Windows portable build ships unsigned, and signing is a documented, outstanding release task.
- That local-first defends against someone who already has your Windows account.
The same inputs produce the same numbers. Every time.
- 01
A run has a checksum
The same normalised inputs, rate-plan version, mappings, settings and engine version produce the same findings, the same totals and the same run checksum — regardless of the order rows appear in any input file.
- 02
A completed run is frozen
Inputs, rate-plan version, mappings, settings and findings are fixed when a run completes. Editing a rate afterwards creates a derived run; the original keeps its numbers, so a dispute you already sent stays reproducible.
- 03
A rate change is an amendment
A published contract revision cannot change. Altering a rate creates a new version with every rule restamped to it, and each completed audit stays attached to the exact rules it used.
- 04
No model decides financial correctness
There is no language model anywhere in the reconciliation path. Every number the product shows is arithmetic a person can reproduce from the evidence pane.
Against the two things brands do today.
Finance teams already reconcile invoices, and audit firms already recover money. Both work. Both have a shape BillDelta deliberately does not have.
| A spreadsheet reconciliation | A contingency audit engagement | BillDelta | |
|---|---|---|---|
| Who runs it | Your team | A third party | Your team |
| Repeating it next month | Rebuild it | Re-engage | Run the period |
| Contract versions | Kept by convention | Held by the firm | Immutable published revisions |
| Line-level evidence | Whatever you kept | In their report | Attached to every finding |
| Where the data goes | Wherever the file goes | Out to a third party | Stays on your machine |
| Cost of a finding | Your team’s time | A share of what is found | Nothing beyond the licence |
None of this makes spreadsheets wrong. A spreadsheet is where most of this work starts and it is very good at it — until effective-dated rate versions, charge-code mappings, row-level provenance and a repeatable monthly run all have to live in the same workbook.
Built for the company paying the invoice.
BillDelta is for e-commerce and DTC brands with enough outsourced fulfillment spend that a month of billing is worth checking properly.
- Head of Operations · VP Ops · COO
- Owns the provider relationship and the monthly invoice approval, and needs the conversation with the 3PL to start from something defensible.
- Finance Manager · Controller · Head of Finance
- Signs off the accrual and the payment, and needs to know which part of a variance is a real difference and which part is missing detail.
- Supply Chain & Fulfillment Operations
- Holds the activity exports the whole check depends on, and is the one who can tell whether a quantity is plausible.
A good fit when
- You outsource fulfillment to a 3PL and receive a line-level invoice.
- You can export orders, receipts, returns or inventory snapshots from your own systems.
- Your rate card is a rate card — priced terms with effective dates, not a handshake.
- You work on Windows.
Not the right product when
- Your provider bills one blended figure with no line detail.
- An hour a month in a spreadsheet already settles it.
- What you need is parcel and postage re-rating — that is a different product.
- You need macOS or Linux today.
One product. One price. No share of what you find.
BillDelta is in early access: the engineering milestones are independently reviewed and closed, and the build is going to a small number of design partners before general release.
BillDelta Early Access
$299/ month
$2,990/ year
Two months against the monthly rate.
Windows desktop licence. Windows 10/11, 64-bit.
What the licence covers
- One 3PL provider
- Unlimited local audits
- Reconciliation across all eight rate primitives
- Activity-substantiated findings wherever your exports support them
- Evidence and provenance on every finding
- CSV, XLSX, printable HTML and locally printed PDF dispute packs
- Immutable contract revisions and reproducible run checksums
- Direct access to the people building it
No gain-share. Keep what you find.
BillDelta does not take a percentage of what an audit turns up. The software costs what it costs, and a difference you identify is yours.
What early access means here
- The Windows build is a portable ZIP and is currently unsigned, so Windows will warn you on first launch.
- It is version 0.9.0 — engine 1.2.0-m1, persistence schema 7 — and the release candidate is technically closed.
- Pricing beyond a single provider is not published, because it is not decided.
- You will be talking to the people writing the code.
Pricing for additional providers is not published here because it is not settled. If you run more than one 3PL, say so in the request and it will be part of the conversation rather than a number invented for a web page.
Before you ask.
What files do I need to start?
At minimum a line-level invoice from your 3PL as CSV or XLSX, and your contracted rates. To check quantities as well as rates you also need exports from your own systems — orders or shipments, receipts, returns, and inventory snapshots for storage.
What if I only have the invoice and the contract?
The audit still runs. Every charge is checked against the contracted rate for its service date and the arithmetic is recomputed. Those findings reach Level 1 — the rate and the multiplication are checked, the quantity is still your provider’s figure. Quantities become checkable when you add the matching activity export.
Does BillDelta upload my billing data anywhere?
No. The reconciliation path contains no network call, no telemetry and no analytics. Files are read where they already are, canonical records are held in a local SQLite workspace, and exports are written where you choose to write them.
Is BillDelta a cloud service?
No. It is a desktop application for Windows. There are no accounts, no sync and no multi-user access — by design, not as a limitation waiting to be lifted.
Does it read Excel files?
It reads .xlsx and CSV. Legacy .xls, macro-enabled .xlsm, .xlsb, ODS, Google Sheets, PDF and scanned documents are not supported. Cached formula results are deliberately not trusted for mapped fields, so export a values-only workbook when your provider sends a calculated sheet.
Does BillDelta decide that every difference is an overcharge?
No, and it is built so it cannot. A difference only enters the potential-overcharge total if the rate was checked against the contract or the quantity was rebuilt from your own exports. Everything else is reported as needing supporting detail and excluded from the claim. Timing differences and charges in your favour are separated out as well.
Can I export the findings?
Yes — the full ledger or exactly the filtered view, as CSV or XLSX; a printable HTML dispute pack; and a PDF printed locally. The pack separates dispute candidates from rows that merely need detail, and carries the manifest a recipient needs to reproduce the run.
Does it read my contract PDF?
No. There is no PDF parsing and no OCR anywhere in the product, and no model reads your contract. Rate cards are configured as structured rules with contract references and effective dates, which is what makes a finding citable back to a clause.
Does it audit the whole invoice?
No, and it says so on screen. Carrier transportation — postage, parcel zones, dimensional weight, fuel surcharges — is displayed for invoice balance and never recomputed. Parcel audit is a different, well-served product. BillDelta covers the warehouse’s own services.
What operating system is supported?
Windows 10 and 11, 64-bit. The current early-access build is a portable ZIP: unzip it and run it, with no installer. It is not code-signed yet, so Windows SmartScreen will warn on first launch. macOS and Linux are not supported today.
Why do the screenshots say “Fulfillment Bill Verifier”?
That is the product’s working title, and the v0.9.0 build still carries it in the window. BillDelta is the public name. Same application, same version — we would rather show you the build that exists than a mock-up with the new name painted on.
Will it work with my 3PL?
It depends on your contract more than on your provider. If the terms are expressible as the eight priced primitives — flat recurring, per order, pick and pack, inbound receiving, storage, return handling, percentage markup, hourly or project — with volume tiers and period minimums, the engine can price them. Anything else is left unmapped and reported honestly rather than approximated.
Bring one month’s invoice.
The most useful first conversation is a real billing period: your invoice, your rate card, and whichever operational exports you already have. Half an hour is usually enough to see whether the check is worth running every month.
BillDelta 0.9.0 · engine 1.2.0-m1 · persistence schema 7 · portable Windows x64, unsigned early-access build




