QEHSQEHS

Developer portal

billing.subscription.updated.v1

The tenant plan, seat count, or trial state changed.

billing.subscription.updated.v1v1at-least-once delivery

Fires when

On plan upgrade/downgrade, seat count change, trial activation, or trial expiry. Scoped to tenant-owner role. Not fired for per-feature-flag toggles.

Payload fields

Envelope fields are shared across all event types. Event-specific data is nested under data.

FieldTypeRequiredDescription
eventIdstring (uuid)requiredUnique per delivery attempt. Use for deduplication.
eventstringrequiredFully-qualified event name, e.g. record.created.v1.
tenantIdstring (uuid)requiredTenant that owns the affected resource.
firedAtstring (date-time)requiredISO-8601 UTC timestamp when the event was emitted.
data.tenantIdstring (uuid)requiredAffected tenant (same as envelope tenantId — repeated for convenience).
data.planstringrequiredNew plan key, e.g. business or enterprise.
data.seatsintegerrequiredNew seat count after the change.
data.status"trialing" | "active" | "past_due" | "cancelled"requiredNew subscription status.
data.effectiveAtstring (date-time)requiredWhen the new plan/status takes effect.

Sample payload

{
  "eventId": "11111111-aaaa-bbbb-cccc-dddddddddddd",
  "event": "billing.subscription.updated.v1",
  "tenantId": "00000000-1111-2222-3333-444444444444",
  "firedAt": "2026-04-18T13:25:00.000Z",
  "data": {
    "tenantId": "00000000-1111-2222-3333-444444444444",
    "plan": "enterprise",
    "seats": 250,
    "status": "active",
    "effectiveAt": "2026-05-01T00:00:00.000Z"
  }
}

Verify the signature

Every delivery includes X-QEHS-Signature: sha256=<hex> and X-Job-ID headers. Verify before trusting the body. See the webhooks signature docs for a full verification example.