Skip to navigation

subscription.ended

Defined, not yet delivered. Build and test your receiver against the trigger; real deliveries start when the publisher ships.

A resident subscription has ended.

Read the Webhooks guide for signature verification, retries, and idempotency, and the event envelope for the fields every event shares.

Payload

{
"eventId": "3b241101-e2bb-4255-8caf-4136c566a962",
"eventType": "subscription.ended",
"occurredAt": "2026-10-14T14:07:32.014Z",
"data": {
"id": "c1a7d2f0-5b1e-4c55-9d52-0c5e1c7f8a10",
"customerId": "123e4567-e89b-12d3-a456-426614174000",
"householdId": "7d6a1e0b-3c1c-4a39-8f0a-2b9f0e6c1d21",
"propertyId": "9e539f48-1c18-41a9-8718-1d4ed029f8b5",
"organizationId": "5c0f2b71-2b6a-4d18-9d3f-8e0a1f2c3d44",
"leaseId": "0f8f6c3e-7a52-4c0e-9a77-6a3f1b2d9e55",
"provider": "PINATA",
"serviceType": "RENT_REPORTING",
"planCode": "PREMIUM",
"previousPlanCode": "REWARDS",
"status": "ENDED",
"changeReason": "MOVE_OUT",
"priceCents": 899,
"partnerReference": "pin_84213",
"version": 4,
"startedAt": "2026-10-14T14:07:30.000Z",
"endedAt": "2026-12-01T00:00:00.000Z"
}
}

data fields

FieldTypeFormatNullableDescription
idstringuuidNoThe subscription.
customerIdstringuuidNoThe customer who holds the subscription.
householdIdstringuuidNoThe household of the customer.
propertyIdstringuuidNoThe property of the household.
organizationIdstringuuidNoThe organization that owns the property.
leaseIdstringuuidYesThe lease the subscription is attached to. It moves on lease renewal.
providerstring-NoThe slug of the provider, for example PINATA.
serviceTypestring-NoThe type of service the provider offers, for example RENT_REPORTING.
planCodestring-NoThe code of the plan the resident is on.
previousPlanCodestring-YesThe code of the plan before the last plan change.
statusstringenumNoAlways ENDED on this event.
changeReasonstringenumNoMOVE_OUT, HOUSEHOLD_MOVE_OUT or PROPERTY_DISABLED on this event. The enum has more values on other events, so keep a default branch.
priceCentsinteger-NoThe plan price in cents, copied from the provider at enrollment.
partnerReferencestring-YesThe provider’s ID for the resident.
versioninteger-NoThe ordering key. See Ordering.
startedAtstringdate-timeYesISO-8601 UTC timestamp of when the subscription started.
endedAtstringdate-timeNoISO-8601 UTC timestamp of when the subscription ended.

These names match the subscription resource. provider and serviceType are added so you can find your own rows. The payload is the subscription after the end.

Read the full record with GET /subscriptions.

Ordering

version is the ordering key. It increases on every write to the subscription row, not only on a write that raises an event. The versions you receive are therefore not contiguous. A gap does not mean a missed event.

Dedupe on eventId, which is stable across retries. Order events for one subscription by version. Ignore an event whose version is lower than the highest one you have applied.

Your rows only

Fortress delivers events for subscriptions of every provider. Act only on events whose provider is your own slug. Ignore the others.

When it fires

subscription.ended is sent once for a subscription row, in any of these cases:

  • The resident moves out.
  • The household moves out.
  • A collections claim ends the subscription.
  • The property is disabled.

changeReason names the cause of the last change. Each trigger sets one value:

TriggerchangeReason
A resident moves out and other residents stay.MOVE_OUT
The last resident moves out, or a collections claim is created.HOUSEHOLD_MOVE_OUT
The property is disabled.PROPERTY_DISABLED

When it does not fire

  • Fortress does not send it a second time for the same subscription row.
  • A change to a live subscription raises subscription.updated.