# Tips

Practical advice for building effective flows.

Want to watch some of these tips in action? Check out this video:

[Watch on YouTube](https://youtu.be/lkIxyC6tQwo)

Setting custom user attributes [#setting-custom-user-attributes]

Setting custom user attributes inside a flow is one of the most useful techniques available. Any tap behavior can set a user attribute, which means buttons, multiple choice selections, and other interactive elements can all tag users with data as they move through the flow.

Once a user attribute is set, you can use it in a few different ways:

* **Within the same flow.** Personalize a later screen with the value (e.g., "Awesome John, welcome to the app!"), route to a different page via branching, or change which products and offers to show.
* **In your app.** Use the [SuperwallDelegate](/docs/sdk/guides/using-superwall-delegate) to send it straight to your analytics provider, create user cohorts, or handle it however you need.

For example, a "Next" button can do more than navigate to the next page. It could, for example, also read from a multiple choice selection, and set its selection to a custom user attribute. By using the tap behavior of "Set Attribute", the value will be set to the user:

<img src="__img0" />

In addition, your app can handle the attribute using the delegate:

```swift
extension MySuperwallDelegate: SuperwallDelegate {
    func userAttributesDidChange(newAttributes: [String : Any]) {
        // The attribute set in the flow is sent here
    }
}
```

This works for any data you collect in a flow, not just multiple choice. Text input values, quiz responses, demographic selections, and preferences can all be stored as attributes and forwarded to your analytics, CRM, or backend.

After purchase behavior [#after-purchase-behavior]

By default, when a user makes a purchase, the paywall or flow will close. But in Flows, you might want to continue. For example, you could show a thank-you message or collect feedback.

To set something like this up:

1. Select the purchase action on your button.
2. Look for the **After purchase** section.
3. Add one or more actions:
   * **Close:** Dismisses the flow (the default).
   * **Navigate Page:** Advances to the next page in the flow. This is the most common choice for flows where the purchase happens mid-journey.
   * **Open URL:** Opens a link after purchase.
   * **Custom Action:** Triggers a custom action in your app.
   * **Custom Placement:** Registers a placement after purchase.
   * **Set Attribute:** Sets a user attribute when the purchase completes.
   * **Set State:** Updates a state variable.

<img src="__img1" />

The **Navigate Page** option is particularly useful in flows. Instead of closing after purchase, the user moves to the next connected page. This opens up use cases like:

* Showing a personalized welcome or thank-you message.
* Collecting feedback about why they subscribed.
* Presenting an upsell for an add-on product.
* Guiding users through initial setup.
* Placing a paywall in the middle of a flow and continuing the journey after conversion.

Purchase actions also include an **On Abandon** section. Use it when users should take a different path if they open the purchase sheet and cancel before completing the transaction. For example, you can close the Flow, navigate to a recovery page, set a state variable, or register a custom placement.

For the full option list and SDK requirements, see [Purchase outcome actions](/docs/dashboard/dashboard-creating-paywalls/paywall-editor-styling-elements#purchase-outcome-actions).

Simulate permission prompts [#simulate-permission-prompts]

Using the permissions tap behavior, you can test Flows without having to run it on device. The canvas view will allow you to mock either response when you interact with a component with the permission behavior:

<img src="__img2" />

Use indicators for longer flows [#use-indicators-for-longer-flows]

If your flow has more than 3-4 pages, add an Indicator element. Users are more likely to complete a flow when they can see:

* How far they've come.
* How much is left.

Progress visibility reduces abandonment, especially in onboarding flows where users might otherwise wonder "how much longer is this?"

Keep flows focused [#keep-flows-focused]

Flows work best when they have a clear, single purpose:

* **Onboarding:** Gathering preferences and introducing the app.
* **Cancellation:** Understanding why users are leaving and offering alternatives.
* **Upsell:** Guiding users to a higher tier or add-on.

If a flow is getting too long or trying to do too many things, consider splitting it into multiple flows. A focused 5-page flow is better than a sprawling 15-page one. When building a new flow, build linear first so all your pages are created and connected in a straight line, then test the basics to make sure navigation works and content looks right, and finally add branching once the foundation is solid. It's much easier to debug a simple flow than a complex one, so get the basics working before adding sophistication.