> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getflowpilot.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Creating a placement

> Walk through the placement creation wizard, choose platforms, attach a published flow, and connect the placement key to your SDK call.

You create a placement with a three step wizard: **Basic Info**, **Link Assignment**, and **Summary**. The result is a placement key your app can trigger and a published flow it serves.

Before you start, you need at least one **published** flow in the current app. The wizard only lets you attach flows that have a published version. If you have not published a flow yet, do that first (see [Publishing](/editor/publishing)).

## Open the wizard

On the **Placements** page, click **New Placement** in the header. The dialog is titled **New Placement** with the description "Define a trigger point inside your app." A progress indicator at the top shows the three steps.

## Step 1: Basic Info

<Steps>
  <Step title="Enter a Placement ID">
    Type the key your app will use, for example `after_signup_success`. The field auto-formats as you type: it lowercases the value and replaces spaces and hyphens with underscores. The rules are:

    * Must start with a lowercase letter.
    * Only lowercase letters, numbers, and underscores.
    * Maximum 64 characters.

    The helper text reads "Unique identifier used in SDK." This ID cannot be changed after the placement is created.
  </Step>

  <Step title="Add a description (optional)">
    The **Description** field is an optional note for your team ("Help your team understand when this placement should trigger"). It is not shown to users.
  </Step>

  <Step title="Select platforms">
    Check the platforms this placement applies to: **iOS**, **Android**, **Web**. You must select at least one. The device platform must be in this list for the placement to resolve a flow. Include **iOS** for the iOS SDK or an Expo app running on iOS, and **Android** for an Expo app running on Android.
  </Step>
</Steps>

Click **Next**.

## Step 2: Link Assignment

<Steps>
  <Step title="Choose the default flow">
    Under **Default Flow**, pick a flow from the dropdown ("Choose a published flow"). Only flows with a published version appear here. Each option shows the flow name and its type. The helper text reads "This flow will be shown when the placement triggers."

    If you see "No published flows available", publish a flow first, then return here.
  </Step>

  <Step title="Set an audience (optional)">
    The **Audience (optional)** section defaults to **All users**. Click **Add Filter** to restrict who sees the flow. Each condition is a property, an operator, and a value, and you choose whether **ALL** or **ANY** conditions must match. See [Audience targeting](/dashboard/audience-targeting) for the full property and operator reference.
  </Step>
</Steps>

The step also shows a tip: you can A/B test different flows for this placement later by creating an experiment from the Experiments section. See [Creating an experiment](/dashboard/creating-experiments).

Click **Next**.

## Step 3: Summary

The final step shows a review table with the **Placement ID**, **Description**, **Default Flow**, **Audience**, and **Platforms**, plus an **SDK Integration** snippet you can copy.

Review the values. When everything is correct, click **Create Placement**. (In edit mode the button reads **Update Placement**.)

## Connect the key to your SDK call

The placement key you just created is the string your app passes to the SDK. The dashboard's summary shows a shorthand snippet, but the real iOS call is `presentPlacement(_:from:)`:

```swift theme={null}
// Present the placement you created
try await FlowPilot.shared?.presentPlacement("after_signup_success", from: viewController)
```

As long as the string matches the placement ID and your SDK is configured for the same app, the SDK resolves and presents whatever flow the placement serves. See [Presenting placements](/ios-sdk/presenting-placements).

<Note>
  The dashboard's **SDK Integration** card displays `FlowPilot.trigger("after_signup_success")`. That is illustrative shorthand. The actual public iOS API is `presentPlacement(_:from:)`, not `trigger`.
</Note>

## Editing a placement later

Open the placement's detail page and click **Edit** (or use **Edit** in the row's actions menu on the list). This reopens the same wizard in edit mode, pre-filled with the placement's current values. You can change the description, platforms, default flow, and audience. The **Placement ID** is locked in edit mode ("Placement ID cannot be changed after creation").

## Attaching a flow from the editor

You can also point a placement at a freshly published flow from inside the editor. When you publish, the editor offers an **Attach to placement** action so you can route traffic to the new version without leaving the editor. See [Publishing](/editor/publishing).

## Common mistakes

* **Key mismatch.** The string in `presentPlacement("...")` must exactly match the placement ID. The dashboard lowercases IDs, so match that in code.
* **Device platform not in the list.** If you only select Android or Web, an iOS device gets no flow (and vice versa). Include every platform your app runs on: **iOS** for the iOS SDK, and **iOS** and/or **Android** for an Expo app.
* **No published flow.** The default flow dropdown only lists published flows. If it is empty, publish a flow first.
* **Created under the wrong app.** Placements are app-scoped. Confirm the app switcher shows the right app before creating the placement, and that your SDK is configured with that app's ID.

## Related pages

* [Placements](/dashboard/placements)
* [Audience targeting](/dashboard/audience-targeting)
* [Managing flows](/dashboard/flows)
* [Publishing](/editor/publishing)
* [Presenting placements (iOS)](/ios-sdk/presenting-placements)
