Attribution Troubleshooting
Troubleshoot RevenueCat attribution provider integrations by symptom
Use this page when RevenueCat attribution-provider events don't appear, are rejected, or appear in the provider but don't attribute or report as expected.
RevenueCat delivery and provider-side attribution are separate steps. A successful delivery means the provider endpoint accepted the event from RevenueCat. The provider still decides whether that event can be matched to a user, attributed to a campaign, used for optimization, or included in a specific report.
Symptoms
- No provider delivery row appears in RevenueCat
- RevenueCat shows delivery, but provider attribution or reporting is wrong
- The provider rejects events
- Provider revenue appears duplicated or too high
- Provider revenue appears missing or too low
- Historical or backfilled events behave differently
No provider delivery row appears in RevenueCat
If a purchase or lifecycle event has no delivery row for the provider in Customer History, RevenueCat didn't attempt to send that event to the provider.
Causes in this section:
- Required identifiers or attributes were missing when the event was processed
- The integration or credentials aren't configured for this environment
- The event type isn't supported or enabled
Cause: Required identifiers or attributes were missing when the event was processed
RevenueCat only sends provider events when the required identifiers, device attributes, or attribution data are present at processing time. If attributes are set after the purchase, future events can use them, but the earlier event may not be sent.
Solution:
- Check the customer's Customer Profile for the provider's required attributes before the purchase event.
- If the attributes were missing, configure the RevenueCat SDK first, then collect and set provider identifiers before the first purchase whenever possible.
- If the provider SDK exposes its identifier asynchronously, set the RevenueCat attribute when the identifier becomes available.
- Adjust
- Appstack
- Tenjin
- None
- Adjust exposes the ADID asynchronously, so it may not be available before
the first purchase. Set
$adjustIdin RevenueCat when the ADID becomes available. - If
$adjustIdwas missing when RevenueCat processed the event, RevenueCat doesn't create an Adjust delivery attempt for that event. Setting$adjustIdlater doesn't reprocess the past event. - Adjust SDK v5 removed
adidfromADJAttributionon iOS andAdjustAttributionon Android. Fetch the ADID from the Adjust SDK instead.
- Appstack attribution params on iOS can be unavailable when your app first
fetches them. If
$appstackIdis missing, update your app code to merge the local Appstack ID fromgetAppstackId()into the attribution params returned bygetAttributionParams()before passing them tosetAppstackAttributionParams(). This protects against transient network responses wheregetAttributionParams()doesn't includeappstack_id.
- Tenjin requires a platform advertising identifier for delivery.
- On iOS, set the
$idfacustomer attribute, including the zeroed default IDFA when App Tracking Transparency permission isn't granted. - On Android, set the
$gpsAdIdcustomer attribute.
Cause: The integration or credentials aren't configured for this environment
RevenueCat needs the provider integration enabled for the correct project and credentials for the environment being tested. Sandbox purchases often require separate sandbox credentials.
Solution:
- Confirm the provider integration is enabled for the correct RevenueCat project.
- Check production and sandbox credentials, app tokens, event tokens, API keys, dataset IDs, or other required provider settings.
- If the provider requires separate sandbox authentication, configure sandbox values before testing sandbox purchases.
- Meta Ads
- None
- For Conversions API, confirm the Dataset ID and Conversions API Token come from the Meta dataset you want RevenueCat to send events into.
- CAPI can support iOS App Events datasets and isn't limited to web Pixels. The dataset ID doesn't need to match the Meta App ID, but the dataset must be linked to the app and accessible from the correct Meta business portfolio.
- Sandbox purchases require sandbox credentials in RevenueCat: a Sandbox Dataset ID and Sandbox Conversions API Token for CAPI, or a Sandbox App ID and Sandbox Client Token for App Events API.
Cause: The event type isn't supported or enabled
RevenueCat may send some provider events while skipping others if the provider doesn't support that lifecycle event, or if the event is optional and not configured.
Solution:
- Confirm the provider supports the RevenueCat event type you expected to send.
- If the event is optional, configure it in RevenueCat before testing that event type.
- Adjust
- Meta Ads
- Asapty
- SplitMetrics Acquire
- None
- Adjust uses provider-issued event tokens, not readable event names. For each platform section in RevenueCat, copy the token from the matching Adjust app and event.
- Don't reuse a token across different RevenueCat lifecycle events unless you intentionally want Adjust to report them as the same event.
- Trial starts map to
StartTrialby default. Trial conversions, initial subscription purchases, and renewals map toSubscribeby default. Non-subscription purchases map tofb_mobile_purchaseby default. - Funnels events are sent to Meta as custom events for analytics. They aren't used for Meta ad attribution or campaign optimization.
- Asapty only receives production iOS App Store purchases which are associated with customers already attributed to Apple Search Ads.
- Organic installs, sandbox purchases, non-Apple platforms, and purchases without Apple Search Ads attribution are skipped.
- SplitMetrics Acquire depends on Apple Search Ads attribution.
- Configure Apple Search Ads attribution collection first, then test with an iOS App Store purchase that RevenueCat can associate with Apple Search Ads data.
RevenueCat shows delivery, but provider attribution or reporting is wrong
A Sent, 200, or successful delivery state means RevenueCat delivered the event to the provider. It doesn't guarantee that the provider attributed the event to a campaign, improved match quality, counted it in Ads Manager, or aligned ROAS with RevenueCat dashboards.
Causes in this section:
- Delivery succeeded, but the provider couldn't match or attribute the event
- Attribution fields were set from fallback or placeholder values
- The provider report is delayed or filtered differently
- Revenue basis differs between RevenueCat and the provider
Cause: Delivery succeeded, but the provider couldn't match or attribute the event
The provider owns attribution and matching. If the event doesn't include enough identifiers, arrives outside a provider attribution window, or isn't eligible for a campaign, dataset, app, or optimization configuration, it may be accepted but still appear as Organic, Unattributed, or missing from a specific report.
Solution:
- Check the identifiers RevenueCat sent to the provider, then compare them to the provider's matching requirements.
- Review the provider's campaign, dataset, app, event, and optimization configuration.
- Check attribution windows and other provider-side eligibility requirements.
- When available and privacy-compliant, set additional matching attributes to improve the provider's ability to match events to users or campaigns.
- Meta Ads
- Apple Search Ads
- Kochava
- None
- Meta owns campaign attribution, Event Match Quality, Ads Manager optimization, SKAdNetwork, and Aggregated Event Measurement readiness.
- RevenueCat's Conversions API integration is limited to values that are on the RevenueCat customer profile and mapped into Meta's payload. The Meta SDK may provide richer on-device context for app-open events, while RevenueCat can send subscription events that occur when the app isn't open.
- Set
$fbAnonId, collect device identifiers, and set additional matching attributes like$emailor$phoneNumberbefore the purchase event when privacy rules allow it. - For iOS campaigns, CAPI delivery doesn't update SKAdNetwork conversion values or configure Aggregated Event Measurement. Complete those steps in Meta, Apple, your app, or an MMP.
- Apple Search Ads attribution depends on the collected AdServices token, the Basic or Advanced integration mode, and the Apple Ads account access granted to RevenueCat. - Limited Access users must include the campaign groups RevenueCat needs, or attribution data may be partial.
- Kochava Free App Analytics accounts can return a successful response for server-to-server post-install events while silently dropping those events.
- Use a paid Kochava account that supports the S2S post-install event API.
Cause: Attribution fields were set from fallback or placeholder values
RevenueCat stores reserved attribution attributes as write-once values. If your app sets a fallback or placeholder value like Organic, Unknown, or No User Consent before the final provider attribution value is available, RevenueCat can't replace that value later for the same customer.
Solution:
- Check the customer's Customer Profile for reserved attribution attributes such as
$mediaSource,$campaign,$adGroup, or$creative. - If a fallback or placeholder value is already stored, test with a new customer after updating your app to set only final attribution values.
- Set attribution fields only after your app has final values from the provider SDK, attribution callback, or another attribution source.
Cause: The provider report is delayed or filtered differently
Provider dashboards often have their own processing delays, date bases, attribution filters, cost data, and report defaults. A successful RevenueCat delivery can appear before the provider dashboard has finished processing the event.
Solution:
- Wait for the provider's expected reporting delay before comparing dashboards: some providers process event reporting within hours, while attribution data for newly configured campaigns can take several days.
- When comparing ROAS, make sure provider cost data, report filters, attribution windows, and date ranges match the comparison you are making in RevenueCat.
- AppsFlyer
- Meta Ads
- Apple Search Ads
- None
- AppsFlyer reports in-app events by install date.
- If you compare RevenueCat event dates with an AppsFlyer install-date report, delivered events can look missing from the selected date range.
- Meta Events Manager can take up to 24 hours to show accepted events. - Wait for Meta's reporting delay before comparing Meta dashboards with RevenueCat delivery results.
- Apple Search Ads attribution data can take up to 7 days for new campaigns or newly configured integrations.
- Wait for Apple attribution data to populate before comparing campaign, ad group, or keyword results.
Cause: Revenue basis differs between RevenueCat and the provider
RevenueCat's Sales Reporting setting controls whether RevenueCat sends gross revenue or revenue after commission and/or estimated taxes. If the provider report uses a different revenue basis, ROAS and revenue totals can differ even when all events were delivered.
Solution:
- Use the same gross or post-commission/tax basis in RevenueCat and in the financial report where the provider data will be used.
The provider rejects events
Provider rejection messages usually come from the provider endpoint. The event was attempted, but the provider didn't accept it.
Causes in this section:
- Provider authentication is incomplete or mismatched
- The provider rejected malformed or ineligible event data
Cause: Provider authentication is incomplete or mismatched
Some providers require additional authentication for server-to-server events. This can be separate from the SDK keys or app identifiers used in your app.
Solution:
- Check the provider error text in RevenueCat Customer History or integration delivery details.
- Compare the error to the provider's API documentation and the provider setup page.
- If the error points to authentication, confirm that all required server-to-server credentials are configured in RevenueCat.
- Adjust
- None
-
If the Adjust delivery response says
Missing authentication token, RevenueCat sent the event without an OAuth token, but Adjust requires one for authenticated S2S event requests. -
Configure the matching OAuth token in RevenueCat.
-
Example error:
{"error":"Event request failed (missing authentication token)"}
Cause: The provider rejected malformed or ineligible event data
Providers may reject malformed identifiers, invalid device data, unsupported event properties, or events that don't meet API requirements.
Solution:
- Confirm the required identifiers and credentials are valid before retrying.
- If the provider error names a specific field, fix that field first before testing with a new event.
Provider revenue appears duplicated or too high
Duplicated revenue usually means the provider counted more than one event for the same purchase or subscription lifecycle event.
Cause: RevenueCat and the provider SDK both sent the same revenue event
RevenueCat sends purchase and subscription events to most attribution providers server-to-server. If the provider SDK also tracks purchase or revenue events in your app, the provider may count both copies.
Solution:
- Turn off duplicate provider SDK purchase or revenue tracking, or intentionally configure deduplication in the provider.
- In most setups, let RevenueCat send subscription purchase, renewal, and trial conversion revenue, while the provider SDK continues sending non-revenue install, activation, and usage events when needed.
Provider revenue appears missing or too low
Lower-than-expected revenue can come from event coverage, provider support, or revenue values rather than delivery failure.
Causes in this section:
- The provider or integration doesn't support the event or revenue value
- Revenue is being compared on different bases
Cause: The provider or integration doesn't support the event or revenue value
Some integrations don't send every RevenueCat lifecycle event by default. Some providers also don't support negative revenue, zero-revenue events, or very small revenue values.
Solution:
- Confirm the event type is supported by the provider integration.
- Configure optional event types for every optional event you want to send.
- Check whether RevenueCat omitted revenue for free trials, zero-revenue events, refunds, negative revenue, or values below the provider's minimum supported revenue amount.
- Adjust
- Singular
- None
- Adjust doesn't accept events with revenue less than
0.001, so free trial events are sent without a revenue property. - RevenueCat's Adjust integration doesn't support negative revenue, so refund events are sent without a revenue property.
- Singular revenue from RevenueCat-delivered events may not appear in the SDK console.
- Check Singular Export logs to verify that the event was processed as a revenue event.
Cause: Revenue is being compared on different bases
If RevenueCat sends post-commission/tax revenue but the provider report expects gross revenue, provider revenue may look lower than RevenueCat dashboards.
Solution:
- Use the same gross or post-commission/tax basis in RevenueCat and in the financial report where the provider data will be used.
Historical or backfilled events behave differently
Historical imports, migrations, and replayed events can behave differently from live events.
Cause: Providers apply timestamp, ordering, or attribution-window rules
Providers may validate event timestamps, reject out-of-order events, or apply different attribution windows to historical events.
Solution:
- Confirm whether the provider accepts historical timestamps for the event types you plan to send.
- Test a small representative batch before sending a full backfill.
- Compare provider warnings with RevenueCat delivery results.
- Meta Ads
- Adjust
- None
- Meta's Conversions API may reject events whose
event_timeis more than seven days old. - Meta may still reject retried or replayed events after a configuration
fix if the original
event_timeis outside Meta's acceptance window, so prioritize validating and fixing your Meta configuration early.
- Adjust can warn or reject events that arrive out of timestamp order, such as a historical import sent after a newer live event for the same customer.
- Test migrations with a small sample before sending a large backfill.