HUBX runs one proven creative at enormous duplication into a web-to-app bridge that hands AppsFlyer a deferred deep link; that attribution is forwarded into Adapty, which holds 19 paywall variants and 34 SKUs and prices you according to the ad you clicked. The product itself is a thin orchestration layer over fal.ai — the model is chosen server-side, per feature, at request time.
Their moat is not the model — it's the same fal.ai stack anyone can rent. The moat is the measurement loop: creative → deferred deep link → per-campaign paywall variant → validated purchase, all wired end-to-end so every price point is attributable back to an ad. That is the thing worth copying.
Every hop below was walked live and captured. The chain matters because each link carries a parameter forward — lose one and the paywall assignment changes.
The most revealing 15 minutes. Note what happens at 21:08:39 — before a single screen is shown.
The single most useful finding. The app does not hardcode a model — it asks the server which model to use, per feature, on every generation.
| Feature | modelKey returned | Coins | Wall clock |
|---|---|---|---|
| gangsta-dance | FALAI_NANO_BANANA_IMAGE_HIGGSFIELD_KLING_MOTION_CONTROL_VIDEO | 600 | 4m 40s |
| image-to-video | FALAI_KLING_21_STD_IMG2VID | 200 | 73s |
| copenhagen-vlog-10s | — (catalog only, not generated) | 1350 | — |
Decoded, the naming is a pipeline description: nano-banana produces the styled still, then Higgsfield + Kling motion control animates it. Plain image→video skips the first stage and goes straight to Kling 2.1 Standard. All of it served through fal.ai. ✓ verified — decoded response bodies
// the entire request body — no prompt, no model, no params POST /process/img-video {"imagePath":"user-inputs/<uid>/1786482866637"} → {"processId":"a5b5c8f4-…"} // then poll every ~5s GET /result/<processId> → {"status":"PROCESSING","remainingTime":4} // counts 5→1, not % → {"status":"COMPLETED","videoUrl":"https://storage.googleapis.com/…"}
The prompt and model live entirely server-side; the client sends only a storage path. That means they can re-price, re-prompt or swap the whole model stack without shipping an app update — and it means the client is trivially cheap to maintain.
remainingTime counting 5 → 1 instead of a percentage. A countdown that only ever moves down never stalls visibly at 87%, which is where progress bars lose people on a 4-minute render.
Adapty, public SDK key [PUBLIC_SDK_KEY_REDACTED]. Nineteen placements, each registered as its own named A/B test, and 34 distinct products. The SKU names are self-documenting.
| Product ID | Shape | Price |
|---|---|---|
| aivideo_weekly_direct_ios_699 | Direct weekly | $6.99 |
| aivideo_weekly_direct_ios_999 | Direct weekly | $9.99 |
| aivideo_weekly_direct_ios_1299 | Direct weekly | $12.99 |
| aivideo_weekly_direct_ios_1499 | Direct weekly | $14.99 |
| aivideo_weekly_direct_ios_1599 | Direct weekly | $15.99 |
| aivideo_weekly_direct_ios_1999 | Direct weekly | $19.99 |
| aivideo_weekly_direct_ios_6999 | Direct weekly — outlier probe | $69.99 |
| aivideo_weekly_3dft_ios_1299 | 3-day free trial → weekly | $12.99 |
| aivideo_yearly_direct_ios_1999 | Annual | $19.99 |
Every one encodes both ends of the ladder in the SKU name, so the intro price and the renewal it steps up to are tested as a pair rather than independently.
| Product ID | Intro | Renews at | Step-up |
|---|---|---|---|
| aivideo_weekly_intro_ios_199_to_999 | $1.99 | $9.99 | 5.0× |
| aivideo_weekly_intro_ios_399_to_999 | $3.99 | $9.99 | 2.5× |
| aivideo_weekly_intro_ios_499_to_999 | $4.99 | $9.99 | 2.0× |
| aivideo_weekly_intro_ios_499_to_1299 | $4.99 | $12.99 | 2.6× |
| aivideo_weekly_intro_ios_499_to_1499 | $4.99 | $14.99 | 3.0× |
| aivideo_weekly_intro_ios_699_to_999 | $6.99 | $9.99 | 1.4× |
| aivideo_weekly_intro_ios_699_to_1299 | $6.99 | $12.99 | 1.9× |
| aivideo_weekly_intro_ios_699_to_1499 | $6.99 | $14.99 | 2.1× |
| Product ID | Coins | Price | Coins / $ |
|---|---|---|---|
| aivideo_150_credit_consumable_ios_299 | 150 | $2.99 | 50 |
| aivideo_300_credit_consumable_ios_499 | 300 | $4.99 | 60 |
| aivideo_600_credit_consumable_ios_799 | 600 | $7.99 | 75 |
| aivideoprod_1000_credit_consumable_ios_399 | 1000 | $3.99 | 251 |
| aivideoprod_1000_credit_consumable_ios_599 | 1000 | $5.99 | 167 |
| aivideoprod_1500_credit_consumable_ios_499 | 1500 | $4.99 | 301 |
| aivideoprod_1500_credit_consumable_ios_799 | 1500 | $7.99 | 188 |
| aivideoprod_2000_credit_consumable_ios_699 | 2000 | $6.99 | 286 |
| aivideoprod_2000_credit_consumable_ios_999 | 2000 | $9.99 | 200 |
The aivideo_* and aivideoprod_* families differ by roughly 4–5× in coins per dollar for overlapping price points. ~ inferred — the likeliest reading is a legacy pack set being retired against a far more generous current one, but I can't confirm which cohort sees which from a single install.
A $12.99 weekly grants 1,500 coins. The flagship dance render costs 600 — so the headline subscription buys two and a half of the thing the ads sell, then refills weekly. Coins are debited at request time, not on delivery, so a failed render is still a paid render unless they refund it.
Creative identity is carried all the way from the ad into the pricing engine. This is the part most teams never wire up.
// AppsFlyer returns the parked click to the fresh install GET 1xnhtg.gcdsdk.appsflyersdk.com/install_data/v5.0/id6478868302 → { "deep_link_value": "genericDance", // ← the creative "af_status": "Non-organic", "media_source": "facebook_w2a", "campaign": "facebook_w2a-campaign", "install_time": "2026-08-11 21:09:09.120" } // …and is immediately handed to the paywall engine POST api.adaptytech.com/api/v1/sdk/attribution/profile/set/data/ { "source": "appsflyer", "profile_id": "[ID_REDACTED]", "attribution_json": "{\"media_source\":\"facebook_w2a\", …, \"click_time\":\"2026-08-11 21:04:18.840\"}" }
Click at 21:04:18, install at 21:09:09, attribution inside Adapty by 21:09:13. From then on every Adapty profile read carries media_source: facebook_w2a, which is what lets a placement resolve to a different price for ad traffic than for organic. ✓ verified — full payloads captured
| Vendor | Host | Identifier | Role |
|---|---|---|---|
| Adapty | api.adaptytech.com · configs-cdn.adapty.io | [PUBLIC_SDK_KEY_REDACTED] | Paywalls, A/B, receipt validation |
| AppsFlyer | *.appsflyersdk.com | dev key 1xnhtg · SDK 6.18 | Attribution + deferred deep link |
| Microsoft Clarity | j.clarity.ms | lf10p2h8m1 | In-app session recording |
| OneSignal | api.onesignal.com | [ID_REDACTED] | Push |
| Firebase / GA | app-analytics-services.com | — | Product analytics, storage |
| Meta SDK | ep1/ep2.facebook.com | — | App events back to Ads |
| Google Cloud | storage.googleapis.com | hubx-aivd-p | Render delivery, signed URLs |
The one that should raise an eyebrow: Microsoft Clarity is recording sessions inside the app. Combined with Adapty's placement data they can watch, screen by screen, where a given paywall variant loses people — not just that it converted worse.
Apple domains were deliberately excluded from decryption, because MITM-ing certificate-pinned Apple services breaks the App Store outright and the install can't complete. Every price above comes from Adapty's payloads, not Apple's receipts. ⚠ not independently confirmed against StoreKit
All 19 placement configs were captured, but a single device only ever gets one assignment. Which offer maps to which campaign, and how prices differ for organic traffic, needs repeat installs across different creatives to establish.
Dismissing a paywall is where these apps typically fire a second, cheaper offer. That path wasn't exercised, so any downsell variant is unobserved.