Apple Search Ads has no API for advertisers to upload conversions. Apple attributes installs itself through AdServices, and Appeeky shows that attribution in ROAS.
How It Works
- You create a smart link for each ad campaign, with Channel set to the ad platform (
tiktok_ads,meta_adsorgoogle_ads) and External id set to the campaign id. Use the link as the ad’s destination URL. - The ad platform adds its click id to the URL when someone taps the ad:
ttclid(TikTok),fbclid(Meta),gclid,gbraidorwbraid(Google). The smart link keeps the click id, the click time, and the visitor’s IP address and user agent. IP and user agent are only kept when one of these click ids is present. - When the install is matched to the click, the install keeps the link and the click.
- RevenueCat or Superwall reports a purchase. Appeeky Analytics matches it to the install and sends Appeeky a conversion.
- For each platform you turned on, Appeeky logs a delivery and sends the event. Every delivery shows in the delivery log with its status.
On Android the click id always reaches the install, through the Play install referrer. On iOS it only reaches the install when the app is already installed and opens through the link: the App Store passes nothing to a fresh install, and Appeeky does not fingerprint devices. For new iOS installs from ads, TikTok and Meta measure through SKAdNetwork and AdAttributionKit, which the SDK already reports.
Events
Trial started, purchase and trial converted are on by default. Renewal is off by default: renewals usually happen long after the ad click, outside the platforms’ attribution windows. Refunds are never sent.
Every event carries its value in USD, as the analytics service reports it, and the event id, which the platforms use to drop duplicates. Trials are sent with value
0.
Minimum value skips paid events below the amount you set. Trials are always sent.
TikTok Ads
Uses the TikTok Events API for app events with your connected TikTok Ads account. You need- TikTok Ads connected in Integrations.
- Your app set up in TikTok Events Manager, and its TikTok App ID.
POST /open_api/v1.3/event/track/)
app.app_id is the App Store id or Play package. external_id is the SHA-256 of the RevenueCat app user id, when there is one. Events older than 7 days are skipped.
Meta Ads
Uses the Meta Conversions API for app events with your connected Meta Ads account. You need- Meta Ads connected in Integrations with a direct Meta login. Connections made through a partner can read insights but can’t send conversions.
- A dataset (pixel) in Meta Events Manager linked to your app, and its Dataset ID.
- On iOS, your app’s bundle id (Android uses the Play package).
POST /{dataset_id}/events)
fbc is built from the fbclid and the click time. anon_id is the Appeeky install id. The SDK does not read the iOS App Tracking Transparency choice, so iOS events are sent with advertiser_tracking_enabled: 0; Android events with 1. Events older than 7 days are skipped.
Google Ads
Uploads offline click conversions with the Google Ads API. You need- Google Ads available on the Appeeky server (shown as “Not available on this server yet” otherwise).
- An OAuth refresh token with the
https://www.googleapis.com/auth/adwordsscope for a Google user with access to the account. It is stored encrypted and never shown again. - The Customer ID, and the Manager account ID when access goes through a manager account.
- A conversion action of type Import → Clicks, and its id.
POST /customers/{customer_id}:uploadClickConversions)
gclid, gbraid or wbraid is sent, in that order of preference. orderId is the event id, so the same conversion is not counted twice. Conversions more than 90 days after the click are skipped.
Test Events
Send test event sends a $1 purchase from a made-up click:- TikTok and Meta need the test event code from Events Manager → Test events. The event appears there and is not counted in reporting.
- Google Ads sends the upload with
validateOnly: true. Google checks the credentials and conversion action and records nothing. A message about the made-up click id still means the credentials work.
Delivery Log
Each conversion gets one delivery per platform you turned on.
Retries. Timeouts, rate limits and server errors are retried after 1 minute, 5 minutes, 30 minutes and 2 hours: 5 attempts in all, then the delivery is
failed. Rejections such as an invalid id fail at once. Retry in the log sends a failed or skipped delivery again with a fresh set of attempts, using your current settings.
The analytics service may send the same conversion more than once. Appeeky keeps one delivery per conversion and platform, so a conversion is never sent twice.
API
All endpoints use the analytics app id, like the other Analytics API routes.
An empty string clears a setting. Unknown settings are rejected.
Data and Privacy
- Click IP address and user agent are only stored for clicks that carry an ad click id, and only sent to the platform that click came from.
- The app user id is sent as a SHA-256 hash.
- Each delivery stores the conversion, including the click IP and user agent, so a retry can send the same event. The request shown in the log has IP and user agent removed.

