Skip to content

Event catalog

This catalog is the published mirror of Paylera’s single source of truth for event types — contracts/vocabulary.yaml (which also generates the SDK constants). Every event Paylera emits is listed here; anything not on this page is not emitted.

Subscribe to the exact event types you care about, or leave the endpoint’s event list empty to receive all of them. There is no prefix or wildcard matching — subscription.* is not a valid subscription; list each type. In production prefer an explicit list over “all” so a new event type doesn’t silently start hitting your handler.

Events are grouped by aggregate. The second segment is a past-tense action.

Subscriptions

EventWhen
subscription.createdSubscription created (in any starting state — trialing, active, or pending_activation).
subscription.updatedA subscription field changed (quantity, metadata, payment method, etc.). Carries previous_attributes; usually re-fetch.
subscription.plan_changedThe plan actually changed — immediately for upgrades and longer-cycle switches, or at the period roll when a scheduled change applies. plan_id now points at the new plan. See the payload below.
subscription.plan_change_scheduledA downgrade or shorter-cycle switch was queued; it applies at the period roll (effective_at). See the payload below.
subscription.plan_change_unscheduledA queued plan change was reverted before the roll; the subscription stays on its current plan.
subscription.cancel_scheduledcancel_at_period_end was set — cancellation is scheduled for the current period end.
subscription.canceledTransitioned to canceled.
subscription.expiredSubscription reached the end of its life and transitioned to ended.
subscription.pausedTransitioned to paused.
subscription.resumedReturned to active from paused.
subscription.trial_endedTrial ended; transitioned to active or past_due.
subscription.entitlements_changedA per-subscription entitlement override was upserted or cleared; affects exactly this subscription.
subscription.commitment_emittedA commitment shortfall landed as a top-up line on the period’s invoice; carries the shortfall amount.
subscription.commitment_satisfiedThe period met the commitment floor without a top-up (evidence event, no charge).

subscription.plan_changed payload

A compact transition payload — the from/to plan ids and timestamp, not the full subscription object:

{
"subscription_id": "…",
"from_plan_id": "…",
"to_plan_id": "…",
"status": "active",
"plan_changed_at": "2026-07-15T04:58:56Z"
}

subscription.plan_change_scheduled payload

{
"subscription_id": "…",
"current_plan_id": "…",
"scheduled_plan_id": "…",
"status": "active",
"scheduled_at": "2026-07-16T09:12:00Z",
"effective_at": "2026-08-01T00:00:00Z"
}

effective_at is the current period end — the moment the swap applies (a subscription.plan_changed event fires then). If the change is reverted first, subscription.plan_change_unscheduled fires instead, carrying unscheduled_plan_id and unscheduled_at.

Invoices

EventWhen
invoice.finalizedDraft transitioned to open.
invoice.issuedInvoice issued to the customer.
invoice.paidTransitioned to paid.
invoice.partially_paidA payment covered part of the balance; invoice is partially_paid.
invoice.overdueAn open/partially_paid invoice aged past its due_at.
invoice.voidedTransitioned to void.
invoice.uncollectibleTransitioned to uncollectible.
invoice.credit_note_issuedA credit note was issued against this invoice.
invoice.credit_note_voidedA credit note on this invoice was voided.

Payments

EventWhen
payment.requires_action3DS / SCA needed; see data.next_action.
payment.succeededCapture succeeded.
payment.failedCapture failed; reason in data.last_error.
payment.refundedThe payment was refunded (fully or partially).
payment.charged_backThe customer initiated a chargeback.
payment_state_conflictOps signal: the reconciler rejected a provider transition that was illegal for the payment’s current state.

Dunning

EventWhen
dunning.openedA dunning cycle opened after a failed payment.
dunning.retry_scheduledA dunning retry was scheduled.
dunning.awaiting_customer_actionThe cycle is waiting on the customer (e.g. SCA / a new card).
dunning.resolvedDunning succeeded; the subscription is back to active.
dunning.exhaustedThe dunning policy ran out of attempts.

Hosted checkout

Note the underscore — these are checkout_session.* events (not the dotted checkout.session.* names Stripe uses).

EventWhen
checkout_session.createdA hosted-checkout session URL was created.
checkout_session.completedThe customer finished checkout.
checkout_session.expiredThe session TTL elapsed without completion.
checkout_session.canceledThe merchant canceled the session before completion.

Catalog & entitlements

EventWhen
plan.entitlements_changedA plan’s entitlement grant was upserted or cleared; affects every subscription on that plan.
product.deleted / plan.deleted / feature.deleted / billable_metric.deletedThe catalog row was soft-deleted (archived) via the idempotent DELETE …/{code} surface.

Coupons

EventWhen
coupon.created / coupon.archived / coupon.restoredCoupon management lifecycle.
coupon.redeemedA customer attached the coupon (POST …/redeem).
coupon.detachedThe coupon was removed from a customer.

Subscription credits

EventWhen
subscription_credit.grantedA new-cycle credit grant was posted.
subscription_credit.consumedA usage track call debited an active grant.
subscription_credit.rolled_overPrior-cycle leftover survived the rollover policy into the new cycle.
subscription_credit.expiredThe remaining balance was written off at cycle end or rolled-credit TTL.

Customers

EventWhen
customer.createdCustomer object created.
customer.updatedAny customer field changed.
customer.external_ref_discoveredThe RevenueAttribution worker back-linked a previously-orphaned revenue.* row to this customer via an email-fingerprint match. Payload: customer_id, tenant_id, provider, external_id, revenue_event_id, discovered_at, discovery_method (v1: email_fingerprint).

Affiliates & payouts

EventWhen
affiliate.commission_payableA commission’s hold period elapsed and it became payable.
affiliate.commission_paidA commission was paid out.
affiliate.commission_reversedThe originating payment was refunded/charged back; the commission was reversed.
affiliate.commission_clawed_backAn already-paid commission was clawed back.
payout_batch.submittedA payout batch was submitted to the provider.
payout_batch.completedEvery transfer in the batch succeeded.
payout_batch.failedA transfer in the batch failed.
referral.earnings_accruedA referred tenant paid a Paylera platform invoice, accruing referral earnings.

Referrals (customer-to-customer)

Rewards for a merchant’s own customers referring each other. Paylera records the attribution and the reward ledger and tells you when to act; it never moves money for these — mint or claw back the credit in your own system, keyed on reward_id.

EventWhen
referral.attributedA customer signed up with another customer’s referral code (POST /v1/referral_attributions). One per referred customer, ever.
referral_reward.issuedThe referred customer’s first paid invoice settled; one event per beneficiary (referrer / referee) with amount_minor + currency to credit. Also sent when an operator issues a manual reward.
referral_reward.reversedThe qualifying payment was fully refunded or charged back (reason = refund / chargeback), or an operator reversed a reward (manual). Claw back what is still unspent.

Revenue (observability)

Normalised, multi-source revenue signals emitted when an external ingestor (Stripe, Toss, Apple ASSN V2, Google Play RTDN) lands a revenue row. They feed the revenue dashboards and do not supplant revenue recognition.

Money-bearing events (revenue.captured, revenue.refunded, revenue.subscription_started, revenue.subscription_renewed, revenue.subscription_recovered, revenue.one_time_purchase) carry amount_minor + currency (normalised to your reporting currency), source_amount_minor + source_currency (as observed at the provider), and fx_rate_used (string-encoded decimal). revenue.refunded carries a positive amount_minor; the event type conveys that it’s a refund.

EventWhen
revenue.capturedMoney captured (a charge succeeded).
revenue.refundedA refund was issued.
revenue.subscription_startedInitial subscription purchase.
revenue.subscription_renewedA recurring renewal succeeded.
revenue.subscription_recoveredGrace-period recovery: the subscription resumed paid status.
revenue.one_time_purchaseA one-time / IAP purchase.
revenue.subscription_canceledSubscription canceled (lifecycle; no money fields).
revenue.subscription_grace_period_enteredPayment failed; billing entered grace (lifecycle; no money fields).
revenue.subscription_expiredSubscription ended (lifecycle; no money fields).
revenue.unknown_currency_seenOps alert: an unrecognised ISO currency code was observed.

Operational & platform

Primarily ops/observability signals. tenant.* are platform-side (Paylera billing your tenant), not events about your own customers.

EventWhen
provider.webhook_receivedAn inbound provider webhook was accepted.
provider.webhook_unresolvedAn inbound provider webhook could not be matched to a payment.
rounding_adjustment_emittedA rounding adjustment line was emitted.
usage.late_event_receivedA usage event arrived after its period had closed.
webhook_delivery.dead_letteredAn endpoint’s delivery gave up after max_attempts. webhook_delivery.* events are never themselves fanned out to endpoints (no amplification loop).
tenant.entered_graceThe platform subscription went past_due; the 14-day grace window opened.
tenant.suspendedThe grace window elapsed; the tenant was suspended (end-customer subs paused).
tenant.frozen30 days of suspension passed; the platform subscription is terminal.
tenant.access_restoredPayment succeeded; the tenant walked back to active (paused subs auto-resume).
tenant.export_window_closedA frozen tenant’s export deadline elapsed.

Payload schema

Every event carries a canonical data object. For most aggregates it is the full canonical representation of the aggregate at the moment of the change — for example, invoice.paid carries the entire invoice including line items, totals, and payments, so you can trust the snapshot. A few transition events (subscription.plan_changed, subscription.commitment_emitted, …) carry a compact, change-specific payload instead of the full object, as shown above.

previous_attributes is included only on *.updated events and lists the fields that changed with their pre-change values. Because subscription.updated events for the same subscription can interleave, re-fetch the subscription when you handle one rather than trusting field order.

For the full canonical payload shape per event, see docs/billing_specs/billing_event_catalog/payload_schemas.yaml in the monorepo.

Schema versioning

Every event carries schema_version. Within a major version, fields are added freely; never removed or renamed. A new major version (schema_version: 2) ships behind a separate event type (e.g. invoice.paid.v2) with an overlap window, deprecation header, and sunset date — the same policy as the API. See Versioning.