All guides

Subscription Payments: Grace, Renewal and License Revocation

How Store subscriptions renew the same key, keep access during payment grace, expire at the grace deadline, and revoke when the subscription ends.

If you sell subscription licenses, one question comes up the moment you go live: what actually happens to a customer's access when their card gets declined? Here's the real, honest answer for how PermitCore's Store handles it — including the part where a single failed charge does not immediately cut anyone off.

A failed renewal starts payment grace

The event names below describe Stripe. A Store can also use Paddle. Each available provider verifies its own paid invoices and subscription events before applying paid-through and payment grace. The provider setup guide lists the required events for each account.

Stripe sends invoice.payment_failed when a subscription invoice cannot be collected. PermitCore tracks the Store license as past_due while preserving its paid-through date. The default payment grace is 14 days from that date. Vendors can configure 0–365 days in Store settings, and a license's explicit post-expiry grace overrides that default. Stripe's retry schedule is configured separately in the vendor's Stripe account.

During this window, validation and activation keep passing with isInGracePeriod: true. Your app can use paymentStatus to show an update-your-card message. If Stripe moves the subscription to unpaid, the same deadline applies. When the deadline is reached, validation reports an expired license even if Stripe has not canceled the subscription.

A successful payment extends the same key

invoice.paid advances the existing license to the invoice's paid billing-period end and restores active. The customer keeps the same license key. Duplicate deliveries and duplicate invoice notifications have no additional effect; an older invoice cannot shorten the paid period.

When a license is revoked

Scheduling cancellation at period end keeps access through the paid period. When the subscription ends, customer.subscription.deleted revokes the license, records the cancellation, and queues a license.revoked webhook for an existing active key. A late payment event cannot reactivate a revoked key. A full refund also revokes the purchased license; a partial refund records the amount while preserving access.

What your app should do

Validate periodically and honor isValid. Show payment guidance when paymentStatus is past_due or unpaid. Signed offline cache and newly issued offline activation tokens for Store subscriptions expire no later than paid-through plus grace. Reconnect to refresh after payment; an already-issued token keeps its signed deadline and cannot discover a cancellation while disconnected. See the validation API and Store webhook setup for the full contract.

Put the guide into practice

Build your first licensed product without building a license server.

Create a free PermitCore account, issue a test license, and validate it from your application.