Every Home Depot receipt, filed under the right job.
Job Ledger turns your Home Depot purchases and returns into one expense ledger per job, ready to match in QuickBooks Online.
Where this stands today
Job Ledger is open source (MIT) and you run it yourself. You need Python, Poppler, a Gmail App Password, a browser paste on homedepot.com, and, if you want them, your own AI agent and QuickBooks connector.
A hosted version, where we run it for you and there is nothing to install, is in development. It is not available yet.
What the ledger looks like
One row per Home Depot transaction, with the job, what paid for it, and a flag on anything a person should check. This is the output of the demo, built from made-up data.
| Date | Type | Job | Total | Paid with | Store credit | Review |
|---|---|---|---|---|---|---|
| 2026-06-30 | Sale | 123 EXAMPLE ST | 130.97 | Visa ..1111 −130.97 | ||
| 2026-06-29 | Sale | 456 SAMPLE AVE | 113.26 | Gift/Store Credit ..2222 −47.52 Amex ..0000 −65.74 | 47.52 from HD Store Credit | |
| 2026-06-28 | Return | 1456 SAMPLE AVE (via receipt) | −122.05 | Amex ..0000 +48.26 Amex ..4444 +26.27 Gift/Store Credit ..2222 +47.52 | 47.52 to HD Store Credit | |
| 2026-06-27 | Cancel | (blank) | 0.00 | 2YES: cancellation |
1The return found its job. Home Depot sent this return with a blank job. The receipt's ORIG REC line points back to the June 29 sale, so the credit goes to 456 Sample Ave. The refund is split across two Amex cards and a store-credit card, and each leg is listed.
Store credit is pooled. The June 29 sale was partly paid with a store-credit card, and the June 28 return loaded the same amount back. Both land in one account named HD Store Credit.
2The cancellation is flagged. Home Depot reports cancelled items with zero amounts. Job Ledger marks the row for review so you can look up the order and book the credit.
All names, addresses, store numbers, and card numbers above are fictional, from the examples/ folder in the repo.
Why the bank feed is not enough
The feed does not know the job.
A card charge shows an amount and a date. Which job the lumber belongs to is on the receipt, in the PO/Job name.Returns credit the wrong job.
On a return, Home Depot often leaves the job blank or generic. The cost belongs to whatever job the original purchase was booked to.Store credit never shows up.
Store-credit payments, some returns, and cancellations never reach the bank feed, so the jobs they touch end up wrong.The exports leave gaps.
Home Depot's CSV export cannot include returns or cancellations. Only about two thirds of transactions email a receipt.
What Job Ledger does
Reads the job from the receipt
Each purchase gets its job from the PO/Job name printed on the receipt.
Traces returns to the original purchase
A return's receipt carries an ORIG REC line that points to the sale. Job Ledger follows it, so the credit lands on the job that paid for the item. If the original sale cannot be found, the row is flagged instead of guessed.
Shows what really paid
Split payments are listed card by card, and the specific store-credit card used is named.
Flags what a person should check
A return with no resolved job, a purchase with a blank job, and a cancellation each get a review flag.
Leaves the final Match to you
You compare the ledger against QuickBooks and click Match on the bank-feed line yourself.
It has been running weekly for one Baltimore renovation contractor.
Today and later
Self-run, available now
Free and open source under the MIT license. You run the steps yourself:
- Paste one script into your browser on homedepot.com to pull your order history.
- Download your receipt emails from Gmail with an App Password.
- Run the scripts. They write
ledger.csv. - Match it against QuickBooks. Bring your own AI agent and QuickBooks connector if you want help posting.
Hosted, in development
We would run it for you, with nothing to install. It is not available yet, and there is no sign-up.
If you want a note when it opens, send an email.
Try it without any accounts
The repo includes a demo that runs on made-up data. It needs no credentials and prints a ledger like the one above.
python3 examples/run_demo.py
Needs Python 3.10 or newer.