> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://developer.fortresstech.io/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://developer.fortresstech.io/_mcp/server.

# subscription.ended

POST 

Fortress POSTs this payload to the URL configured for your subscription. See
[Webhooks](/webhooks/webhooks) for delivery, signing and retry rules, and the
[event page](/webhooks/webhook-events/webhooks/subscription-ended) for when it fires.


Reference: https://developer.fortresstech.io/api-reference/webhooks/on-subscription-ended

## Request

### Payload

- `eventId` (string, required) — Unique identifier for this event. Stable across delivery attempts, so consumers must dedupe on this value. Also sent as the X-Fortress-Event-Id header.
- `eventType` (enum, required) — What happened, in resource.action form. Also sent as the X-Fortress-Event-Type header. New values are added over time.
  - Allowed values: `subscription.ended`
- `occurredAt` (datetime, required) — ISO-8601 UTC timestamp of when the event occurred, not when it was delivered. A retried delivery carries the original occurredAt.
- `data` (SubscriptionEndedData, required) — Event payload. The shape is determined by eventType.
- `test` (boolean, optional) — Present, and true, only on a sample sent by the webhook trigger. A real delivery never carries it. It sits inside the signed body, unlike the X-Fortress-Test-Event header, so decide on this field.

## Types

### SubscriptionEndedData

Payload of a subscription.ended event. It is the subscription after the end. A subscription row publishes it at most once.

- `id` (string, required) — The subscription. Pass it to GET /subscriptions for the full record.
- `customerId` (string, required) — The customer who holds the subscription.
- `householdId` (string, required) — The household of the customer.
- `propertyId` (string, required) — The property of the household.
- `organizationId` (string, required) — The organization that owns the property.
- `leaseId` (string, required, nullable) — The lease the subscription is attached to. Null when it has none. It moves on lease renewal.
- `provider` (string, required) — The slug of the provider, for example PINATA. Act only on rows whose provider is your own slug.
- `serviceType` (string, required) — The type of service the provider offers, for example RENT_REPORTING.
- `planCode` (string, required) — The code of the plan the resident is on.
- `previousPlanCode` (string, required, nullable) — The code of the plan before the last plan change. Null when there was none.
- `status` (enum, required) — The lifecycle status of the subscription.
  - Allowed values: `ENDED`
- `changeReason` (enum, required) — The reason for the last change to the subscription. On this event it is MOVE_OUT, HOUSEHOLD_MOVE_OUT, or PROPERTY_DISABLED. The other values stay in the enum for forward compatibility.
  - Allowed values: `ENROLLMENT`, `RESIDENT_UPGRADE`, `RESIDENT_DOWNGRADE`, `NONPAYMENT_SUSPENSION`, `LEASE_RENEWAL`, `MOVE_OUT`, `HOUSEHOLD_MOVE_OUT`, `PROPERTY_DISABLED`
- `priceCents` (integer, required) — The plan price in cents, copied from the provider at enrollment.
- `partnerReference` (string, required, nullable) — The provider's ID for the resident. Null when not yet known.
- `version` (integer, required) — The ordering key. It increases on every write to the subscription row, not only on a write that raises an event, so the numbers you receive are not contiguous. Do not treat a gap as a missed event. Dedupe on eventId and order by version.
- `startedAt` (datetime, required, nullable) — ISO-8601 UTC timestamp of when the subscription started. Null before it starts.
- `endedAt` (datetime, required) — ISO-8601 UTC timestamp of when the subscription ended. Always set on this event.