Skip to main content
A renewal fails when the customer declines the payment request, does not answer within the window, lacks the balance, or no longer has a default payment method. Here is the sequence.

On the due date

1

The subscription becomes past_due

On the first failure, in the same transaction as the attempt. You receive payment.failed and subscription.past_due. The invoice stays open with lastPaymentError set.
2

Retries are scheduled

Three automatic attempts, on the customer’s default payment method, read again each time:Each retry is a new request on the customer’s phone. attemptCount and nextAttemptAt on the invoice follow the schedule.
3

A success settles it

The invoice becomes paid, the subscription goes back to active and you receive subscription.activated — the only path that emits this event, along with retry-payment.
4

After the third, nothing

The subscription stays past_due, indefinitely. No automatic cancellation, no move to unpaid or uncollectible. It is up to you: retry on demand, cancel, or wait.
No email is sent to the customer on a failed payment, neither on the first attempt nor the following ones. The only email they received is the invoice, three days before the due date, with its payment link. If you want to warn the customer, do it from your webhooks (payment.failed, subscription.past_due).

Special cases

A prolonged past_due leaves the customer with their rights: nothing in Yabetoo cuts them off. If your product must restrict an unpaid customer’s access, do it on subscription.past_due, and restore it on subscription.activated.

Reading the state of an unpaid subscription

  • GET /v1/subscriptions/{id}: status: "past_due", currentPeriodEnd already advanced.
  • GET /v1/subscriptions/{id}/invoices: the cycle’s open invoice, with attemptCount, nextAttemptAt, lastPaymentError.
  • GET /v1/invoices?subscription_id=sub_...&status=open: the same, paginated.