Migration from AppsFlyer
Switching from AppsFlyer to AttributeHQ is straightforward. The SDK APIs are similar, and the core concepts (attribution, events, revenue) are the same.
SDK Method Mapping
Web
| AppsFlyer | AttributeHQ | Notes |
|---|---|---|
window.AF('init', {...}) | init({...}) | Similar config shape |
window.AF('pba', 'event', {...}) | track('event_name', {...}) | Simpler API |
| — | trackRevenue(amount, currency) | Dedicated revenue method |
| — | identify(userId) | Built-in user identification |
| — | getAttribution() | Client-side attribution access |
Key Differences
| Feature | AppsFlyer | AttributeHQ |
|---|---|---|
| Pricing | $0.07/conversion | $0.03/conversion |
| Free tier | 12K conversions/year | 10K conversions/year |
| Enterprise | Custom (negotiated) | Custom (negotiated) |
| Payment currency | USD only | NGN (Paystack) + USD (Stripe) |
| Revenue default currency | USD | NGN (configurable) |
| Attribution access | Callback-based | Sync (getAttribution()) |
| React Native nav tracking | Manual | Built-in NavigationTracker |
| Expo config plugin | Built-in | Built-in |
| Multi-touch models | Enterprise plan only | Included on Growth tier |
| Support timezone | Global (US-based) | Lagos (same timezone) |
Postback URL Migration
AppsFlyer postback URLs use different macros. Update your ad network postbacks:
| AppsFlyer Macro | AttributeHQ Macro |
|---|---|
{clickid} | {device_id} |
{advertising_id} | {device_id} |
{af_siteid} | {media_source} |
{campaign} | {campaign_id} |
{install_time} | {install_time} |
{click_time} | {click_time} |
Migration Steps
- Create AttributeHQ account and register your apps
- Generate API keys for each app
- Replace SDK — swap AppsFlyer SDK for AttributeHQ SDK
- Update event names — map your custom events (most are 1:1)
- Update postback URLs — replace macros in ad network configs
- Update webhook URLs — point to new endpoints
- Test — use the debug dashboard to verify attribution works
- Go live — deploy updated app to stores
Parallel Running
You can run both SDKs simultaneously during migration:
// Both SDKs active during transition
import { init as initAHQ, track as trackAHQ } from '@attributehq/web-sdk'
import AppsFlyer from 'appsflyer-web-sdk'
initAHQ({ apiKey: '...', appId: '...' })
AppsFlyer.init({ devKey: '...', appId: '...' })
// Track to both
function trackEvent(name, props) {
trackAHQ(name, props)
AppsFlyer.logEvent(name, props)
}Run both for 1-2 weeks to compare attribution results, then remove AppsFlyer.