Billing Reporting & Invoice Reconciliation
About 150 fleet-service suppliers across the U.S. and Canada billed through three feeds: EDI, Sterling and Auto Integrate. Pay cycles ran daily, weekly or monthly, some in advance and some in arrears. Every mismatch between those feeds became a manual correction. I redesigned how and when the data was collected and built the automation around it. Weekly corrections fell from ~6,000 to ~450.
~ = close recount from the role, not a system export.
The problem
Billing data had to agree across supplier files, Alteryx-generated reports, SAP and BOSS, a proprietary reconciliation system. Duplicate, incorrect, failed, rejected and aged invoices all needed exception handling, and the volume was relentless.
Supplier backlogs were getting close to write-offs on our side and escalations on theirs. Some suppliers called every day because history had taught them to expect missed invoice runs. It was a logistics problem, a relationship problem and a financial one, for the suppliers and for us.
My role
- Ran and audited the daily billing-report set
- Validated supplier files and invoice/payment status
- Reconciled Alteryx output against BOSS and amounts due/paid
- Corrected or deleted duplicate, incorrect and failed invoices
- Maintained rejected/aged reporting and SharePoint updates
- Designed the workflow fix, brought it to management and implemented the new collection route and timing
- Built a Power Automate shared-inbox itemizing tool and PowerShell report auto-sorting and naming
What I built
Example dataShared-inbox itemizer POWER AUTOMATE
Supplier inquiries arrived as threads in a shared inbox, where they were easy to lose. The flow turns each message into an itemized, trackable row, so the team can see what's open, for whom and for how long.
- Before: inbox
- RE: RE: FW: invoices??
- Missing payment – urgent
- RE: statement attached
- After: itemized
- SUP-014 · Payment inquiry · 2d
- SUP-087 · Missing invoice · 5d
- SUP-102 · Statement recon · 1d
Report auto-sort & naming POWERSHELL
The daily report set landed in shared drives under inconsistent names. The script sorts each file into the right folder and names it by date, feed and report type, so the right report is always findable and nothing gets run twice.
- Before
- Report (3) FINAL.xlsx
- rejected_new_v2.xlsx
- Copy of aged.xlsx
- After
- 2026-05-14_EDI_Daily_Billing.xlsx
- 2026-05-14_Sterling_Rejected.xlsx
- 2026-05-14_All_Aged-30plus.xlsx
File names and inquiry rows above are illustrative.
The daily workflow
- Run and review the daily billing-report set.
- Validate supplier files, invoice records and payment status.
- Reconcile Alteryx-generated reports against BOSS and amounts due/paid.
- Correct or delete duplicate, incorrect or failed invoices.
- Review rejected and aged-invoice reporting and follow up on open items.
- Update workflow outputs and shared tracking locations.
Key decisions
Map every source before changing anything
I traced how each supplier's data actually arrived (which feed, which file drop, which report) before touching the process. The corrections were symptoms; the route was the cause.
Fix the route, not the invoices
I designed a consolidated collection route timed to each supplier's pay cycle, instead of pulling every supplier the same way on the same schedule.
Take it to management, then own the rollout
I brought the design to management, then implemented the new route and timing myself.
Automate the repetitive, keep the judgment
I used PowerShell for the filing and naming nobody should do by hand, and Power Automate to surface every inquiry. Deciding whether an invoice is corrected or deleted stayed a human call.
Run it: where weekly corrections come from
Synthetic dataCorrections per week, by cause
A model with 120 suppliers before the change and 150 after, run for 13 weeks each. The process-made causes collapse once the route is fixed. The genuinely bad data doesn't, because the fix doesn't make suppliers send better invoices. It stops the process from inventing false ones.
Replay: the $327K dispute
Synthetic invoice rowsA monthly-pay supplier says it's owed about $327,000
This supplier was paid monthly rather than weekly, so its balances ran bigger and older. Step through how I took the gap apart. The totals follow what really happened; the 69 invoice rows are invented.
| Supplier's invoice # | Our invoice # | Amount | Status |
|---|
Results
- Rental-finance, invoice, maintenance and toll backlogs went from 3+ months behind to current.
- Suppliers more than two months overdue were caught up.
- When a one-off issue happened, suppliers trusted it was a one-off instead of assuming the system had failed again.
- Supplier patience went up, and fewer escalations came in.
- Other parts of the team became more efficient once corrections stopped consuming them.
- Write-offs decreased.
Course correction
The first version of the fix started to sprawl. Once the original reason for a report got lost, the design became over-analyzed and over-engineered.
Re-anchor on the why: getting each supplier paid correctly and on time. Detail matters, but only in service of that.
I take messy, high-volume operational data across systems and turn recurring exceptions into a controlled, automated, auditable workflow.
About the data. Before/after volumes are close recounts from the role. Supplier names, invoice numbers and amounts shown are synthetic; BOSS and IDEA are described at a high level only.