Webhooks

Enhanced server-to-server notifications from webhooks

👍

Webhooks are available on the Starter plan or greater.

RevenueCat can send you notifications any time an event happens in your app. This is useful for subscription and purchase events, which will allow you to monitor state changes for your subscribers and react accordingly.

With webhooks integrated, you can:

  • Remind subscribers of the benefits of your app when they decide to unsubscribe, or let them know when there are billing issues.

Registering Your Webhook URL

📘

One webhook per project in RevenueCat

Each of your projects has a webhook URL field you can set. This way you can decide which of your projects need server-side notifications, and where they should be sent.

  1. Navigate to your project in the RevenueCat dashboard and find the Integrations card in the left menu. Select + New
332
  1. Choose 'Webhooks' from the Integrations menu
  2. Enter the HTTPS URL of the endpoint that you want to receive your webhooks
  3. (Optional) Set authorization header that will be sent with each POST request
938

📘

Best Practices: Webhook authorization

We recommended setting an authorization header value via the RevenueCat dashboard. When set, RevenueCat will send this header in every request. Your server can use this to authenticate the webhooks from RevenueCat.

RevenueCat will send POST requests to your server, in which the body will be a JSON representation of the notification. Your server should return a 200 status code. Any other status code will be considered a failure by our backend. RevenueCat will retry later (up to 5 times) with an increasing delay (5, 10, 20, 40, and 80 minutes). After 5 retries, we will stop sending notifications.

If you're receiving a webhook it's important to respond quickly so you don't accidentally run over a timeout limit. We recommend that apps defer processing until after the response has been sent.

Webhook Events

Event Types

Webhook Event TypeDescriptionApp StorePlay StoreAmazonStripePromo
TESTTest event issued through the RevenueCat dashboard.
INITIAL_PURCHASEA new subscription has been purchased or a lapsed user has resubscribed.
NON_RENEWING_PURCHASEA customer has made a purchase that will not auto-renew.
RENEWALAn existing subscription has been renewed.
PRODUCT_CHANGEA subscriber has changed the product of their subscription.

This does not mean the new subscription is in effect immediately. See Managing Subscriptions for more details on updates, downgrades, and crossgrades.
CANCELLATIONA subscription or non-renewing purchase has been cancelled. See cancellation reasons for more details.
UNCANCELLATIONA non-expired cancelled subscription has been re-enabled.
BILLING_ISSUEThere has been a problem trying to charge the subscriber. This does not mean the subscription has expired.

Can be safely ignored if listening to CANCELLATION event + cancel_reason=BILLING_ERROR.
SUBSCRIBER_ALIASDeprecated. A new app_user_id has been registered for an existing subscriber.
SUBSCRIPTION_PAUSEDThe subscription has set to be paused at the end of the period.

Please note: You should not revoke access when receiving a SUBSCRIPTION_PAUSED event, but only when receiving an EXPIRATION event (which will have the expiration reason SUBSCRIPTION_PAUSED)
TRANSFERA transfer of transactions and entitlements was initiated between one App User ID(s) to another.
EXPIRATIONA subscription has expired and access should be removed.

If you have Platform Server Notifications configured, this event will occur as soon as we are notified (within seconds to minutes) of the expiration.

If you do not have notifications configured, delays may be approximately 1 hour.

Events Format

Webhook events are serialized in JSON. The body of a POST request to your server will contain the serialized event, as well as the API version.

{
  "api_version": "1.0",
  "event": {
    "aliases": [
      "yourCustomerAliasedID",
      "yourCustomerAliasedID"
    ],
    "app_id": "yourAppID",
    "app_user_id": "yourCustomerAppUserID",
    "commission_percentage": 0.3,
    "country_code": "US",
    "currency": "USD",
    "entitlement_id": "pro_cat",
    "entitlement_ids": [
      "pro_cat"
    ],
    "environment": "PRODUCTION",
    "event_timestamp_ms": 1591121855319,
    "expiration_at_ms": 1591726653000,
    "id": "UniqueIdentifierOfEvent",
    "is_family_share": false,
    "offer_code": "free_month",
    "original_app_user_id": "OriginalAppUserID",
    "original_transaction_id": "1530648507000",
    "period_type": "NORMAL",
    "presented_offering_id": "OfferingID",
    "price": 2.49,
    "price_in_purchased_currency": 2.49,
    "product_id": "onemonth_no_trial",
    "purchased_at_ms": 1591121853000,
    "store": "APP_STORE",
    "subscriber_attributes": {
      "$Favorite Cat": {
        "updated_at_ms": 1581121853000,
        "value": "Garfield"
      }
    },
    "takehome_percentage": 0.7,
    "tax_percentage": 0.3,
    "transaction_id": "170000869511114",
    "type": "INITIAL_PURCHASE"
  }
}

Common Fields

FieldTypeDescriptionPossible Values
typeStringType of the event.TEST

INITIAL_PURCHASE

NON_RENEWING_PURCHASE

RENEWAL

PRODUCT_CHANGE

CANCELLATION

BILLING_ISSUE

SUBSCRIBER_ALIAS

SUBSCRIPTION_PAUSED

UNCANCELLATION

TRANSFER
idStringUnique identifier of the event.
app_idStringUnique identifier of the app the event is associated with. Corresponds to an app within a project.

This value will soon be visible in the app's configuration page in project settings.
event_timestamp_msIntegerThe time that the event was generated. Does not necessarily coincide with when the action that triggered the event occurred (purchased, cancelled, etc).
app_user_idStringLast seen app user id of the subscriber.
original_app_user_idStringThe first app user id used by the subscriber.
aliases[String]All app user ids ever used by the subscriber.

📘

When looking up users from the webhook in your systems, make sure to search both the original_app_user_id and the aliases array.

📘

If we have to retry a webhook for any reason, the retry will have the same id and event_timestamp_ms of the first attempt.

Subscription Lifecycle Events Fields

FieldTypeDescriptionPossible Values
product_idStringProduct identifier of the subscription.
entitlement_ids[String]Entitlement identifiers of the subscription.It can be NULL if the product_id is not mapped to any entitlements.
entitlement_idStringDeprecated. See entitlement_ids.Deprecated. See entitlement_ids.
period_typeStringPeriod type of the transaction.TRIAL, for free trials.

INTRO, for introductory pricing.

NORMAL, standard subscription.

PROMOTIONAL, for subscriptions granted through RevenueCat.
purchased_at_msIntegerTime when the transaction was purchased. Measured in milliseconds since Unix epoch
grace_period_expiration_at_msIntegerOnly available for BILLING_ISSUE events.

The time that the grace period for the subscription would expire. Measured in milliseconds since Unix epoch. Use this field to determine if the user is currently in a grace period.
It can be NULL if subscription does not have a grace period.
expiration_at_msIntegerExpiration of the transaction. Measured in milliseconds since Unix epoch. Use this field to determine if a subscription is still active.It can be NULL for non-subscription purchases.
auto_resume_at_msIntegerThe time when an Android subscription would resume after being paused. Measured in milliseconds since Unix epoch.

Only available for Play Store subscriptions and SUBSCRIPTION_PAUSED events.
storeStringStore the subscription belongs to.AMAZON

APP_STORE

MAC_APP_STORE

PLAY_STORE

PROMOTIONAL

STRIPE
environmentStringStore environment.SANDBOX

PRODUCTION
is_trial_conversionBooleanOnly available for RENEWAL events.

Whether the previous transaction was a free trial or not.
true or false
cancel_reasonStringOnly available for CANCELLATION events.

See Cancellation and Expiration Reasons.
UNSUBSCRIBE

BILLING_ERROR

DEVELOPER_INITIATED

PRICE_INCREASE

CUSTOMER_SUPPORT

UNKNOWN
expiration_reasonStringOnly available for EXPIRATION events.

See Cancellation and Expiration Reasons.
UNSUBSCRIBE

BILLING_ERROR

DEVELOPER_INITIATED

PRICE_INCREASE

CUSTOMER_SUPPORT

UNKNOWN
new_product_idStringProduct identifier of the new product the subscriber has switched to. Only available for App Store subscriptions and PRODUCT_CHANGE events.
presented_offering_idStringNot available for apps using legacy entitlements.

The identifier for the offering that was presented to the user during their initial purchase.
Can be NULL if the purchase was made using purchaseProduct instead of purchasePackage or if the purchase was made outside of your app or before you integrated RevenueCat.
priceDoubleThe USD price of the transaction.Can be NULL if the price is unknown, and 0 for free trials.

Can be negative for refunds.
currencyStringThe ISO 4217 currency code that the product was purchased in.USD, CAD, etc.

Can be NULL if the currency is unknown.
price_in_purchased_currencyDoubleThe price of the transaction in the currency the product was purchased in.Can be NULL if the price is unknown, and 0 for free trials.

Can be negative for refunds.
tax_percentageDoubleThe estimated percentage of the transaction price that was deducted for taxes (varies by country and store).Can be NULL if the tax percentage is unknown.
commission_percentageDoubleThe estimated percentage of the transaction price that was deducted as a store commission / processing fee.Can be NULL if the commission percentage is unknown.
takehome_percentageDoubleDEPRECATED: The estimated percentage of the transaction price that will be paid out to developers after commissions, but before VAT and DST taxes are taken into account.

We recommend using tax_percentage and commission_percentage to calculate proceeds instead. Learn more here.
subscriber_attributesMap of attribute names to attribute objects.

For more details see the subscriber attributes guide.
transaction_idStringTransaction identifier from Apple/Amazon/Google/Stripe.
original_transaction_idStringtransaction_id of the original transaction in the subscription from Apple/Amazon/Google/Stripe.
is_family_shareBooleanIndicates if the user made this purchase or if it was shared to them via Family Sharing.true or false

Always false for non-Apple purchases.
transferred_from[String]This fields is only available when type is set to TRANSFER.

App User ID(s) that transactions and entitlements are being taken from, and granted to transferred_to.
transferred_to[String]This field is only available when type is set to TRANSFER.

App User ID(s) that are receiving the transactions and entitlements taken from transferred_from.
country_codeStringThe ISO 3166 country code that the product was purchased in.

The two-letter country code (e.g., US, GB, CA) of the app user's location (this country code is derived from the last seen request from the SDK for the subscriber.)
US, CA, etc.
offer_codeStringThis field is not available when type is set to SUBSCRIBER_ALIAS or TRANSFER.

The offer code that the customer used to redeem the transaction.

Available for App Store and Play Store. For App Store this property corresponds to the offer_code_ref_name. For Play Store this corresponds to the promotionCode.
Can be null if no offer code was used for this product.

📘

Determine trial and subscription duration

To get a trial or subscription's duration from a webhook, you can subtract purchased_at_ms from expiration_at_ms and you will get the duration of the trial in milliseconds.

Cancellation and Expiration Reasons

ReasonDescriptionApp StorePlay StoreAmazonWebPromo
UNSUBSCRIBESubscriber cancelled voluntarily. This event fires when a user unsubscribes, not when the subscription expires.
BILLING_ERRORApple, Amazon, or Google could not charge the subscriber using their payment method.

The CANCELLATION event with cancellation reason BILLING_ERROR is fired as soon as the billing issue has been detected. The EXPIRATION event with expiration reason BILLING_ERROR is fired if the grace period (if set up) has ended without recovering the payment, and the customer should lose access to the subscription.
DEVELOPER_INITIATEDDeveloper cancelled the subscription.
PRICE_INCREASESubscriber did not agree to a price increase.
CUSTOMER_SUPPORTCustomer cancelled through Apple support and received a refund, a Play Store subscription was refunded through RevenueCat, an Amazon subscription was refunded through Amazon support, or a web subscription was refunded.
UNKNOWNApple did not provide the reason of the cancellation.
SUBSCRIPTION_PAUSEDThe subscription expired because it was paused (only EXPIRATION event)

Testing

You can test your server side implementation by purchasing sandbox subscriptions or by issuing test webhook events through RevenueCat's dashboard.

2514

When testing with sandbox purchases, the environment value will be SANDBOX. RevenueCat itself does not have sandbox and production environments, so this value is only determined by the type of transaction received from the store. The same customer in RevenueCat can have both sandbox and production transactions associated with their account.

Syncing Subscription Status

Webhooks are commonly used to keep a subscribers status in sync with RevenueCat across multiple systems. To simplify the logic of handling different webhook types, we recommend creating a polling system using the GET /subscribers REST API to sync the subscription status of the customer from RevenueCat to your database. Then, each webhook event can simply be a trigger to call this sync function. This approach has a few benefits and can make your system more robust and scalable.

Security and Best Practices

Authorization

You can configure the authorization header used for webhook requests via the dashboard. Your server should verify the validity of the authorization header for every notification.

Response Duration

If your server doesn't finish the response in 60s, RevenueCat will disconnect. We then retry up to 5 times. We recommend that apps respond quickly and defer processing until after the response has been sent.

Delivery Delays

Most webhooks are usually delivered within 5 to 60 seconds of the event occurring - cancellation events usually are delivered within 2hrs of the user cancelling their subscription. You should be aware of these delivery times when designing your app.

Future Proofing

You should be able to handle webhooks that include additional fields to what's shown here, including new event types. We may add new fields or event types in the future without changing the API version. We won't remove fields or events without proper API versioning and deprecation.

Handle duplicate events

RevenueCat makes our best effort for “at least one delivery” of webhooks. In some rare situations, your application may receive a webhook for the same event more than once, and it is something your webhook processing should be prepared to handle. We recommend you to guard against duplicated events by making your webhook processing idempotent. For example, you can keep track of the event id we send with each webhook to ensure you are processing the event only once.

Sample Webhook Events

These are some representative samples of webhooks you might receive from RevenueCat. Keep in mind that webhooks can include additional fields to what's shown here.

{
    "event": {
        "event_timestamp_ms": 1658726378679,
        "product_id": "com.subscription.weekly",
        "period_type": "NORMAL",
        "purchased_at_ms": 1658726374000,
        "expiration_at_ms": 1659331174000,
        "environment": "PRODUCTION",
        "entitlement_id": null,
        "entitlement_ids": [
            "pro"
        ],
        "presented_offering_id": null,
        "transaction_id": "123456789012345",
        "original_transaction_id": "123456789012345",
        "is_family_share": false,
        "country_code": "US",
        "app_user_id": "1234567890",
        "aliases": [
            "$RCAnonymousID:8069238d6049ce87cc529853916d624c"
        ],
        "original_app_user_id": "$RCAnonymousID:87c6049c58069238dce29853916d624c",
        "currency": "USD",
        "price": 4.99,
        "price_in_purchased_currency": 4.99,
        "subscriber_attributes": {
            "$email": {
                "updated_at_ms": 1662955084635,
                "value": "[email protected]"
            }
        },
        "store": "APP_STORE",
        "takehome_percentage": 0.7,
        "offer_code": null,
        "type": "INITIAL_PURCHASE",
        "id": "12345678-1234-1234-1234-123456789012",
        "app_id": "1234567890"
    },
    "api_version": "1.0"
}
{
    "event": {
        "event_timestamp_ms": 1658726522314,
        "product_id": "2100_tokens",
        "period_type": "NORMAL",
        "purchased_at_ms": 1658726519000,
        "expiration_at_ms": null,
        "environment": "PRODUCTION",
        "entitlement_id": null,
        "entitlement_ids": [
            "pro"
        ],
        "presented_offering_id": "coins",
        "transaction_id": "123456789012345",
        "original_transaction_id": "123456789012345",
        "is_family_share": false,
        "country_code": "CA",
        "app_user_id": "1234567890",
        "aliases": [
            "$RCAnonymousID:8069238d6049ce87cc529853916d624c"
        ],
        "original_app_user_id": "$RCAnonymousID:87c6049c58069238dce29853916d624c",
        "currency": "CAD",
        "price": 25.487,
        "price_in_purchased_currency": 32.99,
        "subscriber_attributes": {
            "$email": {
                "updated_at_ms": 1662955084635,
                "value": "[email protected]"
            }
        },
        "store": "APP_STORE",
        "takehome_percentage": 0.85,
        "offer_code": null,
        "type": "NON_RENEWING_PURCHASE",
        "id": "12345678-1234-1234-1234-123456789012",
        "app_id": "1234567890"
    },
    "api_version": "1.0"
}
{
    "event": {
        "event_timestamp_ms": 1658726405017,
        "product_id": "com.subscription.weekly",
        "period_type": "NORMAL",
        "purchased_at_ms": 1658755132000,
        "expiration_at_ms": 1659359932000,
        "environment": "PRODUCTION",
        "entitlement_id": null,
        "entitlement_ids": [
            "pro"
        ],
        "presented_offering_id": null,
        "transaction_id": "123456789012345",
        "original_transaction_id": "123456789012345",
        "is_family_share": false,
        "country_code": "DE",
        "app_user_id": "1234567890",
        "aliases": [
            "$RCAnonymousID:8069238d6049ce87cc529853916d624c"
        ],
        "original_app_user_id": "$RCAnonymousID:87c6049c58069238dce29853916d624c",
        "currency": "EUR",
        "is_trial_conversion": false,
        "price": 8.14,
        "price_in_purchased_currency": 7.99,
        "subscriber_attributes": {
            "$email": {
                "updated_at_ms": 1662955084635,
                "value": "[email protected]"
            }
        },
        "store": "APP_STORE",
        "takehome_percentage": 0.7,
        "offer_code": null,
        "type": "RENEWAL",
        "id": "12345678-1234-1234-1234-123456789012",
        "app_id": "1234567890"
    },
    "api_version": "1.0"
}
{
  "event": {
    "event_timestamp_ms": 1601337615995,
    "product_id": "com.revenuecat.myapp.weekly",
    "period_type": "NORMAL",
    "purchased_at_ms": 1601417766000,
    "expiration_at_ms": 1602022566000,
    "environment": "PRODUCTION",
    "entitlement_id": "pro",
    "entitlement_ids": [
      "pro"
    ],
    "presented_offering_id": "defaultoffering",
    "transaction_id": "100000000000002",
    "original_transaction_id": "100000000000000",
    "app_user_id": "$RCAnonymousID:12345678-1234-1234-1234-123456789123",
    "aliases": [
      "$RCAnonymousID:12345678-1234-ABCD-1234-123456789123",
      "user_1234"
    ],
    "offer_code": "free_month",
    "original_app_user_id": "$RCAnonymousID:12345678-1234-ABCD-1234-123456789123",
    "cancel_reason": "UNSUBSCRIBE",
    "currency": "USD",
    "price": 0.0,
    "price_in_purchased_currency": 0.0,
    "subscriber_attributes": {
      "$idfa": {
        "value": "12345678-1234-1234-1234-12345678912x",
        "updated_at_ms": 1578018408238
      },
      "$appsflyerId": {
        "value": "1234567891234-1234567",
        "updated_at_ms": 1578018408238
      },
      "favorite_food": {
        "value": "pizza",
        "updated_at_ms": 1578018408238
      }
    },
    "store": "APP_STORE",
    "takehome_percentage": 0.7,
    "type": "CANCELLATION",
    "id": "12345678-ABCD-1234-ABCD-12345678912"
  },
  "api_version": "1.0"
}
{
    "event": {
        "event_timestamp_ms": 1663982135337,
        "product_id": "com.subscription.monthly",
        "period_type": "NORMAL",
        "purchased_at_ms": 1662643092000,
        "expiration_at_ms": 1665235092000,
        "environment": "PRODUCTION",
        "entitlement_id": null,
        "entitlement_ids": [
            "plus"
        ],
        "presented_offering_id": "plus",
        "transaction_id": "123456789012345",
        "original_transaction_id": "123456789012345",
        "is_family_share": false,
        "country_code": "US",
        "app_user_id": "1234567890",
        "aliases": [
            "$RCAnonymousID:8069238d6049ce87cc529853916d624c"
        ],
        "original_app_user_id": "$RCAnonymousID:87c6049c58069238dce29853916d624c",
        "currency": "USD",
        "price": 0.0,
        "price_in_purchased_currency": 0.0,
        "subscriber_attributes": {},
        "store": "APP_STORE",
        "takehome_percentage": 0.7,
        "offer_code": null,
        "tax_percentage": 0.0,
        "commission_percentage": 0.3,
        "type": "UNCANCELLATION",
        "id": "12345678-1234-1234-1234-123456789012",
        "app_id": "1234567890"
    },
    "api_version": "1.0"
}
{
  "event" : {
    "event_timestamp_ms" : 1601337601013,
    "product_id" : "com.revenuecat.myapp.monthly",
    "period_type" : "NORMAL",
    "purchased_at_ms" : 1598640647000,
    "expiration_at_ms" : 1601319047000,
    "environment" : "PRODUCTION",
    "entitlement_id" : "pro",
    "entitlement_ids" : [
      "pro"
    ],
    "presented_offering_id" : "defaultoffering",
    "transaction_id" : "100000000000002",
    "original_transaction_id" : "100000000000000",
    "app_user_id" : "$RCAnonymousID:12345678-1234-1234-1234-123456789123",
    "aliases" : [
      "$RCAnonymousID:12345678-1234-1234-1234-123456789123"
    ],
    "offer_code": "summer_special",
    "original_app_user_id" : "$RCAnonymousID:12345678-1234-1234-1234-123456789123",
    "currency" : "USD",
    "price" : 0,
    "price_in_purchased_currency" : 0,
    "subscriber_attributes" : {
      "$idfa" : {
        "value" : "12345678-1234-1234-1234-12345678912x",
        "updated_at_ms" : 1578018408238
      },
      "$appsflyerId" : {
        "value" : "1234567891234-1234567",
        "updated_at_ms" : 1578018408238
      }
    },
    "store" : "APP_STORE",
    "takehome_percentage" : 0.7,
    "tax_percentage": null,
    "commission_percentage": null,
    "type" : "BILLING_ISSUE",
    "id" : "12345678-1234-1234-1234-12345678912"
  },
  "api_version" : "1.0"
}
{
    "event": {
        "event_timestamp_ms": 1652796516000,
        "product_id": "premium",
        "period_type": "NORMAL",
        "purchased_at_ms": 1652681048845,
        "expiration_at_ms": 1655366648845,
        "environment": "PRODUCTION",
        "entitlement_id": "Premium1",
        "entitlement_ids": [
            "Premium1"
        ],
        "presented_offering_id": "premium",
        "transaction_id": "123456789012345",
        "original_transaction_id": "123456789012345",
        "is_family_share": false,
        "country_code": "US",
        "app_user_id": "1234567890",
        "aliases": [
            "$RCAnonymousID:8069238d6049ce87cc529853916d624c"
        ],
        "original_app_user_id": "$RCAnonymousID:87c6049c58069238dce29853916d624c",
        "auto_resume_at_ms": 1657951448845,
        "currency": "USD",
        "price": 0.0,
        "price_in_purchased_currency": 0.0,
        "subscriber_attributes": {
            "$email": {
                "updated_at_ms": 1662955084635,
                "value": "[email protected]"
            }
        },
        "store": "PLAY_STORE",
        "takehome_percentage": 0.85,
        "offer_code": null,
        "type": "SUBSCRIPTION_PAUSED",
        "id": "12345678-1234-1234-1234-123456789012",
        "app_id": "1234567890"
    },
    "api_version": "1.0"
}
{
 "event": {
     "app_id": "1234567890",
     "event_timestamp_ms": 78789789798798,
     "id": "CD489E0E-5D52-4E03-966B-A7F17788E432",
     "store": "APP_STORE",
     "transferred_from": ["00005A1C-6091-4F81-BE77-F0A83A271AB6"],
     "transferred_to": ["4BEDB450-8EF2-11E9-B475-0800200C9A66"],
     "type": "TRANSFER",
 },
 "api_version": "1.0"
}
{
  "event" : {
    "event_timestamp_ms" : 1601337615995,
    "product_id" : "com.revenuecat.myapp.monthly",
    "period_type" : "NORMAL",
    "purchased_at_ms" : 1601258901000,
    "expiration_at_ms" : 1601336705000,
    "environment" : "PRODUCTION",
    "entitlement_id" : "pro",
    "entitlement_ids" : [
      "pro"
    ],
    "presented_offering_id" : "defaultoffering",
    "transaction_id" : "100000000000000",
    "original_transaction_id" : "100000000000000",
    "app_user_id" : "$RCAnonymousID:12345678-1234-ABCD-1234-123456789123",
    "aliases" : [
      "$RCAnonymousID:12345678-1234-1234-1234-123456789123",
      "user_1234"
    ],
    "offer_code": null,
    "original_app_user_id" : "$RCAnonymousID:12345678-1234-1234-1234-123456789123",
    "cancel_reason" : "CUSTOMER_SUPPORT",
    "currency" : "USD",
    "price" : -9.99,
    "price_in_purchased_currency" : -9.99,
    "subscriber_attributes" : {
      "$idfa" : {
        "value" : "12345678-1234-1234-1234-12345678912x",
        "updated_at_ms" : 1578018408238
      },
      "$appsflyerId" : {
        "value" : "1234567891234-1234567",
        "updated_at_ms" : 1578018408238
      }
    },
    "store" : "APP_STORE",
    "takehome_percentage" : 0.7,
    "tax_percentage": 0.1109,
    "commission_percentage": 0.15,
    "type" : "CANCELLATION",
    "id" : "12345678-1234-1234-1234-12345678912"
  },
  "api_version" : "1.0"
}
{
  "event" : {
    "event_timestamp_ms" : 1601338594769,
    "product_id" : "com.revenuecat.myapp.monthly",
    "period_type" : "NORMAL",
    "purchased_at_ms" : 1601304429682,
    "expiration_at_ms" : 1601311606660,
    "environment" : "PRODUCTION",
    "entitlement_id" : "subscription",
    "entitlement_ids" : [
      "subscription"
    ],
    "presented_offering_id" : "defaultoffering",
    "transaction_id" : "GPA.1234-1234-1234-12345",
    "original_transaction_id" : "GPA.1234-1234-1234-12345",
    "app_user_id" : "$RCAnonymousID:12345678-1234-1234-1234-123456789123",
    "aliases" : [
      "$RCAnonymousID:12345678-1234-1234-1234-123456789123"
    ],
    "offer_code": null,
    "original_app_user_id" : "$RCAnonymousID:12345678-1234-1234-1234-123456789123",
    "new_product_id" : "com.revenuecat.myapp.yearly",
    "currency" : "USD",
    "price" : 0,
    "price_in_purchased_currency" : 0,
    "subscriber_attributes" : {},
    "store" : "PLAY_STORE",
    "takehome_percentage" : 0.70,
    "type" : "PRODUCT_CHANGE",
    "id" : "12345678-1234-1234-1234-12345678912"
  },
  "api_version" : "1.0"
}

Here are events you will see regarding trials:

{
    "event": {
        "event_timestamp_ms": 1658726366696,
        "product_id": "com.subscription.yearly",
        "period_type": "TRIAL",
        "purchased_at_ms": 1658726358573,
        "expiration_at_ms": 1658992117958,
        "environment": "PRODUCTION",
        "entitlement_id": null,
        "entitlement_ids": [
            "pro"
        ],
        "presented_offering_id": "standard",
        "transaction_id": "123456789012345",
        "original_transaction_id": "123456789012345",
        "is_family_share": false,
        "country_code": "PH",
        "app_user_id": "1234567890",
        "aliases": [
            "$RCAnonymousID:8069238d6049ce87cc529853916d624c"
        ],
        "original_app_user_id": "$RCAnonymousID:87c6049c58069238dce29853916d624c",
        "currency": "PHP",
        "price": 0,
        "price_in_purchased_currency": 0,
        "subscriber_attributes": {
            "$email": {
                "updated_at_ms": 1662955084635,
                "value": "[email protected]"
            }
        },
        "store": "PLAY_STORE",
        "takehome_percentage": 0.85,
        "offer_code": null,
        "type": "INITIAL_PURCHASE",
        "id": "12345678-1234-1234-1234-123456789012",
        "app_id": "1234567890"
    },
    "api_version": "1.0"
}
{
    "event": {
        "event_timestamp_ms": 1658726482659,
        "product_id": "com.subscription.weekly",
        "period_type": "TRIAL",
        "purchased_at_ms": 1658725349000,
        "expiration_at_ms": 1658984549000,
        "environment": "PRODUCTION",
        "entitlement_id": null,
        "entitlement_ids": [
            "Premium"
        ],
        "presented_offering_id": null,
        "transaction_id": "123456789012345",
        "original_transaction_id": "123456789012345",
        "is_family_share": false,
        "country_code": "CN",
        "app_user_id": "1234567890",
        "aliases": [
            "$RCAnonymousID:8069238d6049ce87cc529853916d624c"
        ],
        "original_app_user_id": "$RCAnonymousID:87c6049c58069238dce29853916d624c",
        "cancel_reason": "UNSUBSCRIBE",
        "currency": "CNY",
        "price": 0.0,
        "price_in_purchased_currency": 0.0,
        "subscriber_attributes": {
            "$email": {
                "updated_at_ms": 1662955084635,
                "value": "[email protected]"
            }
        },
        "store": "APP_STORE",
        "takehome_percentage": 0.7,
        "offer_code": null,
        "type": "CANCELLATION",
        "id": "12345678-1234-1234-1234-123456789012",
        "app_id": "1234567890"
    },
    "api_version": "1.0"
}