Everything you need to ship Metriku: SDK, Firebase push, live config, funnels, and RevenueCat.
metriku.dev → New project with your iOS Bundle ID.SPM: https://github.com/haxhiuurim/DoraSDK.git or binary DoraVersion (1.2.0+). Pass only the App Key and optional launchOptions — the SDK talks to https://metriku.dev automatically (never pass an API base URL).
import Metriku
#if DEBUG
Metriku.setSandbox(true)
#endif
Metriku.initialize("YOUR_APP_KEY", launchOptions: launchOptions).json file.Metriku.Notifications.requestPermission { granted in }
// In AppDelegate:
Metriku.Notifications.setPushToken(deviceToken)
print(Metriku.User.deviceId()) // paste into Settings → Test messagingUse Settings → Test messaging with a device ID for the fastest verification. No TestFlight required for Xcode → device sandbox testing. Full guide: PUSH-SETUP.md.
deviceId from the demo.Keys you publish in the dashboard are what the demo shows under Live config / config keys. Create show_paywall (BOOLEAN) and feature_flags (ARRAY) then tap Force refresh in the demo (SDK also polls every ~60s). Empty keys means the SDK has not received any configs yet (wrong App Key or not connected yet).
let on = Metriku.Config.getBool("show_paywall", default: false)
let flags = Metriku.Config.getStringArray("feature_flags")
let any = Metriku.Config.getValue("custom_key")
Metriku.Config.refresh(force: true) // ignore ETag after publishing new keysDemo UI labels (“config keys”, “show paywall”, “feature flags”) read the same live config store — they are not a separate feature. Defaults show until those keys exist and refresh succeeds.
Prefer the typed helpers (SDK 1.2.0+). RevenueCat webhooks can also fill conversion events when app_user_id matches Metriku.login.
Metriku.Analytics.trackPaywallView() Metriku.Analytics.trackTrialStarted() Metriku.Analytics.trackTrialConverted() Metriku.Analytics.trackRenewed() Metriku.Analytics.trackCanceled() Metriku.Analytics.trackBillingGraceFailed()
/api/v1/webhooks/revenuecat/{projectId}). Create one RevenueCat webhook per Metriku project — events are stored and filtered by project, same as users, push, and config.Metriku.login.Segment by tags (Metriku.User.addTag), subscription status, and activity. Recompute runs in the background when Redis is available.
Publish from the In-app messaging page. The SDK fetches eligible campaigns and shows them on the configured trigger (session start, immediate, or a custom event name). No TestFlight or push token required — IAM is HTTP-fetched by the SDK (works on simulator for UI, device recommended for realism).
// Triggers that match campaign "EVENT" trigger:
Metriku.Analytics.track("your_event_name")Dashboard toggle hides sandbox devices and RevenueCat SANDBOX events. Mark DEBUG installs with Metriku.setSandbox(true).
High-level gaps: FEATURE-GAPS.md. Implementation plan (rollouts, quiet hours, journeys, A/B, delivery funnel): FEATURE-PLAN.md.
Give these to Cursor / ChatGPT one at a time against your iOS app. Full set lives in PUSH-SETUP.md.
Add Metriku via SPM (DoraSDK or DoraVersion 1.2.0+, product Metriku).
Call Metriku.initialize("YOUR_APP_KEY", launchOptions: launchOptions) only —
do NOT pass an API base URL (defaults to https://metriku.dev).
DEBUG: Metriku.setSandbox(true). Use Analytics.trackPaywallView() etc for funnel.Request Metriku.Notifications.requestPermission; in didRegisterForRemoteNotifications call setPushToken(deviceToken); log Metriku.User.deviceId() for dashboard test push. Enable Push capability.