Can I vibecode AppsFlyer?

NOT REALLY · don't bother
price variesbuild time multi-daycategory 📊 analyticsreplaced by 0 people

You can absolutely build a click tracker: log clicks, generate deep links, receive install pings from your own SDK, join them in SQLite. What you cannot build is the reason AppsFlyer exists, which is that Meta, Google, TikTok and Apple do not hand raw attribution data to random self-hosted endpoints. Those self-attributing networks report only to certified measurement partners, and SKAdNetwork/AdAttributionKit postbacks are aggregated and privacy-thresholded by design. Add install fraud detection, which is a data problem across billions of devices rather than a code problem, and the gap stops being about engineering effort. The honest consolation build is a first-party attribution tracker for channels you control: your own links, emails, influencer codes, organic web to app.

the prompt
Build a self-hosted first-party mobile attribution tracker. TypeScript, Fastify, SQLite via better-sqlite3, Vite plus React for the dashboard, Docker Compose for deployment. No accounts, no cloud services, no telemetry.

What it does:
1. Link service: POST /api/links creates a tracked link with campaign, source, medium, and an optional destination path in my app. Each link gets a short id served at GET /l/:id.
2. On click, /l/:id records a click row: timestamp, short id, user agent, platform guess from UA, referrer, IP truncated to /24 for IPv4 and /48 for IPv6, and a random click token set as a cookie. Then 302 to a universal link if the platform is iOS or Android, otherwise to a configured web fallback.
3. Serve /.well-known/apple-app-site-association and /.well-known/assetlinks.json from files in ./public so real deep links work.
4. Ingest endpoint: POST /api/events accepts { deviceId, eventName, clickToken?, platform, appVersion, ts, value? } authenticated by a shared secret in APP_INGEST_KEY. Store raw events untouched in an events table.
5. Attribution job: for each first_open event, attribute deterministically if clickToken matches a click. Otherwise do a probabilistic match against clicks in the last 24 hours on the same truncated IP and platform, and mark it as probabilistic with a confidence field. Never overwrite a deterministic match. Store results in an attributions table so the logic can be re-run idempotently.
6. Dashboard at /: table of campaigns with clicks, installs, deterministic versus probabilistic split, and any named post-install events. Date range picker. CSV export.
7. CLI script: npm run import-spend that loads a CSV of campaign,date,spend so the dashboard can show cost per install for channels I bought myself.

Explicitly out of scope, and say so in the README: SKAdNetwork and AdAttributionKit postbacks, any integration with Meta, Google, TikTok or Apple Search Ads, fraud detection, audience syncing, and a native SDK. The client side is a documented HTTP contract only.

Secrets in .env: APP_INGEST_KEY, PUBLIC_BASE_URL, WEB_FALLBACK_URL. Include a seed script with fake clicks and installs, and vitest tests covering deterministic match, probabilistic match, and the no-double-attribution rule.

$ open in your agent (prompt prefilled, you press enter) or copy it raw · this prompt is generated from the build plan · improve it via PR

why people still pay

Because attribution is not a computation, it is an entitlement. The moment a meaningful slice of your spend goes to Meta or Google or TikTok, your homegrown tracker sees a blob of untagged traffic and shrugs, while the ad networks themselves only talk to partners they have certified. On top of that, media buyers want a neutral scorekeeper both sides accept, finance wants one number, and nobody wants to argue with a partner about whose SQL is right. The price is the referee, not the dashboard.

what you lose

xSelf-attributing network data from Meta, Google, TikTok and Apple Search Ads, which is restricted to certified measurement partners

xSKAdNetwork and AdAttributionKit postback handling, decoding and conversion value modeling

xInstall and click fraud detection, which depends on cross-advertiser device data you will never have

xPostbacks and audience syncs to thousands of ad partners and MMP-only integrations

xA maintained SDK that survives every OS release, ATT prompt change and privacy policy update

xDeterministic cross-device and cross-platform identity resolution

prior art · use these instead of building, if you'd rather

Nothing worth pointing at. That's why the prompt exists.

share on X ↗"I just replaced AppsFlyer with one prompt"
questions
Can I vibecode AppsFlyer?

Not really. AppsFlyer's value is not the code: The moat is certified access to networks that refuse to report to anyone else, plus fraud signals drawn from device data across the whole industry. See the honest breakdown above.

How much does AppsFlyer cost?

AppsFlyer's pricing is usage-based or varies by plan · No flat monthly price: Growth is $0.07 per conversion after the included welcome package; Enterprise is contact-sales..

What do I lose by replacing AppsFlyer?

Honestly: Self-attributing network data from Meta, Google, TikTok and Apple Search Ads, which is restricted to certified measurement partners; SKAdNetwork and AdAttributionKit postback handling, decoding and conversion value modeling; Install and click fraud detection, which depends on cross-advertiser device data you will never have; Postbacks and audience syncs to thousands of ad partners and MMP-only integrations; A maintained SDK that survives every OS release, ATT prompt change and privacy policy update; Deterministic cross-device and cross-platform identity resolution. If any of those are load-bearing for you, keep paying.

Is there an open-source alternative to AppsFlyer?

No mature open-source alternative worth pointing at, which is exactly why the one-shot prompt on this page exists.

Every week, more subscriptions die.

New verdicts, new prompts, the week's most-doomed apps.
One email. Unsubscribe in one click.

free forever · no scanner spam · the prompt stays on the site, the deaths come to you

$weekly: what got a verdict, what died.