Making a vendor's PDF invoices searchable and tracked every week
A vendor's monthly PDF invoices kept sparking the same questions: what changed, was this approved, did it get paid. Building a standing answer meant not trusting the tracker to grade its own homework, every payment status got checked against independent email evidence instead, every week, automatically.
Category
Vendor invoice reconciliation.
What I was trying to accomplish
A standing, queryable record of a vendor's monthly invoices, refreshed automatically, instead of re-opening PDFs and searching email every time a question came up.
The data challenges
A year of invoice PDFs, text extraction, and matching status against email evidence rather than trusting a tracker's own labels, plus practical failures like cloud-sync placeholders that looked like real files but weren't downloaded yet.
The result
An extraction script, per-invoice files, a tracker, and a weekly job that mostly just confirms payment status once things stabilized, plus a breakdown of month-over-month cost changes into their actual drivers so budget decisions rested on evidence instead of a number moving.
Technical details
Tools: Claude Cowork scheduled task, Python (pdftotext), claude.ai Projects, Microsoft 365 email search
The firm's managed IT provider billed monthly with detailed PDF invoices, and questions about them kept coming up: what changed this month, was this one forwarded for approval, did it get paid. The goal was a standing record that Claude and I could query instantly, refreshed weekly by an automated job.
The inputs were about a year of invoice PDFs in a synced folder, and the firm's email for approval and payment evidence. A Python script extracts each invoice into a companion Markdown file. A tracker and a consolidated reference file sit alongside, and a claude.ai Project holds them for questions. A weekly Cowork scheduled task re-runs the extraction, adds new invoices to the tracker, and searches email for proof that anything still unconfirmed was forwarded or paid.
The challenges were practical. Cloud-sync placeholders caused file reads to hang, so the script learned to detect and skip files that were not yet downloaded. Because the script pairs each PDF with its Markdown file by name, the job always renames both together. And Claude's first answers leaned on the tracker's own status labels, so at my direction it re-verified every status against my sent mail, and that check became part of the weekly job.
Pull up a chair.
Let's talk through where things stand, and where they could go.