webhook.test diagnostic. Event names are stable, dotted,
lowercase strings. New optional fields may be added without a version change;
existing fields are not repurposed.
Every example below shows the event-specific data object. Perkstar wraps it
in the common envelope documented in Receive webhooks.
Field conventions
- IDs are opaque strings. Store and compare them exactly.
occurredAt,installedAt,expiresAt,creditedAt,scheduledStart,scheduledEnd,attendedAt, andresolvedAtare ISO 8601 UTC timestamps.createdin the outer envelope is Unix seconds.- Money fields ending in
Penceare integer minor units. - Nullable fields are sent as JSON
null; optional fields may be absent. testMode: trueidentifies a transaction generated with test credentials.
Customer lifecycle
customer.enrolled
customer.enrolled
customer.unenrolled
customer.unenrolled
customer.anonymized
customer.anonymized
customer.group_changed
customer.group_changed
previousGroup and currentGroup use one of vips, regulars, new,
slipping, atRisk, or lost; currentGroup can be null if a customer no
longer classifies into a group. These are Perkstar’s six exclusive lifecycle
groups, not operator-created saved segments. The first classification is stored
as a baseline without emitting customer.group_changed, so connecting a new
endpoint does not replay every existing customer. For a business’s first
interested endpoint, that baseline is established on the next completed
projection. Tracking begins after the warm-up sweep, so a transition inside
that initial window becomes baseline state rather than an event.
Wallet, scanner, expiry, and referrals
wallet.installed
wallet.installed
card.scanned
card.scanned
card.expired
card.expired
referral.created
referral.created
Observation boundaries
wallet.installedis the first provider-owned installation observation per pass and platform. Creating a pass or opening a save link is not an install. Apple reports a device registration directly. Recently issued Google passes are eligible on the 15-minute projector; older unseen objects back off to a lower check cadence, and provider responses or projector backlog can extend observation time. Do not treat 15 minutes as a delivery SLA.platformisappleorgoogle, anddetectionSourceisapple_device_registrationorgoogle_has_users. When a business enables its first interested endpoint, the next completed Google check stores existing state as a no-event baseline; Google-install tracking begins after that warm-up sweep.card.scannedcovers a successful online lookup in the Perkstar Scanner. It does not fire for an offline IndexedDB cache lookup, a dashboard customer search, or a POS integration lookup.credentialTypeiswallet_pass_serial,enrollment_barcode, orphysical_keyring.walletPassIdandplatformare non-null only for a direct wallet-pass serial; shared enrolment barcodes and physical keyrings are platform-neutral.card.expiredis per enrolment and effective expiry instant, not one event for the card template.expirySourceisenrollment_override,fixed_date, orfixed_term. Extending or reissuing the enrolment can produce another event when the later effective expiry is reached.referral.createdis a customer-to-customer loyalty referral. It is not a merchant, agency, or partner-referral invitation.statusispendingorcredited;bonusTimingison_signuporon_first_purchase, andcreditedAtisnullwhile a first-purchase referral remains pending.
Loyalty activity
transaction.created.type is normally STAMP, REDEEM, or ADJUST.
tier.changed.kind is status, cashback, or discount.
transaction.created
transaction.created
coupon.redeemed
coupon.redeemed
reward.redeemed
reward.redeemed
tier.changed
tier.changed
Tickets, gifts, and multipasses
ticket.purchased
ticket.purchased
ticket.cancelled
ticket.cancelled
ticket.refunded
ticket.refunded
gift.purchased
gift.purchased
gift.redeemed
gift.redeemed
multipass.purchased
multipass.purchased
Memberships
membership.purchased
membership.purchased
membership.renewed
membership.renewed
membership.cancelled
membership.cancelled
Engagement
feedback.submitted
feedback.submitted
automation.fired
automation.fired
broadcast.sent
broadcast.sent
Bookings
All booking events use the same schema. Only the event name and resultingstatus differ.
Required fields are
id, provider, providerBookingId, status,
scheduledStart, loyaltyCredited, source, and occurredAt. The fields
customerId, cardId, scheduledEnd, attendedAt, and resolvedAt are
nullable. serviceLabel and staffLabel contain the provider labels saved on
the booking.
Provider lifecycles can skip states. Acuity appointments enter Perkstar as
CONFIRMED, normally have no customerId until attendance matching runs, and
are auto-attended by the Perkstar scheduler after their end time plus 15
minutes. Acuity does not emit a PENDING booking.
booking.created
booking.created
booking.confirmed
booking.confirmed
booking.attended
booking.attended
booking.no_show
booking.no_show
booking.cancelled
booking.cancelled
Diagnostics
The targeted test ignores the endpoint’s subscription filter, but the webhook
must be active.

