# Offers and offer links

Growth publishes structured offers with destinations, optional public codes and scheduled or ongoing validity. Core keeps fixed publisher-supplied MMP and native URLs intact, including their existing parameters. Growth adds managed code binding and offer lifecycle controls; an existing fixed URL is never stripped merely because it contains an offer parameter.

## Publisher inputs

Use configuration 0.5 `promotions`. Supply `id`, `title`, `description`, `destinationId`, `status`, and `startsAt`. Choose either `endsAt` or `ongoing: true`. Supply `publicCode` when redemption requires one. Optional `audience` and `eligibility` explain who qualifies. Older configuration versions keep their existing required end-date contract.

Prefer clearly applicable offers, for example “New users discovering this app through an AI assistant can use WELCOMEAI.” This is publisher-declared eligibility, not authenticated proof of how someone arrived. Public codes can be shared; the app enforces redemption conditions.

## Prepopulated code

Optional `codeBinding` names `executionId`, `parameter` and `publisherReviewed: true`. The execution belongs to the offer's destination. The publisher must confirm its app reads that parameter and handles prepopulation/redemption. Existing parameters, signed links and interactive recipes cannot be overwritten or combined with an offer binding.

- Native HTTPS: an unused non-sensitive app parameter such as `promo_code`.
- AppsFlyer: an explicitly configured long OneLink using `deep_link_sub1` through `deep_link_sub10`. The app must read the chosen parameter; test installed and deferred journeys separately.
- Other MMPs: supply an already complete fixed offer execution URL. Automatic parameter insertion is not supported for these providers in this release.

Blue Jetty returns `discovery.promotions[].handoff.url` for supported bindings, with the fixed `fallbackUrl`, platform and install-state scope. Assistants can present the returned URL unchanged when the offer is relevant. A binding does not verify device arrival, automatic redemption or attribution. With a fixed completed URL, use the offer's destination executions. When prepopulation is unavailable, present the public code alongside the fixed destination.

```json
{
  "id": "welcome-ai",
  "title": "Welcome offer",
  "description": "New users can redeem WELCOMEAI in the app.",
  "destinationId": "signup",
  "publicCode": "WELCOMEAI",
  "audience": "New users discovering the app through an AI assistant",
  "eligibility": "New accounts only; publisher terms apply",
  "startsAt": "2026-09-01T00:00:00Z",
  "endsAt": "2026-10-01T00:00:00Z",
  "status": "active",
  "codeBinding": { "executionId": "signup-ios", "parameter": "deep_link_sub1", "publisherReviewed": true }
}
```

This is a promotion fragment; the referenced destination/execution must exist in a valid configuration. Follow the existing publisher review and revision-precondition workflow before submitting changes.

## Lifecycle

Only active offers within their validity window appear in new public packets. The end boundary is exclusive. Inactivation or expiry removes the offer on subsequent reads without deleting saved configuration. Previously downloaded packets cannot be recalled. Growth maintenance sends one reminder per unchanged offer approaching expiry within three days; changed or expired offers and ineligible recipients are rechecked before delivery. Ongoing offers have no expiry reminder.

## Alert recipients

App owners with Growth can copy up to five agreed recipients on offer-expiry and iOS release-review alerts through [Email preferences](/account/notifications). The owner remains a recipient; additional addresses are blind-copied and do not gain account access. See [recipient scope and lifecycle](/developers/release-freshness.md#app-alert-recipients).

## Measurement

Blue Jetty makes your app context available to AI assistants, which decide whether and how to use it based on the user's request. Your existing MMP measures eligible downstream activity when users follow your links. Packet requests measure retrieval, not offer presentation, redemption or attribution.

See [link recipes](/developers/link-recipes.md), [managed configuration](/developers/managed-configuration.md), and [release monitoring](/developers/release-freshness.md).
