Developer guide · v1.3 · authoritative

AirBridge → Mixpanel Instrumentation Mapping

The implementation contract for Mixxi attribution across iOS and Android. This version consolidates v1.0–v1.2 and aligns the app with enums v1.4.0 ahead of Episode 0 / Discovery on 31 July 2026.

Prod 4017469Staging 4017466Dev 4002103Events are not backfillable
Read this first

The critical correction

Earlier circulation placed the raw channel in acquisition_source. That is no longer valid. The raw value belongs in acquisition_channel; acquisition_source may contain only a committed enum value.

Raw, lossless

acquisition_channel

Raw source such as instagram or whatsapp. First-touch and $set_once.

Canonical bucket

acquisition_source

Enum rollup from v1.4.0. First-touch and $set_once; never a raw channel string.

Affiliate join key

marketing_affiliate_id

The affiliate code from campaign, for affiliate links only.

§3 · interactive

Derive the acquisition source

Evaluate rules top-down; the first match wins.

Result

unknown

No attribution / null.

Paid keys off ad_platform, not channel. Instagram and Facebook paid traffic both roll up to paid_meta; the raw channel remains available in acquisition_channel and mx_channel.
§1–§2

The chain and timing rules

  1. Consent gate first: DPDP deny-by-default.
  2. Initialize Mixpanel before attribution work so distinct_id exists.
  3. Initialize AirBridge and handle immediate and deferred deep links.
  4. Write first-touch profile keys with $set_once.
  5. Register mx_* super props and track funnel events.
  6. MMRP joins the deterministic AirBridge postback to Mixpanel.
click → AirBridge → consent → Mixpanel init → AirBridge init → deep-link params → $set_once profile props → register mx_* → signup_complete
Deferred deep links are non-negotiable. New installs receive attribution through AirBridge's deferred callback. Handling only immediate links makes tagged installs look organic.
§4

Latest-touch event context

On every attributed open, register the available context as Mixpanel super properties:

mx_channel · mx_phase · mx_episode · mx_recipe · mx_asset · mx_placement · mx_funding · mx_ad_platform · mx_persona · mx_layer · mx_team · mx_cta · mx_aff

Profile keys

First touch · immutable

acquisition_channel, acquisition_source, and affiliate credit stay fixed once stamped.

Super properties

Latest attributed touch · overwrite

Overwrite on each new tagged open. Do not clear on organic opens. Omit absent params; never write empty strings.

§5 · launch sequencing

What ships when

Phase 1 — before code-freeze
Write the raw channel to acquisition_channel. Leave acquisition_source unset. Never write a raw channel into acquisition_source.
Phase 2 — strongly targeted pre-launch
Write acquisition_source from the JSON-encoded v1.4.0 rollup. The app must read the ruleset from JSON rather than hardcoding it.
Phase 1 is safe: raw attribution is preserved and MMRP can derive the enum server-side or on a later attributed open. What slips is dashboard convenience, not the source fact.
§6–§8

Join, parity, and privacy

Deterministic join

MMRP joins via airbridge_id and, for affiliate credit, marketing_affiliate_id. No fingerprinting.

Event parity

Use signup_complete, never account_created. iOS and Android names and lowercase enum values must be byte-identical.

DPDP

No phone numbers or raw PII in Mixpanel. Never forward gaid, device_uuid, or client_id into Mixpanel properties.

§9 · verification

One decisive fresh-device test

  1. Use a clean device and test each platform/environment. Create an affiliate link with RISING-E0-TESTONLY; separately test a marketing link: instagram / phase1_tease__ep01_discovery / trend__testasset_01 / funding=organic.
  2. Tap → install → consent → sign up → open an episode.
  3. In the correct Mixpanel Live View, confirm signup_complete, a second event with full mx_*, raw acquisition_channel, enum-only acquisition_source, and airbridge_id.
  4. For the affiliate case, confirm exact marketing_affiliate_id and the AirBridge postback join.
  5. Tap a second tagged link. Its event context must change while first-touch profile keys remain unchanged.
Production is behind: verify all three environments before the 31 July launch. Events are not backfillable.
§10 · open pins

Do not hardcode against these

  1. Confirm the v1.4.0 JSON contains the rollup ruleset as data, not just enum members. The app team must be on v1.4.0, not v1.0.0.
  2. Affiliate postback field (partner vs sub_id) remains console-defined and owned by Punit; campaign is the stable in-app source.
  3. go.mixxi.ai is cosmetic for deferred attribution; direct Universal/App Links are a separate freeze-gated change.
  4. Do not build vote_cast client-side. Preferred path: Unravel backend emits it from validated Kafka votes.