You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
budget amazon backfill walks the full year range the ledger covers rather than a rolling window. Order history is year-scoped while the transactions page is days-back only, so orders backfill year by year and charges come in one long call — and the two can reach different distances into the past.
Resumable. A finished year is a row in the run ledger, so a job that dies partway keeps everything it stored and a re-run skips what is done. No new state.
The per-year gate needed an upper bound. Checking one year previously also counted every later year's charges, so a year that silently returned nothing still looked expected and the check passed vacuously — exactly where a long multi-year job most needs it.
Auth errors and bot challenges are never retried. A credential does not become valid on the third attempt, and re-hitting a challenge is how a soft block becomes a hard one. Transient failures back off and retry a bounded number of times.
Honest coverage
The reconciliation horizon is now a reported value. Matching goes through the retailer's own transaction records, and that page may not reach as far back as order history does. Charges older than the earliest stored transaction cannot be matched at all — so coverage now states how far back it actually works instead of reporting a low percentage with no explanation.
Deliberately not a fallback to matching on order totals: that would extend coverage by reintroducing the exact failure the matcher exists to prevent, since an order total frequently is not what settled on the card.
Purchases report
budget amazon report renders a standalone PDF of what was actually bought — grouped by kind, by month, biggest single items, repeat buys and top sellers.
Kept separate from the monthly budget report on purpose: that page is a fixed one-pager about a month, and hundreds of product titles would swamp it while answering a question its reader may not have asked.
Groupings are a keyword heuristic and the report says so on its face. The source carries no product category, so the rules stay visible and auditable rather than hidden behind a model call.
--since / --until scope it, and the range goes in the filename — a scoped render must not silently overwrite the all-history one.
Fixes
A split-shipment order matched several charges, so joining items through each of them counted the same product once per shipment and overstated every total.
Item prices are positive magnitudes; negating them rendered a whole report as if it were refunds.
A scoped report reported all-time coverage in its footer, describing a different document than the one being read.
Headings no longer orphan at the foot of a page, long tables may split while rows may not, and titles truncate on a word boundary rather than mid-word.