grace_period_expired

Learn about the GRACE_PERIOD_EXPIRED App Store Server Notification V2. Fired when the billing grace period ends without successful payment.

App Store Server Notifications V2Subscriptions
grace_period_expired

The GRACE_PERIOD_EXPIRED notification fires when the billing grace period after a failed renewal has ended without Apple successfully collecting payment. The customer's subscription access should be revoked at this point.


When does it fire?


This notification triggers when the grace period window closes. During the grace period, the customer retained access while Apple retried billing. When the window closes without a successful charge, this notification signals that access should be removed — Apple keeps retrying in the background for up to 60 days from the first failure.


Payload highlights


The signed transaction and renewal info show the final billing retry status and the grace period end date. This is your signal to revoke premium access for the affected subscriber.


How Yeethook helps


Yeethook delivers this notification clearly formatted so your team knows exactly which subscriber lost access and why. This is critical for apps that need to revoke features or content access based on subscription status.


Common use cases


  • Revoke premium feature access when grace periods end
  • Send a final payment update reminder before access is lost
  • Track grace period resolution rates to optimize retention
  • Monitor involuntary churn caused by billing failures

Example payload

Apple sends this one without a subtype. status 3 is the detail people miss: the grace period is over, but the subscription has moved into billing retry rather than straight to expired.

{
  "notificationType": "GRACE_PERIOD_EXPIRED",
  "notificationUUID": "7c05e3b8-9a41-4df7-b268-15fa0c74e2d6",
  "version": "2.0",
  "signedDate": 1789716938000,
  "data": {
    "appAppleId": 1234567890,
    "bundleId": "com.example.app",
    "bundleVersion": "142",
    "environment": "Production",
    "signedTransactionInfo": "eyJhbGciOiJFUzI1NiIsIng1YyI6...",
    "signedRenewalInfo": "eyJhbGciOiJFUzI1NiIsIng1YyI6...",
    "status": 3
  }
}

What it looks like in Slack

Critical

Grace period expired

Product
com.example.app.pro.monthly
Transaction
2000000798765432
Expires
2026-11-12T09:34:13.000Z
Auto-renew
On
Subscription status
Billing retry
Environment
Production

Questions about grace_period_expired

Does this mean the subscription is finished?

Not necessarily. The status drops to 3 (Billing retry), so Apple can still collect the payment and send DID_RENEW with subtype BILLING_RECOVERY, in which case no EXPIRED ever arrives. What has definitively ended is the free access the grace period granted.

Will I receive this event if I never enabled a grace period?

No. It is only sent for apps that switched billing grace period on in App Store Connect. Without it, a failed charge goes straight from DID_FAIL_TO_RENEW with no subtype into billing retry, and there is no intermediate notification.

Which event marks the start of the grace period?

DID_FAIL_TO_RENEW with subtype GRACE_PERIOD and status 4. Pairing that event with this one gives you the real length of the grace window for that subscriber, which is useful because the configured length differs by billing period.

What should my server do when this lands?

Revoke the paid entitlement immediately: the transaction's expiresDate is already in the past and Apple has stopped extending goodwill access. Yeethook raises this at critical level for exactly that reason, unlike the warning-level failure that preceded it.

Get this event in Slack or Discord

Connect Yeethook to receive grace_period_expired notifications in your team's Slack or Discord channels.

Get Started Free