OĞUZ EROL · MarkdownTR
Open MarkdownClose
Source: https://oguzerol.com/en/expense-receipt-document-tracking/

[![Example scenario: an expense missing its receipt is completed later, the receipt is linked to the expense, and manager review is still pending.](https://oguzerol.com/gorseller/senaryo/expense-receipt-document-tracking-senaryo-en.webp)

View full size](https://oguzerol.com/gorseller/senaryo/expense-receipt-document-tracking-senaryo-en.webp)

# Expense Receipt Tracking: Matching Card Statements to Receipts

[Oğuz Erol](https://oguzerol.com/en/about-me/)  |  18 min read

I build a web app that matches each line of the monthly corporate card statement to an expense record and a receipt or invoice, sends anything unmatched to an exception queue, and shows who still owes which document. The biggest trap is that the statement lives in one file and the receipts in a folder, inbox or chat thread, so at month-end finance chases cardholders about charges nobody remembers. Amount, date and merchant rules are set up to match most lines on their own (46 of 63 in the sample month below); people close the rest. AI reads receipts, turns PDF statements into rows and suggests categories; a person always approves.

This page covers one job: card statement against evidence. If you have one or two cards, you may not need this app at all; I explain why below.

## What gets matched to what each month?

Three sources are tied together each month: the statement (what was paid), your expense record (what for, which project or cost centre) and the evidence (invoice or receipt). A line is closed only when all three agree.

- **Statement:** The format depends on your issuer; the app is set up for whichever you receive.
- **Expense record:** Description, project or client code and category, entered before the statement arrives or afterwards on the line itself.
- **Evidence:** An invoice, receipt photo or e-invoice PDF. A statement line alone is usually not enough. In the US, for the travel, meals, gift and transportation (including car) expenses Publication 463 covers, you generally need documentary evidence such as receipts, except for an expense other than lodging under $75, or meals or lodging while travelling away from home that you account for under an accountable plan using a per diem method; a receipt showing amount, date, place and essential character of the expense is ordinarily adequate ([IRS Pub 463, 2025 edition, read 14 October 2026](https://www.irs.gov/publications/p463)). In the UK, HMRC says you must hold valid VAT invoices to reclaim VAT, and a pro-forma invoice or a delivery note will not do ([GOV.UK, read 14 October 2026](https://www.gov.uk/charge-reclaim-record-vat/keeping-vat-records)); a card statement is a general business record, not a VAT invoice. Your accountant sets the rule; the app applies it to every line.
- **Supplier e-invoices and a finance inbox:** By finance inbox I mean a shared company address that suppliers and cardholders send invoices to. If invoices arrive there or in an e-invoicing portal, they can be pulled in bulk, depending on the export your provider offers or the mailbox access your email provider allows, and suggested against lines by supplier, amount and date. Cardholders then upload only what never reaches either. Version one works with manual upload; these two channels are added at the extension step. I don’t promise a connection before seeing your setup.

## A sample month: four cards, 63 lines

The month below is fictional; all figures are sample data with no currency attached. A manufacturer has four corporate cards: managing director, sales manager, field engineer, purchasing specialist. The statement closes on the 18th and produces 63 lines:

- **46 lines** match automatically (statement line, expense record and evidence agree; cardholders uploaded receipts during the month, or the invoice came in through the e-invoice import).
- **5 lines are bank items:** annual card fee (1), foreign transaction fee (2), interest (1), tax on fees and interest (1). They expect no document; they are recognised from the description and go to their own categories.
- **12 lines** go to the exception queue:

| exception | sample line (sample data) | who completes it | how it closes |
| --- | --- | --- | --- |
| No receipt (3) | Fuel 2,150 · parking 180 · taxi 420 | Cardholder | Uploads a photo or requests the invoice; after a set period (my design assumption: five business days) it moves to the manager |
| Amount difference (1) | Restaurant: receipt 1,850, statement 2,035 | Cardholder | Confirms the difference as a tip; it goes to a separate line |
| Invoice not in the company’s name (1) | Hotel 8,400, invoice issued to the cardholder personally | Cardholder | Asks the hotel to reissue it to the company with its tax number |
| Personal charge (1) | Supermarket 640 | Cardholder flags it, manager confirms | A repayment record opens; finance settles it under your policy |
| Foreign currency (2) | Software subscription 49 and design tool 15, in two different foreign currencies | Finance | Matched on the original amount; the difference goes to an FX line |
| Instalment (1), if your issuer offers instalments | Measuring device, instalment 1 of 6 | Finance | The invoice links to instalment 1; the next five monthly lines from the same merchant and amount close against it automatically |
| Refund (1) | Cancelled flight, negative line | Cardholder | Linked to the original ticket charge; if that charge sits in a closed period, the closed period stays locked and the refund closes as its own line in this one |
| Subscription (2) | Cloud storage, video-call tool | Finance | Defined once; its invoice is expected monthly in the finance inbox |

46 + 5 + 12 = 63. Cardholders close 7 of the 12 exceptions, finance 5; the app’s real job is putting the right question to the right person. In a spreadsheet the hotel line would pass unless someone checked the tax number by hand: the amount matches and there is a receipt. Here the AI reads the buyer’s name and tax number on the invoice and compares them with the company’s.

## Which rules decide a match?

A statement line matches when the amount agrees, the date falls inside a set window and the merchant name clears a threshold. Every number below is my starting suggestion, not a measured value; after the first month we tune them to your data.

| rule | my starting value | why |
| --- | --- | --- |
| Expense record ↔ statement line | The cardholder picks their card when entering a record; the record links to a line by card + amount + date window. If no record exists, the line lands with the cardholder as “description needed” and they fill it in on the line | Early entry works; missing entry gets found |
| Amount (home-currency purchase) | Exact to the cent | A difference usually points to the wrong receipt, a tip or a partial refund |
| Tip | If the statement is higher than the receipt by less than 20% of the receipt, it goes to the queue as a “possible tip” | A card-terminal tip may not be on the receipt; never closes without the cardholder |
| Pending authorisation | Unsettled transactions are not matched; they stay “pending” | If live transactions are imported, a pre-authorised amount can change before settling |
| Date window | 0–3 business days after the receipt date, weekends and public holidays not counted; 0–7 business days for foreign transactions | Dates can differ and foreign transactions may post later; a narrow window makes mix-ups of same-amount purchases less likely |
| Merchant name | Similarity score 0–100 (a measure of how closely two names are spelled; 100 means identical): 80 and above matches automatically; 60–79 goes to the queue as a “possible match”; below 60 no match, the line stays receipt-less | Trading name vs legal entity; approved pairings are remembered |
| Foreign currency | If the statement shows the original amount, match on it exactly; if not, a 3% tolerance in home currency | The issuer converts at its own rate and date, so your conversion rarely equals the statement line |
| Many to one | Several documents may attach to one line if totals agree | One charge can cover more than one document, for example a room and an extra service invoiced separately but paid once |
| Bank items | Card fees, foreign transaction fees, interest and related taxes where they appear as separate lines expect no document; recognised from the description | A separate foreign transaction fee line must not be booked as FX difference |
| Duplicate upload | Re-uploading the same statement creates no new lines; one receipt cannot attach to two lines | Prevents double records when two people upload or a receipt is photographed twice |

## What does AI do, and where does it stop?

I give AI three jobs here, and a person has the final word on each:

1. **Reading receipts and invoices:** amount, date, merchant, buyer’s tax number, sales tax or VAT. Uncertain fields are highlighted; nothing counts as “documented” until the cardholder confirms.
2. **Turning a PDF statement into rows:** If the extracted rows don’t add up to the period total printed on the statement, the upload is rejected and the unreadable page is shown, so a misread line never slips into the books.
3. **Suggesting a category from the merchant name:** only for merchants seen for the first time; an approved category becomes a rule for that merchant.

AI does not decide whether a charge is personal, whether an undocumented expense is allowed, or what the journal entry is. Capturing and reading receipts on a phone at the point of purchase belongs to the [mobile employee expense entry](https://oguzerol.com/en/mobile-employee-expense-entry/) workflow.

## Who sees what, and who completes what?

Cardholders see only their own lines; managers see their team’s; finance sees every card, uploads the statement and alone changes matching rules.

The rule I suggest, your decision: nobody approves their own line. For a cardholder with no manager (the managing director in the sample), finance approves. Finance defines users, the card-to-person mapping and reporting lines, and every change to them goes into the audit trail. This is a design suggestion based on segregation of duties: the person who spends and the person who approves should not be the same.

| role | sees | enters / completes | approves | can reverse |
| --- | --- | --- | --- | --- |
| Cardholder | Own card | Description, evidence, “personal” flag, tip confirmation | — | Own entries until the period closes |
| Manager | Team’s cards | Takes over overdue missing receipts | Team’s personal and undocumented lines (never their own) | — |
| Finance | All cards | Statement upload, matching rules, FX, instalment and subscription setup; users, card-to-person mapping, reporting lines | Period close; lines of cardholders with no manager | A closed period, with a written reason |

Every change goes into an audit trail that cannot be deleted, and a reversal is a new entry, not an edit. Example (sample data): “19 Oct 09:12 — Finance specialist uploaded the October statement, 63 lines, period total matched. 20 Oct 11:05 — Line 41 (supermarket, 640): field engineer flagged it ‘personal’. 20 Oct 16:30 — Manager confirmed, reason: ‘supermarket purchase, repayment record opened’. 22 Oct 15:40 — Finance manager lowered the ‘possible tip’ threshold from 20% to 15%, reason: ‘two lines got needless suggestions last month’; old and new values kept, earlier matches not reversed automatically.”

The shared design of roles, audit trail and AI limits is explained in more depth for the [bank transaction reconciliation app](https://oguzerol.com/en/bank-transaction-reconciliation-app/).

Approval limits and the chain from manager to finance belong to the [employee expense approval workflow](https://oguzerol.com/en/employee-expense-approval-workflow/).

## What goes to the accountant at month-end?

In the sample month the statement was uploaded on the 19th, and at the accounting close eight business days later 9 of the 12 exceptions had been resolved. Three stayed on the open exceptions report: a taxi line still without a receipt after two reminders (now with the manager), a hotel invoice waiting to be reissued, and the design-tool invoice that hadn’t yet reached the finance inbox.

Chasing: the cardholder gets an email reminder the day the statement is uploaded and every two business days after; when the set period runs out, the line moves to their manager (intervals are my starting suggestion). What happens to a receipt that never arrives is in the FAQ. The pack contains:

- **Line file:** Excel or CSV in your accounting software’s import format: card, date, merchant, amount, category, project code, document number.
- **Document archive:** File names follow line numbers, so the file name answers “which invoice belongs to this line”.
- **Open exceptions report:** Every unclosed line, its reason and who it is waiting on.
- **Separate lists:** FX differences, personal charges and repayments, undocumented lines, bank items.
- **Period lock:** Changes to a closed period need the finance role and a written reason.

One detail that is easy to miss: the card period ends on the statement date, not at month-end. With an 18th close, one statement spans two accounting months; a purchase on 25 September arrives on the October statement but is a September expense. So each line stores two dates, card period and accounting month: you close the books by one and pay the issuer by the other.

## Where does a spreadsheet break?

You can do this in Excel or Google Sheets. My suggested layout: statement pasted as-is on one sheet, expense records on another; match key “last four card digits + amount”, date gap limited to three days with COUNTIFS; receipt files named date_amount_merchant, linked in a column.

As cards and lines grow, it breaks in concrete places:

- **Statement and receipts live apart.** Link columns break when folders move; a missing receipt surfaces only when someone checks line by line.
- **FX differences are worked out by hand,** and which day’s rate was used isn’t recorded.
- **Nobody knows who fixed what, or why.** Version history shows that a cell changed, not why a line was flagged personal; in the app that answer sits on the line.
- **Everyone sees everything, or the file gets split** per cardholder and stitched back together at month-end.

In the app, a defined business rule is applied when data is entered, not when someone runs a formula at month-end. Before deciding, count your own month: how many lines, how many cardholders, how many days the chasing takes at close.

## When your accounting software or card programme is enough

I would not recommend a custom app if you have one or two cards and a few dozen lines a month (the spreadsheet will do), if your card programme’s expense tool already links receipts to lines and exports to your accounting software, or if an off-the-shelf expense product fits your rules and you are fine with your data living there; it starts faster.

A custom app makes sense when your cards sit with different issuers, you have rules of your own (rebillable client expenses, project codes), your accounting software isn’t on a vendor’s integration list, or the data must stay on your own infrastructure.

## Personal data on receipts: what I watch for

Receipts carry personal data: the cardholder’s name, a hotel guest name, partial card numbers, possibly a vehicle registration. Under the GDPR and UK GDPR, data should be limited to what the purpose needs and kept no longer than necessary ([Regulation (EU) 2016/679, Art. 5(1)(c) and (e)](https://eur-lex.europa.eu/eli/reg/2016/679/oj)). I recommend two rules:

- **Extract only what matching needs** and let only the cardholder, their manager and finance open the receipt image; log every access and change.
- **Agree up front where the AI service runs.** If the model that reads receipts runs in another country, that is an international data transfer and needs its own legal basis. If you are in Turkey, Article 9 of the KVKK was rewritten by [Law No. 7499](https://www.resmigazete.gov.tr/eskiler/2024/03/20240312-1.htm) (Official Gazette 12 March 2024, No. 32487, Art. 34), in force since 1 June 2024; it ties such transfers to an adequacy decision or safeguards such as standard contracts.

Retention also depends on your jurisdiction. In the UK, a limited company generally keeps records, receipts included, for six years from the end of the last financial year they relate to ([GOV.UK, read 14 October 2026](https://www.gov.uk/running-a-limited-company/company-and-accounting-records)). If you are in Turkey, the Tax Procedure Law sets five years from the start of the following calendar year, and the Turkish Commercial Code sets ten years for the documents behind a merchant’s ledger entries; I recommend setting the archive up for the longer period that applies to you.

I don’t give legal advice; privacy notices and transfer decisions belong to your legal adviser.

## How do I set up the first version?

The first version starts with one month and the core of the matching. In automation work, the most common mistake I see is picking the most complicated process as the first thing to automate; here that means trying to auto-resolve all eight exception types in version one. My order:

1. **Scope.** Two months of statements with card numbers and names masked (never unmasked), plus those months’ receipts; cards and issuers, your accounting import format, where supplier invoices arrive.
2. **Manual bridge.** We reconcile one month by hand with your finance lead first. Knowing the expected result in advance is the only reliable test.
3. **First version.** Statement upload, matching rules, the missing-receipt queue, roles and the audit trail.
4. **Check.** We rerun the same month in the app; every exception found by hand must come out with the same reason. We also upload a statement twice and reverse a match.
5. **Extension.** FX, instalment, subscription and bank-item rules, e-invoice import, the finance inbox connection and AI suggestions are added after the core has run cleanly for a month.

The delivery scope is written down. The app runs on a hosted server; the server, keys and accounts can be opened in your name. The data is yours and can be exported in full as Excel or CSV at any time. There is no per-user licence; the running cost is the server’s monthly fee plus upkeep, and for a small or mid-sized team adding users doesn’t change it. The complete source code sits in a repository you can access, with run instructions, a dependency list and known limits. Payments, personal data and critical operations require a separate review of access, security, hosting and maintenance needs, and this app handles personal data and card spending, so I do that review at the start. How a statement profile is updated when an issuer changes format is agreed in writing as part of maintenance. Scope and delivery schedule come in writing after I’ve seen your setup.

If you’d like to start with two masked statements and your receipt folder, [get in touch through the contact page](https://oguzerol.com/en/contact/); in the first meeting we talk through which exceptions come up most for you and scope the first version together.

## Frequently Asked Questions

### What happens to missing receipts when a cardholder leaves?

Open exceptions transfer to their manager, and card cancellation gets a “no open exceptions” check. Their entries and audit trail are kept.

### What if our cards are with different issuers, or an issuer changes its statement format?

Each issuer gets its own statement-reading profile; matching rules, the queue and the month-end pack are shared. If a format changes, the period-total check fails, the upload is rejected and the profile needs updating; how that is handled is agreed in writing as part of maintenance.

### Can the app post entries directly into our accounting software?

Only if your software accepts external data. If it does, I build the connection; if not, the close file comes in its import format and finance imports it once. I don’t promise a connection before seeing the software.

### Can cardholders ask merchants to email the invoice instead?

It is worth asking: an invoice emailed to a company finance address at payment is easier to match, and if the finance inbox is connected (see the extension step) the cardholder has nothing to upload; until then finance forwards or uploads it. Whether it is valid for VAT or tax depends on your country’s rules and your accountant. If you are in Turkey, e-archive invoices to buyers not registered for e-invoicing are delivered on paper by default and electronically on request, under conditions your accountant can confirm.

### What if a receipt never arrives?

The line stays on the open exceptions report and moves to the manager, who either approves a missing-receipt declaration (date, amount, merchant, business purpose) so the line goes to finance tagged “undocumented”, or treats the charge as personal and opens a repayment record. Whether a declaration is acceptable, and up to what amount, is your accountant’s call.

[Back to top ↑](https://oguzerol.com/en/expense-receipt-document-tracking/#icerik)

## You may also find these useful

[Employee Expense Approval Workflow: Manager-to-Finance Chain, Limits and ReturnsExpense approval from manager to finance: amount limits, delegation, line-level approval, returns and an audit trail, worked through a sample month.](https://oguzerol.com/en/employee-expense-approval-workflow/)[Expense Permissions and Reporting Screen: Who Sees What, Which Report Goes to WhomLet project managers see only their project and auditors get read-only exports: a web app that scopes each expense line by role. Walk through a sample company.](https://oguzerol.com/en/expense-permissions-reporting-screen/)[Mobile Employee Expense Entry: Receipt Photos and AI Receipt ReadingA web app where field staff log expenses by phone, AI reads the receipt photo and flags fields that fail checks, and duplicates are stopped. See a sample month.](https://oguzerol.com/en/mobile-employee-expense-entry/)

[Browse all articles →](https://oguzerol.com/en/articles/)

WHAT YOU CAN ASK FOR

## How do I work?
Work-hour packages

Tell me about your business and what you need on WhatsApp or by phone; we agree on **a work block of somewhere between 5 and 40 hours** and I start doing what is needed. What you get is not a calendar window — it is net working hours spent directly on your business. I can use 40 hours working three days straight, or deliberately spread it out and finish it over a year — whatever the work calls for. I do not spend my time estimating how long something will take, I spend it doing the work; every hour I spend leaves a lasting result in your business. We keep going for as long as you find it useful.

WORK BLOCKS

## Why not monthly?
Is 40 hours a week?

On a fixed monthly fee both sides are watching the wrong thing: you watch a fixed cost, the other side watches how many more contracts like this they can line up. Working by the hour puts us both in front of the same thing — the real value of the work that got done. I know not having an upfront answer to "how much will this cost in total?" is the natural cost of this model. But instead of paying a fixed fee for months to a setup that is not producing results, you only pay for the qualified time spent on your work — and you see exactly where that time went, start to finish. That is why my clients keep coming back.

5hours300€ + VAT60€ per hour[Choose this block](https://wa.me/905496546489?text=Hi%2C%20I%27d%20like%20info%20about%20the%205-hour%20work%20block.)

10hours500€ + VAT50€ per hour[Choose this block](https://wa.me/905496546489?text=Hi%2C%20I%27d%20like%20info%20about%20the%2010-hour%20work%20block.)

20hours800€ + VAT40€ per hour[Choose this block](https://wa.me/905496546489?text=Hi%2C%20I%27d%20like%20info%20about%20the%2020-hour%20work%20block.)

40hours1,400€ + VAT35€ per hour[Choose this block](https://wa.me/905496546489?text=Hi%2C%20I%27d%20like%20info%20about%20the%2040-hour%20work%20block.)