Which webhook events does RevenueDot send?

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

  • Headers: Content-Type: application/json, User-Agent: RevenueDot-Webhooks/1.0, X-RevenueCat-Webhook-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256>, and your Authorization header when you set one.
  • Delivery: only HTTP 200 counts. Anything else, or no answer within 60 seconds, is retried after 5, 10, 20, 40 and 80 minutes, then marked failed. Deliveries can repeat: deduplicate on event.id.
  • Examples: recorded from a RevenueDot server on 2026-09-30 with Test Store purchases. Events that the Test Store cannot produce (pause, product change, extension, refund reversal, uncancellation, price consent) show the same builder's output with App Store or Google Play values.
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).
TEST Sent by the dashboard's "Send test event" or POST .../integrations/webhooks/{id}/test. Shaped like a purchase.

Accepted in a webhook's event_types filter but never sent yet: TEMPORARY_ENTITLEMENT_GRANT, VIRTUAL_CURRENCY_TRANSACTION, INVOICE_ISSUANCE, EXPERIMENT_ENROLLMENT, PURCHASE_REDEEMED, SUBSCRIBER_ALIAS.

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 null

Example:

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

RENEWAL#

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

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

Example:

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

CANCELLATION#

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

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

Example (auto-renew turned off):

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

Example (refund):

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

UNCANCELLATION#

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

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

Example:

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

NON_RENEWING_PURCHASE#

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

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

Example:

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

SUBSCRIPTION_PAUSED#

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

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

Example:

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

EXPIRATION#

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

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

Example:

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

BILLING_ISSUE#

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

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

Example:

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

PRODUCT_CHANGE#

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

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

Example:

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

SUBSCRIPTION_EXTENDED#

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

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

Example:

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

REFUND_REVERSED#

A refund was reversed and access is back.

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

Example:

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

The store asks the customer to accept a price increase.

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

Example:

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

The customer accepted the price increase.

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

Example:

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

TRANSFER#

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

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

Example:

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

TEST#

Sent by the dashboard's "Send test event" or POST .../integrations/webhooks/{id}/test. Shaped like a 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 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 null

Example:

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