## TL;DR

Exact-amount matching fails on legitimate differences: tips, foreign fees, and pending-vs-posted amounts. Match within a tolerance window (amount plus a small percentage), prefer the posted transaction amount as canonical, and only escalate differences above the tolerance.

## Error

```text
agent failed to match receipts to transactions: amount mismatch
```

## Steps

1. Log a sample of mismatches with both amounts and the difference. Expected: the differences cluster in explainable bands (tips, fees).
2. Set a matching tolerance: exact match first, then match within the larger of a small fixed amount or a small percentage. Expected: legitimate near-matches now pair up.
3. Treat the posted card transaction amount as canonical and the receipt as supporting evidence. Expected: one consistent amount per matched pair.
4. For matches inside tolerance, record the explained difference (tip, fee) on the match record. Expected: the audit trail shows why the amounts differ.
5. Escalate only differences above tolerance to manual review. Expected: humans see real anomalies, not tip noise.

## When to use

- An agent fails to pair receipts with transactions over small amount gaps.
- Match rates are low despite receipts being present.

## When not to use

- Receipts are missing entirely (see the missing-receipt skills).
- Amounts differ hugely (investigate duplicates or fraud).

## Tool compatibility

- Custom audit agents; Expensify, Ramp, Brex transaction feeds.

## Variant phrasings

### Could not pair receipt with card charge

Same failure, alternate wording.

### Transaction matching failed on amount

Names the match key directly.

## Why it happens

Receipts and card postings capture different moments: pre-tip vs post-tip, authorization vs settlement. Exact matching treats these normal gaps as failures.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_-080KPEP7Gsg7gYOQ5JR6A
