# Integration Approaches

After you've [installed and initialized](https://developer.incode.com/docs/android-installation) the Incode Android SDK, choose an integration approach. This involves choosing:

- **An integration path**: How much UI and orchestration the SDK owns.
- **An integration pattern**: Where the identity verification (IDV) flow is defined and how it runs.

Choose the path first, then the pattern that fits your product.

***

## Integration Paths

The SDK supports three integration paths, each offering a different level of control. Start with the simplest path that meets your requirements.

### Path 1: Full Onboarding Flow

The SDK owns the UI from start to finish. You define the [modules](https://developer.incode.com/docs/android-individual-modules) you want and pass them to the SDK. The SDK then runs those modules in sequence and returns results through a listener.

This is the simplest path and the recommended starting point for most integrations.

### Path 2: Split Flow

The SDK owns each module screen: the camera UI, the capture experience, and the on-device guidance. You own the order of modules and the screens between them. Use this when you need to insert your own screens between Incode steps or run only part of an identity verification journey.

### Path 3: Capture-Only

The SDK owns only the capture UI. You own everything before and after capture. This path is not recommended unless your platform has strict security or orchestration requirements.

See [Capture-Only Mode](https://developer.incode.com/docs/android-capture-only-sdk).

***

## Integration Patterns

The SDK supports three integration patterns. Each pattern determines where the flow is defined and how it runs.

### Pattern 1: Configure Flows Locally and Run End to End

Define the flow in code using `FlowConfig`. Pass it to `startOnboarding()`. The SDK runs every module in sequence and returns control to your app when the flow finishes.

Use this pattern with **Integration Path 1: Full Onboarding Flow**.

See [Configure Flows Locally and Run End to End](https://developer.incode.com/docs/android-configure-flows-locally-and-run-end-to-end)​.

### Pattern 2: Configure Flows Locally and Run Step by Step

Define the flow in code as one or more sections. Run each section with `startOnboardingSection()`. Control returns to your app between sections, so you can insert your own screens or logic, branch based on intermediate results, or split a long flow into discrete steps.

Use this pattern with **Integration Path 2: Split Flow**.

See [Configure Flows Locally and Run Step by Step](https://developer.incode.com/docs/android-configure-flows-locally-and-run-step-by-step)​.

### Pattern 3: Run Flows Configured in Dashboard

Define the flow in Dashboard, then start it with `startFlow()` or `startWorkflow()`. Reference the flow by ID. The SDK pulls the modules and configuration from Dashboard; you don't need to define a `FlowConfig` locally. Activate the flow in Dashboard before starting the session. Use this when you want to update the flow without releasing a new app version.

Dashboard supports two flow types: Flows and Workflows. They behave differently depending on the integration path:

- **Flows** support **Integration Path 1: Full Onboarding Flow** only.
- **Workflows** support **Integration Path 1: Full Onboarding Flow** and **Integration Path 2: Split Flow**.

See [Run Flows Configured in Dashboard](https://developer.incode.com/docs/android-run-flows-configured-online)​.

***

## Choose Your Integration Approach

| Goal                                                              | Path                                                                                                     | Pattern                                                                                                            | Entry Point                                                                                       |
| ----------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------- |
| Run a full IDV flow with the least code possible                  | [Path 1: Full Onboarding Flow](#path-1-full-onboarding-flow)                                             | [Pattern 1: Configure Flows Locally and Run End to End](#pattern-1-configure-flows-locally-and-run-end-to-end)     | `startOnboarding()`                                                                               |
| Insert your own screens or logic between SDK steps                | [​Path 2: Split Flow](#path-2-split-flow)                                                                | [Pattern 2: Configure Flows Locally and Run Step by Step](#pattern-2-configure-flows-locally-and-run-step-by-step) | `startOnboardingSection()`                                                                        |
| Update the flow from Dashboard without an app release (Flows)     | [Path 1: Full Onboarding Flow](#path-1-full-onboarding-flow)                                             | [Pattern 3: Run Flows Configured in Dashboard](#pattern-3-run-flows-configured-online)                             | `startFlow()`                                                                                     |
| Update the flow from Dashboard without an app release (Workflows) | [Path 1: Full Onboarding Flow](#path-1-full-onboarding-flow) or [Path 2: Split Flow](#path-2-split-flow) | [Pattern 3: Run Flows Configured in Dashboard](#pattern-3-run-flows-configured-online)                             | `startWorkflow()`                                                                                 |
| Build a fully custom capture experience                           | [Path 3: Capture-Only](#path-3-capture-only)                                                             | N/A                                                                                                                | See [Capture-Only Mode](https://developer.incode.com/docs/android-capture-only-sdk) |

***

## What's Next

Use the table below to find the page you need.

| Task                                                                                                                                 | Page                                                                                                     |
| ------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------- |
| View a complete, buildable reference integration                                                                                     | [Example Implementation](https://developer.incode.com/docs/android-example-implementation) |
| View the module catalog for building a `flowConfig`                                                                                  | [Individual Modules](doc:individual-modules)                                                             |
| View the result and error objects returned when a flow finishes.                                                                     | [Results](https://developer.incode.com/docs/android-results-reference)                     |
| View the full specification of `startOnboarding()`, `startOnboardingSection()`, `startWorkflow()`, `FlowConfig`, and `SessionConfig` | [API Reference](https://developer.incode.com/docs/android-api-reference)                   |

<br />
