Solar Engine Event Delivery Reference
Example Solar Engine event delivery request and RevenueCat source mapping
Use this page as a reference for the event delivery request RevenueCat sends to Solar Engine. For setup steps, see Solar Engine.
Solar Engine delivery has one main request shape, but the payload can be hard to read in Customer History because RevenueCat sends both a user update and an event entry in the same request. This reference shows how RevenueCat chooses the endpoint, app key, Solar Engine event type, and user identifiers.
| Delivery type | Delivery behavior | Required identifiers |
|---|---|---|
| Event + user update | Sends one request body with a userset entry and an event entry. | iOS or Android App Key. Solar Engine customer identifiers are optional because RevenueCat can fall back to platform identifiers or a generated distinct ID. |
Example event delivery request
{
"body": [
{
"_appkey": "<ios_or_android_app_key>",
"_distinct_id": "<solar_engine_distinct_id_or_device_id>",
"_ts": <event_timestamp_ms>,
"_package_type": 2,
"_source_type": "api",
"_account_id": "<app_user_id>",
"_idfv": "<idfv>",
"_ip": "<ip_address>",
"_type": "userset",
"_userset_type": "userUpdate",
"properties": {
"rc_app_user_id": "<app_user_id>",
"rc_entitlement_ids": ["<entitlement_id>"],
"rc_app_id": "<app_configuration_id>"
}
},
{
"_appkey": "<ios_or_android_app_key>",
"_distinct_id": "<solar_engine_distinct_id_or_device_id>",
"_ts": <event_timestamp_ms>,
"_package_type": 2,
"_source_type": "api",
"_account_id": "<app_user_id>",
"_idfv": "<idfv>",
"_ip": "<ip_address>",
"_type": "event",
"_event_id": "<revenuecat_event_id>",
"_event_name": "_appPur",
"properties": {
"rc_app_user_id": "<app_user_id>",
"rc_entitlement_ids": ["<entitlement_id>"],
"rc_app_id": "<app_configuration_id>",
"_platform": <platform_code>,
"_package_name": "<package_name>",
"_pay_amount": <revenue_in_purchase_currency>,
"_pay_status": 1,
"rc_event_name": "<configured_event_name>",
"_product_id": "<product_id>",
"_currency_type": "<purchase_currency>",
"rc_period_type": "<period_type>",
"rc_purchased_at_ms": <purchase_timestamp_ms>,
"rc_transaction_id": "<transaction_id>",
"rc_original_transaction_id": "<original_transaction_id>",
"rc_store": "<store>"
}
}
]
}
If Use China Mainland Storage Region is enabled, RevenueCat uses https://api-receiver.detailroi.com and sends _package_type as 1. Otherwise, RevenueCat uses https://vg-api-receiver.detailroi.com and sends _package_type as 2.
RevenueCat source to Solar Engine request mapping
| Solar Engine request element | RevenueCat source and behavior |
|---|---|
| Endpoint and signing | Sends POST requests using the global or China mainland Solar Engine domain based on the Use China Mainland Storage Region setting. Sends a timestamp query parameter and a sign query parameter containing an MD5 signature of the app key plus timestamp. |
| Request body | Sends an array with two entries: a userset entry and an event entry. |
_appkey | Uses the iOS App Key for App Store purchases and the Android App Key for Play Store purchases. Other store types are not sent. |
_type | Sends userset for the user-properties entry and event for the RevenueCat lifecycle event entry. The userset entry includes RevenueCat user context, such as app user ID, aliases, subscriber attributes, active entitlements, and app configuration ID when available. |
_event_name | Sends _appPur for purchase events that Solar Engine treats as in-app purchases. Other lifecycle events use the configured event name. |
properties | Sends ordinary event context such as platform, package name, revenue in the purchase currency, product ID, purchase currency, purchase timestamps, transaction identifiers, entitlement context, aliases, store, offer code, and family-share status when available. Properties with special Solar Engine behavior are itemized separately. |
properties.rc_event_name | Included on _appPur events so the configured RevenueCat event name is still available inside event properties. |
properties._pay_status | Sends 1 for _appPur events, as required by Solar Engine. |
_distinct_id | Uses $solarEngineDistinctId when present. Otherwise, iOS events use $idfv, Android events use $gpsAdId, and events without either value use a generated fallback. |
_visitor_id, _account_id | Sends $solarEngineVisitorId and $solarEngineAccountId when set. If neither Solar Engine ID is set, RevenueCat falls back to the app user ID as _account_id. |
_idfa, _idfv, _gaid | Sends available device identifiers from RevenueCat customer attributes. |
_ip | Sends the customer's IP address when available. If no IP is available, RevenueCat sends 0.0.0.0 so Solar Engine does not use the request IP for geolocation. |
| Success response | Treats the request as successful only when Solar Engine returns valid JSON and status is 0. |
Event name behavior
RevenueCat sends _appPur instead of the configured event name for:
- Non-trial initial purchases
- Renewals, including trial conversions
- Non-renewing purchases
RevenueCat sends the configured custom event name for other lifecycle events, such as trial starts, trial cancellations, cancellations, uncancellations, subscription pauses, expirations, billing issues, and product changes.