appeeky

// mobile attribution

Private beta

See which installs turn into revenue

Attribution for React Native and Expo apps. Installs, trials and revenue by source, from Apple Search Ads keywords to smart links and organic. No IDFA, no ATT prompt.

L

Lumen Journal

Attribution · iOS

Install → paid7%+6.0%
Revenue / user$1.32+5.0%
Avg. session4m 12s−2.0%

Revenue (net) · by day (Europe/Berlin)

TimeRevenue (net)
Fri, Sep 25$811
Sat, Sep 26$792
Sun, Sep 27$762
Mon, Sep 28$726
Tue, Sep 29$687
Wed, Sep 30$778
Thu, Oct 1$751
Fri, Oct 2$606
Sat, Oct 3$603
Sun, Oct 4$616
Mon, Oct 5$645
Tue, Oct 6$687
Wed, Oct 7$877
Thu, Oct 8$938
Fri, Oct 9$859
Sat, Oct 10$915
Sun, Oct 11$961
Mon, Oct 12$993
Tue, Oct 13$1,009
Wed, Oct 14$1,155
Thu, Oct 15$1,137
Fri, Oct 16$956
Sat, Oct 17$912
Sun, Oct 18$864
Mon, Oct 19$816
Tue, Oct 20$774
Wed, Oct 21$902
Thu, Oct 22$890
Fri, Oct 23$737
Sat, Oct 24$761

Where installs come from

Installs and revenue by source, place and device. Click a row to filter.
SourceCampaignKeywordAd group
SourceInstallsRevenue
Apple Search Ads6,240$11,480
Organic7,910$6,920
Smart link2,130$3,410
Google Play referrer1,380$1,290
Campaign link760$1,210

What they do in the app

Screens seen, and where sessions start and end.
ScreenEntryExit
ScreenUsersRevenue
Onboarding16,980$21,400
Paywall12,160$24,310
Today9,420$18,260
Mood check-in6,310$12,870
Settings2,140$3,920

Funnel

7.0% from first open to paid · $1.32 per install
  1. first_open18,420 · 100%
  2. ↓ 66% continued · 6,260 dropped

    Paywallscreen12,160 · 66%
  3. ↓ 32.2% continued · 8,240 dropped

    trial_started3,920 · 21.3%
  4. ↓ 25.8% continued · 2,910 dropped

    trial_converted1,010 · 5.5%

Retention

Weekly install cohorts, share still active.
CohortInstallsW0W1W2W3W4
Sep 284,110100%46%34%29%26%
Oct 54,380100%48%36%31%
Oct 124,620100%51%38%
Oct 194,840100%53%

// what you get

Follow every install to the money it makes

Store consoles count installs. Attribution ties each trial, purchase and refund to the install that made it, so you can spend on the sources that pay back.

Revenue by install source

Installs, paying users and net revenue for Apple Search Ads, smart links, campaigns, the Play referrer and organic.

Funnels, retention and LTV

See where users drop between first open, paywall, trial and paid, and what an install earns by day 1, 7 and 30.

Every sale, with its source

A Telegram message for each new sale: price, install source and the screens the buyer saw before paying.

SKAdNetwork

Copies of SKAdNetwork and AdAttributionKit postbacks by network and campaign, with conversion values the SDK keeps up to date.

Anomaly alerts

A daily check flags installs, revenue, trials or conversion far from the 14-day median, on Telegram.

Ask the co-founder

The co-founder and MCP tools read the same data, so you can ask which source pays back in plain words.

Desktop and API

Open it in the Appeeky desktop app, or read the same data from the Analytics API.

// setup

Three steps in your Expo app

Install the SDK, add the key, start it. On first launch it records the install and collects its attribution once.

Step 01

Install the SDK

One package for React Native and Expo. expo-application and expo-device are optional and add the app version and exact device model.

Terminal
npx expo install @appeeky/analytics-expo \
  @react-native-async-storage/async-storage \
  expo-application expo-device
Step 02

Add the publishable key

Turn on Attribution for an app in Appeeky to get its key. It ships inside the app and can only write events for that one app.

.env
EXPO_PUBLIC_APPEEKY_KEY=apk_pub_4f1c…
Step 03

Add the plugin, start it, identify the customer

The config plugin turns on Apple Search Ads, Play referrer and SKAdNetwork. Pass the RevenueCat or Superwall user id so each purchase finds its install. Then rebuild as a development build.

app.json
{
  "expo": {
    "plugins": ["@appeeky/analytics-expo"]
  }
}
App.tsx
import Appeeky from "@appeeky/analytics-expo";
import Purchases from "react-native-purchases";

Appeeky.init({ key: process.env.EXPO_PUBLIC_APPEEKY_KEY! });

// Link each install to its RevenueCat customer so purchases get a source.
Appeeky.identify(await Purchases.getAppUserID());

// hosted or self-hosted

Run it with us, or on your own Cloudflare account

Both run the same server code and the same SDK. Self-hosting keeps every install and purchase in your account.

Self-hosted

Free · you pay your Cloudflare bill

The server is source-available. Run one Worker and one D1 database in your own Cloudflare account. Installs, events and revenue never pass through Appeeky.

Includes:

  • Installs, events, funnels, retention and LTV
  • Revenue by source from RevenueCat and Superwall
  • Smart links, Android deferred deep links and ad click ids
  • SKAdNetwork and AdAttributionKit postback copies on your domain
  • Users, timelines and live activity
  • Sale and anomaly alerts to your own Telegram bot or webhook
  • Your data in the worker's dashboard, the REST API or the Appeeky desktop app

Hosted by Appeeky

Plan quota, then event tiers

Turn it on for an app in Appeeky and add the SDK. Each account's data is kept in its own isolated database, with the same schema as the self-hosted server.

Everything in self-hosted, plus:

  • ROAS with Apple Search Ads, TikTok Ads and Meta Ads spend
  • Ad signals that send trials and purchases to TikTok, Meta and Google Ads
  • Views of your tracked social posts next to installs
  • Sale and anomaly alerts through the Appeeky Alerts bot
  • Co-founder and MCP tools that answer questions about your attribution data

// privacy

Attribution without tracking people

Built to credit installs to sources, not to follow people across apps.

No IDFA, no ATT prompt

The SDK never reads advertising identifiers. Apple Search Ads comes from Apple's AdServices token.

No fingerprinting

Installs are never matched by device signals. When the source can't be known, the install counts as organic.

Coarse location

City and coordinates are rounded to about 10 km. The IP address is not stored for location.

Random install id

Each install gets an id the SDK creates. It is not tied to the device or to other apps.

Opt-out in one line

Start the SDK with disabled: true for a user who opts out, and it collects and sends nothing.

Delete it all

Turning Attribution off for an app deletes its installs, events, revenue, links and postbacks.

// pricing

Priced by events, not by install

Installs and attribution are not metered by install. The hosted service counts events, and Appeeky plans include a quota.

Up to 50K events / month

$0

Up to 500K events / month

$9/ month

Up to 2M events / month

$19/ month

Up to 10M events / month

$49/ month

Self-hosted is free

Run the server on your own Cloudflare account and pay only your Cloudflare bill. The Workers free plan is enough to start.

Self-hosting guide

Attribution FAQ

How sources are detected, what works on each platform, and how hosting and pricing work.

Each install gets one source on its first launch. On iOS the SDK reads Apple's AdServices token, which names the Apple Search Ads campaign, ad group and keyword. On Android it reads the Play Install Referrer. Smart links and campaign links are read from the URL the app first opened with. Everything else counts as organic. No advertising id and no App Tracking Transparency prompt are involved.

On Android, yes: the link travels through the Play install referrer, so the install is matched to the link exactly and getDeferredDeepLink() returns its destination. On iOS, the App Store passes nothing to a fresh install, and matching a click to an install would need device fingerprinting, which Apple does not allow. Those installs usually count as organic, or as Apple Search Ads if they came from an ad. When the app is already installed, the link opens it and is attributed on that first launch.

Through SKAdNetwork and AdAttributionKit. The config plugin tells iOS to send copies of the postbacks to Appeeky, and the SDK keeps the conversion value up to date. You see installs and outcomes by ad network and campaign. An app can name only one endpoint for these copies, so if another provider already receives them you can keep it with attributionEndpoint: false.

RevenueCat, through the webhook you already connect in Appeeky, and Superwall, through one webhook with a signing secret. Call Appeeky.identify() with the same user id you give them, and every trial, purchase, renewal and refund is matched to the install that made it. Revenue shows net of refunds, with the gross and refunded amounts next to it. You can also report ad revenue with adRevenue().

Yes. The server is source-available and runs as one Cloudflare Worker with one D1 database in your own account, so installs, events and revenue never pass through Appeeky. Features that need your connected ad accounts or Appeeky workspace — ROAS, ad signals, organic posts, and the co-founder and MCP tools — run only on the hosted service.

The hosted service is free up to 50K events a month, then $9 for 500K, $19 for 2M and $49 for 10M events a month. Appeeky plans include a quota. Installs and attribution are not metered by install. Self-hosting is free; you pay your own Cloudflare bill.

Yes. Android installs get the Google Play referrer, smart links with exact install attribution and deferred deep links, and TikTok Ads and Meta Ads ROAS through ad smart links. Apple Search Ads and SKAdNetwork are iOS only.

Events do, but Apple Search Ads, SKAdNetwork conversion values and the Play Install Referrer need the SDK's native module, which needs a development build. Add the config plugin and rebuild, for example with npx expo run:ios or an EAS development build.

// private beta

See which installs pay

Attribution is in private beta. Tell us about your app and we'll get you set up.