Event Parameters and Properties

Reference of event parameters and Apphud-managed user properties sent to third-party integrations.

When Apphud sends events about subscriptions and non-renewing purchases to third-party services — mobile analytics, attribution providers, messengers — each event carries a payload of event parameters and a snapshot of Apphud-managed user properties.

This page documents what's in that payload. For the list of event types Apphud emits, see Event Types. For per-integration payload mapping (which provider expects which field name), see the corresponding integration guides under Integrations Overview.

Event Parameters

Every event carries these parameters where applicable. Many integrations expect different field names for the same data — local_price in one provider is af_revenue in AppsFlyer and _valueToSum in Meta (Facebook). Apphud sends the right field name per integration automatically.

ParameterDescription
product_id / af_content_id / content_items[0].$sku / fb_content_idProduct identifier
transaction_idTransaction identifier from the store
unitIncrement of time for a subscription period. Possible values: day, week, month, year
units_countNumber of units per subscription period
local_price / af_revenue / _valueToSumCost of the product in the local store currency
currency / af_currency / fb_currencyLocal currency ISO code
usd_price / content_items[0].$priceCost of the product converted to USD (see About Analytics → About Currencies)
price_descriptionCombined display string. Format: <local_price> <currency> ~ <usd_price> USD. Example: 499 RUB ~ 7.8 USD
reasonReason for an expiration, refund, or billing-issue-resolved event — see Reason values below
offer_idPromotional offer identifier
offer_typeIntroductory or promotional offer payment mode. Possible values: pay_up_front, pay_as_you_go, trial (for promotional offers)
app_nameApp name as configured in Apphud
user_idApphud user identifier
group_nameSubscription / permission group name
📘

Field naming per integration

To see exactly which field name a specific destination expects, check that integration's guide. The mapping is one-to-one — Apphud just routes the same logical value under the destination's preferred name.

Reason values

The reason parameter has different value sets depending on the event:

Subscription expired (subscription / intro / promo / trial)

  • user_canceled — user canceled the subscription manually
  • billing_issue — billing error during renewal
  • declined_price_increase — user didn't agree to a recent price increase
  • unavailable_product — product wasn't available at the time of renewal
  • unknown_error — unknown error

Subscription refunded (subscription / intro / promo)

  • app_issue — user canceled due to a real or perceived issue with your app
  • another_reason — canceled for another reason (e.g., accidental purchase)

Billing issue resolved

  • The reason field carries the product_id from the last active receipt at the time the billing issue was resolved.

User Properties

Alongside event payloads, Apphud sends a snapshot of Apphud-managed user properties for the user the event belongs to. Destination analytics use these for downstream segmentation.

These are Apphud-managed system properties — they're distinct from your own Custom User Properties set via the SDK. System properties use the [Apphud] prefix.

PropertyDescription
[Apphud] status-<group_name>Subscription status for the named permission group. See Status values below
[Apphud] autorenew-<group_name>Whether auto-renew is on for the subscription in that group
[Apphud] total_spentLifetime spend by the user, in USD
[Apphud] payingWhether the user has any paying status
[Apphud] payments_countNumber of charge events for this user
📘

<group_name> placeholder

Replace <group_name> with the name of your Permission Group as configured in Product Hub → Permission groups. If your app has multiple groups (Premium, Pro, Lifetime), each appears as a separate property — e.g., [Apphud] status-Premium, [Apphud] status-Pro.

Status values

All values are per Permission Group:

  • none — user has never purchased a subscription in this group
  • trial — user is currently in trial period
  • intro — user is currently on an introductory offer
  • regular — user has a subscription at the regular price
  • promo — user is currently on a promotional offer
  • refunded — user refunded the subscription
  • expired — subscription lapsed

FAQ

Why does the same parameter appear under multiple names (e.g., local_price / af_revenue)?

Different integrations use different field names for the same data. AppsFlyer expects af_revenue, Facebook expects _valueToSum, generic analytics expects local_price. Apphud routes the same logical value under the right name automatically — you don't configure this. See the per-integration guide under Integrations Overview for each destination's exact mapping.

Where does the USD value in usd_price come from?

From the exchange rate at the time the event was created. The historical USD value is frozen at event time and doesn't change later. See About Analytics → About Currencies for the conversion source.

What's the difference between [Apphud] status-<group> properties and Custom User Properties?

  • [Apphud] status-<group> is Apphud-managed — Apphud sets it automatically based on the user's subscription state. You can read it in destinations but you can't set it.
  • Custom User Properties are properties you set via the SDK (Apphud.setUserProperty, etc.) — anything app-specific like quiz answers, signup source, premium-feature flags.

Both flow to integration destinations alongside events.

Are these parameters sent on every event?

Most parameters are sent on every applicable event. reason is only sent on events where it makes sense (expirations, refunds, billing-issue resolutions). offer_id / offer_type only on events tied to a paid intro or promotional offer.

How do I see the actual payload for a specific event?

In Events → click a row → Event details → click View details on a specific connection → opens that integration's per-event log with the full payload.