{
  "$schema": "https://degreesofsatoshi.com/encyclopedia/schemas/article-v1.json",
  "schemaVersion": "1.0.0",
  "id": "stablecoin-payment-reconciliation",
  "canonical": "https://degreesofsatoshi.com/encyclopedia/stablecoin-payment-reconciliation/",
  "collection": "stablecoins",
  "title": "Reconciling stablecoin payments with invoices",
  "description": "Match stablecoin transfers to invoices without treating every wallet movement or repeated notification as a new customer payment.",
  "aliases": [
    "stablecoin payment reconciliation",
    "Reconciling stablecoin payments with invoices"
  ],
  "dates": {
    "published": "2026-10-02",
    "modified": "2026-10-02",
    "verified": "2026-10-02T19:26:58.461Z",
    "dataAsOf": "2026-10-02"
  },
  "authorship": {
    "publisher": "Degrees of Satoshi editorial project",
    "process": "AI-assisted research and drafting with a separate automated source-verification pass; no external expert or named human review is implied."
  },
  "quickAnswer": {
    "text": "Stablecoin reconciliation matches business records with verified transfers and processor events. Record the chain, token identity, transaction reference, recipient, amount, status and associated invoice, then account for fees, conversions and refunds separately. A transaction hash identifies an event; it does not by itself explain which invoice was paid or whether the business received the intended asset.",
    "claimId": "stablecoin-payment-reconciliation-quick-answer",
    "sourceIds": [
      "x425-sc-erc20",
      "x425-sc-circle-deposits",
      "x425-sc-stripe-refunds"
    ]
  },
  "keyFacts": [
    {
      "label": "Identity",
      "value": "ERC-20 transfer events belong to a particular token contract.",
      "sourceIds": [
        "x425-sc-erc20"
      ],
      "id": "identity",
      "claimId": "stablecoin-payment-reconciliation-fact-identity"
    },
    {
      "label": "Duplicates",
      "value": "Webhook delivery can repeat; processing should handle duplicate events.",
      "sourceIds": [
        "x425-sc-circle-deposits"
      ],
      "id": "duplicates",
      "claimId": "stablecoin-payment-reconciliation-fact-duplicates"
    },
    {
      "label": "Refunds",
      "value": "A refund has its own amount and processing state.",
      "sourceIds": [
        "x425-sc-stripe-refunds"
      ],
      "id": "refunds",
      "claimId": "stablecoin-payment-reconciliation-fact-refunds"
    }
  ],
  "prerequisites": [
    "stablecoin-merchant-payments"
  ],
  "sections": [
    {
      "id": "match",
      "heading": "Build a payment record that answers a business question",
      "sourceIds": [
        "x425-sc-erc20",
        "x425-sc-stripe-payments"
      ],
      "paragraphs": [
        "An invoice number and a blockchain transaction identifier serve different purposes. The invoice describes the obligation; the transaction describes execution on a specific network. Link them using the receiving workflow’s records rather than an assumed resemblance between amounts.",
        "Two customers can both pay 50 units. A rule that matches only on amount can assign the wrong receipt. Network, token, destination and an authenticated order reference provide the necessary context."
      ]
    },
    {
      "id": "events",
      "heading": "Make repeated delivery safe",
      "sourceIds": [
        "x425-sc-circle-deposits"
      ],
      "paragraphs": [
        "Payment services may retry notifications after a timeout, and event order is not necessarily the order in which business actions should occur. Store processed event identifiers and check current state before repeating fulfillment or ledger entries.",
        "Illustrative example: one completed payment generates a notification twice. The correct result is one paid invoice and two delivery observations, not two receipts. Retry-safe processing protects the accounting result without assuming a network delivers each event exactly once."
      ]
    },
    {
      "id": "net",
      "heading": "Keep transfers, fees and refunds distinct",
      "sourceIds": [
        "x425-sc-stripe-refunds",
        "x425-sc-stripe-payments"
      ],
      "paragraphs": [
        "A 100-unit receipt followed by a 20-unit refund leaves 80 units before other charges. If a network fee was paid in a different asset, record that separately instead of silently changing the token quantity shown on the receipt.",
        "Provider settlement can involve another currency and timing. Reconcile the customer payment to the processor balance, then the processor balance to the bank payout. A matching token transfer alone cannot establish the final bank reconciliation."
      ]
    }
  ],
  "faq": [
    {
      "question": "Is a public transaction hash enough for an invoice receipt?",
      "answer": "It is useful evidence, but it still needs the correct chain, asset, recipient, amount and business association. It also does not reveal an off-chain processor’s later conversion, payout or refund state.",
      "sourceIds": [
        "x425-sc-erc20",
        "x425-sc-stripe-payments",
        "x425-sc-stripe-refunds"
      ]
    }
  ],
  "claims": [
    {
      "id": "stablecoin-payment-reconciliation-quick-answer",
      "articleSlug": "stablecoin-payment-reconciliation",
      "statement": "Stablecoin reconciliation matches business records with verified transfers and processor events. Record the chain, token identity, transaction reference, recipient, amount, status and associated invoice, then account for fees, conversions and refunds separately. A transaction hash identifies an event; it does not by itself explain which invoice was paid or whether the business received the intended asset.",
      "sourceIds": [
        "source-ac4ad503a55127bb",
        "source-43794d50912b3ed9",
        "source-8029cd9ca5006236"
      ],
      "sourceLocators": [
        {
          "sourceId": "source-ac4ad503a55127bb",
          "locator": "Token methods and events"
        },
        {
          "sourceId": "source-43794d50912b3ed9",
          "locator": "Event delivery; duplicate events; ordering"
        },
        {
          "sourceId": "source-8029cd9ca5006236",
          "locator": "Refund status; handling failures"
        }
      ],
      "scope": {
        "collection": "stablecoins",
        "dataAsOf": "2026-10-02",
        "blockHeight": null
      },
      "qualification": "",
      "evidenceStatus": "documented",
      "verification": {
        "status": "verified",
        "method": "independent automated source review",
        "checkedAt": "2026-10-02T19:26:58.461Z",
        "reviewer": "Independent automated verification — Codex DeFi agent, separate from the stablecoin drafting agent",
        "notes": "ERC20 event identity and Stripe duplicate/out-of-order notifications checked. Recomputed 100 − 20 = 80; separate native-fee asset preserved."
      }
    },
    {
      "id": "stablecoin-payment-reconciliation-fact-identity",
      "articleSlug": "stablecoin-payment-reconciliation",
      "statement": "Identity: ERC-20 transfer events belong to a particular token contract.",
      "sourceIds": [
        "source-ac4ad503a55127bb"
      ],
      "sourceLocators": [
        {
          "sourceId": "source-ac4ad503a55127bb",
          "locator": "Token methods and events"
        }
      ],
      "scope": {
        "collection": "stablecoins",
        "dataAsOf": "2026-10-02",
        "blockHeight": null
      },
      "qualification": "",
      "evidenceStatus": "documented",
      "verification": {
        "status": "verified",
        "method": "independent automated source review",
        "checkedAt": "2026-10-02T19:26:58.461Z",
        "reviewer": "Independent automated verification — Codex DeFi agent, separate from the stablecoin drafting agent",
        "notes": "ERC20 event identity and Stripe duplicate/out-of-order notifications checked. Recomputed 100 − 20 = 80; separate native-fee asset preserved."
      }
    },
    {
      "id": "stablecoin-payment-reconciliation-fact-duplicates",
      "articleSlug": "stablecoin-payment-reconciliation",
      "statement": "Duplicates: Webhook delivery can repeat; processing should handle duplicate events.",
      "sourceIds": [
        "source-43794d50912b3ed9"
      ],
      "sourceLocators": [
        {
          "sourceId": "source-43794d50912b3ed9",
          "locator": "Event delivery; duplicate events; ordering"
        }
      ],
      "scope": {
        "collection": "stablecoins",
        "dataAsOf": "2026-10-02",
        "blockHeight": null
      },
      "qualification": "",
      "evidenceStatus": "documented",
      "verification": {
        "status": "verified",
        "method": "independent automated source review",
        "checkedAt": "2026-10-02T19:26:58.461Z",
        "reviewer": "Independent automated verification — Codex DeFi agent, separate from the stablecoin drafting agent",
        "notes": "ERC20 event identity and Stripe duplicate/out-of-order notifications checked. Recomputed 100 − 20 = 80; separate native-fee asset preserved."
      }
    },
    {
      "id": "stablecoin-payment-reconciliation-fact-refunds",
      "articleSlug": "stablecoin-payment-reconciliation",
      "statement": "Refunds: A refund has its own amount and processing state.",
      "sourceIds": [
        "source-8029cd9ca5006236"
      ],
      "sourceLocators": [
        {
          "sourceId": "source-8029cd9ca5006236",
          "locator": "Refund status; handling failures"
        }
      ],
      "scope": {
        "collection": "stablecoins",
        "dataAsOf": "2026-10-02",
        "blockHeight": null
      },
      "qualification": "",
      "evidenceStatus": "documented",
      "verification": {
        "status": "verified",
        "method": "independent automated source review",
        "checkedAt": "2026-10-02T19:26:58.461Z",
        "reviewer": "Independent automated verification — Codex DeFi agent, separate from the stablecoin drafting agent",
        "notes": "ERC20 event identity and Stripe duplicate/out-of-order notifications checked. Recomputed 100 − 20 = 80; separate native-fee asset preserved."
      }
    }
  ],
  "sources": [
    {
      "id": "x425-sc-erc20",
      "label": "ERC-20 Token Standard",
      "publisher": "Ethereum Improvement Proposals",
      "url": "https://eips.ethereum.org/EIPS/eip-20",
      "locator": "Token methods and events",
      "note": "Names/symbols, balances and Transfer events do not independently authenticate the issuer.",
      "version": "Document retrieved 2026-10-02; content hash recorded",
      "checkedAt": "2026-10-02T18:51:07.936Z",
      "contentSha256": "98bda5e4707841a68684879878c4c165fdaa47d89ed69ebf232ab9be06ff050e",
      "recordId": "source-ac4ad503a55127bb"
    },
    {
      "id": "x425-sc-circle-deposits",
      "label": "Webhook delivery and duplicate events",
      "publisher": "Stripe",
      "url": "https://docs.stripe.com/webhooks",
      "locator": "Event delivery; duplicate events; ordering",
      "note": "Payment event processing and idempotent reconciliation; this does not establish chain settlement.",
      "version": "Document retrieved 2026-10-02; content hash recorded",
      "checkedAt": "2026-10-02T18:52:46.705Z",
      "contentSha256": "650b1b9552da854ad708451a100da848385e621bd5dfb87b26a17e63db6bb557",
      "recordId": "source-43794d50912b3ed9"
    },
    {
      "id": "x425-sc-stripe-refunds",
      "label": "Refund and cancel payments",
      "publisher": "Stripe",
      "url": "https://docs.stripe.com/refunds",
      "locator": "Refund status; handling failures",
      "note": "Refund workflow, asynchronous processing and reconciliation separate from an original charge.",
      "version": "Document retrieved 2026-10-02; content hash recorded",
      "checkedAt": "2026-10-02T18:51:05.967Z",
      "contentSha256": "22616120bdc24b09ef3989b49da6f49a152476a45aa2d61ec1d6956d43471ba0",
      "recordId": "source-8029cd9ca5006236"
    },
    {
      "id": "x425-sc-stripe-payments",
      "label": "Stablecoin payments",
      "publisher": "Stripe",
      "url": "https://docs.stripe.com/payments/stablecoin-payments",
      "locator": "Payment flow; refunds; disputes; settlement",
      "note": "Processor-specific stablecoin acceptance, refund and merchant balance behavior.",
      "version": "Document retrieved 2026-10-02; content hash recorded",
      "checkedAt": "2026-10-02T18:51:05.825Z",
      "contentSha256": "0e6392015c311d173816abfcfef2233910b851cd0adc698abdffd47f72232c24",
      "recordId": "source-6abcea6a4776290a"
    }
  ],
  "related": {
    "articles": [
      "ethereum-transaction-receipts",
      "stablecoin-payment-refunds",
      "stablecoin-off-ramps",
      "stablecoin-payroll"
    ],
    "dossiers": [],
    "wallets": []
  },
  "revisionHistory": [
    {
      "date": "2026-10-02",
      "kind": "published",
      "summary": "First publication after primary-source research and separate automated verification."
    }
  ],
  "citation": "Degrees of Satoshi editorial project. “Reconciling stablecoin payments with invoices.” Published 2026-10-02; updated 2026-10-02. https://degreesofsatoshi.com/encyclopedia/stablecoin-payment-reconciliation/"
}
