---
metadata:
  - name: generator
    content: Diplodoc Platform v5.52.0
alternate:
  - https://appmetrica.yandex.com/docs/en/sdk/android/analytics/android-product-flow.md
  - https://appmetrica.yandex.com/docs/ru/sdk/android/analytics/android-product-flow.md
  - href: en/sdk/android/analytics/android-product-flow.md
    type: text/markdown
    title: Markdown version
  - href: ../../../llms.txt
    type: text/markdown
    title: llms.txt
---
> **Documentation Index:** Fetch the complete configuration index at https://appmetrica.yandex.com/docs/en/llms.txt

# Product flow and offer events

{% note info "Product Flow module" %}

To use this functionality, add the `io.appmetrica.analytics:analytics-product-flow` module. The module version must match the `io.appmetrica.analytics:analytics` library version.

Add the following dependency to your app's `build.gradle.kts`:

```kotlin translate=no
dependencies {
    implementation("io.appmetrica.analytics:analytics-product-flow:8.5.0")
}
```

{% endnote %}

## About the approach {#details}

**Product Flow** is a new schema for standard AppMetrica events in apps with offers, purchases, applications, and multi-step product and service checkout flows.

For more information about the module and complete user scenarios, see [Offer events in product scenarios](https://appmetrica.yandex.com/docs/en/data-collection/offers.md).

This approach helps standardize analytics for the following entities and scenarios:

- product offerings;
- marketing offers;
- product and service purchases;
- user funnels;
- checkout steps;
- applications and approval results;
- asynchronous S2S results.

We recommend using the Product Flow approach for the following types of apps:

- banks;
- insurance services;
- telecom apps;
- booking and travel services;
- subscription services;
- delivery services;
- marketplaces;
- gaming apps;
- any apps with product scenarios, purchases, and funnel analytics.

{% note tip "Do not consume custom events and DSA limits" %}

The new standard events are not counted toward:

- the `custom events` limit;
- the `Data Stream API` limit.

This lets you:

- gradually adopt the new event schema;
- send more product scenarios and steps;
- build detailed funnels and analytics without consuming custom event and DSA limits.

{% endnote %}

## Main events {#main-events}

The interaction schema is built around 4 main events:

#|
|| **Event** | **Meaning** ||
|| `offerShown` | The user saw an offer or a proposal ||
|| `flowStart` | The user started the product checkout ||
|| `flowStep` | An intermediate checkout step ||
|| `flowResult` | The final result ||
|#

## Event examples {#examples}

### offerShown {#example-offerShown}

The user saw a banner: "You are pre-approved for a loan of up to 500,000 ₽ at a rate starting from 12.5%."

```kotlin translate=no
AppMetrica.reportEvent(
    ProductFlowEvent.offerShown("credit_q1", "financial_product")
        .withProductId("personal_loan")
        .withBenefitType("discount_percentage")
        .withReferrer(
                OfferReferrer.newBuilder()
                    .withType("banner")
                    .withIdentifier("main_screen_credit_banner")
                    .withScreen("main")
                    .build()
        )
        .withPayload(mapOf(
            "campaign_id" to "credit_spring_2026",
            "segment" to "preapproved_users",
            "approved_limit" to "500000",
            "currency" to "RUB",
            "interest_rate" to "12.5"
        ))
        .build()
)
```

### flowStart {#example-flowStart}

The user taps the banner and starts the application.

```kotlin translate=no
AppMetrica.reportEvent(
    ProductFlowEvent.flowStart("personal_loan")
        .withProductOfferId("credit_q1")
        .build()
)
```

### flowStep {#example-flowStep}

The user uploads documents.

```kotlin translate=no
AppMetrica.reportEvent(
    ProductFlowEvent.flowStepForProduct("personal_loan", "documents")
        .withProductOfferId("credit_q1")
        .withStepOption("passport_upload")
        .build()
)
```

### flowResult {#example-flowResult}

Later the bank sends the final result via S2S.

```kotlin translate=no
AppMetrica.reportEvent(
    ProductFlowEvent.flowResultForProduct(ProductFlowStatus.SUCCESS, "personal_loan")
        .withProductOfferId("credit_q1")
        .withPrice(OfferPrice(430000.0, "RUB"))
        .withPayload(mapOf(
            "application_id" to "loan_app_12345",
            "decision_source" to "s2s"
        ))
        .build()
)
```

<!-- source: en/_includes/feedback-button-3.md -->
If you didn't find the answer you were looking for, you can use the feedback form to submit your question. Please describe the problem in as much detail as possible. Attach a screenshot if possible.

<a href="../../../troubleshooting/feedback-new">
  <span class="button">Contact support</span>
</a>

<a href="../../../troubleshooting/feedback-docs">
  <span class="button">Suggest an improvement for documentation</span>
</a>
<!-- endsource: en/_includes/feedback-button-3.md -->
