Promotion guide

Use case

Correlate promotion redemption context

Use device observations alongside campaign eligibility and account history. Start without precise location, telephony, accessibility, or installed-app visibility.

Redemption event flow

1. Validate campaign
2. Create redemption attempt
3. Collect minimal profile
4. Submit redemption
5. Join campaign history

Bind the raw event to a server-created promotion_redemption action_id, not to a persistent client-generated identifier.

Minimal starting profile

const promotionIntel = new DeviceIntel({
  consent: consentFor([
    "device_identity",
    "application",
    "os_integrity",
    "device_security_posture",
    "locale",
    "runtime",
  ]),
  config: {
    probes: {
      geolocation: { enabled: false },
      telephony: { enabled: false },
      media_bluetooth_apps: { enabled: false },
      transaction_safety: { enabled: false },
    },
  },
});

const observations = await promotionIntel.collect({
  sessionId: redemptionAttempt.id,
  clientId: authenticatedAccountId,
});

Add sensitive data only for a documented purpose

Network

Add VPN, proxy, transport, or country-adjacent context only after privacy review and measurement of legitimate usage.

Telephony

Enable selected SIM or carrier fields only where eligibility rules and user expectations justify them. The SDK never requests phone permission.

Geolocation

Keep geolocation off by default. If separately justified, use existing permission and project only necessary fields such as authorization, accuracy, source, or age. The SDK never shows a location prompt or starts updates.

Backend handling

Join the event with campaign ID, account age, prior redemptions, household or business rules, server-side velocity, and the redemption outcome. Version any derived feature and monitor it by OS, app version, geography, and missing-data state.

{
  "action_id": "promo_01JEXAMPLE",
  "action_type": "promotion_redemption",
  "campaign_id": "summer-referral-2026",
  "sdk_version": "0.8.1",
  "platform": "android",
  "observations": { "...RawSignalEvent": "..." }
}

Decision boundaries

The SDK does not calculate a risk score or determine promotion eligibility. A shared model, locale mismatch, VPN, emulator, or rooted device can have legitimate explanations. Never reject a redemption from one observation.