Quickstart
Two steps and you're live; a third makes every match exact. About ten minutes end to end.
1. Create a tracking link
In Links → Create link, pick the channel (Meta, TikTok, Google, X…) and, optionally, a deep-link destination. You get a URL like
makervn.app/go/<slug>— use it as that ad's destination. Full detail in Tracking links.2. Connect the RevenueCat webhook
Paste the URL and Authorization value from Dashboard → Integrations → RevenueCat → Connect into RevenueCat → Project → Integrations → Webhooks. See RevenueCat.
3. Add the first-launch snippet (recommended)
Send the device signal set on first open and hand the returned click id to RevenueCat. It's a fetch, not an SDK. See First-launch setup.
The first-launch snippet
Paste once where your app starts, right after RevenueCat is configured:
// On first launch, after Purchases.configure(...)
import UIKit
func makervnModel() -> String { // e.g. "iPhone15,2"
var s = utsname(); uname(&s)
return withUnsafeBytes(of: &s.machine) { String(cString: $0.bindMemory(to: CChar.self).baseAddress!) }
}
var c = URLComponents(string: "https://www.makervn.app/api/attribution/resolve")!
c.queryItems = [
.init(name: "app", value: "YOUR_APP_TOKEN"),
.init(name: "uid", value: Purchases.shared.appUserID), // RevenueCat fills this
.init(name: "platform", value: "ios"),
.init(name: "osVersion", value: UIDevice.current.systemVersion),
.init(name: "model", value: makervnModel()),
.init(name: "lang", value: Locale.current.language.languageCode?.identifier),
]
if let (data, _) = try? await URLSession.shared.data(from: c.url!),
let j = try? JSONSerialization.jsonObject(with: data) as? [String: Any] {
if let cid = j["cid"] as? String { Purchases.shared.attribution.setAttributes(["makervn_cid": cid]) }
// if let deep = j["deep_link"] as? String { /* route the user to `deep` */ }
}Your app token is the same value in your webhook URL. The uid is provided by RevenueCat at runtime — no API key needed.