plan.sold_out

A plan hit its sales cap, or a pass series filled its last seat, and Subscriby paused it automatically.

When this fires

A plan carrying a sales cap records its last allowed successful purchase, or a pass_series plan with a seat cap seats its last holder. Subscriby switches the plan off on the spot, records the reason, and fires this event once. The plan disappears from the portal and the bot until the creator switches it back on; existing subscribers are untouched.

A plan.deactivated event fires alongside it, carrying the same reason, so automations that only watch availability still see the change. Subscribe to this event when you care specifically about "sold out" — a waitlist, a restock reminder, a celebratory post.

Required ability

project-subscription-plan:view — token must carry this at mint time to subscribe an endpoint to this event.

Payload

{
  "id": "evt_01HX...",
  "type": "plan.sold_out",
  "created_at": "2026-09-08T14:05:00Z",
  "api_version": "2026-05-01",
  "project_id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13",
  "data": {
    "plan": {
      "id": "c4e82f16-93a7-4d5b-b81c-6e0f27a94d3b",
      "name": "Founding Members",
      "price": "49.00",
      "active": false
    },
    "plan_id": "c4e82f16-93a7-4d5b-b81c-6e0f27a94d3b",
    "plan_name": "Founding Members",
    "reason": "sales_cap_reached",
    "sales_cap": 10,
    "sales_cap_sold": 10
  }
}

Field reference

FieldTypeNotes
idstring ULIDUnique event id, prefixed evt_. Use for idempotent processing.
typestringAlways plan.sold_out for this event.
created_atISO 8601 timestampServer-side emission time.
api_versionstringWebhook API contract version.
project_idstring UUIDProject this event belongs to.
data.planobjectSnapshot of the plan after the pause: id, name, price, active (always false).
data.plan_idstring UUIDThe plan, flat, for consumers that never read the snapshot.
data.plan_namestringThe plan's name at the time of the pause.
data.reasonstringsales_cap_reached for a capped plan, seat_cap_reached for a season whose seats filled.
data.sales_capintegerThe cap that was hit: the plan's sales cap, or the series' seat cap.
data.sales_cap_soldintegerPurchases counted against that cap when it was hit.

Switching the plan back on from the dashboard, the API (publish) or the publish_plan tool clears the reason and, for a sales cap, restarts the counter at zero, so the same cap sells another batch. Raising or clearing the cap while the plan is on sale also restarts the counter. A seat-capped series keeps its seats taken; raise the seat cap before publishing it again.

How is this guide?

On this page

Subscriby is a product designed by you — for you.

No boardroom full of executives deciding what we ships next. Our roadmap always shaped by you with your feedback.

Share feedback or a request