Stablecoin invoice reconciliation: worked examples
Stable Reconcile compares your declared invoices with recorded stablecoin transfers. It separates partial payments, pending transfers and wrong-network records, with exact decimal totals. Use it for a local exception review before updating your books.
Three fictional scenarios, calculated by the same engine as the tool. They illustrate behavior and failure cases, not customer outcomes or measured provider performance.
Split & partial payments
One invoice matches; another is short by 20.
- Invoices
- 2
- Matched
- 1
- Transfer exceptions
- 1
| Invoice | Network / asset | Due | Recorded paid | Pending | Difference | Status |
|---|---|---|---|---|---|---|
| INV-01 | eip155:8453 / demo-usdc-contract | 125.50 | 125.5 | 0 | 0 | Matched |
| INV-02 | eip155:8453 / demo-usdc-contract | 80 | 60 | 0 | -20 | Underpaid |
Run this scenario Input JSON Calculated report
Inspect every input
{
"invoices": [
{
"id": "INV-01",
"network": "eip155:8453",
"asset": "demo-usdc-contract",
"amount": "125.50"
},
{
"id": "INV-02",
"network": "eip155:8453",
"asset": "demo-usdc-contract",
"amount": "80"
}
],
"transfers": [
{
"id": "demo-log-1",
"invoice": "INV-01",
"network": "eip155:8453",
"asset": "demo-usdc-contract",
"amount": "100",
"state": "finalized"
},
{
"id": "demo-log-2",
"invoice": "INV-01",
"network": "eip155:8453",
"asset": "demo-usdc-contract",
"amount": "25.50",
"state": "finalized"
},
{
"id": "demo-log-3",
"invoice": "INV-02",
"network": "eip155:8453",
"asset": "demo-usdc-contract",
"amount": "60",
"state": "finalized"
},
{
"id": "demo-log-4",
"invoice": "INV-02",
"network": "eip155:1",
"asset": "demo-usdc-contract",
"amount": "20",
"state": "finalized"
}
]
}A transfer is still pending
See why a pending transfer does not settle the invoice.
- Invoices
- 2
- Matched
- 0
- Transfer exceptions
- 1
| Invoice | Network / asset | Due | Recorded paid | Pending | Difference | Status |
|---|---|---|---|---|---|---|
| INV-01 | eip155:8453 / demo-usdc-contract | 125.50 | 100 | 25.5 | -25.5 | Underpaid |
| INV-02 | eip155:8453 / demo-usdc-contract | 80 | 60 | 0 | -20 | Underpaid |
Run this scenario Input JSON Calculated report
Inspect every input
{
"invoices": [
{
"id": "INV-01",
"network": "eip155:8453",
"asset": "demo-usdc-contract",
"amount": "125.50"
},
{
"id": "INV-02",
"network": "eip155:8453",
"asset": "demo-usdc-contract",
"amount": "80"
}
],
"transfers": [
{
"id": "demo-log-1",
"invoice": "INV-01",
"network": "eip155:8453",
"asset": "demo-usdc-contract",
"amount": "100",
"state": "finalized"
},
{
"id": "demo-log-2",
"invoice": "INV-01",
"network": "eip155:8453",
"asset": "demo-usdc-contract",
"amount": "25.50",
"state": "pending"
},
{
"id": "demo-log-3",
"invoice": "INV-02",
"network": "eip155:8453",
"asset": "demo-usdc-contract",
"amount": "60",
"state": "finalized"
},
{
"id": "demo-log-4",
"invoice": "INV-02",
"network": "eip155:1",
"asset": "demo-usdc-contract",
"amount": "20",
"state": "finalized"
}
]
}Customer paid twice
Review an overpayment while keeping the duplicate event IDs distinct.
- Invoices
- 2
- Matched
- 0
- Transfer exceptions
- 1
| Invoice | Network / asset | Due | Recorded paid | Pending | Difference | Status |
|---|---|---|---|---|---|---|
| INV-01 | eip155:8453 / demo-usdc-contract | 125.50 | 135.5 | 0 | 10 | Overpaid |
| INV-02 | eip155:8453 / demo-usdc-contract | 80 | 60 | 0 | -20 | Underpaid |
Run this scenario Input JSON Calculated report
Inspect every input
{
"invoices": [
{
"id": "INV-01",
"network": "eip155:8453",
"asset": "demo-usdc-contract",
"amount": "125.50"
},
{
"id": "INV-02",
"network": "eip155:8453",
"asset": "demo-usdc-contract",
"amount": "80"
}
],
"transfers": [
{
"id": "demo-log-1",
"invoice": "INV-01",
"network": "eip155:8453",
"asset": "demo-usdc-contract",
"amount": "100",
"state": "finalized"
},
{
"id": "demo-log-2",
"invoice": "INV-01",
"network": "eip155:8453",
"asset": "demo-usdc-contract",
"amount": "25.50",
"state": "finalized"
},
{
"id": "demo-log-3",
"invoice": "INV-02",
"network": "eip155:8453",
"asset": "demo-usdc-contract",
"amount": "60",
"state": "finalized"
},
{
"id": "demo-log-4",
"invoice": "INV-02",
"network": "eip155:1",
"asset": "demo-usdc-contract",
"amount": "20",
"state": "finalized"
},
{
"id": "demo-extra-payment",
"invoice": "INV-01",
"network": "eip155:8453",
"asset": "demo-usdc-contract",
"amount": "10",
"state": "finalized"
}
]
}A mistake worth catching
Counting a pending transfer as paid hides settlement risk. Keep pending amounts separate and verify finality with your original source.
Use the method with your records
Match the declared invoice ID, network and asset exactly. Sum finalized amounts with fixed-point integers. Pending and reverted records never settle an invoice.
No wallet sync, automatic matching, FX, refund processing, tax accounting or independent finality checks.
Read the complete method, sources and input contract. Updated 2026-09-19; by the AGI Scorecard team.