> ## Documentation Index
> Fetch the complete documentation index at: https://docs.settlx.io/llms.txt
> Use this file to discover all available pages before exploring further.

# subscriber.expired

> The grace period has elapsed without payment. The subscription has ended. Revoke access now.

## When it fires

When a `past_due` or `pending` subscriber does not pay their invoice before the grace period ends. Settlx transitions the subscriber to `expired` and fires this event.

The subscriber cannot be reactivated automatically. To reinstate them, you must [re-enroll](/api-reference/subscriptions/enroll) them into the plan.

***

## What to do

**Revoke access to your product here.**

* Downgrade or disable the customer's account
* Send a "subscription expired" email with a resubscribe link
* Archive their session or active resources if applicable

<Warning>
  `subscriber.expired` is the definitive signal that access must end. Do not wait for a manual action — revoke access in this handler.
</Warning>

***

## Payload

```json theme={null}
{
  "event": "subscriber.expired",
  "subscriberId": "9f1e2d3c-4b5a-6789-abcd-ef0123456789",
  "merchantId": "f9e8d7c6-b5a4-3210-9876-543210fedcba",
  "planId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "email": "customer@example.com",
  "status": "expired",
  "currentPeriodEnd": "2026-06-19T00:00:00.000Z",
  "timestamp": "2026-05-26T00:00:01.000Z"
}
```

| Field              | Type   | Description                                |
| ------------------ | ------ | ------------------------------------------ |
| `event`            | string | Always `subscriber.expired`                |
| `subscriberId`     | string | UUID of the subscriber record              |
| `merchantId`       | string | Your merchant account UUID                 |
| `planId`           | string | UUID of the plan                           |
| `email`            | string | Subscriber email address                   |
| `status`           | string | Always `expired`                           |
| `currentPeriodEnd` | string | ISO 8601 — the period that was not renewed |
| `timestamp`        | string | ISO 8601 — when the event was generated    |

***

## Handler example

```javascript Node.js theme={null}
app.post('/webhooks/settlx', express.raw({ type: 'application/json' }), async (req, res) => {
  verifySignature(req); // see Webhook Integration for verification code

  const event = JSON.parse(req.body);

  if (event.event === 'subscriber.expired') {
    const { subscriberId, email, planId } = event;

    // Revoke product access
    await db.subscriptions.update(subscriberId, { status: 'expired' });
    await revokeAccess(email);

    // Notify customer with resubscribe link
    await sendEmail(email, 'subscription-expired', {
      resubscribeUrl: `https://yourapp.com/plans/${planId}`,
    });
  }

  res.status(200).json({ received: true });
});
```

***

## Related events

* [`subscriber.past_due`](/webhook-events/subscriber-past-due) — Invoice was created; this fires if payment never arrived.
* [`subscriber.cancelled`](/webhook-events/subscriber-cancelled) — Merchant-initiated cancellation (access ends at period end).
