Failed renewals and retries.
When a renewal cannot be collected, nothing is taken and the subscription is past due. Fianto makes four attempts in all: two minutes into the period, then one hour, six hours and one day into it. If the fourth fails, the subscription ends, and that period is never charged later.
The four attempts
| Attempt | When, from the start of the period |
|---|---|
| 1 | 2 minutes |
| 2 | 1 hour |
| 3 | 6 hours |
| 4 | 1 day |
The schedule is fixed for every merchant; there is no setting for it. When an earlier delay was not the customer's doing, each retry keeps its gap from the failure before it rather than all falling due at once. The program never takes part of an amount.
Which failures count
Only a failure caused by the customer's wallet uses up an attempt:
| Reason in the event | Meaning | Uses an attempt |
|---|---|---|
INSUFFICIENT_ | The wallet holds less USDC than the charge | Yes |
DELEGATION_ | The customer removed the permission in their wallet | Yes |
ACCOUNT_ | The customer's USDC account is frozen | Yes |
ACCOUNT_ | The customer's USDC account was closed | Yes |
TOO_ | The chain's clock had not reached the new period | No |
NETWORK_ | Solana or an RPC node did not answer | No |
PROGRAM_ | The program refused for another reason | No |
CHARGING_ | Fianto's charging key could not pay its fee | No |
What your server hears
subscription.: once, at the first failure that counts. The subscription's status ispast_ due PAST_.DUE subscription.: at every failed attempt, withpayment_ failed failure.,reason attempt_andno next_.attempt_ at subscription.: a later attempt succeeded; the period is paid.renewed subscription.: the fourth attempt failed, withended end_.reason: "PAYMENT_ FAILED"
Whether a past-due customer keeps access while attempts run is your decision; the events give you what you need either way. The dashboard lists every failing subscription with its reason and next attempt.
Reading it from the API
GET /v1/subscriptions/{id} returns the subscription as it is now: status is ACTIVE, PAST_ or ENDED, with current_ and the latest payment and its signature. You can also cancel a past-due subscription yourself, now, with POST /v1/subscriptions/{id}/cancel, instead of waiting for the last attempt.
What the customer can do
In the portal at fianto.xyz/my, the subscription shows as past due, with what to do: for a short wallet, add USDC before the next try, and it is collected then. A customer who removed the permission can reauthorize in the portal at fianto.xyz/my while the subscription is still past due. Fianto sends customers no email, so if you want them to know, tell them from your own product.
