Onchain Invoice Expiration: What Payment Failure Really Means
What happens if a USDC invoice expires before payment? Explore the lifecycle of onchain invoices, handling expired stablecoin payments, and operational patterns.

Invoicing onchain with USDC brings new mechanics to payment deadlines. Unlike card rails, there is no silent grace period or late capture. If an invoice expires before the payer submits a transaction, both sides see a clear, irreversible result. The merchant does not get paid. The customer keeps their funds. Expired invoices are visible to both, and the next step is always explicit.
How Onchain Invoice Expiration Works
Onchain invoices encode an amount, a recipient, and an expiration time. The expiration is critical: it sets a hard cutoff after which the invoice is invalid. This is not a UI timer. It is data anyone can read, onchain or off. A wallet or dapp can enforce this at the signing step, refusing to submit a transaction if the invoice is already past due.
For a merchant, this is a risk control. Expiration can help avoid underpayment from late transfers, or overpayment due to FX shifts. For a payer, it provides clarity: after the deadline, the invoice cannot claim funds. No late debits. No ambiguity.
Invoice Lifecycle and Expired Payments
The lifecycle starts when the merchant issues an invoice. The invoice records the due amount, the recipient address (often a merchant-controlled settlement wallet), and an expiration timestamp. A payer receives the invoice and either submits an onchain USDC transfer before the deadline or does not. If no transaction is confirmed before expiration, the invoice is expired. There is no fallback.
Example: USDC Invoice with Expiry
Suppose a SaaS company invoices a customer for 200 USDC, payable to 0xMerchantAddress, with an expiration at 17:00 UTC on June 10th. The invoice data is:
- Amount: 200 USDC
- To: 0xMerchantAddress
- Expires: 2024-06-10T17:00:00Z
If the customer signs and submits a USDC transfer at 16:59 UTC, the payment can settle. If the transaction is confirmed at 17:01 UTC, the invoice has already expired. The merchant will see no payment. The customer still holds their USDC.
Code Example: Invoice Expiration Check
For engineers integrating invoice rendering or payment signing, expiration checks can be enforced client side. For example, in TypeScript:
function invoiceIsExpired(expiry: number, now: number): boolean {
return now > expiry;
}
const expiry = Date.parse('2024-06-10T17:00:00Z');
const now = Date.now();
if (invoiceIsExpired(expiry, now)) {
throw new Error('Invoice expired. Payment not accepted.');
}
This prevents the payer from signing a payment past the invoice deadline. Merchants should also reject late payments at the backend, matching the onchain settlement window.
Common Patterns When Invoices Expire
1. Retry with a New Invoice
If a customer still wants to pay after an invoice expires, the merchant issues a new invoice with a fresh expiration and (optionally) updated terms. No funds move until the customer approves and settles the new invoice.
2. Update Pricing or Terms
In volatile periods, merchants may update the price on a new invoice if the USDC amount was pegged to a fiat value at the original issue time. This reduces risk from FX moves between the original and retried payment.
3. Cancel or Close the Order
Some workflows treat expiry as a hard fail. The merchant cancels the corresponding order or subscription. The customer must restart the process. This is common for time-sensitive offerings or limited inventory.
Finality and No Chargebacks
Once an invoice is settled onchain before expiry, the payment is final. If the invoice expires, there is no charge or hold. There are no partial payments or later reversals. This differs from card rails, where a late capture or chargeback may still occur days after an invoice deadline.
This hard boundary gives both merchant and customer a clear, auditable state. There is no ambiguity about what happens when a deadline is missed.
Expired Stablecoin Payments: Visibility and UX
Expired invoices should be visible in both the merchant admin and the customer portal. For many SaaS or service businesses, this means a customer sees a clear status: paid, unpaid, or expired. Merchants can trigger notifications or reminders as the deadline approaches, but after expiration, the system should not prompt payment on that invoice.
For recurring subscriptions, expiration may trigger a workflow: pause access, retry later, or close the account. For manual invoices, the next step is often re-issuing a new invoice if needed.
How We Handle Invoice Expiration at Reclack
At Reclack, every invoice has an explicit expiration timestamp. If a payer does not settle before the deadline, the invoice moves to an expired state. This is visible in both merchant and customer dashboards. No USDC moves, and no further payment is accepted against the expired invoice. Merchants can issue a new request if needed. We never accept late payments, and every transaction happens onchain, in USDC, on Base, Ethereum, or Polygon. To learn more about our approach to onchain billing infrastructure, visit reclack.com.


