Which webhook events does RevenueDot send?

RevenueDot POSTs one JSON event per request to each matching webhook: { "api_version": "1.0", "event": { ... } }. The payload matches RevenueCat's webhook format field for field, so existing handlers keep working. Set up, verify and test webhooks with the webhooks guide.

  • Headers: Content-Type: application/json, User-Agent: RevenueDot-Webhooks/1.0, X-RevenueCat-Webhook-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256>, and your Authorization header when you set one.
  • Delivery: only HTTP 200 counts. Anything else, or no answer within 60 seconds, is retried after 5, 10, 20, 40 and 80 minutes, then marked failed. Deliveries can repeat: deduplicate on event.id.
  • Examples: recorded from a RevenueDot server on 2026-09-30 with Test Store purchases. Events that the Test Store cannot produce (pause, product change, extension, refund reversal, uncancellation, price consent) show the same builder's output with App Store or Google Play values. PURCHASE_REDEEMED and the funnel events show the builder's output for a web checkout on a test-mode Stripe account.
Event When it is sent
INITIAL_PURCHASE The first purchase of a subscription, including a free trial start.
RENEWAL A new paid period: a renewal, a trial converting (is_trial_conversion: true), a lapsed customer resubscribing, or a recovered billing issue.
CANCELLATION Auto-renew was turned off, or the purchase was refunded. Access continues to expiration_at_ms unless it was a refund. A refund has cancel_reason: CUSTOMER_SUPPORT and a negative price.
UNCANCELLATION Auto-renew was turned back on before the subscription expired.
NON_RENEWING_PURCHASE A one-time purchase: consumable, non-consumable or lifetime.
SUBSCRIPTION_PAUSED A Google Play subscription is scheduled to pause. It will not renew at the end of the period.
EXPIRATION Access ended: the period ran out, billing retry gave up or the subscription paused.
BILLING_ISSUE A renewal charge failed. The store retries; access may continue in a grace period.
PRODUCT_CHANGE The customer changed product: an upgrade now, or a downgrade or crossgrade scheduled for the next renewal. product_id is the old product.
SUBSCRIPTION_EXTENDED The current period got longer without a new payment: an App Store renewal extension or a Google Play deferral.
REFUND_REVERSED A refund was reversed and access is back.
PRICE_INCREASE_CONSENT_REQUIRED The store asks the customer to accept a price increase.
PRICE_INCREASE_CONSENT_APPROVED The customer accepted the price increase.
TRANSFER A purchase moved to another customer because that customer restored it (transfer behaviour transfer or transfer_if_no_active).
VIRTUAL_CURRENCY_TRANSACTION An in-app currency was credited because a purchase of a granting product was recorded (source: in_app_purchase), or because a rewarded ad was verified and a reward rule granted currency (source: ad_reward, a RevenueDot extension; product_id and store are null and transaction_id is the ad network's transaction id). Not sent for adjustments made through the API.
EXPERIMENT_ENROLLMENT A customer joined an offering experiment: the first offerings request that enrolled them. Its app_user_id is the id that asked for offerings. Sent once per customer and experiment, as a production event with no app, so a webhook set to sandbox only or to one app does not get it. See Experiments.
SUBSCRIBER_ALIAS A new app user id joined an existing customer: logIn onto an anonymous customer, logIn that merged an anonymous customer into an existing one, Android's alias call, or a restore that merged two customers. RevenueCat deprecated this event and sends it only to older projects, so RevenueDot delivers it only to webhooks whose event_types filter names subscriber_alias; it always appears in the customer's event history.
PURCHASE_REDEEMED A web purchase was redeemed in the app through a redemption link (POST /v1/subscribers/redeem_purchase): the anonymous customer who paid on the web was merged into the app user. Fields follow RevenueCat's sample; app_user_id is added so analytics tools know who it is. See Redemption links.
FUNNEL_VIEWED RevenueDot type. A visitor opened a published funnel. Opt-in: sent only to webhooks and integrations whose event_types names funnel_viewed. app_user_id is null unless the page URL had ?app_user_id=. See Funnels.
FUNNEL_STEP_COMPLETED RevenueDot type. A visitor finished a funnel step, with the answer for a question (an email step's answer is provided, never the address). Opt-in: funnel_step_completed.
FUNNEL_PURCHASE RevenueDot type. A funnel's checkout was paid. app_user_id is the buyer's (anonymous unless the page had one) and product_id the Stripe price. Opt-in: funnel_purchase.
PAYWALL_IMPRESSION A paywall was shown (RevenueDot type; the SDK reports it to POST /v1/events). Opt-in: sent only to webhooks and integrations whose event_types names paywall_impression. RevenueCat sends paywall events to Amplitude, Mixpanel, PostHog and Segment only, not to webhooks. See Integrations.
PAYWALL_CLOSE The customer closed a paywall. Opt-in: paywall_close.
PAYWALL_CANCEL The customer dismissed the store's payment sheet on a paywall. Opt-in: paywall_cancel.
PAYWALL_EXIT_OFFER An exit offer was shown when the customer left a paywall. Opt-in: paywall_exit_offer.
PAYWALL_COMPONENT_INTERACTED The customer changed a paywall control: a tab, package, button or sheet. Opt-in: paywall_component_interacted.
PAYWALL_PURCHASE_INITIATED The customer started a purchase from a paywall. A RevenueDot addition: RevenueCat does not forward it. Opt-in: paywall_purchase_initiated.
PAYWALL_PURCHASE_ERROR A purchase started from a paywall failed. A RevenueDot addition: RevenueCat does not forward it. Opt-in: paywall_purchase_error.
TEST Sent by the dashboard's "Send test event" or POST .../integrations/webhooks/{id}/test. Shaped like a purchase, for no real customer, so it never carries experiments.

Accepted in a webhook's event_types filter but never sent, because RevenueDot never has the fact behind them: TEMPORARY_ENTITLEMENT_GRANT (RevenueDot never grants access it has not verified with the store; during a store outage the SDK keeps the purchase and grants access on the device from the offline entitlement mapping) and INVOICE_ISSUANCE (only RevenueCat Billing issues invoices). That makes 19 of RevenueCat's 21 event types sent. SUBSCRIBER_ALIAS and RevenueDot's three funnel types (FUNNEL_VIEWED, FUNNEL_STEP_COMPLETED, FUNNEL_PURCHASE) are opt-in: they go only to webhooks whose filter names them. So are the seven paywall types the SDKs report (PAYWALL_IMPRESSION, PAYWALL_CLOSE, PAYWALL_CANCEL, PAYWALL_EXIT_OFFER, PAYWALL_COMPONENT_INTERACTED, PAYWALL_PURCHASE_INITIATED, PAYWALL_PURCHASE_ERROR); RevenueCat sends paywall events to analytics integrations only, not to webhooks.

INITIAL_PURCHASE#

The first purchase of a subscription, including a free trial start.

Field Type Description
id string Unique event id (upper-case UUID). Deduplicate on it.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_id string RevenueDot app id. Left out for promotional grants.
app_user_id string The app user id the event is about (a non-anonymous alias when there is one).
original_app_user_id string The customer's first app user id.
aliases array of string Every app user id of the customer.
product_id string Store product id. For PRODUCT_CHANGE, the product the customer changed from.
period_type NORMAL, TRIAL, INTRO, PROMOTIONAL, PREPAID
purchased_at_ms integer Start of the period. Epoch milliseconds.
expiration_at_ms integer or null End of the period, or null for lifetime. Epoch milliseconds.
environment PRODUCTION, SANDBOX
entitlement_id null Always null (deprecated in RevenueCat's payload).
entitlement_ids array of string Lookup keys of the entitlements the product unlocks, or null.
presented_offering_id string or null Offering the purchase was made from, when the SDK sent it.
transaction_id string or null Store transaction id of this period.
original_transaction_id string or null First transaction id of the subscription.
is_family_share boolean
country_code string or null ISO 3166-1 alpha-2.
currency string or null ISO 4217.
price number or null USD. Money moved only on INITIAL_PURCHASE, RENEWAL, NON_RENEWING_PURCHASE, REFUND_REVERSED and refunds (negative); 0 on other events.
price_in_purchased_currency number or null Same as price, in currency.
subscriber_attributes object
store APP_STORE, MAC_APP_STORE, PLAY_STORE, AMAZON, STRIPE, RC_BILLING, PROMOTIONAL, TEST_STORE, PADDLE, ROKU, EXTERNAL
takehome_percentage number 1 minus the estimated store commission.
tax_percentage number Always 0 today.
commission_percentage number Estimated store commission (0.3 for App Store and Google Play, 0 for Test Store).
offer_code string or null The App Store or Google Play offer id of this period (a promotional offer, offer code, win-back offer or Google offer), or null. See Win-back offers.
experiments array of object Every offering experiment the customer joined. Left out when there are none. See Experiments.
experiments[].experiment_id string
experiments[].experiment_variant a, b, c, d
experiments[].enrolled_at_ms integer Epoch milliseconds.

Example:

JSON
{
  "api_version": "1.0",
  "event": {
    "id": "66339910-3BFF-49F4-B873-D1283D673DE2",
    "type": "INITIAL_PURCHASE",
    "event_timestamp_ms": 1790800914034,
    "app_id": "appvnrm0a5h",
    "app_user_id": "user_1",
    "original_app_user_id": "user_1",
    "aliases": [
      "user_1"
    ],
    "product_id": "pro_monthly",
    "period_type": "NORMAL",
    "purchased_at_ms": 1790800914000,
    "expiration_at_ms": 1793392914000,
    "environment": "SANDBOX",
    "entitlement_id": null,
    "entitlement_ids": [
      "pro"
    ],
    "presented_offering_id": "default",
    "transaction_id": "test_1790800914000_quickstart",
    "original_transaction_id": "test_1790800914000_quickstart",
    "is_family_share": false,
    "country_code": null,
    "currency": "USD",
    "price": 9.99,
    "price_in_purchased_currency": 9.99,
    "subscriber_attributes": {},
    "store": "TEST_STORE",
    "takehome_percentage": 1,
    "tax_percentage": 0,
    "commission_percentage": 0,
    "offer_code": null
  }
}

RENEWAL#

A new paid period: a renewal, a trial converting (is_trial_conversion: true), a lapsed customer resubscribing, or a recovered billing issue.

Field Type Description
id string Unique event id (upper-case UUID). Deduplicate on it.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_id string RevenueDot app id. Left out for promotional grants.
app_user_id string The app user id the event is about (a non-anonymous alias when there is one).
original_app_user_id string The customer's first app user id.
aliases array of string Every app user id of the customer.
product_id string Store product id. For PRODUCT_CHANGE, the product the customer changed from.
period_type NORMAL, TRIAL, INTRO, PROMOTIONAL, PREPAID
purchased_at_ms integer Start of the period. Epoch milliseconds.
expiration_at_ms integer or null End of the period, or null for lifetime. Epoch milliseconds.
environment PRODUCTION, SANDBOX
entitlement_id null Always null (deprecated in RevenueCat's payload).
entitlement_ids array of string Lookup keys of the entitlements the product unlocks, or null.
presented_offering_id string or null Offering the purchase was made from, when the SDK sent it.
transaction_id string or null Store transaction id of this period.
original_transaction_id string or null First transaction id of the subscription.
is_family_share boolean
country_code string or null ISO 3166-1 alpha-2.
currency string or null ISO 4217.
price number or null USD. Money moved only on INITIAL_PURCHASE, RENEWAL, NON_RENEWING_PURCHASE, REFUND_REVERSED and refunds (negative); 0 on other events.
price_in_purchased_currency number or null Same as price, in currency.
subscriber_attributes object
store APP_STORE, MAC_APP_STORE, PLAY_STORE, AMAZON, STRIPE, RC_BILLING, PROMOTIONAL, TEST_STORE, PADDLE, ROKU, EXTERNAL
takehome_percentage number 1 minus the estimated store commission.
tax_percentage number Always 0 today.
commission_percentage number Estimated store commission (0.3 for App Store and Google Play, 0 for Test Store).
offer_code string or null The App Store or Google Play offer id of this period (a promotional offer, offer code, win-back offer or Google offer), or null. See Win-back offers.
experiments array of object Every offering experiment the customer joined. Left out when there are none. See Experiments.
experiments[].experiment_id string
experiments[].experiment_variant a, b, c, d
experiments[].enrolled_at_ms integer Epoch milliseconds.
is_trial_conversion boolean True for the first paid period after a free trial.

Example:

JSON
{
  "api_version": "1.0",
  "event": {
    "id": "96E753E0-4DEC-4F9B-ABC5-55FBC363769A",
    "type": "RENEWAL",
    "event_timestamp_ms": 1790800923895,
    "app_id": "appvnrm0a5h",
    "app_user_id": "user_trial_conversion",
    "original_app_user_id": "user_trial_conversion",
    "aliases": [
      "user_trial_conversion"
    ],
    "product_id": "pro_monthly",
    "period_type": "NORMAL",
    "purchased_at_ms": 1790800923895,
    "expiration_at_ms": 1793392923895,
    "environment": "SANDBOX",
    "entitlement_id": null,
    "entitlement_ids": [
      "pro"
    ],
    "presented_offering_id": null,
    "transaction_id": "test_1790800923895_c8ba6a2d-5f87-4e08-bb4b-f880624bcd6c..1",
    "original_transaction_id": "test_1790800923895_c8ba6a2d-5f87-4e08-bb4b-f880624bcd6c",
    "is_family_share": false,
    "country_code": null,
    "currency": "USD",
    "price": 9.99,
    "price_in_purchased_currency": 9.99,
    "subscriber_attributes": {},
    "store": "TEST_STORE",
    "takehome_percentage": 1,
    "tax_percentage": 0,
    "commission_percentage": 0,
    "offer_code": null,
    "is_trial_conversion": true
  }
}

CANCELLATION#

Auto-renew was turned off, or the purchase was refunded. Access continues to expiration_at_ms unless it was a refund. A refund has cancel_reason: CUSTOMER_SUPPORT and a negative price.

Field Type Description
id string Unique event id (upper-case UUID). Deduplicate on it.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_id string RevenueDot app id. Left out for promotional grants.
app_user_id string The app user id the event is about (a non-anonymous alias when there is one).
original_app_user_id string The customer's first app user id.
aliases array of string Every app user id of the customer.
product_id string Store product id. For PRODUCT_CHANGE, the product the customer changed from.
period_type NORMAL, TRIAL, INTRO, PROMOTIONAL, PREPAID
purchased_at_ms integer Start of the period. Epoch milliseconds.
expiration_at_ms integer or null End of the period, or null for lifetime. Epoch milliseconds.
environment PRODUCTION, SANDBOX
entitlement_id null Always null (deprecated in RevenueCat's payload).
entitlement_ids array of string Lookup keys of the entitlements the product unlocks, or null.
presented_offering_id string or null Offering the purchase was made from, when the SDK sent it.
transaction_id string or null Store transaction id of this period.
original_transaction_id string or null First transaction id of the subscription.
is_family_share boolean
country_code string or null ISO 3166-1 alpha-2.
currency string or null ISO 4217.
price number or null USD. Money moved only on INITIAL_PURCHASE, RENEWAL, NON_RENEWING_PURCHASE, REFUND_REVERSED and refunds (negative); 0 on other events.
price_in_purchased_currency number or null Same as price, in currency.
subscriber_attributes object
store APP_STORE, MAC_APP_STORE, PLAY_STORE, AMAZON, STRIPE, RC_BILLING, PROMOTIONAL, TEST_STORE, PADDLE, ROKU, EXTERNAL
takehome_percentage number 1 minus the estimated store commission.
tax_percentage number Always 0 today.
commission_percentage number Estimated store commission (0.3 for App Store and Google Play, 0 for Test Store).
offer_code string or null The App Store or Google Play offer id of this period (a promotional offer, offer code, win-back offer or Google offer), or null. See Win-back offers.
experiments array of object Every offering experiment the customer joined. Left out when there are none. See Experiments.
experiments[].experiment_id string
experiments[].experiment_variant a, b, c, d
experiments[].enrolled_at_ms integer Epoch milliseconds.
cancel_reason UNSUBSCRIBE, BILLING_ERROR, DEVELOPER_INITIATED, PRICE_INCREASE, CUSTOMER_SUPPORT, UNKNOWN

Example (auto-renew turned off):

JSON
{
  "api_version": "1.0",
  "event": {
    "id": "5A47B64A-DBC9-48CF-B0BE-F15041559619",
    "type": "CANCELLATION",
    "event_timestamp_ms": 1790800924019,
    "app_id": "appvnrm0a5h",
    "app_user_id": "user_cancel",
    "original_app_user_id": "user_cancel",
    "aliases": [
      "user_cancel"
    ],
    "product_id": "pro_monthly",
    "period_type": "NORMAL",
    "purchased_at_ms": 1790800924019,
    "expiration_at_ms": 1793392924019,
    "environment": "SANDBOX",
    "entitlement_id": null,
    "entitlement_ids": [
      "pro"
    ],
    "presented_offering_id": null,
    "transaction_id": "test_1790800924019_bd497110-3c45-48fb-a928-437d22de3e2b",
    "original_transaction_id": "test_1790800924019_bd497110-3c45-48fb-a928-437d22de3e2b",
    "is_family_share": false,
    "country_code": null,
    "currency": "USD",
    "price": 0,
    "price_in_purchased_currency": 0,
    "subscriber_attributes": {},
    "store": "TEST_STORE",
    "takehome_percentage": 1,
    "tax_percentage": 0,
    "commission_percentage": 0,
    "offer_code": null,
    "cancel_reason": "UNSUBSCRIBE"
  }
}

Example (refund):

JSON
{
  "api_version": "1.0",
  "event": {
    "id": "BF6C2BFB-91A8-4AD8-B3BB-5BE5E708B3DF",
    "type": "CANCELLATION",
    "event_timestamp_ms": 1790800924088,
    "app_id": "appvnrm0a5h",
    "app_user_id": "user_refund",
    "original_app_user_id": "user_refund",
    "aliases": [
      "user_refund"
    ],
    "product_id": "pro_monthly",
    "period_type": "NORMAL",
    "purchased_at_ms": 1790800924088,
    "expiration_at_ms": 1793392924088,
    "environment": "SANDBOX",
    "entitlement_id": null,
    "entitlement_ids": [
      "pro"
    ],
    "presented_offering_id": null,
    "transaction_id": "test_1790800924088_d06c5cf7-096e-41e7-8d2c-d91e5ac57fb1",
    "original_transaction_id": "test_1790800924088_d06c5cf7-096e-41e7-8d2c-d91e5ac57fb1",
    "is_family_share": false,
    "country_code": null,
    "currency": "USD",
    "price": -9.99,
    "price_in_purchased_currency": -9.99,
    "subscriber_attributes": {},
    "store": "TEST_STORE",
    "takehome_percentage": 1,
    "tax_percentage": 0,
    "commission_percentage": 0,
    "offer_code": null,
    "cancel_reason": "CUSTOMER_SUPPORT"
  }
}

UNCANCELLATION#

Auto-renew was turned back on before the subscription expired.

Field Type Description
id string Unique event id (upper-case UUID). Deduplicate on it.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_id string RevenueDot app id. Left out for promotional grants.
app_user_id string The app user id the event is about (a non-anonymous alias when there is one).
original_app_user_id string The customer's first app user id.
aliases array of string Every app user id of the customer.
product_id string Store product id. For PRODUCT_CHANGE, the product the customer changed from.
period_type NORMAL, TRIAL, INTRO, PROMOTIONAL, PREPAID
purchased_at_ms integer Start of the period. Epoch milliseconds.
expiration_at_ms integer or null End of the period, or null for lifetime. Epoch milliseconds.
environment PRODUCTION, SANDBOX
entitlement_id null Always null (deprecated in RevenueCat's payload).
entitlement_ids array of string Lookup keys of the entitlements the product unlocks, or null.
presented_offering_id string or null Offering the purchase was made from, when the SDK sent it.
transaction_id string or null Store transaction id of this period.
original_transaction_id string or null First transaction id of the subscription.
is_family_share boolean
country_code string or null ISO 3166-1 alpha-2.
currency string or null ISO 4217.
price number or null USD. Money moved only on INITIAL_PURCHASE, RENEWAL, NON_RENEWING_PURCHASE, REFUND_REVERSED and refunds (negative); 0 on other events.
price_in_purchased_currency number or null Same as price, in currency.
subscriber_attributes object
store APP_STORE, MAC_APP_STORE, PLAY_STORE, AMAZON, STRIPE, RC_BILLING, PROMOTIONAL, TEST_STORE, PADDLE, ROKU, EXTERNAL
takehome_percentage number 1 minus the estimated store commission.
tax_percentage number Always 0 today.
commission_percentage number Estimated store commission (0.3 for App Store and Google Play, 0 for Test Store).
offer_code string or null The App Store or Google Play offer id of this period (a promotional offer, offer code, win-back offer or Google offer), or null. See Win-back offers.
experiments array of object Every offering experiment the customer joined. Left out when there are none. See Experiments.
experiments[].experiment_id string
experiments[].experiment_variant a, b, c, d
experiments[].enrolled_at_ms integer Epoch milliseconds.

Example:

JSON
{
  "api_version": "1.0",
  "event": {
    "id": "0C1F6F2E-5B7A-4E8B-9D1C-3A2B1C0D9E01",
    "type": "UNCANCELLATION",
    "event_timestamp_ms": 1790800914034,
    "app_id": "appugfw01uy",
    "app_user_id": "user_1",
    "original_app_user_id": "user_1",
    "aliases": [
      "user_1"
    ],
    "product_id": "pro_monthly",
    "period_type": "NORMAL",
    "purchased_at_ms": 1790800914000,
    "expiration_at_ms": 1793392914000,
    "environment": "PRODUCTION",
    "entitlement_id": null,
    "entitlement_ids": [
      "pro"
    ],
    "presented_offering_id": null,
    "transaction_id": "2000000912345679",
    "original_transaction_id": "2000000912345678",
    "is_family_share": false,
    "country_code": "US",
    "currency": "USD",
    "price": 0,
    "price_in_purchased_currency": 0,
    "subscriber_attributes": {},
    "store": "APP_STORE",
    "takehome_percentage": 0.7,
    "tax_percentage": 0,
    "commission_percentage": 0.3,
    "offer_code": null
  }
}

NON_RENEWING_PURCHASE#

A one-time purchase: consumable, non-consumable or lifetime.

Field Type Description
id string Unique event id (upper-case UUID). Deduplicate on it.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_id string RevenueDot app id. Left out for promotional grants.
app_user_id string The app user id the event is about (a non-anonymous alias when there is one).
original_app_user_id string The customer's first app user id.
aliases array of string Every app user id of the customer.
product_id string Store product id. For PRODUCT_CHANGE, the product the customer changed from.
period_type NORMAL, TRIAL, INTRO, PROMOTIONAL, PREPAID
purchased_at_ms integer Start of the period. Epoch milliseconds.
expiration_at_ms integer or null End of the period, or null for lifetime. Epoch milliseconds.
environment PRODUCTION, SANDBOX
entitlement_id null Always null (deprecated in RevenueCat's payload).
entitlement_ids array of string Lookup keys of the entitlements the product unlocks, or null.
presented_offering_id string or null Offering the purchase was made from, when the SDK sent it.
transaction_id string or null Store transaction id of this period.
original_transaction_id string or null First transaction id of the subscription.
is_family_share boolean
country_code string or null ISO 3166-1 alpha-2.
currency string or null ISO 4217.
price number or null USD. Money moved only on INITIAL_PURCHASE, RENEWAL, NON_RENEWING_PURCHASE, REFUND_REVERSED and refunds (negative); 0 on other events.
price_in_purchased_currency number or null Same as price, in currency.
subscriber_attributes object
store APP_STORE, MAC_APP_STORE, PLAY_STORE, AMAZON, STRIPE, RC_BILLING, PROMOTIONAL, TEST_STORE, PADDLE, ROKU, EXTERNAL
takehome_percentage number 1 minus the estimated store commission.
tax_percentage number Always 0 today.
commission_percentage number Estimated store commission (0.3 for App Store and Google Play, 0 for Test Store).
offer_code string or null The App Store or Google Play offer id of this period (a promotional offer, offer code, win-back offer or Google offer), or null. See Win-back offers.
experiments array of object Every offering experiment the customer joined. Left out when there are none. See Experiments.
experiments[].experiment_id string
experiments[].experiment_variant a, b, c, d
experiments[].enrolled_at_ms integer Epoch milliseconds.

Example:

JSON
{
  "api_version": "1.0",
  "event": {
    "id": "457C5C58-FF87-4CF3-908A-EB31E34846E1",
    "type": "NON_RENEWING_PURCHASE",
    "event_timestamp_ms": 1790800924176,
    "app_id": "appvnrm0a5h",
    "app_user_id": "user_life",
    "original_app_user_id": "user_life",
    "aliases": [
      "user_life"
    ],
    "product_id": "pro_lifetime",
    "period_type": "NORMAL",
    "purchased_at_ms": 1790800924176,
    "expiration_at_ms": null,
    "environment": "SANDBOX",
    "entitlement_id": null,
    "entitlement_ids": [
      "pro"
    ],
    "presented_offering_id": null,
    "transaction_id": "test_1790800924176_a2fda0f6-622f-4e5d-9a5c-003144fb7a2f",
    "original_transaction_id": "test_1790800924176_a2fda0f6-622f-4e5d-9a5c-003144fb7a2f",
    "is_family_share": false,
    "country_code": null,
    "currency": "USD",
    "price": 49.99,
    "price_in_purchased_currency": 49.99,
    "subscriber_attributes": {},
    "store": "TEST_STORE",
    "takehome_percentage": 1,
    "tax_percentage": 0,
    "commission_percentage": 0,
    "offer_code": null
  }
}

SUBSCRIPTION_PAUSED#

A Google Play subscription is scheduled to pause. It will not renew at the end of the period.

Field Type Description
id string Unique event id (upper-case UUID). Deduplicate on it.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_id string RevenueDot app id. Left out for promotional grants.
app_user_id string The app user id the event is about (a non-anonymous alias when there is one).
original_app_user_id string The customer's first app user id.
aliases array of string Every app user id of the customer.
product_id string Store product id. For PRODUCT_CHANGE, the product the customer changed from.
period_type NORMAL, TRIAL, INTRO, PROMOTIONAL, PREPAID
purchased_at_ms integer Start of the period. Epoch milliseconds.
expiration_at_ms integer or null End of the period, or null for lifetime. Epoch milliseconds.
environment PRODUCTION, SANDBOX
entitlement_id null Always null (deprecated in RevenueCat's payload).
entitlement_ids array of string Lookup keys of the entitlements the product unlocks, or null.
presented_offering_id string or null Offering the purchase was made from, when the SDK sent it.
transaction_id string or null Store transaction id of this period.
original_transaction_id string or null First transaction id of the subscription.
is_family_share boolean
country_code string or null ISO 3166-1 alpha-2.
currency string or null ISO 4217.
price number or null USD. Money moved only on INITIAL_PURCHASE, RENEWAL, NON_RENEWING_PURCHASE, REFUND_REVERSED and refunds (negative); 0 on other events.
price_in_purchased_currency number or null Same as price, in currency.
subscriber_attributes object
store APP_STORE, MAC_APP_STORE, PLAY_STORE, AMAZON, STRIPE, RC_BILLING, PROMOTIONAL, TEST_STORE, PADDLE, ROKU, EXTERNAL
takehome_percentage number 1 minus the estimated store commission.
tax_percentage number Always 0 today.
commission_percentage number Estimated store commission (0.3 for App Store and Google Play, 0 for Test Store).
offer_code string or null The App Store or Google Play offer id of this period (a promotional offer, offer code, win-back offer or Google offer), or null. See Win-back offers.
experiments array of object Every offering experiment the customer joined. Left out when there are none. See Experiments.
experiments[].experiment_id string
experiments[].experiment_variant a, b, c, d
experiments[].enrolled_at_ms integer Epoch milliseconds.
auto_resume_at_ms integer or null When it resumes. Epoch milliseconds.

Example:

JSON
{
  "api_version": "1.0",
  "event": {
    "id": "0C1F6F2E-5B7A-4E8B-9D1C-3A2B1C0D9E02",
    "type": "SUBSCRIPTION_PAUSED",
    "event_timestamp_ms": 1790800914034,
    "app_id": "app9l7z3oij",
    "app_user_id": "user_1",
    "original_app_user_id": "user_1",
    "aliases": [
      "user_1"
    ],
    "product_id": "pro",
    "period_type": "NORMAL",
    "purchased_at_ms": 1790800914000,
    "expiration_at_ms": 1793392914000,
    "environment": "PRODUCTION",
    "entitlement_id": null,
    "entitlement_ids": [
      "pro"
    ],
    "presented_offering_id": null,
    "transaction_id": "GPA.3372-1234-5678-90123..1",
    "original_transaction_id": "GPA.3372-1234-5678-90123",
    "is_family_share": false,
    "country_code": "US",
    "currency": "USD",
    "price": 0,
    "price_in_purchased_currency": 0,
    "subscriber_attributes": {},
    "store": "PLAY_STORE",
    "takehome_percentage": 0.7,
    "tax_percentage": 0,
    "commission_percentage": 0.3,
    "offer_code": null,
    "auto_resume_at_ms": 1796071314000
  }
}

EXPIRATION#

Access ended: the period ran out, billing retry gave up or the subscription paused.

Field Type Description
id string Unique event id (upper-case UUID). Deduplicate on it.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_id string RevenueDot app id. Left out for promotional grants.
app_user_id string The app user id the event is about (a non-anonymous alias when there is one).
original_app_user_id string The customer's first app user id.
aliases array of string Every app user id of the customer.
product_id string Store product id. For PRODUCT_CHANGE, the product the customer changed from.
period_type NORMAL, TRIAL, INTRO, PROMOTIONAL, PREPAID
purchased_at_ms integer Start of the period. Epoch milliseconds.
expiration_at_ms integer or null End of the period, or null for lifetime. Epoch milliseconds.
environment PRODUCTION, SANDBOX
entitlement_id null Always null (deprecated in RevenueCat's payload).
entitlement_ids array of string Lookup keys of the entitlements the product unlocks, or null.
presented_offering_id string or null Offering the purchase was made from, when the SDK sent it.
transaction_id string or null Store transaction id of this period.
original_transaction_id string or null First transaction id of the subscription.
is_family_share boolean
country_code string or null ISO 3166-1 alpha-2.
currency string or null ISO 4217.
price number or null USD. Money moved only on INITIAL_PURCHASE, RENEWAL, NON_RENEWING_PURCHASE, REFUND_REVERSED and refunds (negative); 0 on other events.
price_in_purchased_currency number or null Same as price, in currency.
subscriber_attributes object
store APP_STORE, MAC_APP_STORE, PLAY_STORE, AMAZON, STRIPE, RC_BILLING, PROMOTIONAL, TEST_STORE, PADDLE, ROKU, EXTERNAL
takehome_percentage number 1 minus the estimated store commission.
tax_percentage number Always 0 today.
commission_percentage number Estimated store commission (0.3 for App Store and Google Play, 0 for Test Store).
offer_code string or null The App Store or Google Play offer id of this period (a promotional offer, offer code, win-back offer or Google offer), or null. See Win-back offers.
experiments array of object Every offering experiment the customer joined. Left out when there are none. See Experiments.
experiments[].experiment_id string
experiments[].experiment_variant a, b, c, d
experiments[].enrolled_at_ms integer Epoch milliseconds.
expiration_reason UNSUBSCRIBE, BILLING_ERROR, DEVELOPER_INITIATED, PRICE_INCREASE, CUSTOMER_SUPPORT, UNKNOWN, SUBSCRIPTION_PAUSED

Example:

JSON
{
  "api_version": "1.0",
  "event": {
    "id": "91A2F69A-FCA7-4C27-9EAE-65C8207BAD7D",
    "type": "EXPIRATION",
    "event_timestamp_ms": 1790800924128,
    "app_id": "appvnrm0a5h",
    "app_user_id": "user_expire",
    "original_app_user_id": "user_expire",
    "aliases": [
      "user_expire"
    ],
    "product_id": "pro_monthly",
    "period_type": "NORMAL",
    "purchased_at_ms": 1788122524128,
    "expiration_at_ms": 1790800924128,
    "environment": "SANDBOX",
    "entitlement_id": null,
    "entitlement_ids": [
      "pro"
    ],
    "presented_offering_id": null,
    "transaction_id": "test_1790800924128_a715897b-5461-4c93-abb6-d8d3ea3d11cd",
    "original_transaction_id": "test_1790800924128_a715897b-5461-4c93-abb6-d8d3ea3d11cd",
    "is_family_share": false,
    "country_code": null,
    "currency": "USD",
    "price": 0,
    "price_in_purchased_currency": 0,
    "subscriber_attributes": {},
    "store": "TEST_STORE",
    "takehome_percentage": 1,
    "tax_percentage": 0,
    "commission_percentage": 0,
    "offer_code": null,
    "expiration_reason": "UNSUBSCRIBE"
  }
}

BILLING_ISSUE#

A renewal charge failed. The store retries; access may continue in a grace period.

Field Type Description
id string Unique event id (upper-case UUID). Deduplicate on it.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_id string RevenueDot app id. Left out for promotional grants.
app_user_id string The app user id the event is about (a non-anonymous alias when there is one).
original_app_user_id string The customer's first app user id.
aliases array of string Every app user id of the customer.
product_id string Store product id. For PRODUCT_CHANGE, the product the customer changed from.
period_type NORMAL, TRIAL, INTRO, PROMOTIONAL, PREPAID
purchased_at_ms integer Start of the period. Epoch milliseconds.
expiration_at_ms integer or null End of the period, or null for lifetime. Epoch milliseconds.
environment PRODUCTION, SANDBOX
entitlement_id null Always null (deprecated in RevenueCat's payload).
entitlement_ids array of string Lookup keys of the entitlements the product unlocks, or null.
presented_offering_id string or null Offering the purchase was made from, when the SDK sent it.
transaction_id string or null Store transaction id of this period.
original_transaction_id string or null First transaction id of the subscription.
is_family_share boolean
country_code string or null ISO 3166-1 alpha-2.
currency string or null ISO 4217.
price number or null USD. Money moved only on INITIAL_PURCHASE, RENEWAL, NON_RENEWING_PURCHASE, REFUND_REVERSED and refunds (negative); 0 on other events.
price_in_purchased_currency number or null Same as price, in currency.
subscriber_attributes object
store APP_STORE, MAC_APP_STORE, PLAY_STORE, AMAZON, STRIPE, RC_BILLING, PROMOTIONAL, TEST_STORE, PADDLE, ROKU, EXTERNAL
takehome_percentage number 1 minus the estimated store commission.
tax_percentage number Always 0 today.
commission_percentage number Estimated store commission (0.3 for App Store and Google Play, 0 for Test Store).
offer_code string or null The App Store or Google Play offer id of this period (a promotional offer, offer code, win-back offer or Google offer), or null. See Win-back offers.
experiments array of object Every offering experiment the customer joined. Left out when there are none. See Experiments.
experiments[].experiment_id string
experiments[].experiment_variant a, b, c, d
experiments[].enrolled_at_ms integer Epoch milliseconds.
grace_period_expiration_at_ms integer or null End of the grace period, or null when there is none. Epoch milliseconds.

Example:

JSON
{
  "api_version": "1.0",
  "event": {
    "id": "59A0C090-CC89-458B-BDF2-57D9F1447C19",
    "type": "BILLING_ISSUE",
    "event_timestamp_ms": 1790800924056,
    "app_id": "appvnrm0a5h",
    "app_user_id": "user_billing_issue",
    "original_app_user_id": "user_billing_issue",
    "aliases": [
      "user_billing_issue"
    ],
    "product_id": "pro_monthly",
    "period_type": "NORMAL",
    "purchased_at_ms": 1788122524056,
    "expiration_at_ms": 1790800924056,
    "environment": "SANDBOX",
    "entitlement_id": null,
    "entitlement_ids": [
      "pro"
    ],
    "presented_offering_id": null,
    "transaction_id": "test_1790800924056_16f6f7bd-6289-454a-b3b8-1fac8424f8a0",
    "original_transaction_id": "test_1790800924056_16f6f7bd-6289-454a-b3b8-1fac8424f8a0",
    "is_family_share": false,
    "country_code": null,
    "currency": "USD",
    "price": 0,
    "price_in_purchased_currency": 0,
    "subscriber_attributes": {},
    "store": "TEST_STORE",
    "takehome_percentage": 1,
    "tax_percentage": 0,
    "commission_percentage": 0,
    "offer_code": null,
    "grace_period_expiration_at_ms": 1791405724056
  }
}

PRODUCT_CHANGE#

The customer changed product: an upgrade now, or a downgrade or crossgrade scheduled for the next renewal. product_id is the old product.

Field Type Description
id string Unique event id (upper-case UUID). Deduplicate on it.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_id string RevenueDot app id. Left out for promotional grants.
app_user_id string The app user id the event is about (a non-anonymous alias when there is one).
original_app_user_id string The customer's first app user id.
aliases array of string Every app user id of the customer.
product_id string Store product id. For PRODUCT_CHANGE, the product the customer changed from.
period_type NORMAL, TRIAL, INTRO, PROMOTIONAL, PREPAID
purchased_at_ms integer Start of the period. Epoch milliseconds.
expiration_at_ms integer or null End of the period, or null for lifetime. Epoch milliseconds.
environment PRODUCTION, SANDBOX
entitlement_id null Always null (deprecated in RevenueCat's payload).
entitlement_ids array of string Lookup keys of the entitlements the product unlocks, or null.
presented_offering_id string or null Offering the purchase was made from, when the SDK sent it.
transaction_id string or null Store transaction id of this period.
original_transaction_id string or null First transaction id of the subscription.
is_family_share boolean
country_code string or null ISO 3166-1 alpha-2.
currency string or null ISO 4217.
price number or null USD. Money moved only on INITIAL_PURCHASE, RENEWAL, NON_RENEWING_PURCHASE, REFUND_REVERSED and refunds (negative); 0 on other events.
price_in_purchased_currency number or null Same as price, in currency.
subscriber_attributes object
store APP_STORE, MAC_APP_STORE, PLAY_STORE, AMAZON, STRIPE, RC_BILLING, PROMOTIONAL, TEST_STORE, PADDLE, ROKU, EXTERNAL
takehome_percentage number 1 minus the estimated store commission.
tax_percentage number Always 0 today.
commission_percentage number Estimated store commission (0.3 for App Store and Google Play, 0 for Test Store).
offer_code string or null The App Store or Google Play offer id of this period (a promotional offer, offer code, win-back offer or Google offer), or null. See Win-back offers.
experiments array of object Every offering experiment the customer joined. Left out when there are none. See Experiments.
experiments[].experiment_id string
experiments[].experiment_variant a, b, c, d
experiments[].enrolled_at_ms integer Epoch milliseconds.
new_product_id string The product the customer changed to.

Example:

JSON
{
  "api_version": "1.0",
  "event": {
    "id": "0C1F6F2E-5B7A-4E8B-9D1C-3A2B1C0D9E03",
    "type": "PRODUCT_CHANGE",
    "event_timestamp_ms": 1790800914034,
    "app_id": "appugfw01uy",
    "app_user_id": "user_1",
    "original_app_user_id": "user_1",
    "aliases": [
      "user_1"
    ],
    "product_id": "pro_monthly",
    "new_product_id": "pro_annual",
    "period_type": "NORMAL",
    "purchased_at_ms": 1790800914000,
    "expiration_at_ms": 1793392914000,
    "environment": "PRODUCTION",
    "entitlement_id": null,
    "entitlement_ids": [
      "pro"
    ],
    "presented_offering_id": null,
    "transaction_id": "2000000912345679",
    "original_transaction_id": "2000000912345678",
    "is_family_share": false,
    "country_code": "US",
    "currency": "USD",
    "price": 0,
    "price_in_purchased_currency": 0,
    "subscriber_attributes": {},
    "store": "APP_STORE",
    "takehome_percentage": 0.7,
    "tax_percentage": 0,
    "commission_percentage": 0.3,
    "offer_code": null
  }
}

SUBSCRIPTION_EXTENDED#

The current period got longer without a new payment: an App Store renewal extension or a Google Play deferral.

Field Type Description
id string Unique event id (upper-case UUID). Deduplicate on it.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_id string RevenueDot app id. Left out for promotional grants.
app_user_id string The app user id the event is about (a non-anonymous alias when there is one).
original_app_user_id string The customer's first app user id.
aliases array of string Every app user id of the customer.
product_id string Store product id. For PRODUCT_CHANGE, the product the customer changed from.
period_type NORMAL, TRIAL, INTRO, PROMOTIONAL, PREPAID
purchased_at_ms integer Start of the period. Epoch milliseconds.
expiration_at_ms integer or null End of the period, or null for lifetime. Epoch milliseconds.
environment PRODUCTION, SANDBOX
entitlement_id null Always null (deprecated in RevenueCat's payload).
entitlement_ids array of string Lookup keys of the entitlements the product unlocks, or null.
presented_offering_id string or null Offering the purchase was made from, when the SDK sent it.
transaction_id string or null Store transaction id of this period.
original_transaction_id string or null First transaction id of the subscription.
is_family_share boolean
country_code string or null ISO 3166-1 alpha-2.
currency string or null ISO 4217.
price number or null USD. Money moved only on INITIAL_PURCHASE, RENEWAL, NON_RENEWING_PURCHASE, REFUND_REVERSED and refunds (negative); 0 on other events.
price_in_purchased_currency number or null Same as price, in currency.
subscriber_attributes object
store APP_STORE, MAC_APP_STORE, PLAY_STORE, AMAZON, STRIPE, RC_BILLING, PROMOTIONAL, TEST_STORE, PADDLE, ROKU, EXTERNAL
takehome_percentage number 1 minus the estimated store commission.
tax_percentage number Always 0 today.
commission_percentage number Estimated store commission (0.3 for App Store and Google Play, 0 for Test Store).
offer_code string or null The App Store or Google Play offer id of this period (a promotional offer, offer code, win-back offer or Google offer), or null. See Win-back offers.
experiments array of object Every offering experiment the customer joined. Left out when there are none. See Experiments.
experiments[].experiment_id string
experiments[].experiment_variant a, b, c, d
experiments[].enrolled_at_ms integer Epoch milliseconds.

Example:

JSON
{
  "api_version": "1.0",
  "event": {
    "id": "0C1F6F2E-5B7A-4E8B-9D1C-3A2B1C0D9E04",
    "type": "SUBSCRIPTION_EXTENDED",
    "event_timestamp_ms": 1790800914034,
    "app_id": "appugfw01uy",
    "app_user_id": "user_1",
    "original_app_user_id": "user_1",
    "aliases": [
      "user_1"
    ],
    "product_id": "pro_monthly",
    "period_type": "NORMAL",
    "purchased_at_ms": 1790800914000,
    "expiration_at_ms": 1793997714000,
    "environment": "PRODUCTION",
    "entitlement_id": null,
    "entitlement_ids": [
      "pro"
    ],
    "presented_offering_id": null,
    "transaction_id": "2000000912345679",
    "original_transaction_id": "2000000912345678",
    "is_family_share": false,
    "country_code": "US",
    "currency": "USD",
    "price": 0,
    "price_in_purchased_currency": 0,
    "subscriber_attributes": {},
    "store": "APP_STORE",
    "takehome_percentage": 0.7,
    "tax_percentage": 0,
    "commission_percentage": 0.3,
    "offer_code": null
  }
}

REFUND_REVERSED#

A refund was reversed and access is back.

Field Type Description
id string Unique event id (upper-case UUID). Deduplicate on it.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_id string RevenueDot app id. Left out for promotional grants.
app_user_id string The app user id the event is about (a non-anonymous alias when there is one).
original_app_user_id string The customer's first app user id.
aliases array of string Every app user id of the customer.
product_id string Store product id. For PRODUCT_CHANGE, the product the customer changed from.
period_type NORMAL, TRIAL, INTRO, PROMOTIONAL, PREPAID
purchased_at_ms integer Start of the period. Epoch milliseconds.
expiration_at_ms integer or null End of the period, or null for lifetime. Epoch milliseconds.
environment PRODUCTION, SANDBOX
entitlement_id null Always null (deprecated in RevenueCat's payload).
entitlement_ids array of string Lookup keys of the entitlements the product unlocks, or null.
presented_offering_id string or null Offering the purchase was made from, when the SDK sent it.
transaction_id string or null Store transaction id of this period.
original_transaction_id string or null First transaction id of the subscription.
is_family_share boolean
country_code string or null ISO 3166-1 alpha-2.
currency string or null ISO 4217.
price number or null USD. Money moved only on INITIAL_PURCHASE, RENEWAL, NON_RENEWING_PURCHASE, REFUND_REVERSED and refunds (negative); 0 on other events.
price_in_purchased_currency number or null Same as price, in currency.
subscriber_attributes object
store APP_STORE, MAC_APP_STORE, PLAY_STORE, AMAZON, STRIPE, RC_BILLING, PROMOTIONAL, TEST_STORE, PADDLE, ROKU, EXTERNAL
takehome_percentage number 1 minus the estimated store commission.
tax_percentage number Always 0 today.
commission_percentage number Estimated store commission (0.3 for App Store and Google Play, 0 for Test Store).
offer_code string or null The App Store or Google Play offer id of this period (a promotional offer, offer code, win-back offer or Google offer), or null. See Win-back offers.
experiments array of object Every offering experiment the customer joined. Left out when there are none. See Experiments.
experiments[].experiment_id string
experiments[].experiment_variant a, b, c, d
experiments[].enrolled_at_ms integer Epoch milliseconds.

Example:

JSON
{
  "api_version": "1.0",
  "event": {
    "id": "0C1F6F2E-5B7A-4E8B-9D1C-3A2B1C0D9E05",
    "type": "REFUND_REVERSED",
    "event_timestamp_ms": 1790800914034,
    "app_id": "appugfw01uy",
    "app_user_id": "user_1",
    "original_app_user_id": "user_1",
    "aliases": [
      "user_1"
    ],
    "product_id": "pro_monthly",
    "period_type": "NORMAL",
    "purchased_at_ms": 1790800914000,
    "expiration_at_ms": 1793392914000,
    "environment": "PRODUCTION",
    "entitlement_id": null,
    "entitlement_ids": [
      "pro"
    ],
    "presented_offering_id": null,
    "transaction_id": "2000000912345679",
    "original_transaction_id": "2000000912345678",
    "is_family_share": false,
    "country_code": "US",
    "currency": "USD",
    "price": 9.99,
    "price_in_purchased_currency": 9.99,
    "subscriber_attributes": {},
    "store": "APP_STORE",
    "takehome_percentage": 0.7,
    "tax_percentage": 0,
    "commission_percentage": 0.3,
    "offer_code": null
  }
}

The store asks the customer to accept a price increase.

Field Type Description
id string Unique event id (upper-case UUID). Deduplicate on it.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_id string RevenueDot app id. Left out for promotional grants.
app_user_id string The app user id the event is about (a non-anonymous alias when there is one).
original_app_user_id string The customer's first app user id.
aliases array of string Every app user id of the customer.
product_id string Store product id. For PRODUCT_CHANGE, the product the customer changed from.
transaction_id string or null Store transaction id of this period.
original_transaction_id string or null First transaction id of the subscription.
store APP_STORE, MAC_APP_STORE, PLAY_STORE, AMAZON, STRIPE, RC_BILLING, PROMOTIONAL, TEST_STORE, PADDLE, ROKU, EXTERNAL
environment PRODUCTION, SANDBOX
currency string or null ISO 4217.
country_code string or null ISO 3166-1 alpha-2.
subscriber_attributes object

Example:

JSON
{
  "api_version": "1.0",
  "event": {
    "id": "0C1F6F2E-5B7A-4E8B-9D1C-3A2B1C0D9E06",
    "type": "PRICE_INCREASE_CONSENT_REQUIRED",
    "event_timestamp_ms": 1790800914034,
    "app_id": "appugfw01uy",
    "app_user_id": "user_1",
    "original_app_user_id": "user_1",
    "aliases": [
      "user_1"
    ],
    "product_id": "pro_monthly",
    "environment": "PRODUCTION",
    "transaction_id": "2000000912345679",
    "original_transaction_id": "2000000912345678",
    "country_code": "US",
    "currency": "USD",
    "subscriber_attributes": {},
    "store": "APP_STORE"
  }
}

The customer accepted the price increase.

Field Type Description
id string Unique event id (upper-case UUID). Deduplicate on it.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_id string RevenueDot app id. Left out for promotional grants.
app_user_id string The app user id the event is about (a non-anonymous alias when there is one).
original_app_user_id string The customer's first app user id.
aliases array of string Every app user id of the customer.
product_id string Store product id. For PRODUCT_CHANGE, the product the customer changed from.
transaction_id string or null Store transaction id of this period.
original_transaction_id string or null First transaction id of the subscription.
store APP_STORE, MAC_APP_STORE, PLAY_STORE, AMAZON, STRIPE, RC_BILLING, PROMOTIONAL, TEST_STORE, PADDLE, ROKU, EXTERNAL
environment PRODUCTION, SANDBOX
currency string or null ISO 4217.
country_code string or null ISO 3166-1 alpha-2.
subscriber_attributes object

Example:

JSON
{
  "api_version": "1.0",
  "event": {
    "id": "0C1F6F2E-5B7A-4E8B-9D1C-3A2B1C0D9E07",
    "type": "PRICE_INCREASE_CONSENT_APPROVED",
    "event_timestamp_ms": 1790800914034,
    "app_id": "appugfw01uy",
    "app_user_id": "user_1",
    "original_app_user_id": "user_1",
    "aliases": [
      "user_1"
    ],
    "product_id": "pro_monthly",
    "environment": "PRODUCTION",
    "transaction_id": "2000000912345679",
    "original_transaction_id": "2000000912345678",
    "country_code": "US",
    "currency": "USD",
    "subscriber_attributes": {},
    "store": "APP_STORE"
  }
}

TRANSFER#

A purchase moved to another customer because that customer restored it (transfer behaviour transfer or transfer_if_no_active).

Field Type Description
id string Unique event id (upper-case UUID). Deduplicate on it.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_id string RevenueDot app id. Left out for promotional grants.
store APP_STORE, MAC_APP_STORE, PLAY_STORE, AMAZON, STRIPE, RC_BILLING, PROMOTIONAL, TEST_STORE, PADDLE, ROKU, EXTERNAL
environment PRODUCTION, SANDBOX
transferred_from array of string App user ids of the previous owner.
transferred_to array of string App user ids of the new owner.
subscriber_attributes object

Example:

JSON
{
  "api_version": "1.0",
  "event": {
    "id": "90CB2D5B-DDD2-4F25-9430-4E5290CC493A",
    "type": "TRANSFER",
    "event_timestamp_ms": 1790800924235,
    "app_id": "appvnrm0a5h",
    "environment": "SANDBOX",
    "subscriber_attributes": {},
    "store": "TEST_STORE",
    "transferred_from": [
      "alice"
    ],
    "transferred_to": [
      "bob"
    ]
  }
}

VIRTUAL_CURRENCY_TRANSACTION#

An in-app currency was credited because a purchase of a granting product was recorded (source: in_app_purchase), or because a rewarded ad was verified and a reward rule granted currency (source: ad_reward, a RevenueDot extension; product_id and store are null and transaction_id is the ad network's transaction id). Not sent for adjustments made through the API.

Field Type Description
id string Unique event id (upper-case UUID). Deduplicate on it.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_id string RevenueDot app id. Left out for promotional grants.
app_user_id string The app user id the event is about (a non-anonymous alias when there is one).
aliases array of string Every app user id of the customer.
store APP_STORE, MAC_APP_STORE, PLAY_STORE, AMAZON, STRIPE, RC_BILLING, PROMOTIONAL, TEST_STORE, PADDLE, ROKU, EXTERNAL, null Null for an ad reward.
adjustments array of object
adjustments[].amount integer Credited amount.
adjustments[].currency object
product_id string or null The granting product, or null for an ad reward.
product_display_name string or null The product's display name, or null for an ad reward.
purchase_environment PRODUCTION, SANDBOX
source in_app_purchase, ad_reward ad_reward is a RevenueDot extension: RevenueCat documents no source value for rewarded ads.
transaction_id string or null Store transaction id of this period.
virtual_currency_transaction_id string Starts with vatx.
subscriber_attributes object

Example:

JSON
{
  "api_version": "1.0",
  "event": {
    "adjustments": [
      {
        "amount": 100,
        "currency": {
          "code": "GLD",
          "description": "Gold coins",
          "name": "Gold"
        }
      }
    ],
    "aliases": [
      "$RCAnonymousID:8069238d6049ce87cc529853916d624c"
    ],
    "app_id": "appe8dyp6dl",
    "app_user_id": "user_1",
    "event_timestamp_ms": 1790800914012,
    "product_display_name": "100 coins",
    "product_id": "coins_100",
    "purchase_environment": "PRODUCTION",
    "source": "in_app_purchase",
    "store": "APP_STORE",
    "subscriber_attributes": {
      "$email": {
        "updated_at_ms": 1790800900000,
        "value": "ana@example.com"
      }
    },
    "transaction_id": "2000000123456789",
    "virtual_currency_transaction_id": "vatx1a2b3c4d5e6f7g",
    "type": "VIRTUAL_CURRENCY_TRANSACTION",
    "id": "8F2B1C4D-1234-4C5D-9E6F-0A1B2C3D4E5F"
  }
}

EXPERIMENT_ENROLLMENT#

A customer joined an offering experiment: the first offerings request that enrolled them. Its app_user_id is the id that asked for offerings. Sent once per customer and experiment, as a production event with no app, so a webhook set to sandbox only or to one app does not get it. See Experiments.

Field Type Description
id string Unique event id (upper-case UUID). Deduplicate on it.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_user_id string The app user id the event is about (a non-anonymous alias when there is one).
original_app_user_id string The customer's first app user id.
aliases array of string Every app user id of the customer.
experiment_id string
experiment_variant a, b, c, d a is the control; b, c and d are treatments.
offering_id string or null The variant's offering identifier.
experiment_enrolled_at_ms integer Epoch milliseconds.

Example:

JSON
{
  "api_version": "1.0",
  "event": {
    "event_timestamp_ms": 1790800914012,
    "app_user_id": "$RCAnonymousID:12345678123412341234123456789123",
    "aliases": [
      "$RCAnonymousID:12345678123412341234123456789123"
    ],
    "original_app_user_id": "$RCAnonymousID:12345678123412341234123456789123",
    "experiment_id": "prexpca1234ab",
    "experiment_variant": "b",
    "offering_id": "promo",
    "experiment_enrolled_at_ms": 1790800914012,
    "type": "EXPERIMENT_ENROLLMENT",
    "id": "0F1E2D3C-4B5A-4978-8695-A4B3C2D1E0F9"
  }
}

SUBSCRIBER_ALIAS#

A new app user id joined an existing customer: logIn onto an anonymous customer, logIn that merged an anonymous customer into an existing one, Android's alias call, or a restore that merged two customers. RevenueCat deprecated this event and sends it only to older projects, so RevenueDot delivers it only to webhooks whose event_types filter names subscriber_alias; it always appears in the customer's event history.

Field Type Description
id string Unique event id (upper-case UUID). Deduplicate on it.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_id string RevenueDot app id. Left out for promotional grants.
app_user_id string The app user id the app uses now.
original_app_user_id string The customer's first app user id.
aliases array of string Every app user id of the customer.
subscriber_attributes object
experiments array of object Every offering experiment the customer joined. Left out when there are none. See Experiments.
experiments[].experiment_id string
experiments[].experiment_variant a, b, c, d
experiments[].enrolled_at_ms integer Epoch milliseconds.

Example:

JSON
{
  "api_version": "1.0",
  "event": {
    "aliases": [
      "$RCAnonymousID:0123456789abcdef0123456789abcdef",
      "user_1"
    ],
    "app_id": "appvnrm0a5h",
    "app_user_id": "user_1",
    "event_timestamp_ms": 1790800925011,
    "original_app_user_id": "$RCAnonymousID:0123456789abcdef0123456789abcdef",
    "subscriber_attributes": {
      "$email": {
        "value": "ana@example.com",
        "updated_at_ms": 1790800901000
      }
    },
    "type": "SUBSCRIBER_ALIAS",
    "id": "5B3C2D1E-0F9A-4B8C-9D7E-6F5A4B3C2D1E"
  }
}

PURCHASE_REDEEMED#

A web purchase was redeemed in the app through a redemption link (POST /v1/subscribers/redeem_purchase): the anonymous customer who paid on the web was merged into the app user. Fields follow RevenueCat's sample; app_user_id is added so analytics tools know who it is. See Redemption links.

Field Type Description
id string Unique event id (upper-case UUID). Deduplicate on it.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_id string The Stripe app the purchase was made through.
store STRIPE
environment PRODUCTION, SANDBOX
redeemed_from array of string The anonymous web buyer's app user id.
redeemed_by array of string The app user id that redeemed it.
redemption_outcome alias The web customer was merged into the app user.
redemption_platform string or null From the SDK's X-Platform header: ios, android, web ...
product_id string or null The web product's store identifier (the Stripe price id).
entitlement_ids array of string Entitlements the product unlocks, or null.
workflow_id string or null The funnel id when the purchase came from a funnel, else null.
workflow_step_id null
trace_id string The web checkout id (wco_...).
app_user_id string The app user id that redeemed it. A RevenueDot addition to RevenueCat's sample.

Example:

JSON
{
  "api_version": "1.0",
  "event": {
    "app_id": "appstrp8k2m9q4",
    "event_timestamp_ms": 1790801342625,
    "id": "5B2E8C1D-9F3A-4E7B-A6C0-1D2E3F4A5B6C",
    "store": "STRIPE",
    "environment": "SANDBOX",
    "redeemed_from": [
      "$RCAnonymousID:7c1e9b2f4a6d48e3b05f9a8c2d1e3f47"
    ],
    "redeemed_by": [
      "user_1"
    ],
    "redemption_outcome": "alias",
    "redemption_platform": "ios",
    "product_id": "price_1QxR2nKc8Hn4AbCd",
    "entitlement_ids": [
      "pro"
    ],
    "workflow_id": "fnl_7q2k9m4x1z8c",
    "workflow_step_id": null,
    "trace_id": "wco_8k2m9q4x7a1b3c5d",
    "app_user_id": "user_1",
    "type": "PURCHASE_REDEEMED"
  }
}

FUNNEL_VIEWED#

RevenueDot type. A visitor opened a published funnel. Opt-in: sent only to webhooks and integrations whose event_types names funnel_viewed. app_user_id is null unless the page URL had ?app_user_id=. See Funnels.

Field Type Description
id string Unique event id (upper-case UUID). Deduplicate on it.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_id string or null The funnel's Stripe app.
app_user_id string or null The visitor's app user id, when known.
aliases array of string Every app user id of the customer.
environment PRODUCTION, SANDBOX SANDBOX when the Stripe app uses a test-mode key.
store STRIPE
funnel_id string
funnel_name string
funnel_slug string
session_id string The page session; one per visit.
step_id string or null
step_type question, info, email, paywall, success, null
step_index integer or null 0-based position of the step.
answer string or array of string or null FUNNEL_STEP_COMPLETED of a question: the answer, or a list for multiple choice. Otherwise null.
product_id string FUNNEL_PURCHASE only: the Stripe price id.
subscriber_attributes object Always empty.
revenue_usd number FUNNEL_PURCHASE only: what the buyer paid, in US dollars.
currency USD FUNNEL_PURCHASE only: the currency of revenue_usd.
click_ids object The ad click ids from the landing page's URL, when it had any. Checkouts and purchases take them from the visit's first page view while an integration asks for funnel events.
click_ids.fbclid string
click_ids.gclid string
click_ids.gbraid string
click_ids.wbraid string
click_ids.ttclid string
click_ids.msclkid string
client_ip string The visitor's IP address, for Meta and Branch: only while one of them (enabled) has a funnel event type in its filter; otherwise no visitor IP is stored. Deleted after 7 days. Never for a visitor with Global Privacy Control on.
client_user_agent string The visitor's browser user agent. Same conditions as client_ip.
page_url string The funnel page's address, without its query. While any enabled integration (not a webhook) has a funnel event type in its filter; not for a visitor with Global Privacy Control on.

Example:

JSON
{
  "api_version": "1.0",
  "event": {
    "id": "A1C3E5F7-2B4D-4F6A-8C0E-1A3C5E7F9B2D",
    "type": "FUNNEL_VIEWED",
    "event_timestamp_ms": 1790800914034,
    "app_id": "appstrp8k2m9q4",
    "environment": "SANDBOX",
    "store": "STRIPE",
    "funnel_id": "fnl_7q2k9m4x1z8c",
    "funnel_name": "Focus quiz",
    "funnel_slug": "focus-quiz",
    "session_id": "3f9c2a7b1e8d4c6a9b0f1e2d3c4b5a69",
    "app_user_id": null,
    "aliases": [],
    "step_id": null,
    "step_type": null,
    "step_index": null,
    "answer": null,
    "utm_source": "tiktok",
    "utm_campaign": "fall",
    "subscriber_attributes": {},
    "click_ids": {
      "fbclid": "IwAR2xQ9kM"
    }
  }
}

FUNNEL_STEP_COMPLETED#

RevenueDot type. A visitor finished a funnel step, with the answer for a question (an email step's answer is provided, never the address). Opt-in: funnel_step_completed.

Field Type Description
id string Unique event id (upper-case UUID). Deduplicate on it.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_id string or null The funnel's Stripe app.
app_user_id string or null The visitor's app user id, when known.
aliases array of string Every app user id of the customer.
environment PRODUCTION, SANDBOX SANDBOX when the Stripe app uses a test-mode key.
store STRIPE
funnel_id string
funnel_name string
funnel_slug string
session_id string The page session; one per visit.
step_id string or null
step_type question, info, email, paywall, success, null
step_index integer or null 0-based position of the step.
answer string or array of string or null FUNNEL_STEP_COMPLETED of a question: the answer, or a list for multiple choice. Otherwise null.
product_id string FUNNEL_PURCHASE only: the Stripe price id.
subscriber_attributes object Always empty.
revenue_usd number FUNNEL_PURCHASE only: what the buyer paid, in US dollars.
currency USD FUNNEL_PURCHASE only: the currency of revenue_usd.
click_ids object The ad click ids from the landing page's URL, when it had any. Checkouts and purchases take them from the visit's first page view while an integration asks for funnel events.
click_ids.fbclid string
click_ids.gclid string
click_ids.gbraid string
click_ids.wbraid string
click_ids.ttclid string
click_ids.msclkid string
client_ip string The visitor's IP address, for Meta and Branch: only while one of them (enabled) has a funnel event type in its filter; otherwise no visitor IP is stored. Deleted after 7 days. Never for a visitor with Global Privacy Control on.
client_user_agent string The visitor's browser user agent. Same conditions as client_ip.
page_url string The funnel page's address, without its query. While any enabled integration (not a webhook) has a funnel event type in its filter; not for a visitor with Global Privacy Control on.

Example:

JSON
{
  "api_version": "1.0",
  "event": {
    "id": "B2D4F6A8-3C5E-4A7B-9D1F-2B4D6F8A0C3E",
    "type": "FUNNEL_STEP_COMPLETED",
    "event_timestamp_ms": 1790800921034,
    "app_id": "appstrp8k2m9q4",
    "environment": "SANDBOX",
    "store": "STRIPE",
    "funnel_id": "fnl_7q2k9m4x1z8c",
    "funnel_name": "Focus quiz",
    "funnel_slug": "focus-quiz",
    "session_id": "3f9c2a7b1e8d4c6a9b0f1e2d3c4b5a69",
    "app_user_id": null,
    "aliases": [],
    "step_id": "goal",
    "step_type": "question",
    "step_index": 0,
    "answer": "Sleep better",
    "utm_source": "tiktok",
    "utm_campaign": "fall",
    "subscriber_attributes": {}
  }
}

FUNNEL_PURCHASE#

RevenueDot type. A funnel's checkout was paid. app_user_id is the buyer's (anonymous unless the page had one) and product_id the Stripe price. Opt-in: funnel_purchase.

Field Type Description
id string Unique event id (upper-case UUID). Deduplicate on it.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_id string or null The funnel's Stripe app.
app_user_id string or null The visitor's app user id, when known.
aliases array of string Every app user id of the customer.
environment PRODUCTION, SANDBOX SANDBOX when the Stripe app uses a test-mode key.
store STRIPE
funnel_id string
funnel_name string
funnel_slug string
session_id string The page session; one per visit.
step_id string or null
step_type question, info, email, paywall, success, null
step_index integer or null 0-based position of the step.
answer string or array of string or null FUNNEL_STEP_COMPLETED of a question: the answer, or a list for multiple choice. Otherwise null.
product_id string FUNNEL_PURCHASE only: the Stripe price id.
subscriber_attributes object Always empty.
revenue_usd number FUNNEL_PURCHASE only: what the buyer paid, in US dollars.
currency USD FUNNEL_PURCHASE only: the currency of revenue_usd.
click_ids object The ad click ids from the landing page's URL, when it had any. Checkouts and purchases take them from the visit's first page view while an integration asks for funnel events.
click_ids.fbclid string
click_ids.gclid string
click_ids.gbraid string
click_ids.wbraid string
click_ids.ttclid string
click_ids.msclkid string
client_ip string The visitor's IP address, for Meta and Branch: only while one of them (enabled) has a funnel event type in its filter; otherwise no visitor IP is stored. Deleted after 7 days. Never for a visitor with Global Privacy Control on.
client_user_agent string The visitor's browser user agent. Same conditions as client_ip.
page_url string The funnel page's address, without its query. While any enabled integration (not a webhook) has a funnel event type in its filter; not for a visitor with Global Privacy Control on.

Example:

JSON
{
  "api_version": "1.0",
  "event": {
    "id": "C3E5A7B9-4D6F-4B8C-0E2A-3C5E7A9B1D4F",
    "type": "FUNNEL_PURCHASE",
    "event_timestamp_ms": 1790800994034,
    "app_id": "appstrp8k2m9q4",
    "environment": "SANDBOX",
    "store": "STRIPE",
    "funnel_id": "fnl_7q2k9m4x1z8c",
    "funnel_name": "Focus quiz",
    "funnel_slug": "focus-quiz",
    "session_id": "3f9c2a7b1e8d4c6a9b0f1e2d3c4b5a69",
    "app_user_id": "$RCAnonymousID:7c1e9b2f4a6d48e3b05f9a8c2d1e3f47",
    "aliases": [
      "$RCAnonymousID:7c1e9b2f4a6d48e3b05f9a8c2d1e3f47"
    ],
    "step_id": null,
    "step_type": null,
    "step_index": null,
    "answer": null,
    "product_id": "price_1QxR3pKc8Hn4EfGh",
    "subscriber_attributes": {},
    "revenue_usd": 39.99,
    "currency": "USD"
  }
}

PAYWALL_IMPRESSION#

A paywall was shown (RevenueDot type; the SDK reports it to POST /v1/events). Opt-in: sent only to webhooks and integrations whose event_types names paywall_impression. RevenueCat sends paywall events to Amplitude, Mixpanel, PostHog and Segment only, not to webhooks. See Integrations.

Field Type Description
id string A UUID derived from the project and the SDK's event id, so a batch the SDK sends again is not delivered twice.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_id string RevenueDot app id. Left out for promotional grants.
app_user_id string The app user id the event is about (a non-anonymous alias when there is one).
original_app_user_id string The customer's first app user id.
aliases array of string Every app user id of the customer.
environment PRODUCTION, SANDBOX SANDBOX for TestFlight, Xcode and Test Store builds.
store string The app's store: APP_STORE, PLAY_STORE, TEST_STORE ...
paywall_id string The paywall's id.
paywall_name string The paywall's name, when it has one.
paywall_revision integer
offering_id string
session_id string One per time the paywall is shown.
display_mode string full_screen, sheet, condensed_footer ...
dark_mode boolean
locale string
source string
placement_identifier string
targeting_revision integer
targeting_rule_id string
workflow_id string
exit_offer_type string PAYWALL_EXIT_OFFER: dismiss.
exit_offering_id string PAYWALL_EXIT_OFFER: the offering shown.
package_id string PAYWALL_PURCHASE_*: the package.
product_id string PAYWALL_PURCHASE_*: the product.
error_code integer PAYWALL_PURCHASE_ERROR.
error_message string PAYWALL_PURCHASE_ERROR.
component_type string PAYWALL_COMPONENT_INTERACTED: tab, package, purchase_button, sheet ...
component_name string
component_value string
component_url string
origin_index integer
destination_index integer
default_index integer
origin_context_name string
destination_context_name string
origin_package_id string
destination_package_id string
default_package_id string
origin_product_id string
destination_product_id string
default_product_id string
current_package_id string
resulting_package_id string
current_product_id string
resulting_product_id string
sdk_version string The customer's last SDK version.
platform_version string The customer's last OS version.
subscriber_attributes object

Example:

JSON
{
  "api_version": "1.0",
  "event": {
    "id": "7D3F0B1E-5C2A-5E8B-9A4D-6F1E2C3B4A51",
    "type": "PAYWALL_IMPRESSION",
    "event_timestamp_ms": 1790800914034,
    "app_id": "app1a2b3c4d",
    "app_user_id": "user_42",
    "original_app_user_id": "$RCAnonymousID:9f8e7d6c5b4a39281706f5e4d3c2b1a0",
    "aliases": [
      "$RCAnonymousID:9f8e7d6c5b4a39281706f5e4d3c2b1a0",
      "user_42"
    ],
    "environment": "PRODUCTION",
    "store": "APP_STORE",
    "paywall_id": "pw_5k2m8q1x7c3z",
    "paywall_name": "Spring sale",
    "paywall_revision": 3,
    "offering_id": "default",
    "session_id": "0B6E2A4C-8D1F-4E3A-9C7B-5A2D8F1E6C3B",
    "display_mode": "full_screen",
    "dark_mode": false,
    "locale": "en_US",
    "placement_identifier": "onboarding",
    "sdk_version": "5.62.0",
    "platform_version": "18.5",
    "subscriber_attributes": {
      "$email": {
        "value": "wren@example.com",
        "updated_at_ms": 1790800000000
      }
    }
  }
}

PAYWALL_CLOSE#

The customer closed a paywall. Opt-in: paywall_close.

Field Type Description
id string A UUID derived from the project and the SDK's event id, so a batch the SDK sends again is not delivered twice.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_id string RevenueDot app id. Left out for promotional grants.
app_user_id string The app user id the event is about (a non-anonymous alias when there is one).
original_app_user_id string The customer's first app user id.
aliases array of string Every app user id of the customer.
environment PRODUCTION, SANDBOX SANDBOX for TestFlight, Xcode and Test Store builds.
store string The app's store: APP_STORE, PLAY_STORE, TEST_STORE ...
paywall_id string The paywall's id.
paywall_name string The paywall's name, when it has one.
paywall_revision integer
offering_id string
session_id string One per time the paywall is shown.
display_mode string full_screen, sheet, condensed_footer ...
dark_mode boolean
locale string
source string
placement_identifier string
targeting_revision integer
targeting_rule_id string
workflow_id string
exit_offer_type string PAYWALL_EXIT_OFFER: dismiss.
exit_offering_id string PAYWALL_EXIT_OFFER: the offering shown.
package_id string PAYWALL_PURCHASE_*: the package.
product_id string PAYWALL_PURCHASE_*: the product.
error_code integer PAYWALL_PURCHASE_ERROR.
error_message string PAYWALL_PURCHASE_ERROR.
component_type string PAYWALL_COMPONENT_INTERACTED: tab, package, purchase_button, sheet ...
component_name string
component_value string
component_url string
origin_index integer
destination_index integer
default_index integer
origin_context_name string
destination_context_name string
origin_package_id string
destination_package_id string
default_package_id string
origin_product_id string
destination_product_id string
default_product_id string
current_package_id string
resulting_package_id string
current_product_id string
resulting_product_id string
sdk_version string The customer's last SDK version.
platform_version string The customer's last OS version.
subscriber_attributes object

Example:

JSON
{
  "api_version": "1.0",
  "event": {
    "id": "7D3F0B1E-5C2A-5E8B-9A4D-6F1E2C3B4A52",
    "type": "PAYWALL_CLOSE",
    "event_timestamp_ms": 1790800914034,
    "app_id": "app1a2b3c4d",
    "app_user_id": "user_42",
    "original_app_user_id": "$RCAnonymousID:9f8e7d6c5b4a39281706f5e4d3c2b1a0",
    "aliases": [
      "$RCAnonymousID:9f8e7d6c5b4a39281706f5e4d3c2b1a0",
      "user_42"
    ],
    "environment": "PRODUCTION",
    "store": "APP_STORE",
    "paywall_id": "pw_5k2m8q1x7c3z",
    "paywall_name": "Spring sale",
    "paywall_revision": 3,
    "offering_id": "default",
    "session_id": "0B6E2A4C-8D1F-4E3A-9C7B-5A2D8F1E6C3B",
    "display_mode": "full_screen",
    "dark_mode": false,
    "locale": "en_US",
    "placement_identifier": "onboarding",
    "sdk_version": "5.62.0",
    "platform_version": "18.5",
    "subscriber_attributes": {
      "$email": {
        "value": "wren@example.com",
        "updated_at_ms": 1790800000000
      }
    }
  }
}

PAYWALL_CANCEL#

The customer dismissed the store's payment sheet on a paywall. Opt-in: paywall_cancel.

Field Type Description
id string A UUID derived from the project and the SDK's event id, so a batch the SDK sends again is not delivered twice.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_id string RevenueDot app id. Left out for promotional grants.
app_user_id string The app user id the event is about (a non-anonymous alias when there is one).
original_app_user_id string The customer's first app user id.
aliases array of string Every app user id of the customer.
environment PRODUCTION, SANDBOX SANDBOX for TestFlight, Xcode and Test Store builds.
store string The app's store: APP_STORE, PLAY_STORE, TEST_STORE ...
paywall_id string The paywall's id.
paywall_name string The paywall's name, when it has one.
paywall_revision integer
offering_id string
session_id string One per time the paywall is shown.
display_mode string full_screen, sheet, condensed_footer ...
dark_mode boolean
locale string
source string
placement_identifier string
targeting_revision integer
targeting_rule_id string
workflow_id string
exit_offer_type string PAYWALL_EXIT_OFFER: dismiss.
exit_offering_id string PAYWALL_EXIT_OFFER: the offering shown.
package_id string PAYWALL_PURCHASE_*: the package.
product_id string PAYWALL_PURCHASE_*: the product.
error_code integer PAYWALL_PURCHASE_ERROR.
error_message string PAYWALL_PURCHASE_ERROR.
component_type string PAYWALL_COMPONENT_INTERACTED: tab, package, purchase_button, sheet ...
component_name string
component_value string
component_url string
origin_index integer
destination_index integer
default_index integer
origin_context_name string
destination_context_name string
origin_package_id string
destination_package_id string
default_package_id string
origin_product_id string
destination_product_id string
default_product_id string
current_package_id string
resulting_package_id string
current_product_id string
resulting_product_id string
sdk_version string The customer's last SDK version.
platform_version string The customer's last OS version.
subscriber_attributes object

Example:

JSON
{
  "api_version": "1.0",
  "event": {
    "id": "7D3F0B1E-5C2A-5E8B-9A4D-6F1E2C3B4A53",
    "type": "PAYWALL_CANCEL",
    "event_timestamp_ms": 1790800914034,
    "app_id": "app1a2b3c4d",
    "app_user_id": "user_42",
    "original_app_user_id": "$RCAnonymousID:9f8e7d6c5b4a39281706f5e4d3c2b1a0",
    "aliases": [
      "$RCAnonymousID:9f8e7d6c5b4a39281706f5e4d3c2b1a0",
      "user_42"
    ],
    "environment": "PRODUCTION",
    "store": "APP_STORE",
    "paywall_id": "pw_5k2m8q1x7c3z",
    "paywall_name": "Spring sale",
    "paywall_revision": 3,
    "offering_id": "default",
    "session_id": "0B6E2A4C-8D1F-4E3A-9C7B-5A2D8F1E6C3B",
    "display_mode": "full_screen",
    "dark_mode": false,
    "locale": "en_US",
    "placement_identifier": "onboarding",
    "sdk_version": "5.62.0",
    "platform_version": "18.5",
    "subscriber_attributes": {
      "$email": {
        "value": "wren@example.com",
        "updated_at_ms": 1790800000000
      }
    }
  }
}

PAYWALL_EXIT_OFFER#

An exit offer was shown when the customer left a paywall. Opt-in: paywall_exit_offer.

Field Type Description
id string A UUID derived from the project and the SDK's event id, so a batch the SDK sends again is not delivered twice.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_id string RevenueDot app id. Left out for promotional grants.
app_user_id string The app user id the event is about (a non-anonymous alias when there is one).
original_app_user_id string The customer's first app user id.
aliases array of string Every app user id of the customer.
environment PRODUCTION, SANDBOX SANDBOX for TestFlight, Xcode and Test Store builds.
store string The app's store: APP_STORE, PLAY_STORE, TEST_STORE ...
paywall_id string The paywall's id.
paywall_name string The paywall's name, when it has one.
paywall_revision integer
offering_id string
session_id string One per time the paywall is shown.
display_mode string full_screen, sheet, condensed_footer ...
dark_mode boolean
locale string
source string
placement_identifier string
targeting_revision integer
targeting_rule_id string
workflow_id string
exit_offer_type string PAYWALL_EXIT_OFFER: dismiss.
exit_offering_id string PAYWALL_EXIT_OFFER: the offering shown.
package_id string PAYWALL_PURCHASE_*: the package.
product_id string PAYWALL_PURCHASE_*: the product.
error_code integer PAYWALL_PURCHASE_ERROR.
error_message string PAYWALL_PURCHASE_ERROR.
component_type string PAYWALL_COMPONENT_INTERACTED: tab, package, purchase_button, sheet ...
component_name string
component_value string
component_url string
origin_index integer
destination_index integer
default_index integer
origin_context_name string
destination_context_name string
origin_package_id string
destination_package_id string
default_package_id string
origin_product_id string
destination_product_id string
default_product_id string
current_package_id string
resulting_package_id string
current_product_id string
resulting_product_id string
sdk_version string The customer's last SDK version.
platform_version string The customer's last OS version.
subscriber_attributes object

Example:

JSON
{
  "api_version": "1.0",
  "event": {
    "id": "7D3F0B1E-5C2A-5E8B-9A4D-6F1E2C3B4A54",
    "type": "PAYWALL_EXIT_OFFER",
    "event_timestamp_ms": 1790800914034,
    "app_id": "app1a2b3c4d",
    "app_user_id": "user_42",
    "original_app_user_id": "$RCAnonymousID:9f8e7d6c5b4a39281706f5e4d3c2b1a0",
    "aliases": [
      "$RCAnonymousID:9f8e7d6c5b4a39281706f5e4d3c2b1a0",
      "user_42"
    ],
    "environment": "PRODUCTION",
    "store": "APP_STORE",
    "paywall_id": "pw_5k2m8q1x7c3z",
    "paywall_name": "Spring sale",
    "paywall_revision": 3,
    "offering_id": "default",
    "session_id": "0B6E2A4C-8D1F-4E3A-9C7B-5A2D8F1E6C3B",
    "display_mode": "full_screen",
    "dark_mode": false,
    "locale": "en_US",
    "placement_identifier": "onboarding",
    "exit_offer_type": "dismiss",
    "exit_offering_id": "winback",
    "sdk_version": "5.62.0",
    "platform_version": "18.5",
    "subscriber_attributes": {
      "$email": {
        "value": "wren@example.com",
        "updated_at_ms": 1790800000000
      }
    }
  }
}

PAYWALL_COMPONENT_INTERACTED#

The customer changed a paywall control: a tab, package, button or sheet. Opt-in: paywall_component_interacted.

Field Type Description
id string A UUID derived from the project and the SDK's event id, so a batch the SDK sends again is not delivered twice.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_id string RevenueDot app id. Left out for promotional grants.
app_user_id string The app user id the event is about (a non-anonymous alias when there is one).
original_app_user_id string The customer's first app user id.
aliases array of string Every app user id of the customer.
environment PRODUCTION, SANDBOX SANDBOX for TestFlight, Xcode and Test Store builds.
store string The app's store: APP_STORE, PLAY_STORE, TEST_STORE ...
paywall_id string The paywall's id.
paywall_name string The paywall's name, when it has one.
paywall_revision integer
offering_id string
session_id string One per time the paywall is shown.
display_mode string full_screen, sheet, condensed_footer ...
dark_mode boolean
locale string
source string
placement_identifier string
targeting_revision integer
targeting_rule_id string
workflow_id string
exit_offer_type string PAYWALL_EXIT_OFFER: dismiss.
exit_offering_id string PAYWALL_EXIT_OFFER: the offering shown.
package_id string PAYWALL_PURCHASE_*: the package.
product_id string PAYWALL_PURCHASE_*: the product.
error_code integer PAYWALL_PURCHASE_ERROR.
error_message string PAYWALL_PURCHASE_ERROR.
component_type string PAYWALL_COMPONENT_INTERACTED: tab, package, purchase_button, sheet ...
component_name string
component_value string
component_url string
origin_index integer
destination_index integer
default_index integer
origin_context_name string
destination_context_name string
origin_package_id string
destination_package_id string
default_package_id string
origin_product_id string
destination_product_id string
default_product_id string
current_package_id string
resulting_package_id string
current_product_id string
resulting_product_id string
sdk_version string The customer's last SDK version.
platform_version string The customer's last OS version.
subscriber_attributes object

Example:

JSON
{
  "api_version": "1.0",
  "event": {
    "id": "7D3F0B1E-5C2A-5E8B-9A4D-6F1E2C3B4A55",
    "type": "PAYWALL_COMPONENT_INTERACTED",
    "event_timestamp_ms": 1790800914034,
    "app_id": "app1a2b3c4d",
    "app_user_id": "user_42",
    "original_app_user_id": "$RCAnonymousID:9f8e7d6c5b4a39281706f5e4d3c2b1a0",
    "aliases": [
      "$RCAnonymousID:9f8e7d6c5b4a39281706f5e4d3c2b1a0",
      "user_42"
    ],
    "environment": "PRODUCTION",
    "store": "APP_STORE",
    "paywall_id": "pw_5k2m8q1x7c3z",
    "paywall_name": "Spring sale",
    "paywall_revision": 3,
    "offering_id": "default",
    "session_id": "0B6E2A4C-8D1F-4E3A-9C7B-5A2D8F1E6C3B",
    "display_mode": "full_screen",
    "dark_mode": false,
    "locale": "en_US",
    "placement_identifier": "onboarding",
    "component_type": "package",
    "component_name": "annual_pkg",
    "component_value": "selected",
    "origin_package_id": "$rc_monthly",
    "destination_package_id": "$rc_annual",
    "origin_product_id": "pro_monthly",
    "destination_product_id": "pro_annual",
    "sdk_version": "5.62.0",
    "platform_version": "18.5",
    "subscriber_attributes": {
      "$email": {
        "value": "wren@example.com",
        "updated_at_ms": 1790800000000
      }
    }
  }
}

PAYWALL_PURCHASE_INITIATED#

The customer started a purchase from a paywall. A RevenueDot addition: RevenueCat does not forward it. Opt-in: paywall_purchase_initiated.

Field Type Description
id string A UUID derived from the project and the SDK's event id, so a batch the SDK sends again is not delivered twice.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_id string RevenueDot app id. Left out for promotional grants.
app_user_id string The app user id the event is about (a non-anonymous alias when there is one).
original_app_user_id string The customer's first app user id.
aliases array of string Every app user id of the customer.
environment PRODUCTION, SANDBOX SANDBOX for TestFlight, Xcode and Test Store builds.
store string The app's store: APP_STORE, PLAY_STORE, TEST_STORE ...
paywall_id string The paywall's id.
paywall_name string The paywall's name, when it has one.
paywall_revision integer
offering_id string
session_id string One per time the paywall is shown.
display_mode string full_screen, sheet, condensed_footer ...
dark_mode boolean
locale string
source string
placement_identifier string
targeting_revision integer
targeting_rule_id string
workflow_id string
exit_offer_type string PAYWALL_EXIT_OFFER: dismiss.
exit_offering_id string PAYWALL_EXIT_OFFER: the offering shown.
package_id string PAYWALL_PURCHASE_*: the package.
product_id string PAYWALL_PURCHASE_*: the product.
error_code integer PAYWALL_PURCHASE_ERROR.
error_message string PAYWALL_PURCHASE_ERROR.
component_type string PAYWALL_COMPONENT_INTERACTED: tab, package, purchase_button, sheet ...
component_name string
component_value string
component_url string
origin_index integer
destination_index integer
default_index integer
origin_context_name string
destination_context_name string
origin_package_id string
destination_package_id string
default_package_id string
origin_product_id string
destination_product_id string
default_product_id string
current_package_id string
resulting_package_id string
current_product_id string
resulting_product_id string
sdk_version string The customer's last SDK version.
platform_version string The customer's last OS version.
subscriber_attributes object

Example:

JSON
{
  "api_version": "1.0",
  "event": {
    "id": "7D3F0B1E-5C2A-5E8B-9A4D-6F1E2C3B4A56",
    "type": "PAYWALL_PURCHASE_INITIATED",
    "event_timestamp_ms": 1790800914034,
    "app_id": "app1a2b3c4d",
    "app_user_id": "user_42",
    "original_app_user_id": "$RCAnonymousID:9f8e7d6c5b4a39281706f5e4d3c2b1a0",
    "aliases": [
      "$RCAnonymousID:9f8e7d6c5b4a39281706f5e4d3c2b1a0",
      "user_42"
    ],
    "environment": "PRODUCTION",
    "store": "APP_STORE",
    "paywall_id": "pw_5k2m8q1x7c3z",
    "paywall_name": "Spring sale",
    "paywall_revision": 3,
    "offering_id": "default",
    "session_id": "0B6E2A4C-8D1F-4E3A-9C7B-5A2D8F1E6C3B",
    "display_mode": "full_screen",
    "dark_mode": false,
    "locale": "en_US",
    "placement_identifier": "onboarding",
    "package_id": "$rc_annual",
    "product_id": "pro_annual",
    "sdk_version": "5.62.0",
    "platform_version": "18.5",
    "subscriber_attributes": {
      "$email": {
        "value": "wren@example.com",
        "updated_at_ms": 1790800000000
      }
    }
  }
}

PAYWALL_PURCHASE_ERROR#

A purchase started from a paywall failed. A RevenueDot addition: RevenueCat does not forward it. Opt-in: paywall_purchase_error.

Field Type Description
id string A UUID derived from the project and the SDK's event id, so a batch the SDK sends again is not delivered twice.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_id string RevenueDot app id. Left out for promotional grants.
app_user_id string The app user id the event is about (a non-anonymous alias when there is one).
original_app_user_id string The customer's first app user id.
aliases array of string Every app user id of the customer.
environment PRODUCTION, SANDBOX SANDBOX for TestFlight, Xcode and Test Store builds.
store string The app's store: APP_STORE, PLAY_STORE, TEST_STORE ...
paywall_id string The paywall's id.
paywall_name string The paywall's name, when it has one.
paywall_revision integer
offering_id string
session_id string One per time the paywall is shown.
display_mode string full_screen, sheet, condensed_footer ...
dark_mode boolean
locale string
source string
placement_identifier string
targeting_revision integer
targeting_rule_id string
workflow_id string
exit_offer_type string PAYWALL_EXIT_OFFER: dismiss.
exit_offering_id string PAYWALL_EXIT_OFFER: the offering shown.
package_id string PAYWALL_PURCHASE_*: the package.
product_id string PAYWALL_PURCHASE_*: the product.
error_code integer PAYWALL_PURCHASE_ERROR.
error_message string PAYWALL_PURCHASE_ERROR.
component_type string PAYWALL_COMPONENT_INTERACTED: tab, package, purchase_button, sheet ...
component_name string
component_value string
component_url string
origin_index integer
destination_index integer
default_index integer
origin_context_name string
destination_context_name string
origin_package_id string
destination_package_id string
default_package_id string
origin_product_id string
destination_product_id string
default_product_id string
current_package_id string
resulting_package_id string
current_product_id string
resulting_product_id string
sdk_version string The customer's last SDK version.
platform_version string The customer's last OS version.
subscriber_attributes object

Example:

JSON
{
  "api_version": "1.0",
  "event": {
    "id": "7D3F0B1E-5C2A-5E8B-9A4D-6F1E2C3B4A57",
    "type": "PAYWALL_PURCHASE_ERROR",
    "event_timestamp_ms": 1790800914034,
    "app_id": "app1a2b3c4d",
    "app_user_id": "user_42",
    "original_app_user_id": "$RCAnonymousID:9f8e7d6c5b4a39281706f5e4d3c2b1a0",
    "aliases": [
      "$RCAnonymousID:9f8e7d6c5b4a39281706f5e4d3c2b1a0",
      "user_42"
    ],
    "environment": "PRODUCTION",
    "store": "APP_STORE",
    "paywall_id": "pw_5k2m8q1x7c3z",
    "paywall_name": "Spring sale",
    "paywall_revision": 3,
    "offering_id": "default",
    "session_id": "0B6E2A4C-8D1F-4E3A-9C7B-5A2D8F1E6C3B",
    "display_mode": "full_screen",
    "dark_mode": false,
    "locale": "en_US",
    "placement_identifier": "onboarding",
    "package_id": "$rc_annual",
    "product_id": "pro_annual",
    "error_code": 2,
    "error_message": "The payment was declined.",
    "sdk_version": "5.62.0",
    "platform_version": "18.5",
    "subscriber_attributes": {
      "$email": {
        "value": "wren@example.com",
        "updated_at_ms": 1790800000000
      }
    }
  }
}

TEST#

Sent by the dashboard's "Send test event" or POST .../integrations/webhooks/{id}/test. Shaped like a purchase, for no real customer, so it never carries experiments.

Field Type Description
id string Unique event id (upper-case UUID). Deduplicate on it.
type string Event type.
event_timestamp_ms integer When RevenueDot recorded the event. Epoch milliseconds.
app_id string RevenueDot app id. Left out for promotional grants.
app_user_id string The app user id the event is about (a non-anonymous alias when there is one).
original_app_user_id string The customer's first app user id.
aliases array of string Every app user id of the customer.
product_id string Store product id. For PRODUCT_CHANGE, the product the customer changed from.
period_type NORMAL, TRIAL, INTRO, PROMOTIONAL, PREPAID
purchased_at_ms integer Start of the period. Epoch milliseconds.
expiration_at_ms integer or null End of the period, or null for lifetime. Epoch milliseconds.
environment PRODUCTION, SANDBOX
entitlement_id null Always null (deprecated in RevenueCat's payload).
entitlement_ids array of string Lookup keys of the entitlements the product unlocks, or null.
presented_offering_id string or null Offering the purchase was made from, when the SDK sent it.
transaction_id string or null Store transaction id of this period.
original_transaction_id string or null First transaction id of the subscription.
is_family_share boolean
country_code string or null ISO 3166-1 alpha-2.
currency string or null ISO 4217.
price number or null USD. Money moved only on INITIAL_PURCHASE, RENEWAL, NON_RENEWING_PURCHASE, REFUND_REVERSED and refunds (negative); 0 on other events.
price_in_purchased_currency number or null Same as price, in currency.
subscriber_attributes object
store APP_STORE, MAC_APP_STORE, PLAY_STORE, AMAZON, STRIPE, RC_BILLING, PROMOTIONAL, TEST_STORE, PADDLE, ROKU, EXTERNAL
takehome_percentage number 1 minus the estimated store commission.
tax_percentage number Always 0 today.
commission_percentage number Estimated store commission (0.3 for App Store and Google Play, 0 for Test Store).
offer_code string or null The App Store or Google Play offer id of this period (a promotional offer, offer code, win-back offer or Google offer), or null. See Win-back offers.
experiments array of object Every offering experiment the customer joined. Left out when there are none. See Experiments.
experiments[].experiment_id string
experiments[].experiment_variant a, b, c, d
experiments[].enrolled_at_ms integer Epoch milliseconds.

Example:

JSON
{
  "api_version": "1.0",
  "event": {
    "id": "F48A3CEE-2785-4001-9A4D-590F95C1A9F0",
    "type": "TEST",
    "event_timestamp_ms": 1790800924267,
    "app_id": "appvnrm0a5h",
    "app_user_id": "$RCAnonymousID:10daafcef1da4cea82bdf031565747fc",
    "original_app_user_id": "$RCAnonymousID:10daafcef1da4cea82bdf031565747fc",
    "aliases": [
      "$RCAnonymousID:10daafcef1da4cea82bdf031565747fc"
    ],
    "product_id": "test_product",
    "period_type": "NORMAL",
    "purchased_at_ms": 1790800924267,
    "expiration_at_ms": 1793392924267,
    "environment": "SANDBOX",
    "entitlement_id": null,
    "entitlement_ids": null,
    "presented_offering_id": null,
    "transaction_id": "test_transaction_id",
    "original_transaction_id": "test_original_transaction_id",
    "is_family_share": false,
    "country_code": "US",
    "currency": "USD",
    "price": 0,
    "price_in_purchased_currency": 0,
    "subscriber_attributes": {},
    "store": "TEST_STORE",
    "takehome_percentage": 1,
    "tax_percentage": 0,
    "commission_percentage": 0,
    "offer_code": null
  }
}