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

# Quizzes, targeting and A/B tests

> Ask visitors what they want with multi-step forms and quizzes, show popups to the right people at the right moment, and A/B test forms and landing pages.

Opens tell you less every year (Apple Mail Privacy Protection opens emails for people). What people **tell you** stays true: which topics they want, how often, what they are shopping for. This page covers the tools that collect it — multi-step forms, quiz questions and a result step — plus popup targeting and A/B tests for forms and landing pages.

| Feature | Plan |
| - | - |
| Multi-step forms, quiz questions, result step, the Preference quiz starter, Draft with Spark | Essential, Pro, Enterprise |
| Popup targeting rules | Every plan |
| Form and landing page A/B tests | Pro, Enterprise |

Below the plan the upgrade card replaces the controls. Nothing you set up is deleted, and a published form keeps working for visitors.

## Multi-step forms

Open a form under **Audience → Forms** and find **Steps** in the editor. Turn on **Split into steps** to page the form with a progress bar ("1 / 3"). By default each quiz question gets its own step and the contact fields come last; use **Which step each field is on** to move a field, **Add step** for another page (up to 6), and give each step an optional title and description. **Next button text** and **Back button text** are what visitors see, so write them in the form's language.

Each step is checked before the visitor moves on, with the browser's own "please fill in this field" message. The server checks every answer again on submit.

## Quiz questions

Under **Quiz questions**, click **Add question**. A question has 2 to 12 options; turn on **Several answers allowed** for a multiple-choice question. Each option can **write** up to four things to the contact when it is chosen:

| Writes | What happens |
| - | - |
| **Custom field value** | Sets a choice (SELECT) or yes/no custom field to one of the values the field declares. On a [multi-select](https://docs.instantcampaign.ai/guides/audience-and-campaigns/custom-fields.md#multi-select-fields) field it *adds* that option to the contact's set and keeps the ones they already had. You can only pick declared options, so segments built on that field keep working. |
| **Tag (yes/no field)** | Sets a yes/no custom field to *yes* ("wants event invitations"). For topics, prefer one multi-select field. Contacts have no separate tag list. |
| **Add to list** | Joins one of your lists, with the same opt-in as the form's target list (double opt-in included: the confirmation email covers it). |
| **Email frequency** | Sets the contact's own "How often?" choice (every email, at most weekly, at most monthly, only the important ones), the same choice the preference centre offers. The [cadence policy](https://docs.instantcampaign.ai/guides/audience-and-campaigns/send-policies.md) honours it. |

The answer itself is stored with the submission under the question's key (shown as `{{ data.quiz_… }}` in the editor), so automations started by the form can use it. A multiple-choice question can't write the same field from two options (except a multi-select field, where each ticked option is added), and two questions can't write the same field — the form refuses to save and says which one.

### Draft with Spark

Click **Draft with Spark**, describe what the quiz should learn ("which roast people like and how often they want offers") and pick the quiz language. Spark drafts 2–4 questions and maps the answers to your custom fields. It sees only your brief and the names and options of custom fields **not** marked sensitive — never a contact or a contact's value — and any mapping to a field or option you don't have is dropped. Nothing is saved until you click **Save Form**. A draft uses 3 [AI credits](https://docs.instantcampaign.ai/guides/sending-and-workspace/ai-credits.md). In Spark or an MCP client the same tool is `draft_quiz`.

### Preference quiz starter

On **Audience → Forms**, click **Preference quiz**, name it, pick the target list and type 2–8 topics. You get a three-step form: which topics (several answers), how often, then first name and email. The topics become the options of one multi-select custom field, `interests` (created if it does not exist; an existing multi-select `interests` field gains any topics it is missing), and each topic a visitor ticks is added to their interests. Segment on it with **Interests is any of / all of / none of**. The frequency answer sets the contact's email frequency. Edit any wording afterwards. If you already have an `interests` field of another type, the starter refuses rather than overwrite it: delete that field first, or build the quiz by hand. Forms created by the earlier version of the starter, with one yes/no `interest_<topic>` field per topic, keep working.

## Result step

Under **Result step**, turn it on to replace the success message with a title and text. Add **results for an answer** to show something specific: the first chosen answer that has a result wins, otherwise the default text shows. When the contact still has to confirm their subscription (double opt-in), the confirmation notice appears under the result.

Multi-step forms, quizzes and the result step work in the hosted form page, iframe embeds, popups, slide-ins, banners and the landing page **Form** block. The **Live Preview** uses the same renderer.

## Popup targeting rules

For a **Popup**, **Slide-in** or **Banner**, turn on **Targeting rules** under Display Type. They replace the trigger and frequency settings.

**Show when** — the first of these to happen shows the popup; leave all empty to show it on page load:

* **Time on page** in seconds
* **Scroll depth** in percent
* **Exit intent**: the pointer leaves the top of the window (desktop browsers)

**Only if** — every one of these must hold:

* **Pages to show on / never to show on**: one pattern per line. A pattern matches the page path, `*` matches anything (`/blog/*`), a pattern with `?` also matches the query, and one starting with `https://` matches the full address. Use **Test a URL** to check.
* **Visitors**: everyone, new visitors only, or returning visitors only.
* **Show at most once every … days**: 0 shows it on every page view.
* **Devices**: desktop, tablet, mobile.

The rules run in the visitor's browser. A **returning** visitor is one who was already shown this form; that, and the frequency cap, are remembered in the browser's local storage (not a cookie), written only when the form is actually shown. A browser that blocks storage treats everyone as new. You can still open the popup from your own code with `ICShowPopup["<form id>"]()`.

## A/B test a form

At the bottom of the form editor, under **A/B test**, set what **Variant B** changes — title, button text, success message and/or accent colour — and the **Share of visitors seeing B**, then click **Start test**. Fields and consent wording are never part of a variant, so every visitor gives the same consent.

Nothing is stored in the visitor's browser for the test: our server picks the variant from the same daily-changing visitor hash the website analytics uses, so a visitor keeps one variant for the day, without a cookie. A visitor is counted once a day, the first time they see the form; a **conversion is a submission**. The results table shows visitors, submissions, the conversion rate with its 95% range and a verdict: keep running until each variant has 100 visitors, then either "Variant B is ahead by X% with Y% confidence" (a two-proportion z-test at 95%) or "no significant difference yet". You can change the split while it runs.

**Declare A** or **Declare B** ends the test. Declaring B copies its changes into the form, so everyone sees B from then on. **Stop without a winner** goes back to the original.

## A/B test a landing page

On **Content → Landing pages**, click the flask icon on a page to open its A/B test. Choose **Variant B**: a copy of this page (created as an unpublished page you then edit in the builder — use **Edit variant B**) or another page you already have. Set the split and start.

Visitors to the page's address are split between the page and variant B. Variant B is shown at the **same address** with this page's SEO settings, custom code and tracking — only the content differs. Each visitor keeps their variant for the day without any cookie: our server picks it from the daily-changing visitor hash, and counts a visitor once a day. A **conversion is a submission of a Form block** on the page (a form embedded in an HTML block as an iframe is not counted). Declaring B copies the variant's content into this page; the variant page itself is left as it is.

A running test pauses (everyone sees the original) if the workspace moves below Pro, and resumes on upgrade.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.