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 yourAuthorizationheader 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_REDEEMEDand 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:
{
"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:
{
"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):
{
"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):
{
"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:
{
"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:
{
"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:
{
"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:
{
"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:
{
"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:
{
"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:
{
"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:
{
"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
}
}PRICE_INCREASE_CONSENT_REQUIRED#
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:
{
"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"
}
}PRICE_INCREASE_CONSENT_APPROVED#
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:
{
"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:
{
"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:
{
"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:
{
"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:
{
"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:
{
"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:
{
"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:
{
"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:
{
"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:
{
"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:
{
"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:
{
"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:
{
"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:
{
"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:
{
"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:
{
"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:
{
"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
}
}Related#
- Webhooks guide: signature verification code, retries, testing
- Subscriptions and events: which store change produces which event
- OpenAPI document: the
webhookssection