Adjust
Forward Rovenue revenue and subscription-lifecycle events to Adjust's server-to-server (S2S) event API using your own Adjust event tokens.
Adjust
The Adjust integration forwards Rovenue revenue events (purchases, trial conversions, renewals, refunds, cancellations) and subscription-lifecycle events (trials, grace period, billing issues, plan changes) to Adjust's server-to-server event API, so subscription revenue is attributed back to the install-time campaign, network, and cohort that drove it.
Unlike Amplitude, Mixpanel, and AppsFlyer, Adjust has no built-in default event mapping — every event you want forwarded needs its own Adjust event token, configured in the drawer's mapping step.
1. Get your credentials from Adjust
- Open the Adjust dashboard → App Settings for the app you want Rovenue events attributed to.
- Copy the App token.
- For each Rovenue event you want to forward, create an event in Adjust (Adjust dashboard → Events) and copy its event token (a short alphanumeric string, e.g.
f0ob4r). You'll paste these into Rovenue's mapping step in step 3 below.
2. Add the integration in Rovenue
- In the Rovenue dashboard, navigate to Apps (left sidebar).
- Find Adjust under Attribution & MMP and click it.
- The side drawer opens. Fill in the Credentials step:
- App token — paste the app token from step 1.
- Click Validate.
Validate is shape-only. Adjust's S2S event API is a write-only ingestion endpoint with no dedicated credential-check probe — there is no way to confirm an app token is correct without sending a real event with a real event token. Validate here only confirms the form is well-formed (app token present). The connection's Delivery Log (in the drawer's Deliveries tab) is the actual proof: trigger a real event and confirm it shows
succeededwith an HTTP200.
- Choose which events to forward.
- On the Mapping step, enter the Adjust event token for each event you selected — the value you type there is sent verbatim as
event_token. An event left blank on this step is never forwarded (skipped withno_mapping), since Adjust has no vendor-wide event vocabulary to fall back to.
3. Event mapping
eventMapping[key].eventName is the Adjust event token — there's no vendor name translation layer. Rovenue's public event keys are available for mapping, but none of them has a default:
| Rovenue event key | Adjust event_token |
|---|---|
revenue.INITIAL | (your own token) |
revenue.TRIAL_CONVERSION | (your own token) |
revenue.RENEWAL | (your own token) |
revenue.CREDIT_PURCHASE | (your own token) |
revenue.REFUND | (your own token) |
revenue.CANCELLATION | (your own token) |
subscription.trial.started | (your own token) |
subscription.cancel_requested | (your own token) |
subscription.expired | (your own token) |
subscription.billing_issue | (your own token) |
subscription.grace_period | (your own token) |
subscription.uncancelled | (your own token) |
subscription.product_changed | (your own token) |
subscription.paused | (your own token) |
subscription.recovered | (your own token) |
subscription.revoked | (your own token) |
subscription.offer_redeemed | (your own token) |
Every forwarded event carries deduplication_id and callback_params.outbox_event_id (Rovenue's internal outboxEventId, for dedup — see below) and callback_params.product_id when known. For the six revenue.* keys only, it also carries revenue/currency; subscription-lifecycle events never carry revenue fields — they represent no money movement.
revenue is always sent as a positive number, including for revenue.REFUND — Adjust's S2S event API documents no convention for representing a refund as negative revenue (same finding as AppsFlyer).
4. Identity resolution
Every forwarded event requires one advertising/device id. Rovenue resolves it in this order:
$adjustId(Adjust's ownadid) — sent asadid.$idfa(iOS advertising identifier) — sent asidfa, only if$adjustIdis absent.$gpsAdId(Android advertising identifier) — sent asgps_adid, only if both of the above are absent and the advertising-id gate lets it through, which it currently never does.
If none of the three survive, the event is skipped with reason no_user_data (visible in the connection's Delivery Log). Advertising ids are default-deny: $idfa is sent only when the subscriber's $attConsentStatus is authorized, and $gpsAdId is never sent, because no Android opt-in signal exists. Without an authorized IDFA, this fallback narrows to $adjustId, so set it from the Adjust SDK to keep those users attributed.
See Subscriber Identity Attributes for the full reserved-attribute reference, including $adjustId.
5. Deduplication
Every forwarded event's deduplication_id and callback_params.outbox_event_id are both set to Rovenue's internal outboxEventId.
deduplication_id is not an enumerated parameter in Adjust's published S2S events reference — Adjust's dedup behaviour for S2S events is undocumented there. Rovenue sends it as a top-level echo of the same id already carried in callback_params.outbox_event_id, on the expectation that an unrecognised parameter is ignored safely; if Adjust does act on it, retries after a network failure or an at-least-once outbox replay dedupe at Adjust as well. Either way, Rovenue's own guarantees (an at-least-once outbox plus query-time idempotent revenue views) do not depend on Adjust honouring the field, and callback_params.outbox_event_id is always available in Adjust's raw-data exports for dedup on your side.
6. Verify events are arriving
- Open Apps → Adjust → Delivery Log in the Rovenue dashboard and check for
succeededrows with HTTP200. - Cross-check in Adjust's own raw data exports or Datascape, filtered to one of the event tokens above.
- If events are not appearing:
- Confirm the event has a token configured in the connection's mapping step — a blank mapping skips with
no_mapping. - Confirm the subscriber has one of
$adjustId/$idfa/$gpsAdIdset (missing all three skips withno_user_data). - A
401/403response means the app token is wrong or belongs to a different Adjust account. - Ensure the event type you're sending is included in the connection's enabled events.
- Confirm the event has a token configured in the connection's mapping step — a blank mapping skips with