PAM IntegrationCanonical event catalog

Canonical event catalog

These are the event types PlaylogiQ actively consumes for financial derivation, lifecycle, analytics, and gamification. Your PAM’s raw types are translated to these via the mapping engine — you are not required to emit these names verbatim.

Financial & account lifecycle

Canonical typeMeaning
registrationPlayer account created.
login / logoutSession start / end (auth level).
depositSuccessful deposit. Key payload field: amount.
deposit_failedA deposit attempt that failed.
withdrawal_requestA withdrawal was requested (not yet settled).
withdrawalA withdrawal that settled (money left the wallet).
verificationA generic verification step.
kyc_verifiedKYC identity approved.
status_changedAccount status changed at the PAM (the new status rides in the payload).
limit_setPlayer set a responsible-gaming limit.
self_exclusionPlayer self-excluded.
cooling_offPlayer entered a cooling-off period.

Gameplay

Canonical typeMeaning
betReal-money bet (casino). Payload: amount.
winReal-money win. Payload: amount.
bet_bonus / win_bonusBet / win with bonus funds.
bet_sport / win_sportSportsbook bet / win.
game_session_startA game session started.
game_session_endA game session ended.

Bonuses

Canonical typeMeaning
bonus_grantedOperator/PAM granted a bonus to the player.
bonus_claimedPlayer claimed a bonus.
bonus_completedA bonus completed its wagering.
bonus_expiredA bonus expired.

Custom events

Any type prefixed custom. is stored verbatim in your own namespace (e.g. custom.newsletter_opened). Custom events are never treated as “unknown”; use them for brand-specific signals you want in segments/journeys without polluting the canonical set.

Common payload fields

Canonical consumers read a small set of well-known fields (produce them with the payload field map):

FieldUsed by
amountDeposits, withdrawals, bets, wins — revenue derivation.
currencyCurrency of the amount.
methodPayment method (deposits) — powers “deposits by payment method”.
game / categoryGameplay attribution.

These fields are what the platform uses. The PAM sends its own field names; the operator maps them to these canonical names. Nothing is strictly required (an event with no payload is still stored), but mapping the recommended fields is what makes revenue, lifecycle, and analytics work.

Canonical eventRecommended canonical fieldsWhy
registrationplayer identity via the player field map: email, first_name, last_name, country, registration_datePopulates the CRM record on first contact.
depositamount, currency, methodDeposit totals (total_deposits, deposit_count, last_deposit_at) + deposits-by-method.
withdrawalamount, currencySettled-withdrawal totals (total_withdrawals, withdrawal_count).
bet / bet_sport / bet_bonusamount, currency, game/categoryWagering & GGR, game attribution, last_bet_at.
win / win_sport / win_bonusamount, currencyWagering & GGR.
bonus_granted / bonus_claimedamount, currencyBonus-cost analytics / ROI (NGR).
status_changedstatus (map PAM codes via enum:{…})Mirrors PAM account status onto the player.
kyc_verifiedMarks KYC complete for compliance/lifecycle.
game_session_start / game_session_endsession_id (top-level field), game/categorySession analytics.

Send amounts in a consistent unit and tell the operator whether it’s major units or minor units (cents) — the mapping applies cents_to_units when needed. See Recipes & scenarios for worked examples.

How financials are derived

A background worker folds the event stream into the player’s financial profile incrementally — each event is processed exactly once and its delta is added:

Profile fieldDerived from
total_deposits, deposit_count, last_deposit_atdeposit events
total_withdrawals, withdrawal_countwithdrawal (settled) events
total_wagered, total_ggrbet / bet_sport (stakes) − win / win_sport (payouts)
total_ngr, lifetime_valueGGR − bonus cost (bonus_claimed / win_bonus)
favorite_category, last_bet_atbet events

So a deposit event moves the deposit totals (not GGR), a bet/win pair moves wagering/GGR, and so on — exactly what you’d expect. Derivation is asynchronous (a few seconds after ingest), so the profile updates shortly after the event lands.

Events vs snapshot — avoid double-counting. These totals are computed by incrementing from events. POST /players can also SET absolute baselines (handy to import a player’s history in one shot). Use events for ongoing activity, and the snapshot only as a one-time baseline — don’t send both an event and a snapshot for the same money, or the totals will double-count.

Built-in aliases

Even without a mapping, these legacy/SDK forms normalize automatically:

  • player.<x><x> when <x> is canonical (e.g. player.loginlogin).
  • player.withdrawalwithdrawal_request, player.withdrawal_settledwithdrawal, player.bonus_grantbonus_granted, player.kyckyc_verified, player.status_changestatus_changed, …

An explicit event type map always takes precedence over these built-in aliases.