# Formtoro documentation > The complete Formtoro merchant documentation, as one document. > Individual pages are at https://formtoro.com/docs/, and also served as > markdown via `Accept: text/markdown` or a `.md` suffix. Corpus version: e3662d3d2fe0 # API keys > Mint scoped API keys for scripts, BI tools, and integrations, and call the Formtoro REST API. Formtoro isn't only driven from the admin, it's a fully agentic platform. For scripts, BI tools, and integrations, you mint API keys — scoped bearer tokens for the Formtoro REST API. Manage them in **Settings → API and MCP Connections**. Connecting an AI client like Claude or ChatGPT works differently: it goes through the MCP server, on the same settings page, and needs no key at all. API keys are part of the AI Insights plan. On other plans the page shows everything in a locked state with an upgrade banner — and if you ever downgrade, existing keys stay visible so you can still revoke them. ## Mint a key 1. Choose Generate API key. 2. Give it a name you'll recognize later (e.g. "BI script" or _"Zapier"_). 3. Select the permissions (scopes) it should have — at least one is required, and Analytics is pre-selected as the sensible default. 4. Copy the key. This is the only time the key is shown, so store it somewhere safe (a password manager, not a shared doc). Keys look like ft_live_… and are sent as a bearer token against the REST API: ```bash curl https://public-api.formtoro.com/v1/forms \ -H "Authorization: Bearer ft_live_your_key_here" ``` ## Manage keys - Edit permissions changes a key's scopes in place — the key itself never changes, and the new scopes apply from its next request. You can only add scopes your own role holds; scopes already on the key are preserved. - Revoke permanently disables a key right away. Revoked keys stay listed in a muted state so you have a record of what existed. - Every mint, permission edit, and revoke is written to your shop's audit trail. ## Scopes Each key is least-privilege — it can only do what you grant, and you can only grant scopes your own role already has. The same permissions govern what an MCP client can do once you approve it: | Scope | Grants | | Analytics | Read funnels, step drop-off, engagement, devices, trends, attribution, revenue, ad spend and ROAS, discount performance, subscriptions, and A/B results. | | Customer lifetime value | Read customer-level lifetime value. Grant only to trusted integrations. | | Form editing | Create and edit forms as drafts. Does not publish or change live forms. | | Form publishing | Save versions and turn forms on or off on your live storefront. Shoppers see the change immediately. Grant only to trusted integrations. | | Discounts | Read your discount definitions (id, name, status, config). Read-only, no customer data. | | Branding | Read your themes and confirmed brand (logo, colors, fonts). Read-only, no customer data. | | Branding editing | Create and edit reusable design artifacts — fork/update themes, create/update shop-level styles. Grant only to trusted integrations. | ## The REST API Everything the scopes above unlock is served from https://public-api.formtoro.com — forms and funnels, branding and themes, discounts, revenue and attribution, Meta and Google ad spend, and shop analytics. The full endpoint-by-endpoint reference, with request and response shapes, lives in the API reference. One endpoint is easy to miss by name: signups broken down by UTM source and campaign come from /v1/revenue/by-utm?dimension=campaign, not from /v1/subscriptions. Each row carries the submission count, converted submissions, attributed orders, and revenue for one source-and-campaign pair. It counts every submission, not only email or phone opt-ins, and submissions with no UTM at all are excluded from it. There is no per-form filter or per-submission export. ## Next steps - MCP server — connect Claude, ChatGPT, or your own agent instead of writing against the API. - API reference — every REST endpoint an API key can call. - Luigi, your AI assistant — the in-app version of the same capabilities. - Settings & team — roles and permissions, which bound what you can grant. --- Source: https://formtoro.com/docs/ai-and-api # Analytics & submissions > Measure how your forms perform and read every response in one place. Formtoro gives you two complementary surfaces: Analytics for the big picture — three tabs covering your whole shop, each form, and each answer — and the Submissions inbox for the individual responses behind the numbers. Both live in the app's sidebar. ## The Analytics page Open Analytics and you land on the Overview tab, with Forms and Responses beside it. All three share the same period picker: Today (the default), Yesterday, Last 7, 14, 30, or 90 days, or a custom range. Switching tabs keeps your selected period, and your last pick is remembered for your next visit. Two things worth knowing about the numbers: - Days match your store's timezone, not UTC. "Today" and every other window start and end on your shop's local calendar day, so Formtoro's figures line up with what Shopify's own analytics show for the same day. - Data is cached briefly for speed. The header shows Updated with the time the numbers were fetched; hit Refresh to force a live re-fetch. ## Reading the insights grid The Overview tab is a grid of metric cards, organized into sections. Each card shows the number for your selected period plus a trend badge comparing it against the period immediately before (green up, red down). Three words unlock the whole grid: - Attributed (also read as "subscriber") — orders and revenue Formtoro can tie back to a shopper who filled in one of your forms. This is your form-driven impact. - Store-wide — totals for your entire Shopify store. Revenue and orders are pulled from Shopify and lag real time by a few hours; store-wide visitors are counted by Formtoro's app embed on every storefront page, so they only appear once the embed is enabled in your theme. - First-time vs. returning — brand-new customers vs. repeat ones. The sections, in order: - Forms — Signup-form views (impressions on forms that can capture an email or phone), Forms seen (impressions on all forms), **New Subscribers, Subscription %** (of everyone who saw a signup form), and Sub → conversion (share of the subscribers captured in the period who went on to place an order — whenever that order happened, up to 90 days later, so a day's rate and a month's rate add up; it has no trend badge, because the most recent subscribers have simply had less time to buy). - Visitors — Total (store-wide when the app embed is counting, otherwise visitors who saw your forms), Saw your forms (how many visitors saw a form, with their share of store visitors), New and Returning (the same population as Total, split by whether they had visited your store before — each card says which), and Subscribers (existing subscribers who came back this period). Store-wide visitor counting starts the day you enable the app embed, so the first period after enabling it compares against a shorter history. - Revenue — store Total (matches Shopify's "Total sales"), **Formtoro attributed revenue, First-time and Returning customer revenue**, and Returning subscriber revenue (repeat purchases from people your forms captured). - Ads — shown only if you've connected Meta or Google Ads: Ad Spend, Cost 1st Acquisition, Blended CAC, ROAS 1x, and Blended ROAS, with a per-platform filter. - Orders — store-wide Total orders, AOV (average order value), and Conversion rate (orders ÷ store traffic). - First orders — first-time customers: total (with its share of all orders), AOV, and first-time conversion rate. - Subscriber orders — your form-attributed orders: count (as a share of first-time orders), AOV, and Subscriber value (total attributed revenue). - Non-subscriber orders — first-time buyers who didn't come through a form: count, AOV, value. - Returning customer orders — repeat customers: total and AOV. Why is a number showing "—"? A dash means that figure's data source is temporarily unavailable — most often the store-wide Shopify figures, which update on a delay. Your Formtoro figures still show. And because store totals lag, **Formtoro attributed revenue can briefly read higher than the store Total** next to it — the card notes "store totals updating" when that's the case. On the "Today" window, store-wide and ad trends pause — including the store-wide Visitors cards, which count by whole day — because a partial day can't fairly compare against a full one, while form trends compare against the same time yesterday. The grid says so in a caption. How attribution works When an order comes in, Formtoro matches it back to a form submission — in order of confidence: by the discount the shopper earned from a form, by the email they gave you, or by recognizing the same visitor's browser. A matched order (and its revenue) counts as attributed; everything else stays store-wide only. That's the whole trick: submission first, order later, tied together automatically. For breakdowns the grid doesn't show — signups and attributed revenue by UTM campaign, device, or page — just ask Luigi; it reads the same data. ## Per-form performance The Forms tab breaks the same period down per form: Viewers, Subs (with the conversion rate from viewers), Completed (with the completion rate), Emails and Phones captured, attributed Revenue (with AOV), and Orders (with the share of that form's subscribers who converted). Hover a form's name for its publish date; click it to open the form in the builder. The converted share counts the period's subscribers who went on to order at any point afterwards — the same rule as Sub → conversion on the Overview — while Orders counts only orders placed inside the period. A form can therefore show 0 orders beside a non-zero converted share: its subscribers bought after the period ended. Viewers counts people — one shopper who reloads a form five times, or returns across three days and two devices, is a single viewer. Everything to its right counts submissions, because a captured email belongs to a submission rather than to a visit. Subs means subscribers: submissions that gave you an email or a phone number. It's the contact you can actually market to, not the number of people who tapped through a step — so on a form that asks a question before the email, someone who answers and leaves isn't counted. A form with no email or phone field can't subscribe anyone, so its Subs cell reads — and its completion rate is measured against viewers instead. The status filter defaults to Turned on — switch to All forms to include forms that are currently off. A live form with no traffic still shows, zeroed, so you can spot a form that's on but not being seen (if that's a surprise, see Going live). ## Responses — what each answer tells you The Responses tab turns answers into insight. It shows one card per question with a fixed set of answers — every choice question, plus any Text field restricted to a list of allowed answers — and the same question merges across forms. Each answer shows: - Count and share — how many respondents picked it, with a proportional bar. (On multi-select questions shares can add up to more than 100%, because one person can pick several answers.) - Revenue line — for answers that led to orders: $1,370.80 · 44% of revenue · 12% conversion — the revenue attributed to people who gave that answer, that answer's slice of the question's total attributed revenue, and the share of those respondents who ordered. Answers that haven't driven a purchase yet read "No orders yet" rather than a misleading $0. Open-ended questions work the other way round: there is no fixed set to chart, so their answers are listed one by one for you to read, not aggregated. Adding allowed answers to a Text field starts its breakdown from that point on, not retroactively. Answers collected while the field was still open-ended never appear in the chart — they could be anything a shopper typed, so they're never rolled into one. You can still read every one of them in the open answers list, which stays available for the question either way. This is where you learn which answers signal a buyer — if "shopping for a gift" converts far better than "just browsing," you know which segment to court, which products to lead with, and what to test next. ## Submissions The Submissions inbox lists every response across your forms — including partial ones: **the moment a shopper submits a step that captures their email or phone, a submission exists**, even if they never finish the rest. Each row shows: - Contact — the email or phone captured, or Anonymous. - Form — which form it came from (hidden when every row is the same form). - Submitted — when, in your store's timezone. - Completion — Completed (the shopper reached the form's end screen) or Still filling out. - Delivery — whether it synced to your connected apps: Not started, a live count while it's in flight (3/4 delivered — three of the four destinations have landed, the rest are still going), Delivered, Needs attention (some destinations succeeded, some didn't), or Failed. Hover the badge for an explanation. - Release — which saved version of the form the shopper saw (v1, v2, …), so you can tell which edit a response belongs to. Narrow the list with the search box (email or phone) and the **date filter** — Any time, last 24 hours, last 7, 30, or 90 days, or a custom range — and page through with Previous / Next. The list doesn't auto-poll; use Refresh to pull the latest. Reading one submission Click a row to open the submission's own page — a real URL you can bookmark or share with a teammate. It shows the contact and status, every **answer in plain language** (your question labels, not raw keys — see how answers are keyed), and a details column with the submitted/completed timestamps, the form, the signup page the shopper was on, and any marketing consent they gave ("Consented to email marketing"). A Sync card lists each connected app with its delivery status and when it synced. The inbox is read-only — it's for reading and triaging responses, not editing them. Your synced integrations (e.g. Klaviyo) are where responses flow onward and get acted on. Your monthly submission usage against your plan's quota lives in Settings → Plan & Usage. If a form's badge reads **"Paused — limit reached"**, that's the quota — see Settings. ## Next steps - Experiments — turn an insight into a controlled A/B test. - Luigi — ask questions about these numbers in plain language, from any page. - Klaviyo — send submissions to your email platform automatically. --- Source: https://formtoro.com/docs/analytics # Audience filtering > Decide exactly who sees a form — pages, devices, location, visitor history, and Klaviyo or Shopify segments — with testable AND/OR rules. Audience filtering controls who sees a form. Before a form renders on your storefront, Formtoro checks whether the current visitor matches the form's audience. If they match, the form appears; if not, it stays hidden — the visitor never knows it exists. New forms start with the Any visitor (not subscribed) audience: everyone who hasn't already signed up through one of your forms is eligible, and existing subscribers are left alone. ## Where to edit the audience Open Settings in the builder's title bar and switch to the Audience tab, then click Edit rules. The Audience Rules sheet slides in with everything on one screen: quick presets, your saved audiences, the rule editor, a plain-English Targeting summary, and the tester. Changes apply to your draft only when you click Apply — Cancel discards them. ## Quick presets One click applies a common pattern, which you can then customize: | Preset | Who it targets | | All visitors | Everyone — removes all rules | | Any visitor (not subscribed) | Anyone who hasn't subscribed yet (the default) | | New visitors | First-time visitors | | Returning visitors | Visitors you've seen before | | Mobile only / Desktop only | One device class | | Product pages | Pages whose URL contains /products/ | | UTM campaign traffic | Visitors arriving with any utm_campaign | ## What you can target Each rule picks one condition from a grouped dropdown. The groups and their exact options: | Group | Options | | URL & UTM | Full URL, UTM source, UTM medium, UTM campaign | | Device & Geo | Device type (Mobile or Desktop), Country, Continent, Located in the EU, Located outside the EU | | Visitor lifecycle | First-time visitor, Returning visitor, Subscribed visitor (signed up via a form), Any unsubscribed visitor | | This form | Has not completed this form — hide a form from people who already finished it | | Integrations | Klaviyo segment, Shopify segment — see segment targeting | | Storage | Cookie, Local storage, Session storage — you provide the key (the cookie or storage entry name) to read | Lifecycle options like First-time visitor or Located in the EU are complete conditions on their own — pick one and you're done. The rest take an operator and a value. To target specific pages, use Full URL with contains — for example Full URL contains /products/ matches every product page, whatever the domain, language prefix, or query string. Older audiences built with the retired Page path condition keep working and still show it, but new rules use Full URL. Full URL checks the whole address, including the query string, so a contains rule also matches text that only appears in a link parameter (for example ?return_to=/products/x). Pick a value specific enough to avoid that. Switching a rule's condition keeps what you already entered wherever it still makes sense — a contains value you typed for Full URL carries over to a UTM or cookie rule — and clears values that wouldn't mean the same thing on the new condition, like an exact equals match or a URL typed into Country. ## Operators Depending on the condition, you can use: - equals / does not equal - contains / does not contain — substring match, great for URLs - is one of / is not one of — match against a list (devices, countries, continents, segments) - is set / is not set — the value exists at all (UTM parameters, cookies, storage entries) A few examples: - Show a welcome offer only on collection pages: First-time visitor and Full URL contains /collections/. - Show a campaign form only when UTM campaign contains spring-sale. - Hide a form from VIPs who carry a vip cookie: Cookie with key vip and is not set — only visitors without the cookie match. ## Combining rules Each group opens with a sentence — **Show to visitors who match all of these rules — and the all / any** chip in it decides how the rules below combine: all (AND) means a visitor must match every rule, any (OR) means one is enough. The choice applies to the whole group; the and / or between rows just reads it back. To mix the two, use a group. Add “any of” group (or “all of”) nests a sub-group with the opposite setting, so you can express things like: Unsubscribed visitor AND Full URL does not contain /checkout AND (Country is Australia OR Country is New Zealand) Groups can nest up to three levels deep. To keep visitors out — hide the form on checkout or cart pages — use **does not contain rules in an all group. In an any** group a visitor only has to pass one rule, so two “does not contain” rules let almost everyone through; the editor flags this and offers Match all rules instead. It likewise flags an all group that asks for two values of the same thing at once (Country is Australia AND Country is New Zealand), which no visitor can match. To reorder rules, drag a rule by its leading icon (or a nested group by the grip in its header) — rules move within their own group, so dragging never changes the AND/OR logic. To reuse a rule, click the Duplicate rule icon next to its remove button: the copy lands right below it, ready to tweak. As you edit, the dashed Targeting box below the rules restates the whole audience in plain English — read it back to confirm the logic says what you mean. Clear all removes every rule, which means show to all visitors. ## Target Klaviyo and Shopify segments You can gate a form on membership in a Klaviyo segment or a **Shopify customer segment** — show a VIP-only offer, or hide a winback form from your engaged segment. - Pick segments by name: the value field is a searchable multiselect that lists your segments; selected ones appear as removable chips. If the list can't load, you can still type a segment ID and press Enter to add it. - Klaviyo segment only appears in the dropdown once Klaviyo is connected. Membership is resolved for visitors Klaviyo already recognizes on your site (their Klaviyo cookie). - Shopify segment membership is only evaluated for **logged-in customers**. A guest browsing your store can't be matched to a Shopify segment. When membership can't be checked — the visitor isn't recognized by Klaviyo, isn't logged in to Shopify, or the lookup fails — an is one of rule treats the visitor as not matching, so a members-only form stays hidden rather than leaking to everyone. An is not one of rule does the opposite and keeps showing the form, so an exclusion never accidentally suppresses your whole audience. ## Saved audiences Build a rule set once and reuse it across forms: - Save as audience stores the current rules under a name. - The Saved audience dropdown loads any saved audience into the editor. Once selected, you can rename it, delete it, or Detach to keep the rules on this form only, no longer linked to the library entry. - An audience that's linked to a form can't be deleted — detach it first. ## How it runs When a shopper loads a page, the storefront widget asks Formtoro whether the form is eligible. Formtoro evaluates the audience server-side using the visitor's context — page, device, location, visit and subscription history, segment membership. Cookie, Local storage, and Session storage rules are the exception: those values only exist in the shopper's browser, so they're checked there. ## Test your audience Click Test audience at the bottom of the sheet to open the **Test visitor panel. It shows input fields only for the conditions your rules actually use** — a URL, a device, a country, segment IDs — you fill in the values a real visitor would have. There are no preset visitor profiles; you always describe the test visitor yourself. The result updates live: a Visitor matches / Visitor does not match banner plus a per-rule breakdown showing exactly which conditions passed and failed, with the value each one saw. For segment rules, enter segment IDs comma-separated — or leave the field empty to simulate a visitor whose membership couldn't be checked. ## Test mode Test mode lets you try a form on your live store without shoppers seeing it. While it's on, the form only shows on pages whose URL contains #ft-test, such as https://your-store.com/#ft-test. 1. Turn on Test mode in the Audience section of the right panel. 2. Click Save version. If the form is off, click Turn on too. The switch only changes your draft. Your store keeps showing the previous version until you save. 3. When the panel shows Testing on your store, use Copy test link or Open to try the form. Until you save, the panel shows Not testing yet and tells you the step that's missing. The test link appears only after that. While testing, your audience rules are paused, so anyone with the test link sees the form, even if they're on the wrong device or have already signed up. Test mode doesn't change or remove your rules. To go live, turn the switch off and click Save version. Your rules then apply again, exactly as before. Until you save, the panel shows Your store is still in test mode. How often it shows still applies while testing. If the form stops showing after you close or submit it, open the test link in a private window. The #ft-test part of the link doesn't carry over when you click to another page. To test the form somewhere else, add #ft-test to the end of that page's URL and reload. You can't change test mode while the form's experiment is running or paused, so every arm is always shown to the same shoppers. You also can't start an experiment while any of its forms is in test mode. ## Audiences and experiments In an A/B experiment, every arm must target the same audience — otherwise you'd be comparing different visitors, not different forms. Edit the audience on the control form and it mirrors to every variant automatically; the variants' audiences are locked while the experiment is set up. ## Next steps - Display modes & triggers — how and how often an eligible form appears. - Logic engine — adapt the form after the right audience opens it. - Klaviyo integration — connect Klaviyo to unlock segment targeting. - Going live — the "why isn't my form showing?" checklist, which starts with the audience. --- Source: https://formtoro.com/docs/audiences # Brand colors > Your store's palette, and the swatches it feeds into every color picker in the builder. Formtoro learns your palette once, then offers it everywhere you pick a color — so an on-brand form is a click away rather than a hex code you have to remember. ## Set your palette When you onboard, Formtoro detects your storefront's palette — Primary, Secondary, Background, and Text. Review and edit these in Settings → Branding & Themes, and add your own named custom colors alongside them. Everything you save here appears as quick-pick swatches in every color picker across the builder, so your exact brand hex values are always one click away. ## On-brand from the very first step The create-form wizard uses your brand before you've styled anything: - The design gallery renders each template as a live preview with your brand layered on. Each design keeps its signature look — your brand accent and typography are applied only where they stay legible against that design's own background, so a preview is never unreadable. - The color step then offers every palette as a live card, with your own custom themes listed first. New forms come out looking like your store — the wizard is usually the fastest way to an on-brand starting point. ## Next steps - Custom fonts — bring your licensed typefaces into every font picker. - Themes — apply a whole design system to a form. - Themes & styles — how the layers stack. --- Source: https://formtoro.com/docs/branding/brand-colors # Custom fonts > Use any Google Font, or upload your own licensed typefaces to Shopify and load them in Formtoro. Every font picker in Formtoro already searches the full Google Fonts catalog — no setup needed. If your brand uses a typeface you've licensed yourself, upload the font files to Shopify and Formtoro will find them, load them, and list them at the top of every font picker as "Your store's fonts". ## 1. Upload your font files to Shopify In your Shopify admin, go to Content → Files and upload one file per weight and style you want to use. - Supported formats: .woff2 (recommended), .woff, .ttf, .otf. - Each file must be under 2 MB — larger files are skipped as almost certainly not webfonts. - Upload the font files, not a .zip, and use Content → Files rather than pasting them into the theme code editor (that can corrupt a binary). Make sure your font license covers web use. The file stays in your own Shopify storage and is served from your Shopify CDN — Formtoro links to it, it never copies or re-hosts your font. ## 2. Name the files so we can read them A bare font file carries no family name, so Formtoro reads the filename. Brandon-Grotesque_Bold-Italic.woff2 becomes the Brandon Grotesque family, bold (700), italic. - Everything left after the weight and style words is the family name, and that's exactly what you'll see in the picker — so name files carefully. - Separate parts with -, _, . or a space. BRANDON becomes Brandon and brandonGrotesque becomes Brandon Grotesque. - Shopify's duplicate-upload suffix (brandon-bold (1).woff2) is ignored. - Files whose name doesn't reduce to a usable family are skipped. Recognized weight words — anything else is treated as part of the family name: | In the filename | Weight | | thin | 100 | | extralight/ultralight | 200 | | light | 300 | | regular/normal/book | 400 | | medium | 500 | | semibold/demibold | 600 | | bold | 700 | | extrabold/ultrabold | 800 | | black/heavy | 900 | A bare number works too (Brandon-700.woff2), and italic or oblique anywhere in the name marks the file as italic. A file with no weight word is treated as regular (400). ## 3. Scan your store Open Settings → Branding & Themes → Fonts from your store and click Scan my store. Formtoro reads your Shopify files and lists every font family it found, each row rendered in its own typeface with the weights it picked up — that preview is how you confirm we found the right file. Uploaded another weight later? Click Scan again. Re-scanning is safe and additive: it never removes a font you already have, and a temporary Shopify hiccup leaves your saved list untouched. ## 4. Use the font Your fonts appear first in every font picker — the element inspector's Typography section, the theme editor, and the create-form wizard — under "Your store's fonts". Pick one and it renders everywhere: builder canvas, preview, and the live storefront. If you have a store font and a Google font with the same name, **your file wins** — you licensed the real thing, so we load it rather than Google's lookalike. A published form loads the font files that existed **when you saved that version**. After adding a new font (or a new weight), save a new version of any live form that should use it. ## Limits and edge cases - Up to 24 font families, and up to 6 weight/style files per family. - Only fonts hosted on your Shopify storage load — Content → Files or your theme's assets/ folder. Font URLs on other hosts are rejected for security. - If Formtoro says it needs permission to read your store files, click Reconnect Shopify in the banner — that shop's authorization predates the permission and reconnecting fixes it in one step. - Typing a family name that's neither a Google font nor one of your uploads gives you a custom font: Formtoro writes the name into the CSS but loads nothing, so it only renders if your storefront theme already loads that font (and it won't look right in the builder or preview). Uploading the file is almost always what you want instead. - Scanning requires permission to edit branding — see Team roles. ## Next steps - Themes — set a font once for a whole form. - Brand colors — the other half of your visual identity. - Going live — republish a live form so it picks up a new font. --- Source: https://formtoro.com/docs/branding/custom-fonts # Themes & styles > How brand colors, fonts, themes, and reusable styles keep every form on-brand. Formtoro forms should look like they belong on your store. Your **brand colors feed every color picker, a theme** sets a form's overall look, and reusable Styles keep individual elements consistent — change something once and it updates everywhere it's used. ## The four pieces - Brand colors — the palette Formtoro detects from your storefront, plus your own named colors. Every color picker in the builder offers them as one-click swatches. - Custom fonts — the full Google Fonts catalog by default, plus any typeface you've licensed and uploaded to your Shopify files. - Themes — a reusable design system applied to a whole form: colors, fonts, spacing, radius, and a default look for every kind of element. - Reusable Styles — a named bundle of look-and-feel you apply to many elements of the same kind. Like a shared CSS class, but visual. ## How styling stacks When Formtoro decides how an element looks, each layer wins over the one before it: 1. The theme's default look for that kind of element. 2. A Style applied to the element. 3. Your tweaks on that one element — colors, spacing, borders. 4. Per-breakpoint tweaks — mobile/tablet/desktop responsive overrides. The practical rule: a local change always beats the theme. If the theme makes buttons blue and you set one button to red, that button stays red — even if you later edit or switch the theme. ## Next steps - Building forms — the builder where themes and Styles come together. - Layout & responsive design — arrange elements and fine-tune each breakpoint. - Going live — why a live form needs a new version to pick up theme changes. - Luigi — ask Luigi to restyle elements for you. --- Source: https://formtoro.com/docs/branding # Reusable styles > Named, reusable bundles of look-and-feel you apply to many elements at once. A Style is a named, reusable bundle of look-and-feel you can apply to many elements of the same kind. Edit the Style once and every element using it updates — like a shared CSS class, but visual. You manage Styles in the Style section at the top of an element's inspector. An element with no Style shows Theme default. ## Create a Style from an element 1. Select an element and style it the way you want. 2. In the Style section, choose Create new Style from this element…. 3. Give it a name (e.g. _"Hero headline"_) and save. The element is now bound to that Style, which captures its current look. ## Reuse it - Apply to one element — select another element of the same kind and pick the Style from the dropdown. - Apply to all of a kind — choose Match these styles on all to bring every same-kind element on the form onto this element's styling in one go. ## Edit once, update everywhere Tweaks you make to a styled element stay on that element — they don't change the shared Style until you say so. The Style section counts your changes and shows an Update available badge: - Update this Style commits your tweaks into the Style — every element using it updates instantly. - Create new Style from this element splits your tweaks into a separate new Style instead. - Reset all discards the tweaks and returns the element to the Style as defined. This lets one element deviate slightly without affecting its siblings — and lets you promote a good deviation to the standard when you're ready. ## Manage Styles The manage menu in the Style section offers Rename, Duplicate, and Delete. Deleting a Style keeps each element's current look — the styling is preserved on the elements themselves, so nothing visually breaks. If the Style is still used in other places, Formtoro blocks the delete and lists exactly where it's used so you can unbind those first. ## Next steps - Themes — the defaults a Style overrides. - Themes & styles — how a theme, a Style, and a local tweak stack. - Layout & responsive design — per-breakpoint tweaks on top of a Style. --- Source: https://formtoro.com/docs/branding/styles # Themes > Apply, switch, edit, and manage the design system behind a whole form. A theme is a reusable design system applied to a whole form. It bundles design tokens — named values for colors, fonts, spacing, and corner radius — plus a default look for every kind of element, so every heading, button, and field starts consistent. Every form renders with a theme; a form that never picked one uses Simple. ## Built-in and custom themes - Built-in themes — nearly thirty designs ship with Formtoro, from the neutral Simple and Dark to opinionated palettes like Editorial, Neon, and Onyx. Built-ins are read-only. - Custom themes — your own copies, badged Custom. You get one by duplicating a built-in on the Branding page, or automatically the first time you edit a built-in theme in the builder (see below). ## Switching a form's theme In the builder, the Theme section (in the Form scope of the inspector) shows the active theme with a small preview. Change opens the Choose a theme modal — built-ins first, then your custom themes. Picking a theme restyles the whole form at once, and switching is clean: the old theme's element styles are swapped out entirely, so no stale styling is left behind. Your content, layout, and any reusable Styles you created are untouched. ## Editing a theme Edit in the Theme section opens the theme editor — token controls on the left (Brand colors, Typography, Spacing, Radius) and a live preview of your actual form on the right. - Save palette commits your changes. Discard changes reverts them. Closing without saving keeps your edits as a pending buffer — the canvas keeps the new look and an Unsaved badge reminds you to reopen and save. - Editing a built-in theme never changes the built-in. Your first save creates a custom copy (named like _"Neon (custom)"_), assigns it to the form, and applies your edits there. The editor tells you this up front. - Editing a custom theme updates every form that uses it. A warning in the editor states the blast radius before you save. Draft forms pick up the change next time you open them; a **live form keeps serving its published look until you save a new version** — see republish after changing shared settings. - Custom themes can also be renamed from the Theme section (Rename theme). ## Managing custom themes Custom themes can be deleted from two places: the Branding page (each custom theme card shows how many forms use it, with a drill-down to see which) and the builder's theme picker (a delete icon on any custom theme that isn't currently active). Deleting is guarded: if any form still uses the theme, the delete is blocked unless you explicitly confirm the force option — then drafts fall back to the default theme, while live published versions continue serving their snapshot normally. ## Next steps - Reusable Styles — override the theme for one kind of element, consistently. - Themes & styles — how a theme, a Style, and a local tweak stack. - Going live — why a live form needs a new version to pick up theme changes. --- Source: https://formtoro.com/docs/branding/themes # Building forms > A Figma-style editor for multi-step forms — layers, canvas, inspector, live preview, versions, and keyboard shortcuts. The builder is where you shape a form. Open any form from the Forms list to edit it. It works like a design tool: select things on a canvas, edit them in an inspector, and preview exactly what shoppers will see. ## The three-panel layout - Left — Layers. A tree of every step and element in the form. Click to select, drag to reorder, and use the inline + to add elements from the block picker. Elements can be hidden or locked from here (locked elements can't be edited, moved, or deleted until unlocked). Parts of a field — like its label and input — are shown nested under it. - Center — Canvas. Every step laid out side by side, rendered exactly as the live form renders. Zoom and pan freely: ⌘0 fits all steps in view, ⌘1 zooms to the selected step. - Right — Inspector. Edit whatever is selected: content, styling, validation, and visibility. A breadcrumb at the top shows where the selection sits in the tree — click any segment to jump to that ancestor. Selecting things Click an element to select the deepest thing under your cursor — click again to cycle the selection up to its parent. Escape walks the other way out: finish text editing → select the parent → deselect the element → deselect the step. ⌘↑ / ⌘↓ step the selection through the tree element by element. ## Adding elements Add elements from the block picker — via the + in the layers panel or by dragging a block straight onto the canvas. Blocks are grouped as: - Form fields — text, email, phone, text area, date, single choice, dropdown, image choice, and consent. (Choice fields can be switched between single- and multiple-select in the inspector.) - Content — headings, text blocks, and images. - Layout — containers and spacers to arrange everything. - Actions — the submit button and a discount display element. (The close button isn't a block — it's part of the form's chrome, configured in the Form settings.) See the fields reference for what each block does and what you can configure on it. Start a step from a template Instead of assembling a step block by block, pick a pre-built one from the step templates palette — email capture, survey questions, discount reveals, feedback prompts, and more, grouped into Capture, Engagement, Conversion, and Feedback. Applying a template replaces the selected step's content, so use it on a fresh step. ## Editing on the canvas Text is edited in place. Select a heading, text block, label, button, or choice option and press Enter (or double-click it) to start typing right on the canvas. A formatting toolbar appears for rich text, merge tags like {{shop_name}}, and policy links. Press Escape when you're done. Right-click for quick actions. The same context menu is available on the canvas and in the layers panel: - Duplicate and Delete - Show / Hide and Lock — unlock again with the lock icon in the layers panel (locked elements can't be edited or right-clicked until then) - Wrap in container — group elements to arrange them side by side or float them - Add label on fields, Add item on choice fields ## Working with steps Forms can be multi-step. Each step is one screen the shopper sees — keeping a single question per step tends to lift completion rates: ask one thing, then move on. - Add, duplicate, reorder, and delete steps from the canvas or the layers panel. Alt+1–9 jumps straight to a step. - Select a step to edit its settings in the inspector: its name, its background, its visibility, and its logic. - A thank-you or success screen is just a regular step at the end of the flow — route to it with the submit button or the logic engine. ## Check your work Two tools, two jobs: - Breakpoint toggle (on the canvas) switches a step's editing view between Mobile, Tablet, and Desktop so you can fine-tune each breakpoint while you edit. - Preview (title bar, or ⌘P) opens an interactive preview you can actually click through — validation, step routing, and animations all run. It renders with the same engine as the live widget, framed in real devices: iPhone SE, iPhone 15, iPad, Desktop, and Desktop Large. What you see here is pixel-for-pixel what shoppers get. ## The issues panel The builder continuously checks your form and flags problems before they reach shoppers — a missing email consent disclaimer, a discount code that doesn't exist in Shopify, a step with no way forward, content that may overflow on mobile, conflicting discount setups, and more. Open the issues panel to see each flag with an explanation and, where possible, a one-click fix. Blocking issues also appear in the checklist when you save a version, so nothing critical slips into a live release. ## Saving, versions, and going live You never lose work in the builder — and you control exactly what goes live: - Your draft autosaves continuously. Toasts confirm Saving... and Changes saved, and warn you on Save failed, Offline, or when the form was modified elsewhere (say, by a teammate). - Save version (the primary title-bar button) snapshots your draft as an immutable version. The save dialog runs a readiness checklist and writes a changelog of what changed since the last version. **If the form is on, saving updates the storefront immediately — the button reads Save and update live**, so treat it as a deploy. If the form is off, the version saves quietly and Formtoro then asks whether you want to turn it on. - Turn on / Turn off flips the form live or off without creating a new version. The form's badge shows On, Off, or Draft — plus Paused — limit reached if your plan's monthly submission limit is hit while it's on. - Version history (⌘⇧H) lists every version with its changelog and a Live badge on the active one. Restore this version copies an older version back into your draft — the storefront doesn't change until your next Save version. Going live also depends on your theme setup — see Going live for the app embed, launch buttons, and the "why isn't my form showing?" checklist. ## Keyboard shortcuts On Windows, use Ctrl for ⌘ and Alt for Option. | Shortcut | Action | | ⌘S | Save the draft now | | ⌘Z / ⌘⇧Z | Undo / redo | | ⌘D | Duplicate the selected element or step | | Delete | Delete the selected element or step | | Enter | Edit the selected element's text in place | | Escape | Finish editing → select parent → deselect | | ⌘↑ / ⌘↓ | Move the selection through the element tree | | ⌘0 / ⌘1 | Fit all steps in view / zoom to selected step | | Alt+1–9 | Jump to step 1–9 | | ⌘P | Toggle the interactive preview | | ⌘⇧H | Open version history | | ⌘J | Open Ask Luigi | | Alt+F / Alt+K | Jump the inspector to Form / Integrations scope | ## Form settings at a glance The Settings button in the title bar opens a tabbed sheet covering how the form behaves on your storefront: Trigger, Teaser, Frequency, Dismiss Behavior, Audience, and Discount. The inspector's Form scope covers its appearance: placement (popup, slide-in, full page, or inline), size, background, border, close button, animation, and theme. Each has its own guide: - Display modes & triggers — how and how often the form appears. - Audience filtering — who is eligible to see it. - Discounts — reward shoppers for completing it. - Themes & styles — keep every form on-brand. ## Editing with Luigi You don't have to do any of this by hand. Open Ask Luigi (⌘J) and describe what you want — "Add an email step with consent", _"Make the button teal"_, "Add a discount after the survey." Luigi sees what you have selected — the drawer shows Editing: … for the current element or step — and scopes its edits accordingly. Every Luigi edit can be undone with one click. See Luigi, your AI assistant. ## Next steps - Fields reference — every block you can place. - Layout & responsive design — containers, side-by-side layouts, and per-breakpoint tuning. - Logic engine — branch between steps and route shoppers based on their answers. - Going live — get the form rendering on your storefront. --- Source: https://formtoro.com/docs/building-forms # Discounts > Reward shoppers with magic discounts that apply themselves at checkout, or static codes that auto-apply the moment someone subscribes. Formtoro can reward shoppers for completing a form. There are two ways to do it, and the difference matters — so it's worth understanding both before you pick one. ## Magic vs. static discounts | | Magic discount | Static code | | What the shopper does | Nothing — it just works | Sees the code in the form; it's also applied for them | | When it applies | Automatically at checkout | Auto-applied to the cart as soon as they subscribe | | The reward | Granted per customer — nothing to leak or share | One shared Shopify code, visible to everyone | | Applies to | The whole form | The discount display element that shows it | | Where it lives | Form settings → Discount (no visible element needed) | A discount display element placed in the form | | Backed by | A saved reward from your Discounts page | A discount code you create and manage in Shopify | Magic discount (recommended) A magic discount is granted to the shopper the moment your form captures their first accepted email or phone number. There's no code to copy and nothing to remember: 1. The shopper submits their email or phone. 2. Formtoro grants that customer access to the reward on a secure Shopify customer record (creating the customer if they're new). 3. At checkout, Shopify recognizes the customer — because they're logged in or entered the same email or phone — and applies the discount automatically. Where possible, the reward shows up as early as the cart page. Because access is granted per customer, the reward can't leak on a coupon site, and you control exactly one redemption per customer if you want to. To set one up, open Form settings → Discount in the builder and pick one of your saved rewards under Magic discount. If the list is empty, create one on the Discounts page first. The discount the buyer sees in their cart is labeled Sign Up Discount by default — set a custom Reward message on the reward (up to 24 characters) to change it. Static code A static code is a discount code you already manage in Shopify (e.g. WELCOME10), shown inside the form on a discount display element. The code belongs to that element, so you set it there: 1. Add a discount display element — from the block picker, or with **Add code block under Static codes in Form settings → Discount** (it's added to your form's last step). 2. Select the element. Its Discount section opens at the top of the inspector — or double-click the element on the canvas to jump straight into the code field. 3. Type your code in Static code customers will see. It searches your store's active Shopify codes as you type, and you can also enter a code by hand. Form settings → Discount lists every static code in the form under Static codes, with a warning on any that's missing or not found in Shopify. Click a row to jump to that element. Static codes are friendlier than they used to be: as soon as the shopper subscribes, Formtoro auto-applies the code to their cart — they don't have to copy and paste anything, though they still can (the copy button is optional). See the fields reference for the element's display options. A static code is still one shared code: it's visible to everyone who completes the form, and it only works if the matching discount exists and is active (or scheduled) in Shopify. The builder warns you when it isn't — see issue flags below. If you see the warning and then create the code in Shopify, switch back to the builder or click Check again under the field. The builder checks the code again and the warning clears. Which should you use? Prefer a magic discount for signup rewards — it's per-customer, unshareable, and needs no Shopify code to keep in sync. Use a static code when you want a code shoppers can see, save, or share. Free gift with purchase Instead of a code, you can offer a product: an Add to cart element is a button that puts one item in the shopper's cart. 1. Add it from the block picker, or with Add product block under **Static codes in Form settings → Discount** (it's added to your form's last step). 2. Select the element and click Select product to pick the product variant. 3. To make the item free, create a Shopify discount for it — for example, a Buy X Get Y reward or an automatic discount in Shopify that makes it free on orders over $50. The button only adds the item. It doesn't change the price. The item is never added automatically: it only goes in the cart when the shopper clicks the button. If the item has a price, the builder shows a warning asking you to state the terms on the same step, for example "Free with orders over $50. Otherwise it's charged at full price." Add a text block that says this clearly. Shoppers need to know what they'll pay before they add it. While the item is being added, the button shows Adding…. Then it shows Added ✓. If the item can't be added (it's sold out or was deleted), it shows Unavailable and the rest of the form keeps working. You can change all three labels. If the item is already in the shopper's cart, clicking doesn't add a second one. If the same step shows a static code, the code is applied to the cart along with the gift. On themes built on Dawn or Horizon, the cart drawer and cart count update right away. Other themes may show the item only the next time the shopper loads a page. ## The Discounts page The Discounts page is your reward library. Each reward is defined once and can be attached to many forms. At the top, a status panel confirms the Formtoro discount function is installed on your store, that your **active rewards are synced to Shopify, and how many grants** were issued in the last day and week. Each row shows the reward's value, its status (active or archived, plus a Not synced warning if it hasn't reached Shopify), and how many forms use it. Reward types When you create a reward, pick a Reward type: | Reward type | What the customer gets | | Percentage / fixed amount off | e.g. 10% off, or $5 off, eligible products in the cart | | Buy X Get Y | Buy N qualifying items, get up to M items discounted or free | | Free shipping | 100% off their delivery options | | Shipping discount | Free, a percentage off, an amount off, or a flat rate on shipping | | Product + shipping | One reward granting both — e.g. "10% off and free shipping" | Product rewards For percentage and fixed-amount rewards, you also choose **What gets discounted**: - Every eligible item in the cart — the default. - One unit of the most expensive item or **one unit of the least expensive item** — the reward is pinned to exactly one unit, compared by per-unit price. It never spreads to other items and never grows when the customer buys more. Example: with a $200 jacket and two $50 tees in the cart, a 50% reward on the most expensive item takes $100 off the jacket and nothing off the tees. An Applies to section limits the reward to specific products, collections, or variants; single-item targeting only compares items that pass that filter. Shipping discounts The Shipping discount type covers four rewards: - Free shipping — 100% off eligible delivery options. - Percentage off shipping — each eligible option discounted by a percent. - Amount off shipping — a fixed amount off each option, never below free. - Flat-rate shipping — the customer pays exactly the rate you set (e.g. $4.95); options already cheaper are left alone. A flat rate of $0 is free shipping. Three restrictions can narrow it, and they all apply together: - Excluded shipping rates — delivery options with these titles are never discounted (matched exactly, ignoring case — e.g. add "Express" so an overnight upgrade doesn't become a giveaway). - Countries — restrict the reward to specific destination countries. - Maximum rate — only discount rates at or below a cost you set. If the restrictions leave no eligible option, the customer simply sees their normal shipping rates — never a partial or misleading discount. Product + shipping combines a product benefit with a shipping benefit in a single reward — one grant unlocks both, and each applies independently at checkout. Limits, expiration, and stacking - Limit to one redemption per customer — a customer can hold only one active grant for the reward. - Grant window (days) — each customer's grant expires this many days after it's issued. Leave blank for no per-customer expiry. - Expiration date — the whole reward stops applying after this date. Leave blank and it remains active indefinitely. - Combines with other Shopify discounts — by default a reward stacks with product and shipping discounts but not with other order discounts. Three checkboxes let you change that. Checkout rules The Rules section adds optional checkout-time conditions on top of the grant — the customer must hold a grant and satisfy the rules. Conditions can reference the customer (number of orders, total spent, tags, first order) and the cart (subtotal, item count, specific products, ship-to country, currency), combined with AND/OR logic. Test before you rely on it Every reward has a Testing and diagnostics panel. Simulate a checkout — customer recognized or not, order history, cart contents, delivery options and their costs — and run it against your configuration to see exactly whether the discount would apply, which rule matched, and why not if it didn't. If a reward shows Not synced, the panel's Sync to Shopify button re-provisions it and reports what failed. ## Attaching a discount to a form - When creating a form — the create-form wizard has a discount step where you pick a static code or a magic discount before the form is generated. - In the builder — open Form settings → Discount. Pick the magic discount there; for a static code, use Add code block (or click an existing code) to jump to the element that holds it. As always, changes take effect when you Save version with the version set live — a form that's Draft or Paused grants nothing. What the builder checks for you The issues panel flags discount problems before shoppers see them, including: a magic discount pointing at an archived reward, a magic discount on a form that captures no email or phone (so it could never be granted), a static code that doesn't match any active discount in your Shopify store, an empty discount display element, and a form that sets up both a magic discount and a static code — which usually means customers get two discounts that stack unexpectedly. Most flags come with a one-click fix or a jump to what needs changing — Edit code and **Set code** take you straight to the element's code field. ## Archiving Archive reward (in the reward's danger zone) is a soft delete. If the reward is still used by published forms, Formtoro warns you first: those forms stop granting new rewards until you attach a different one and save a new version. Grants already issued to customers are unaffected. ## Next steps - Building forms — where the Discount settings and issues panel live. - Fields reference — the discount display element's options. - Analytics & submissions — see how discounts affect revenue and attribution. - Klaviyo integration — subscriber profiles carry the granted discount, so your flows can reference it. --- Source: https://formtoro.com/docs/discounts # Display modes & triggers > Choose how a form appears, when it opens, and how often a returning shopper sees it. How a form shows up on your storefront — and how persistent it is — matters as much as what's inside it. This guide covers the four display modes, the triggers that open a form, what happens when a shopper closes it, and frequency (how often a returning shopper sees the form again). Placement lives in the builder inspector's Form scope; everything else here lives in the Settings sheet (title bar) under the Trigger, Frequency, and Dismiss Behavior tabs. For the small clickable prompt that invites a shopper to open the form instead of showing it outright, see Teasers. ## Display modes Every form has exactly one of four display modes: | Display mode | What shoppers see | | Popup | A centered modal over a dimmed backdrop. You control the backdrop color and opacity. | | Slide-in | A panel anchored to the bottom-left or bottom-right corner of the page. | | Full Page | A takeover that fills the whole viewport. | | Inline | Embedded in the page itself, placed through the Shopify theme editor as an app block. | A form can also carry a separate mobile display mode: when you pick Popup, Slide-in, or Inline while creating a form, Formtoro sets the phone experience to Full Page by default — most popups read better as a takeover on a small screen. The Settings sheet shows both values under the Trigger tab's placement summary. Inline forms behave a little differently Because an inline form sits where you placed it in your theme, it doesn't sneak up on anyone — so Formtoro deliberately skips the popup machinery for it: - Frequency caps don't apply. A merchant-placed section shouldn't vanish. - Only the After delay trigger applies. Scroll, exit intent, cart value, and page views are popup behaviors; an inline form appears on load (or after its delay). On click (launcher) works too, paired with a launch button on the same page. - Audience rules fully apply. An ineligible visitor sees nothing — the space simply collapses. See Audience filtering. - The close button is off by default for inline forms (turn it on in the inspector if you want one), and a dismissed inline form collapses to the same floating teaser popups use. Setup for the inline block lives in Going live. ## Triggers The Trigger tab decides when an eligible visitor's form opens: | Trigger | Behavior | | Show Immediately | Opens as soon as the page loads. The default for new forms. | | After delay | Opens after a pause — pick a preset from 1s to 30s, or Custom seconds. | | On scroll | Opens once the visitor scrolls past a percentage of the page (default 50%). | | Exit intent | Opens when the visitor's cursor moves to leave the page. | | Cart value | Opens once the cart total reaches your threshold (default $50). | | After N pages viewed | Opens on the Nth page of the visit (default 3) — targets browsers, not bouncers. | | On click (launcher) | Never opens on its own. A launch button you place in your theme opens it. | ## Open on click instead of automatically If you'd rather the shopper open the form by clicking a button — say a "Find my size" button right below your Buy Buttons — set the trigger to On click (launcher) and place a Formtoro Launcher block in your theme. The form loads and waits silently until the button is clicked. See Launch buttons for the full setup. One coherence rule: a form with the On click (launcher) trigger can't have a teaser — the launcher is its entry point, so the **Enable teaser** toggle is locked while that trigger is selected. ## Send dismissing subscribers to a step The Dismiss Behavior tab has one setting, On dismiss: instead of Close (default), choose Go to step and pick a step (typically a coupon or offer step). When a shopper who has already submitted their email or phone tries to close the form, they're sent to that step instead — a last-chance nudge. Guardrails, so nobody gets trapped: - Subscribers only. It fires only after a submitted email or phone — a visitor who typed an email but never submitted closes normally. - Fires once. The next dismiss closes the form normally. - Still counts as a dismissal. Even though the shopper lands on your offer step, Formtoro durably records the close — the form won't reopen on later page views. Whether the closed form disappears for the rest of the visit or shrinks back to a reopenable prompt is a separate choice — see when a shopper dismisses the form. ## How often a form shows The Frequency tab controls whether a returning visitor sees the form again. This is the setting merchants most often misread, so here's the full picture: | Option | Behavior | | Until subscribed | Keep showing until the visitor gives an email or phone. The default for new forms. | | Until form completed | Keep showing until the visitor finishes the form (or explicitly closes its teaser). | | Once ever | At most one appearance per browser, ever. | | Once per session | At most one appearance per browsing session. | | Every visit | Show on every eligible page load. | | Custom interval | Show again only after Repeat every N days (default 7). | Until subscribed — the default A visitor counts as subscribed the moment they submit a step containing their email or phone — on any of your forms, even if they never finish the rest of that form. From then on, every form of yours set to **Until subscribed** stops appearing in that browser. The idea: never nag someone who already gave you their contact. Formtoro remembers the subscribed state in the shopper's browser, scoped to your store, for about 6 months. Your audience rules — such as excluding existing Klaviyo subscribers — remain the durable, server-side way to keep known subscribers out beyond that window. Until form completed Choose this when finishing the form matters more than capturing the contact — surveys and quizzes, for example. The form keeps showing until the visitor reaches a true end state: completing the form, being redirected, or closing the teaser with its Allow full close control. Two useful consequences: - A visitor who gave their email mid-form but didn't finish **keeps seeing this form** so they can complete the remaining steps — and it resumes on the step where they left off, even across visits. - Saving a new live version resets that resume point: mid-form visitors start again from step one (the form still shows; only their place is lost). Good to know - Eligibility comes first. A form only reaches the frequency check if the visitor matches its audience and the form is live. - Frequency state lives in the shopper's browser, scoped to your store. In private browsing (where storage is blocked), the form simply shows on each eligible page load — the safe direction. - Every visit and the impression-based options count an appearance when the form (or its teaser) is shown, not when it's opened. ## Customer privacy Off by default, set per form. When you turn it on, this form is **held back from a shopper until they've consented to tracking**, honoring Shopify's storefront Customer Privacy signals. It waits for cookie consent in **any region where you've enabled Shopify's cookie banner** — the EU / EEA by default, plus any other regions you've turned it on for in your privacy settings. The moment such a visitor consents, a popup appears — same visit, no reload. (An inline embed appears on the next page load instead, since it's part of the page rather than an overlay.) Because a form that never shows records no impression, its analytics are held back too, and Formtoro drops the tracking identifiers it would otherwise store for that visitor. Separately, and regardless of this setting: shoppers who opt out of data sale — California, Virginia, or a Global Privacy Control browser signal — always have their ad click IDs withheld from ad platforms. Two guardrails so you don't lose conversions: - **It only hides the form for a shopper the consent signal actively reports as declined.** Visitors whose region needs no consent see the form as normal — and if a shopper's browser or an ad-blocker hides the consent signal, or your store has no consent banner at all, Formtoro shows the form rather than guessing. - Submitting is never blocked. Once the form is showing, a shopper can always fill it in. Find it in a form's settings under Customer privacy. It only has an effect on storefronts that use Shopify's consent management — on a store with no consent banner, nothing changes. This is separate from your store-wide consent copy, which controls the SMS/email agreement text shown inside your forms. ## Next steps - Teasers — invite shoppers to open the form instead of showing it outright. - Audience filtering — decide who is eligible to see a form. - Launch buttons — open forms from a button in your theme. - Going live — the app embed, inline blocks, and the "why isn't my form showing?" checklist. - Building forms — design what's inside. --- Source: https://formtoro.com/docs/display-and-triggers # Experiments > A/B test up to five versions of a form — split traffic, compare conversion and revenue, and promote the winner with confidence. Experiments let you run up to five versions of a form against each other and measure which one actually converts better — so you change your forms based on evidence, not opinion. Formtoro splits your storefront traffic between the versions, tracks conversion and revenue for each, and tells you when the result is statistically trustworthy. ## How a test works Every experiment has a control and one to four challengers — up to five arms in total: - Control — the form you already have. Its identity stays stable: embeds, integrations, and analytics keep pointing at it no matter how the test ends. - Variants — the challengers. Each one is another form you pick — published, or a draft you haven't published yet. A test with one challenger calls it Variant; with more, they're lettered Variant B, Variant C, and so on. Experiments compare forms you've already built. Create each version you want to test as its own form first — duplicate the control from the Forms list if you want a starting point — then pick them when you set up the test. A variant can stay a draft: starting the test publishes it, so it never shows on its own beforehand. While the test runs, each visitor is assigned to one arm and **always sees the same arm** on every visit — assignment is deterministic per visitor, so nobody flip-flops between versions mid-test. You choose the traffic split when you create the test (an even split by default). Every arm is always served to the control form's audience, so the versions are compared against the same visitors. A form can only be in one active experiment at a time, in any role. How many arms? Each extra arm splits your traffic further, so every arm gets fewer visitors and the test takes longer to reach a verdict. Start with one challenger unless you have plenty of traffic and genuinely different ideas to compare. ## Run your first experiment Open Experiments in the navigation and click New experiment. One modal walks you through it: 1. Pick a form to test. The picker lists your published forms, most recently edited first — a form needs at least one saved version to qualify. Only the first few are listed; search by name to find the rest. Forms already in an active experiment appear disabled, labeled with the experiment they belong to. 2. Add challengers. The test starts with one; click Add challenger for up to four. For each one, pick another form — published, or a draft (marked _"Draft — published when the test starts"_). If its audience differs from the control's, you'll see a heads-up: starting the test aligns its audience to the control's. If the form is on, creating the draft turns it off until the test starts, so it never shows as a separate popup alongside your control. You need a published form to test and at least one more form to challenge it. 3. Configure the test. Give it a name (pre-filled as _"{'{form}'} — A/B Test"_) and set the traffic split: a percentage for each arm, from 1% to 99%, adding up to 100%. Drag each arm's slider or type its percentage; the other arms adjust automatically, in proportion, to keep the total at 100%. Split evenly resets it to an even split (adding or removing a challenger does too). Click Create draft. This creates the experiment but does not start it — no traffic is split yet. You land on the experiment's detail page. From here: - Open any arm's form (each arm card links straight into the builder) to fine-tune it before launch. Test one meaningful change at a time — a different headline, offer, image, or flow — or you won't know what caused the difference. - When you're ready, click Start test. Starting turns on every form in the test, publishes the latest saved version of each, and begins splitting traffic. You don't need to turn the forms on yourself: while the test is a draft its variants stay off, and turning one on from the Forms list or the builder is refused with _"This form is a variant in the draft test … Start the test to turn it on."_ If a form was archived or is in test mode, a banner lists what to fix before you can start. ## While the test runs - The Forms list shows who's in a test. Forms in an experiment carry an A/B Test pill plus a pill naming their arm — Control, Variant, or Variant B, Variant C… — click them to jump to the experiment. - Audiences stay in sync. Every variant's audience is locked in the builder while the test is active; audience changes you make on the control mirror to every variant automatically. This keeps the comparison fair. - Leave the forms alone. You can still open any of the forms in the builder, but changing a form mid-test muddies what the results mean. Make your edits before starting, or end the test and run a new one. - Name and split are locked after start. You can edit the test's name and traffic split only while it's a draft — changing the split mid-flight would change the meaning of data you've already collected. - Formtoro watches the test's health. If someone turns off one of the forms while the test runs, the experiment page shows a warning — an arm is getting no traffic and the results are being skewed — with a one-click fix to turn it back on. You can Pause a running test at any time (traffic stops splitting; visitors see your forms as normal) and Resume it later. ## Reading the results The experiment page shows every arm side by side, control first. By default it covers the whole test — from the moment you started it through to now, or through to the day it finished — so the significance verdict weighs every visitor the test has seen rather than an arbitrary recent slice. The date picker narrows that window if you want to look at a particular stretch; a range wider than the test is trimmed to the days the test actually ran, and the header always names the window you are looking at. Under the page title you'll see when the test started and, once it's over, when it ended — the same dates the Experiments list shows. Within that window, each arm card leads with two rates side by side: - Opt-in rate is the headline number for each arm — submissions as a share of unique visitors who saw the form. This is the rate the test is judged on: the arm with the highest opt-in rate wears a Leading badge once every arm has traffic, and the significance banner is computed on it. - Sub → conversion answers the next question — of the people this arm signed up, how many went on to buy? It's the share of signups (submissions that gave you an email or phone) with at least one attributed order — the same subscriber-grain definition as the Sub → conversion tile on the Analytics overview. A repeat buyer counts once. An arm can win on opt-in rate and lose here, which is exactly the trade-off you want to see before promoting a winner. - Traffic — viewers, submissions, completions, and dismissals. Each counts people, not events: a shopper who reloads the form, or returns on another day or device, is one viewer. Submissions here means everyone who sent a step, which is not the same as the [Forms tab's](/docs/analytics#per-form-performance) Subs — that counts only the people who gave you contact details. Where the two differ, read the arm cards as a measure of engagement. - Revenue — revenue per visitor, attributed orders, and net revenue (after refunds), so you can see whether the "winner" actually makes more money. - Pooled totals sum every arm — the experiment's overall footprint. Each variant's card also says how it compares with the control: its opt-in lift (for example _"+20.0% vs control"_) and a verdict — Beats control, Trails control, Not significant yet, or Not enough data yet. Above the cards, a banner tells you how much to trust what you're seeing: - "Not enough data yet to call a winner" — the sample is still too small for the math to mean anything. A 100% opt-in rate on three visitors is noise, not signal. Keep the test running. - "Not yet statistically significant" — there's data, but the gap between the arms could still be luck. Let it run longer. - "Significant at 95% confidence" — the difference is real with 95% confidence, and the banner names which arm is winning. With several variants, it says which variant beats the control (or that the control beats every variant): each variant is compared with the control. More variants, higher bar. Every extra comparison is another chance for luck to look like a win. When a test has more than one variant, Formtoro corrects each comparison for the number of variants (the Holm method), so the p-values it shows are already adjusted and adding arms doesn't raise the odds of a false win. The card verdicts use the same adjusted numbers as the banner, and no card claims a win while any variant is still short on data. Be patient. Most tests need hundreds of visitors per arm — often a week or two of traffic — before a trustworthy verdict emerges. Ending a test the moment one arm pulls ahead is the most common way to ship the wrong form. Significance is a nudge, not a gate: you can always declare a winner manually, but the banner tells you when the data has your back. ## Ending a test From the experiment page's top bar: - Declare winner — the decisive move. A modal shows every arm with its opt-in rate; the leading arm is pre-selected, but you pick. On confirm, traffic splitting stops, the winning version keeps serving your storefront, and every variant form is turned off at the same moment — they stay in your forms list, so you can reuse them later or archive them to free up form slots. If a variant won, its design is carried over to your original form — so every embed, integration, and report that pointed at your original form keeps working, now serving the winning version. If the data is still thin, the modal warns you before you commit. Declaring a winner ends the test permanently. - End test — stop collecting data without picking a winner yet. Your control form keeps serving your storefront and every variant form is turned off at the same moment, so they don't show up as separate popups. The results stay available on the page, and you can still declare a winner later. - Cancel test — abandon the experiment. On a running or paused test, your control form keeps serving and every variant form is turned off. Cancelling a draft leaves its variants off. Either way, no form is changed or deleted — turn a variant on from the Forms list if you want it live on its own. An experiment's status moves through Draft → Running (with optional Paused detours) and ends as Completed, Promoted, or Discarded — always visible as a badge in the Experiments list. Drafts and running or paused tests sit under Active tests; finished ones move beneath them to Previous tests, each with the dates it started and ended, and stay there so you can revisit any test's results later. ## Next steps - Analytics & submissions — the metrics behind your experiments, for every form. - Building forms — craft the variants you want to test. - Audience filtering — who is eligible to see your forms. - Luigi, your AI assistant — ask _"How are my A/B experiments doing?"_ for a plain-language readout. --- Source: https://formtoro.com/docs/experiments # Fields reference > Every element you can add to a form, what it's for, and what you can configure. This is a practical reference to the building blocks you place in the builder. Add elements from the block picker — via the + in the layers panel or by dragging onto the canvas — then select one to configure it in the right-hand inspector. The picker groups blocks into Layout, Form Fields, Content, and Actions. (The close button isn't a block — it's part of the form's chrome, configured in the Form settings.) ## Input fields | Field | What it's for | What you can set | | Text | Short free-text answers | Placeholder · Allowed answers · Required (+ error) | | Text area | Longer free-text answers | Placeholder · Rows (1–20) · Required (+ error) | | Email | Email capture, with built-in email validation | Placeholder · Required (+ error) | | Phone | Phone capture with a country dial-code picker | Placeholder · Default country · Required (+ error) | | Date | A date answer, via a date picker | Required (+ error) | Every required field blocks the step until it's filled, and shows your error message (or "This field is required" if you leave it blank). Email, phone, and date formats are validated automatically. A few field-specific details: - Phone shows a flag-and-dial-code picker in front of the input. **Default country** (US by default) sets which dial code is pre-selected; when the shopper switches country, and you haven't set your own placeholder, the input shows an example number in that country's local format. - Date opens the shopper's native date picker — the same control they use everywhere else on their device, so it's familiar on mobile. - Text area wraps and grows with its Rows setting (3 by default). - Text can be restricted to a list of Allowed answers — see below. Allowed answers on a Text field A Text field can carry a list of Allowed answers. As the shopper types, their browser suggests the matching ones — and **the field then only accepts an answer that is on the list**. Adding one turns free text into a "pick one of these, but type to find it" control. Use it when the answer comes from a known set that would be tedious to scroll as a dropdown — countries you ship to, store locations, sizes, a product line. Leave it empty when you genuinely want free text. To set it up, select the Text field and, under Field Properties → Allowed answers: - Type a keyword and press Enter to add it. You can paste a comma-separated or one-per-line list (straight out of a spreadsheet) and press Enter to add the whole lot in one go. - Click into any keyword to rename it, or press Escape to abandon the edit. - Click the ✕ next to a keyword to remove it. Removing the last one turns the field back into a plain text field. You can add up to 100 keywords. Matching ignores capitalization and surrounding spaces, so a shopper who types italy passes — and their answer is always saved as the Italy you typed, however they submitted it, so all of your responses group together in reporting and your logic rules can compare against the keyword exactly. Duplicates are rejected as you add them, for the same reason. Because the answers are a known set, they're also reported as a breakdown with counts and revenue in Responses, the same way a dropdown is. The open answers list stays available too, so answers you collected before adding the list are never hidden. If a shopper submits something that isn't on the list, they see the keywords listed back to them ("Please choose one of: Italy, Spain, France"), or your own text if you fill in Validation message. Long lists fall back to "Please choose one of the suggested options". Browser suggestion lists are advisory — a shopper can always type past them, and a few browsers style them differently or not at all. That's why Formtoro validates the answer itself, on the shopper's device and again on our servers. ## Choice fields | Field | What it's for | | Single choice | Pick from a list of options — toggle to multiple in the inspector | | Dropdown | Pick one from a select menu | | Image choice | Pick from a grid of image tiles — also toggles single/multiple | For single-choice and image-choice fields you can configure: - Selection — toggle between Single and Multiple. Single-select questions are always required (an unanswered single-select is never a valid submission), so the Required toggle is hidden — but you can still customize the error message. - Auto-advance on selection — for single-select, picking an option moves to the next step automatically (no submit button needed). On by default. - Randomize option order — shuffles the options per visitor to remove order bias (stable within a visit, reshuffled on the next). Your canvas always shows them in your editing order. - Layout — arrange options Vertical, Horizontal, or Grid. - Add item — add options; edit each option's Label (its stored value is derived from the label automatically). On an image choice, each tile's picture is a selectable image of its own — click into it to set the source, alt text, and fit with the same controls as a standalone image. Dropdown is configured slightly differently: edit its Options inline (at least one is required) and set a placeholder. We can select individual choice items to edit them more granularly: ## Consent The consent field handles marketing opt-in and disclaimers. Pick a **Consent mode**: - SMS (the default) — a required checkbox with TCPA-compliant copy. Required is locked on (legally, SMS marketing needs explicit opt-in). - Email — an informational disclaimer shown with email capture. No checkbox, and it isn't submitted as an answer. - Custom — you control the copy, the checkbox, and whether it's required. Consent copy supports {{shop_name}}, {{terms}}, and {{privacy}}, which resolve to your store name and your policy links on the live form. Set the policy links in Settings → Legal & compliance, and republish after changing them. Changing the wording There are two places to edit consent copy, and which one you want depends on how far the change should reach: - Every form — Settings → Legal & compliance. Your copy there becomes the starting text for every consent field you add from then on. A Use recommended button appears whenever your copy differs from ours, so you can always snap back. - This form only — select the consent text on the canvas and edit the Content box in the inspector. It's a plain-text box that understands the same {{...}} placeholders, so the links keep working while you rewrite the words around them. Editing the Content box changes only the form you're in. It does not affect your saved default in Settings, and it does not change consent fields on your other forms. Translating consent copy Consent copy is the one place where a non-English store has to translate two separate things — the sentence, and the clickable link words inside it. 1. The link words. Set Terms link text and Privacy link text in Settings → Legal & compliance. {{terms}} and {{privacy}} then render in your language on every form — Nutzungsbedingungen instead of "Terms & Conditions". Set it once; existing forms pick it up the next time you save a version. 2. The sentence. Rewrite it in your own language, in either of the two places described under Changing the wording. If one form needs different link wording than the rest of your store, put it inside the placeholder instead: ``` Weitere Informationen finden Sie in unserer {{privacy:Datenschutzrichtlinie}}. ``` The Content box goes read-only for rich copy. If your consent text contains bold or colored text, a link you made by hand, or a merge tag other than {{shop_name}}, plain text can't represent it — so rather than risk destroying it, Formtoro locks the box (you can still read the copy). Edit that consent text directly on the canvas instead. The checkbox itself has two dedicated color pickers in the inspector: Background color paints the unchecked box, Accent color fills it when checked. ## Content | Element | What it's for | Notes | | Heading | A title (renders as H1–H4) | Edit text inline on the canvas; supports merge tags | | Text block | Paragraph copy | Inline rich text; supports merge tags and policy links | | Image | A picture, optionally linked | Source, alt text, fit, position, link, per-breakpoint image | Merge tags personalize copy at render time: type {{ while editing a heading or text block to insert First Name, Discount Code, **Shop Name, Product Name, Product Price, or Cart Total**. Image controls live in the inspector's Asset section: pick or upload a source, set alt text, choose a fit (Cover — the default, fills and crops like a photo — Contain, Fill, None, or Scale down), and set a focal position for cropped fits. You can give mobile and desktop different images: the source you pick while editing the Desktop breakpoint becomes a desktop override, while the base image serves smaller screens. Add a link URL to make the image clickable. ## Layout | Element | What it's for | | Container | Group elements to arrange them (row / stack / grid) and to enable floating | | Spacer | Add vertical space between elements | See Layout & responsive design for how containers unlock side-by-side and responsive layouts. ## Actions & special - Submit button — set its Text and Loading text, and choose what happens On submit: go to the Next step, Skip step (advances without enforcing required fields — perfect for a "Skip for now" button), Close form, or Redirect to URL. Step routing rules still take priority over the button's own action. - Discount display — shows a static discount code inside the form. The Static code customers will see field suggests your store's active Shopify codes as you type, and warns you if the code you enter isn't an active discount in Shopify. Double-click the element on the canvas to jump to the field. Shoppers don't have to copy it — the code **auto-applies to their cart as soon as they subscribe** — but they still can (hide the copy button if you just want to show the code). Magic discounts don't need this element — they apply automatically at checkout. - Add to cart — a button that adds one product to the shopper's cart when they click it, for a free gift with purchase. Pick the product with Select product, and change the Button text, Adding text, Added text, and Unavailable text. The button stays hidden on your store until a product is selected. ## Good to know - Field names are automatic. Each answer is stored under a key (like email or shopping_interest) that Formtoro assigns; it's also the default Klaviyo/Shopify property name. You can edit it in the inspector's **Field name** box — it must be unique within the form, and any logic rules referencing it update automatically. Those keys are what you'll see in Submissions and the Responses view. - Reuse a question across forms. Choice and dropdown fields offer a Reuse question picker that adopts another form's question key and answer set — responses from both forms then combine in shop-wide analytics instead of splitting into two look-alike questions. - Every field can hide its label. Toggle Show label in the inspector (or the eye icon in the layers panel). A field hidden entirely can't be required — hiding it un-requires it. - A few controls aren't exposed yet. Minimum/maximum selections on choice fields, minimum/maximum dates, and the heading's level (new headings render as H2) exist in the data model but don't have builder controls today — treat them as planned, not hidden. ## What a form can't collect Formtoro forms collect typed answers and choices — text, email, phone, long text, dates, and the choice/dropdown families above. There is no file upload or image upload field, so a shopper can't attach a photo, a receipt, or a document to a submission — not as a guest, and not as a logged-in customer. Images in a form are always yours, never the shopper's. They arrive three ways: - an image block in the Content group — a picture you place in the layout, - image choice options — a choice field whose answers are pictures the shopper picks between, and - a background image on the form or a step, set in the inspector. If you genuinely need a file from a shopper, use Submit → redirect to send them to a page on your store that accepts one after they subscribe — the submission still lands in Formtoro, and the upload happens where you already handle it. ## Next steps - Building forms — placing and arranging these elements. - Logic engine — branch between steps and route shoppers based on their answers. --- Source: https://formtoro.com/docs/fields # Getting started > Install Formtoro, work through the setup guide, and get your first form live. This guide takes you from installing Formtoro to a live form on your storefront — about five to ten minutes, most of it spent admiring what Luigi built for you. ## 1. Install the app Install Formtoro from the Shopify App Store. After you authorize it, Formtoro provisions your workspace automatically — there's nothing extra to set up. ## 2. Work through the setup guide The first time you open Formtoro, the Home page shows **Finish setting up Formtoro** — a checklist of everything between you and a live form. 1. Confirm your brand — Formtoro detects your colors and fonts from your Shopify theme; confirm or refine them. 2. Confirm your storefront domain — so previews and links point at the right store. 3. Add your legal links — your Terms of Service and Privacy Policy URLs, pre-filled from your Shopify policies. Consent copy links to these, so it's best done before you publish. 4. Create your first form — the wizard below. 5. Start your free trial (optional) — the free plan already publishes; the 14-day trial unlocks Formtoro's full power and doesn't charge until it ends. 6. Publish it to your store — save a version and turn the form on. 7. Turn Formtoro on in your theme — the one-time app embed toggle. 8. Connect your email & SMS — wire subscribers into Klaviyo. This one doesn't block going live: Formtoro captures every lead durably either way. Each step's button takes you straight to the right place. The rest of this guide walks the three that matter most: create, publish, connect. Confirm your brand The moment you install, Formtoro reads your Shopify theme and pulls in your colors and fonts, so your first form already looks like your store rather than a generic template. The setup guide asks you to confirm what it detected — nudge a color, swap a font, and you're done. This is worth a minute up front: every preview that follows (the design gallery, the color step, Luigi's draft) renders in these brand settings, so getting them right here means everything downstream looks finished from the first glance. Nothing's locked in — you can refine your palette, fonts, and full themes any time in Themes & styles. Confirm domain Formtoro needs to know which host your storefront serves from, and it matters for two reasons. First, previews and the links in the setup guide point at the right store instead of a stale URL. Second — the one that counts at launch — live forms only load when the request comes from an allowed storefront domain, which is what stops another site from loading your forms just by knowing a form ID. Your installed Shopify shop domain is always allowed and can't be removed, so if you sell from myshop.myshopify.com there's nothing to do here. If you sell from a custom domain, add it: paste anything — https://Shop.Brand.com normalizes to shop.brand.com automatically — and remember that subdomains match exactly, so www.brand.com and shop.brand.com are separate entries. Until your live host is on the list, forms load only from the Shopify preview domain and Formtoro shows a warning. You can manage the list any time under Settings → Storefront domains. Add your legal links Your consent fields link out to your Terms of Service and Privacy Policy, so shoppers can read exactly what they're agreeing to. Formtoro pre-fills both URLs from your Shopify store policies, so most of the time you're just confirming what's already there. Do this before you publish. Policy links are baked into a form the moment you save a version, so a form published without them ships with no clickable policy links — and Formtoro shows a warning banner while either URL is missing. You can edit the URLs and the consent copy any time in Settings → Legal & compliance. Start your free trial This step is optional. The free plan already lets you build, publish, and go live — you don't need to start a trial to get your first form on the storefront. We suggest the 14-day free trial so you can experience the full power of Formtoro — higher limits and the AI features that make Luigi shine. It doesn't charge until the trial ends, and billing runs entirely through Shopify, so there's no separate card to enter. Start it from the setup guide, pick a plan on Shopify's hosted page, and you land right back in Formtoro. You can change or cancel any time from Settings → Plan & usage. ## 3. Create your first form From Forms, click Create form. A short wizard walks you through the choices, previewing each one with your real brand: 1. Choose a format — name the form and pick its capture shape: **Email first, Micro-opt-in (Yes / No), or Question, then email**. Tick Collect phone numbers to add a phone step after the email step. 2. Pick a design — a gallery of form designs, each previewed in your brand palette. 3. Pick a color — swap the palette for the design you chose: built-in Light and Dark, plus your brand themes. 4. Choose a display type — Popup, Full Page, or Slide-in (Inline joins the list once you've made your first form). Whichever you pick, phones default to a Full Page takeover — see Display modes & triggers. 5. Choose a layout — where the hero image sits, if the design has one. 6. Add a discount (optional) — an existing Shopify code, or a magic discount that applies itself at checkout. 7. Let Luigi write it — Luigi drafts the headline, questions, and button copy from your store; add a short steer if you like (_"skincare quiz, friendly tone"_). Your first form's generation is free. On later forms this step is optional — Skip & use template creates the form with the design's default copy. Click Create form, watch Luigi write, and you land in the builder with a finished draft. ## 4. Make it yours Edit anything in the builder — text is edited in place, right on the canvas. Or, if you are on a paid plan, just ask our AI, Luigi: _"Add a 'How did you hear about us?' question"_ or "Make the heading match my brand." ## 5. Save it and turn it on Press Save version — Formtoro then asks whether to turn the form on. (Once a form is on, later saves update the storefront immediately, and **Turn on / Turn off** flips it live or off any time.) Two things to line up the first time: - Turn Formtoro on in your theme — popups are delivered by a theme app embed that Shopify keeps off until you enable it. Click **Activate in theme editor from the setup guide, toggle Formtoro Popups** on, and Save. - Allow your custom domain — if you sell from one, add it under Settings → Storefront domains. The Going live guide covers both in two minutes — and exactly what to check if a form doesn't appear. ## 6. Connect Klaviyo Connect Klaviyo in Settings → Integrations and every submission syncs to your lists and profiles in real time — email and phone with per-channel consent, plus each answer as a profile property. See Klaviyo for the two ways to connect. Once you're live, results appear in Analytics as shoppers respond. ## Next steps - Building forms — go deeper on steps and fields. - Going live — get your form rendering on the storefront. - Connect Klaviyo — sync subscribers as they come in. --- Source: https://formtoro.com/docs/getting-started # Going live > Save a version, turn your form on, get it rendering on your storefront, and fix the most common reason it doesn't show. Building a form is only half the job — this page covers getting it **live on your storefront** and what to check when it doesn't appear. ## Publish: save a version, turn it on Publishing is two steps in the builder's title bar: 1. Save version snapshots your draft as an immutable version (with a readiness checklist and an automatic changelog). If the form is already on, saving updates the storefront immediately; if it's off, Formtoro asks whether you want to turn it on after saving. 2. Turn on / Turn off flips the form live or off at any time, without creating a new version. A form's status badge is one of: - Draft — never turned on; only you see it in the builder. - On — live and eligible to show on the storefront (**On + Unsaved changes** means your draft has edits the live version doesn't). - Off — turned off; not shown to anyone. - Paused — limit reached — the form is on, but your plan's monthly submission limit was hit; it resumes when the limit resets or you upgrade. See Saving, versions, and going live for the full save model. Publishing makes a form eligible to show — but a few things have to line up for a shopper to actually see it. ## Turn Formtoro on in your theme (one time) Popups are delivered by a theme app embed that Shopify keeps switched off until you enable it. Until you turn it on, published popups won't appear on your storefront. 1. From the Forms list (or an open popup form), click **Activate in theme editor. Or go to Online Store → Themes → Customize → Theme settings → App embeds**. 2. Find Formtoro Popups and toggle it on. 3. Click Save in the theme editor. That's it — popup, slide-in, and full-page forms can now render. You only do this once per theme; switching themes means turning it on again in the new theme. Turning the embed off (or never turning it on) means **popups don't appear anywhere on your store**, even when a form is turned on. Inline forms use a separate block If your form's placement is Inline (embedded directly into a page, not floating), it uses the Formtoro Form app block instead of the app embed. Add it where you want the form to appear: 1. In the builder's Embed panel, copy the form ID and click **Open theme editor**. 2. In a section that accepts app blocks, Add block → Formtoro Form. 3. Paste the form ID into the block, then Save. The app embed (above) powers popup/slide-in/full-page; the app block powers inline. A form needs whichever matches its placement. ## Add a launch button (App Launcher block) Sometimes you don't want a form to appear on its own — you want the shopper to open it by clicking a button you place exactly where it makes sense. That's the Formtoro Launcher app block: a native-looking button (or your own custom style) that opens a popup or expands an inline form on click. It pairs with a form whose trigger is On click (launcher) and works even when the app embed is off. It's a fundamental piece of how Formtoro forms reach shoppers, so it has its own guide: Launch buttons — setup, popup vs. inline mode, placement advice, styling, and troubleshooting. ## Allow your storefront domain Live forms only load from domains you've allowed — this stops other sites from loading your forms just by knowing a form ID. In **Settings → Storefront domains**: - Your Shopify shop identity is recognized automatically. - Add every custom storefront host you sell from — for example www.brand.com — one per line. You can paste hostnames; https:// and paths are normalized for you. If you run your store on a custom domain and haven't added it here, forms won't load there yet. ## "I published, but my form isn't showing" — checklist This is the most common question. Work down the list: 1. Is the form On? Draft and Off forms never show, and **Paused — limit reached** means your plan's monthly submission limit was hit. Check the status badge in the builder or the Forms list. 2. Is Formtoro turned on in your theme? For popups, **Online Store → Themes → Customize → App embeds must have Formtoro Popups** toggled on. For an inline form, the Formtoro Form block must be added to a section. 3. Is it a click-to-open form? If the form's trigger is **On click (launcher)**, it's supposed to stay hidden until a shopper clicks its launcher button. Confirm the button is placed, the Form ID matches, and you're an eligible visitor. 4. Is your domain allowed? If you use a custom domain, add it under Settings → Storefront domains. 5. Does the visitor match the audience? If the form targets "new visitors on the homepage" and you're a returning visitor on a product page, it correctly won't show. Use the audience tester to confirm your rule, or temporarily widen the audience. 6. Have you already seen it? Your display frequency may have been satisfied — e.g. Once ever or Until completed won't show again on the same browser. Try a private/incognito window, which starts fresh. 7. Did you change settings but not republish? Some settings (like consent policy links) are baked in at publish time — republish the form. Quick test: open your store in a private/incognito window that matches the audience. That bypasses any "already dismissed/seen" state and is the fastest way to confirm a form is live. ## Republish after changing shared settings A few things are compiled into a form when you publish it, so changing them later requires republishing the affected forms to take effect on the storefront: - Terms of Service / Privacy Policy URLs and consent copy (see Settings → Legal & compliance). - Brand/theme changes you want reflected in an already-published form. - Custom fonts — the font files a form loads are resolved when you save a version, so a newly uploaded font (or a newly added weight) reaches the storefront on the next save. If your consent links are blank or point to the wrong place, the usual cause is a changed URL without a republish. ## Test before (and after) you publish - Preview in the builder to click through the form on each device. - The audience tester confirms who's eligible. - Test mode lets you try a saved version on your live store at a #ft-test link before shoppers can see it. - The logic simulator checks your routing rules. - The anonymous /try builder lets you experiment without affecting live forms. ## Next steps - Audience filtering — control exactly who's eligible. - Display modes & triggers — how and how often it appears. - Troubleshooting — more fixes for common snags. --- Source: https://formtoro.com/docs/going-live # How to use Formtoro > A guided tour of Formtoro — from your first form to insights, discounts, and integrations. Formtoro is an AI-native form and popup platform for Shopify. You describe what you want, the built-in assistant Luigi drafts it, and your forms go live on your storefront in a few clicks. Submissions flow to your tools (like Klaviyo), shoppers can be rewarded with discounts that auto-apply at checkout, and every answer becomes insight you can act on. This guide teaches you how to use Formtoro end to end. If you're brand new, start with Getting started — it takes you from install to your first live form in a few minutes. ## Start here - Getting started — install, follow the setup guide, and get your first form live. - Building forms — the builder, steps, and fields. - Fields reference — every element and what you can configure. - Luigi, your AI assistant — create and edit forms by chatting. ## Design & behavior - Layout & responsive design — containers, floating, mobile vs desktop. - Themes & styles — themes, tokens, and reusable style classes. - Logic engine — branch between steps based on answers. - Audience filtering — control who sees each form. - Display modes & triggers — how and how often a form appears. - Teasers — a bubble or banner that invites shoppers to open the form. ## Go live & grow - Going live — the save model, the theme app embed, and fixing "it's not showing." - Launch buttons — a theme button that opens a form on click, placed anywhere. - Discounts — magic discounts that auto-apply at checkout. - Analytics & submissions — what every dashboard tile means. - Experiments — A/B test forms to find what converts. ## Connect & administer - Integrations — sync submissions to Klaviyo and send conversions to Meta and Google Ads. - MCP server — connect Claude, ChatGPT, or your own agent to your shop. - API keys — mint scoped keys for scripts and integrations, and find the API reference. - Settings & team — store details, legal/consent, domains, team, and plan. - Troubleshooting — quick fixes for common snags. ## How Formtoro fits together A typical journey looks like this: 1. Create a form — pick a capture format (email first, a yes/no micro-opt-in, or a question then email), a design and color, and a display type (Popup, Slide-in, Full Page, or Inline). Luigi writes the copy from your store. 2. Refine it in the builder, or just ask Luigi to make changes. 3. Reward shoppers by attaching a discount that applies itself at checkout. 4. Publish — save a version, turn the form on, and it's live on your storefront. 5. Measure results in Analytics, read responses in your Submissions inbox, and A/B test variants with Experiments. If a step ever fails — an integration is down, a provider is slow — Formtoro records the work durably and retries it. Your submissions are never lost. --- Source: https://formtoro.com/docs/index # Google Ads > Upload form signups to Google Ads as offline conversions for Smart Bidding, and pull campaign spend into Formtoro analytics. If you run Google Ads, Smart Bidding only optimizes on what it can measure. Connect Google and Formtoro reports what happens after the click — every form signup as a Formtoro Lead conversion, uploaded server-side to your ad account. Your campaigns learn from actual signups, and your Google ad spend shows up inside Formtoro's analytics next to the revenue it drove. Google Ads is rolling out gradually — if the Connect button on the Google Ads card is disabled with a Coming soon badge, it hasn't reached your shop yet. ## What it does - Lead conversions — when a shopper submits a form, Formtoro uploads a conversion to your Formtoro Lead action, tied to the ad click that brought them. - Purchases come from Shopify — Formtoro doesn't upload purchase conversions. Shopify's Google & YouTube channel already reports every order to your Google Ads account, so keep its purchase tracking turned on. A second copy from Formtoro would make Google count each order twice. - Ad spend in analytics — Formtoro syncs your campaign performance nightly and shows Google spend alongside form revenue in Analytics. Everything is server-side: no extra scripts on your storefront. Conversions match through the Google click ID when one is present and through hashed identifiers otherwise — email and phone are hashed before they leave Formtoro, never sent in the clear. Every upload carries a stable transaction ID, so retries never double-count a conversion in Google. ## Connect Google Ads Go to Settings → Integrations and click Connect with Google on the Google Ads card. You authorize Formtoro with your Google account on Google's own consent screen, then you're returned to Formtoro. That's the only way to connect — there's no API key to create or paste. ## Finish setup: pick your ad account After connecting, open Configure on the card. Formtoro lists every ad account your Google login can access — including accounts managed through a manager (MCC) account — so there are no customer IDs to type. If your login sees exactly one account, it's pre-selected. Click Finish setup and Formtoro prepares the account for you: - creates a Formtoro Lead conversion action in Google Ads, or reuses it if it already exists. If you connected before purchases moved to Shopify, you may also see an older Formtoro Purchase action — it no longer receives conversions, so you can remove it or set it to secondary; - checks your account's readiness (see below); - runs a verification dry-run upload, so you see Connection verified before a single real conversion is sent. The ad account is set once. To switch to a different account, disconnect and reconnect Google Ads. ## Account readiness Two Google-side settings decide how well your conversions match, and the configure page checks both: - Customer data terms — until your Google Ads account accepts them, uploads that match by email or phone aren't measured. Accept them in Google Ads under Settings → Account settings. - Enhanced conversions for leads — turn this on in Google Ads under Goals → Conversions → Settings for the best match rates. Each unmet item shows as a warning with the exact toggle to flip, and Re-check account status refreshes the result once you've fixed it. ## Configure options The Configure page also covers: - Ad consent for EEA/UK/Swiss visitors — the consent status applied to every uploaded conversion. Without Granted, conversions from EEA, UK, and Swiss visitors can't be used for measurement — set it only if your store obtains marketing consent. - Nightly campaign sync — keeps campaign spend and performance flowing into Analytics. You can toggle it off without disconnecting. - Send test conversion — a dry run against your real configuration. Google validates the full payload but records nothing, and any problems are reported inline. ## How conversions are uploaded Uploads happen automatically and asynchronously — a Google outage never blocks a shopper's submission, and failed uploads are retried until they land. A few details worth knowing: - The lead conversion is uploaded within minutes of the submission — the shopper doesn't need to reach checkout for Google to see the signup. - Transaction IDs are deterministic, so a retried upload deduplicates inside Google instead of inflating your conversion counts. - Uploaded conversions appear in Google Ads within a few hours, dated to the original ad click. ## If access expires If Google access is revoked or expires, the card shows a warning: conversion uploads are paused until you reconnect. Click Reconnect Google Ads to run the same connect flow again — uploads resume once it completes. If you reconnect with a Google login that can't access your ad account, Formtoro warns you immediately instead of failing silently later. ## Disconnect Click Disconnect on the Google Ads card to stop uploading conversions and syncing spend. Formtoro also revokes its access with Google, and nothing already reported to Google Ads is affected. If submissions are still being processed, Formtoro asks you to wait a minute so in-flight uploads aren't abandoned. You can reconnect at any time. ## Next steps - Analytics & submissions — revenue, spend, and the funnel in one place. - Meta Ads — send the same conversions to Meta too. - Discounts — give ad traffic a reason to convert. --- Source: https://formtoro.com/docs/integrations/google-ads # Klaviyo > Sync every form submission to Klaviyo — list subscriptions, consent, and answers as profile properties — automatically and reliably. Connect Klaviyo once and every form submission flows into your account as it happens: new profiles with email and phone, list subscriptions with consent recorded correctly, and every answer written onto the profile so you can segment and build flows on what shoppers actually told you. ## Connect Klaviyo Go to Settings → Integrations and find the Klaviyo card. There are two ways to connect: - Connect with OAuth — the recommended path. Click the button and you're sent to Klaviyo to approve the connection, then straight back to Formtoro. Formtoro never sees your private key, access refreshes automatically, and you can revoke it from inside Klaviyo at any time. - Connect with a private API key — paste a Klaviyo private API key (it starts with pk_). You can create one in Klaviyo under **Account → Settings → API Keys**. The field is masked, and the key is stored encrypted. If you only see the API-key form, OAuth isn't available on your install — the API-key path syncs exactly the same data. ## Pick a default list Once connected, click Configure on the Klaviyo card and choose your default subscription list. Every submission that captures an email address subscribes the contact to this list — so pick one before your forms go live. The picker shows your lists fresh from Klaviyo, so a list you just created is always available. Individual forms can override this default — see choose a list per form below. ## Email and SMS consent Formtoro records consent the way Klaviyo (and the law) expects: - Email — subscribed on every submission that captures an email address. The consent disclaimer near your submit button is the opt-in mechanism, so keep it in place (the issues panel flags forms that are missing it). - SMS — never subscribed without explicit consent. SMS opt-in is detected automatically: when your form has a consent checkbox in SMS mode and the shopper both provides a phone number and checks the box, the contact is subscribed to SMS marketing. No checked box, no SMS subscription — ever. There's nothing to configure for this; it follows from how you build the form. See the consent field in the fields reference. ## Choose a list per form Each form can sync to its own list — a giveaway form to a giveaway list, your welcome popup to your master list. In the builder, jump to the Integrations scope (Alt+K, or open the Klaviyo card in the form settings) and pick the list for this form. The card confirms with Syncing to: and the list name. Forms without their own list fall back to the shop default, and the card shows which list is actually in effect. Changes apply to new submissions right away — you don't need to save a new version of the form. ## Map answers to profile properties The same panel shows how each field in your form maps to a Klaviyo profile property. Formtoro generates sensible defaults: - Email and phone fields map to Klaviyo's standard $email and $phone_number properties. - Every other question becomes a custom property prefixed with ft_, named after the step or the field's label — so "What's your skin type?" might land as ft_skin_type. The prefix makes Formtoro-sourced properties easy to spot in Klaviyo. You can rename any custom property before saving. Two fields can't map to the same property — Formtoro blocks the save and tells you which fields collide, so answers never silently overwrite each other. Rename the discount code property If your form hands out a discount code, the code is written to its own property — ft_discount_code by default. Already standardized on a different name across your stack? Set Discount code property in the same modal to whatever you use, and Formtoro writes the code there instead. Leave it blank to keep ft_discount_code. The setting is per form, so you can migrate one form at a time. A form field can't be mapped to the same property as the discount code — Formtoro blocks that save, because the code would otherwise overwrite the answer. Renaming only changes where future codes are written. Profiles that already have a code under the old property keep it, so a flow still reading the old name goes on working until you point it at the new one. Clear the old property in Klaviyo once you've switched your flows over. ## What lands in Klaviyo For each submission, Formtoro: - Creates or updates the profile with the email and/or phone number captured by the form. - Writes every mapped answer as a profile property, visible on the profile card and usable in segments. - Subscribes the contact to the resolved list — email always, SMS only with explicit consent. - Records the discount code the shopper received (as ft_discount_code, or whichever property you named) so your flows can send or reference it. - Tracks a "Submitted Formtoro Form" event on the profile, tagged with the form, so you can trigger Klaviyo flows the moment someone completes a form. Campaign attribution on the event The "Submitted Formtoro Form" event also carries the source Formtoro resolved for the visit — utm_source, utm_medium, utm_campaign, utm_term, and utm_content — so you can branch a flow or build a segment on what produced the signup ("everyone who joined from the spring sale"). This is the resolved source, not just the raw link parameters: - Arrived on a tagged link → the URL's own utm_* values. - Arrived from another site with no tags → a source derived from the referring site, so a Google search reads utm_source: google, utm_medium: organic, and social or referral traffic reads utm_medium: social / referral. - A true direct visit — no tagged link, no referring site — carries no UTMs at all. Worth knowing if you segment on these: utm_source being present does not mean "paid", because organic and social arrivals set it too. Segment on utm_medium, or on a specific utm_campaign, to isolate paid traffic. The source is captured when the shopper arrives and kept for 30 days as they browse, so clicking through to another page before filling in the form doesn't lose it. Clicking a new campaign link replaces it. These values live on the event, not the profile, so each submission keeps its own source instead of the newest one overwriting the last. Because they describe how the shopper reached your store, these values come from the browser and a visitor can set them by hand. Use them for reporting, targeting, and flow conditions — but don't let them be the only gate on something valuable, like a high-value gift card. ## When it syncs Syncing happens automatically after each submission — usually within seconds. It's deliberately decoupled from the form itself: if Klaviyo is briefly down or rate-limiting, the shopper's submission still succeeds and Formtoro retries the sync automatically until it lands. Retries never create duplicate profiles or double-fire your flows. ## Target Klaviyo segments A connected Klaviyo account also unlocks **audience targeting by Klaviyo segment** — show a form only to shoppers in (or not in) a segment, like a VIP list or an engaged-subscribers segment. See target Klaviyo and Shopify segments. ## If something goes wrong The Klaviyo card in Settings → Integrations is your health check: - Last synced shows the most recent successful sync, in your shop's timezone. - If a sync hits a persistent problem, an error banner appears on the card with the reason. - If Klaviyo access expires or is revoked (for example, you removed the connection inside Klaviyo), the card switches to a Reconnect with OAuth prompt. Syncing pauses until you reconnect — reconnecting resumes it. In the builder, the per-form Klaviyo card warns you when Klaviyo isn't connected or no list is selected, so you find out before launch — not after. ## Disconnect or switch how you connect Click Disconnect on the Klaviyo card to stop syncing. If submissions are still syncing when you disconnect, Formtoro warns you first so in-flight syncs aren't abandoned. Disconnecting doesn't touch anything already in Klaviyo. To switch between OAuth and an API key, disconnect and reconnect with the other method — your default list and per-form settings are re-entered on the fresh connection. ## Next steps - Audience filtering — target forms by Klaviyo segment. - Analytics & submissions — see the responses you're syncing. - Meta Ads — send form conversions to your ad platform too. --- Source: https://formtoro.com/docs/integrations/klaviyo # Meta Ads > Send form signups to Meta as server-side Lead events, and pull your ad spend into Formtoro analytics. If you run Meta ads, your ad account only optimizes on what it can see. Connect Meta and Formtoro reports what happens after the click — every form signup as a Lead event, sent server-side through Meta's Conversions API. Your campaigns learn from real signups, and your ad spend shows up inside Formtoro's analytics next to the revenue it drove. ## What it does - Lead events — when a shopper submits a form, Formtoro sends a Lead conversion to your Meta dataset (pixel), tied to the ad click that brought them. - Purchases come from Shopify — Formtoro doesn't send Purchase events. Shopify's Facebook & Instagram channel already reports every order to your pixel, so keep Purchase events turned on there. A second copy from Formtoro would make Meta count each order twice. - Ad spend in analytics — with an ad account connected, Formtoro syncs your Meta spend daily and shows it alongside form revenue in Analytics. Everything is server-side: no extra scripts on your storefront, and it works even when browser tracking is blocked. Identifiers like email and phone are hashed before they're sent, and every event carries a stable ID so retries never double-count a conversion in Meta. ## Connect Meta Go to Settings → Integrations and click Connect with Meta on the Meta card. Meta's own dialog opens: you pick the Business, the pixel, and the ad account to share, then you're returned to Formtoro. The connection uses a long-lived token, so there's nothing to renew on a schedule. ## Finish setup: pick your dataset Events are sent to one dataset (Meta's name for a pixel). After connecting, open Configure on the Meta card: - If exactly one dataset is visible, it's selected for you — nothing to do. - If you have several, pick the one your ads campaigns use. Until a dataset is selected, the card shows a Finish setup badge and no events are sent — so if the badge is showing, that's the one thing left to do. ## Configure options The Configure page also covers: - Ad account — optional. Selecting one turns on the daily ad-spend sync that powers the spend and return numbers in Analytics. You can toggle the sync off without disconnecting. - Send test events — paste a test event code from Meta's Events Manager and Formtoro tags outgoing events with it for the next 30 minutes, so you can watch them arrive in the Test Events tab. Test mode switches itself off — you can't leave it on by accident. - Limited Data Use — enable Meta's Limited Data Use flag for US privacy compliance if your legal setup calls for it. ## How events are sent Events go out automatically and asynchronously — a Meta outage never blocks a shopper's submission, and failed sends are retried until they land. A few details worth knowing: - The Lead event fires when the submission is accepted. You don't need the shopper to finish checkout for Meta to see the signup. - Event IDs are deterministic, so a retried or replayed event deduplicates inside Meta instead of inflating your conversion counts. ## If access expires If Meta access is revoked or expires — including removing Formtoro from your Meta Business settings — the card shows a warning: conversion events are paused until you reconnect. Click Reconnect Meta to run the same connect flow again; events resume once it completes. ## Disconnect Click Disconnect on the Meta card to stop sending events and syncing spend. Nothing already reported to Meta is affected. You can reconnect at any time. ## Next steps - Analytics & submissions — revenue, spend, and the funnel in one place. - Klaviyo — sync the subscribers those ads are bringing in. - Discounts — give ad traffic a reason to convert. --- Source: https://formtoro.com/docs/integrations/meta-ads # Launch buttons > The Formtoro Launcher app block — a native-looking button you place anywhere in your theme that opens a form on click. Sometimes you don't want a form to appear on its own — you want the shopper to open it by clicking a button you place exactly where it makes sense: under the Buy Buttons, in a footer, on a landing page. That's the **Formtoro Launcher** app block: a native-looking button that opens a form on click. ## How it works Every form has a trigger that decides when it opens — on a delay, on scroll, on exit intent, and so on (see Display modes & triggers). One of those triggers is On click (launcher): the form loads and arms itself but never opens by itself. It only opens when a shopper clicks a launcher button. So a launcher is always paired with a form whose trigger is set to On click (launcher) — that's its one and only entry point. The launcher loads Formtoro on its own, so a popup launcher works **even if the Formtoro Popups app embed is turned off** — you don't have to enable the embed just to use a button. ## Set it up 1. In the builder, set the form's trigger to On click (launcher), then save a version and turn the form on. Copy the form ID from the Embed panel. 2. In the theme editor (Online Store → Themes → Customize), open the page and section where you want the button. 3. Add block → Formtoro Launcher. 4. Paste the Form ID, set the Button text (e.g. _"Check my size"_), and Save. ## What the button opens The "What does this open?" setting has two modes: - A popup form (overlay) — the default. Clicking the button opens a popup, slide-in, or full-page form as an overlay, exactly as if it had triggered on its own. - An inline form (expands in place) — for a form whose placement is Inline. Clicking the button expands the form right where you placed the Formtoro Form (inline) block. Choose this mode only when that inline block is on the same page — the button opens it, so without it the button has nothing to open. ## Where to put it A launcher shines anywhere a shopper is already deciding to act. Good spots: - On the product page, just below the Buy Buttons — a "Find my size", "Get restock alert", or "Ask about this product" button right where the shopper is weighing the purchase. This is the most common and highest-intent placement. - In a section or footer as an always-available "Join the list" or "Get 10% off" button, instead of a popup that interrupts. - On a landing page as the primary call to action. You can drop the block into any section that accepts app blocks (product pages, custom sections, footers, and so on). If a theme area doesn't offer **Add block**, that section simply hasn't opted into app blocks — pick another spot. ## Match your theme, or style it - Match my theme button (default) — the button inherits your theme's own button styling (font, hover, focus), so it looks native with zero effort. - Custom — paint it yourself: background, text, and border colors, border width, corner radius, font and text size, padding, and hover colors. - Width & alignment — set a fixed width, turn on Full width, or leave the width at 0 for automatic (fits the text; never overflows on small screens); align left, center, or right. - Custom CSS class — add a class you target from your theme's Custom CSS for anything the settings don't cover. ## Only the right shoppers see it A popup launcher respects the form's audience, just like a popup. The button stays hidden until Formtoro confirms the visitor is eligible, then reveals it — so an ineligible shopper never sees a button that opens nothing. (In the theme editor it always shows, so you can place and style it.) ## If the button isn't showing or doing anything - The button is invisible on the live store — the paired form probably isn't turned On, or you don't match its audience. The button only reveals for eligible visitors. Check the form ID matches the Embed panel exactly. - The button shows but nothing opens (inline mode) — the Formtoro Form (inline) block must be on the same page; the button expands it in place. - You can't find "Add block" — that theme section doesn't accept app blocks. Try a different section, or use a custom liquid section that does. ## Next steps - Display modes & triggers — the other ways a form can appear. - Going live — the app embed, inline blocks, and the "why isn't my form showing?" checklist. - Audience filtering — control exactly who's eligible. --- Source: https://formtoro.com/docs/launcher # Layout & responsive design > Wrap elements in containers, arrange them, float them, and fine-tune how they look on mobile vs desktop. Formtoro forms look great on every screen by default — but when you want precise control, the builder gives you containers, layout controls, floating elements, and per-breakpoint overrides. ## Mobile vs. desktop The builder previews three breakpoints, selected from the toggle at the top of the canvas: - 375 — Mobile - 768 — Tablet - 1024 — Desktop The toggle changes the editing view; to click through the form on real device frames, use the interactive preview (⌘P). Mobile is the base; wider screens override Formtoro is mobile-first, as is commonly done in responsive web design. The styles you set on Mobile (375) are the base — they apply everywhere unless a wider breakpoint overrides them. When you switch Desktop and change a property, you create an override that only applies at that width and above. So the cascade is: Mobile → Tablet (≥768px) → Desktop (≥1024px), each layering on top of the last. If you only set padding on Mobile, every screen uses it. If you also set padding on Desktop, screens ≥1024px use the Desktop value and everything narrower keeps the Mobile value. Editing, indicators, and resetting - Switch to the breakpoint you want to style, then edit properties as usual. - A property that has an override at the current breakpoint shows a small indicator dot next to it, so you can tell base values from overrides. - Reset a property to clear it. On Mobile, reset removes the base value; on Tablet/Desktop, reset clears just that breakpoint's override and falls back to the inherited value. Tip: design at Mobile first, get it right, then switch to Desktop only to adjust the few things that need more room. ## Containers: group, arrange, and unlock layout By default, elements stack vertically. To place elements side by side, control spacing and alignment, or float something, wrap them in a container. How to wrap In the Layers panel (left), right-click an element and choose **Wrap in container**. Formtoro creates a container in the element's place and moves the element inside it. You can then drag other elements into the same container. Layout controls Select a container to open its layout controls: - Direction — Vertical, Horizontal, or Grid. Horizontal places children side by side; Grid lays them out in columns. - Gap — the space between children. - Distribution — how children are spaced along the main axis (start, center, between, around). - Alignment — how children align across the other axis (start, center, end, stretch). - Columns — for Grid direction, how many columns to use. Because direction is a normal style, you can make it responsive: stack elements vertically on Mobile and switch to Horizontal on Desktop, so a layout that's comfortable on a phone opens up on a wide screen. ## Floating elements A container can be set to float, which positions it freely on top of the form rather than in the normal flow. Use floating for badges, decorative images, or accents layered over your content. With Floating turned on, you also get: - Position — where the floating container sits, set with a visual placement picker. Position can vary per breakpoint, so a badge can sit top-left on mobile and top-right on desktop. - Layer order — whether the floating element sits behind, at the default level, or above other content. Floating is a container feature — wrap the element you want to float first, then enable floating on the container. ## Next steps - Themes & styles — apply consistent colors and reusable styles. - Display modes & triggers — how the form appears on the storefront. --- Source: https://formtoro.com/docs/layout-and-responsive # Logic engine > Branch between steps, recognize returning visitors, redirect, or block a submission — with rules you can test before anyone sees them. Formtoro forms don't have to be linear. Step logic lets a step react to what the shopper just submitted — send them to a different step, redirect them to a URL, close the form, or stop them with an inline error. A returning subscriber can skip straight to a thank-you screen while a new visitor gets the full flow. ## Open the logic editor Logic lives on a step — it runs when the shopper submits that step, and it's how you branch one step to another. Three ways in: - Select a step and open the Logic section in the inspector, then click Add logic (or Edit logic if rules exist). The section also shows a plain-language summary of each rule at a glance. - Click the Logic button on the step's card on the canvas — it shows a count of rules, like Logic (2). - Click any logic connection or action card on the canvas (see Logic on the canvas). All of them open the Step Logic sheet, where you build rules and click Apply to write them into your draft. As with everything in the builder, the draft autosaves; Save version snapshots it and Turn on puts it in front of shoppers — see Saving, versions, and going live. ## Anatomy of a rule Each rule reads as a sentence: when its conditions are met, then an action fires. Click Add rule to create one. To send every shopper to the same place — no conditions — click **Always go to a step instead. It creates a single Always rule (for example, Always go to Breed**); you don't need a stand-in condition like “is not empty”. A rule can hold several conditions, joined by the AND / OR pill between them — AND means every condition must be true, OR means one is enough. The setting applies to the whole rule. Add condition stacks more, and the drag handles reorder rules and conditions. ## Conditions A condition compares an input against a value. The Use selector picks what kind of input: - Field — an answer from this form. The Field dropdown lists every field, labeled with its name and step, like shopping_interest (Survey). For choice fields, the Answer value is a dropdown pre-filled with that field's actual options, so you can't mistype a value. - Visitor — whether Formtoro recognizes this shopper from a previous submission (see below). Pick an Operator to compare with: | Operator | Meaning | | equals / does not equal | exact match | | contains / does not contain | text contains the value | | is one of / is not one of | matches any value in a comma-separated list | | is empty / is not empty | the answer is blank (no value to enter) | | is greater/less than (or equal to) | numeric comparison | Visitor recognition Visitor conditions answer one question: have I seen this person before? Formtoro checks the email or phone the shopper just typed against prior submissions to any of your forms. | Source | True when… | | Visitor recognized | the email or phone matches a prior submission | | Recognized by email | the email matches a prior submission | | Recognized by phone | the phone number matches a prior submission | Classic uses: route recognized shoppers past the capture step to a "Welcome back" screen, or show an inline "You're already subscribed" error instead of re-capturing them. ## Actions The Then row sets what happens when the rule matches. The Action select offers four: | Action | What it does | | Go to step | Branch to the step you pick in Send to instead of the next one. | | Redirect to URL | Send the shopper to the Open URL you set, in the Same tab or a New tab. | | Dismiss form | Close the form. | | Show inline error | Keep the shopper on the step and show your Error message under the field you pick in Show error on field. The answer is still recorded — the shopper just doesn't advance. | Show inline error can only target a field on the current step — the dropdown only offers this step's fields, so the message always has somewhere to appear. ## Rule order and the Otherwise branch Rules run top to bottom, and the first matching rule wins — its action fires and the rest are skipped. Drag rules to change their order. Add “Otherwise” adds a card below your rules that runs its action when no rule above it matches. It's optional: without it, a shopper no rule matches follows the button they pressed. If you remove every rule above it, the card becomes Always. An Always or Otherwise card applies to every button on the step — including one set to redirect — and the card lists the buttons it covers. Buttons set to close the form are never affected. To send one button somewhere else, add a rule on Button clicked above it. An Always card can't show an inline error, since shoppers could then never leave the step. If a step has no logic at all, submitting simply follows the submit button's own behavior — normally straight to the next step (see the fields reference). ## Test your rules Click Test rules at the bottom of the Step Logic sheet to open the simulator. It shows an input for each field your rules reference — type or pick sample answers and watch the result update live: - a banner announces the outcome, e.g. Rule 1 matched → Go to "Thank You" or No rule matched — default action applies; - each rule gets a per-rule verdict: Matched, Did not match, or Otherwise (always matches). Visitor-recognition rules are flagged Requires server evaluation — they depend on your real subscriber data, so the simulator can't predict them. The simulator tests your current unsaved edits, so you can tune rules before clicking Apply. ## Logic on the canvas Your routing is drawn right on the canvas. Steps connected by logic show labeled connections — solid gray for an unconditional path, dashed amber for a conditional one. Rules that leave the flow (Redirect, Dismiss, **Show error**) appear as small action cards beside the step. Click any connection or card to jump into the logic editor with that rule highlighted. ## Renames, deletes, and the issues panel Logic references fields by name, and the builder keeps those references honest: - Renaming a field automatically rewrites every rule and error target that uses it — nothing to fix by hand. - Deleting a field removes the rules that depended on it, rather than leaving rules that silently misfire. - The issues panel flags remaining problems before they go live: a rule pointing at a field that doesn't exist, a value that doesn't fit the field's answers, or a step with no way forward. ## Logic and completion A submission counts as complete when the shopper reaches an end screen — a step with nothing left to fill in, like a thank-you or discount reveal — even if they then close the popup without clicking anything. A rule that ends the form with Redirect to URL or Dismiss form also completes it. That's what drives the completion numbers in Analytics, so routing shoppers to a proper end screen keeps your funnel honest. ## Next steps - Audience filtering — control who sees the form in the first place; logic controls where they go once they're in it. - Discounts — reward shoppers based on the path they take. - Building forms — steps, the issues panel, and going live. - Analytics — see which branches shoppers actually take. --- Source: https://formtoro.com/docs/logic # Luigi, your AI assistant > Create and edit Formtoro forms by chatting in plain language. Luigi is the AI assistant built into Formtoro. Instead of clicking through every setting, you describe what you want and Luigi does it — and instead of digging through reports, you ask a question and Luigi answers it with your real numbers. You'll meet Luigi in three places: - Creating a form — Luigi writes the first draft's copy in the create-form wizard. - In the builder — Ask Luigi (⌘J) edits the form you have open. - Everywhere else in the admin — a floating Ask Luigi button answers questions about your forms, conversion, revenue, experiments, and discounts. ## Luigi writes your first draft When you create a form, the wizard's last step is Let Luigi write it. You've already picked the structure and look — Luigi fills in the words: the headline, the questions, and the button copy, drawn from your store so it sounds like you and not like a template. There's one optional field — Anything Luigi should know? — for a short steer: "Skincare quiz for first-time buyers, friendly tone." Leave it empty and Luigi works from your store alone. You land in the builder with a complete draft you can edit freely. For your first form, this generation is free and part of onboarding. For later forms it's optional — skip it and the form is created with the template's default copy instead. ## Editing forms in the builder Open Ask Luigi from the builder — the Ask Luigi button or ⌘J (Ctrl+J on Windows). It's a chat that stays with you while you edit, so you can go back and forth as the form takes shape. Luigi sees what you've selected The chat header shows exactly what your next message will act on — **Editing: Email input, Editing step: Discount reveal, or Editing full form** when nothing is selected. Select an element on the canvas, say "make this bigger", and Luigi knows what "this" is. A context badge above the composer confirms the current target. What you can ask - "Add an email capture step with a consent checkbox." - "Add a multiple-choice question: what are you shopping for today?" - "Make the heading bigger and match my brand color." - "Add a step that reveals my welcome discount." - "Reorder the steps so email comes last." - "Restyle the whole form to feel more editorial." - "Check this form for problems before I save a version." Luigi doesn't guess in the dark. Before editing, it can read your confirmed brand (logo, colors, fonts), your themes, your existing discounts, and the questions you already ask in other forms — so a new step arrives on-brand and consistent with the rest of your setup. It also runs the same checks as the builder's issues panel, so it can flag a step with no way forward or a missing consent disclaimer before shoppers ever see it. You stay in control Luigi edits your draft, never your live form. The draft autosaves as always; nothing reaches your storefront until you Save version and turn the form on (how versions work). After every Luigi edit, a banner shows what changed — AI updated 3 elements — with a one-click Undo. Luigi's edits also join the regular history, so ⌘Z works too. ## Ask Luigi anywhere Outside the builder, a floating Ask Luigi button follows you on every admin page. This Luigi is your account manager: it answers questions, in plain language, backed by your actual data — it looks the numbers up while you watch and never changes anything. Ask things like: - "How's my conversion this week?" - "Which form drives the most revenue?" - "Where do people drop off in my welcome popup?" - "Did the version I published last Tuesday help or hurt?" - "How are my A/B experiments doing — has any reached significance?" - "What's my return on ad spend by campaign?" - "Which answers predict the highest customer value?" Luigi understands plain-language time ranges (_"last week"_, _"past 30 days"_) in your shop's timezone, and finds forms by name — "the quiz" is enough. What Luigi can look up - Funnels and drop-off — shop-wide and per form: views, starts, completions, and where people leave, step by step. - Revenue and attribution — orders and revenue attributed to your forms, broken down by form, answer, UTM campaign, device, or page. - Publish history and releases — which versions of a form went live when, and how each one performed, so you can see whether a change paid off. - Answers and audience value — response distributions, how answers correlate with each other, and customer lifetime value by form or segment. - Experiments — every A/B test's status, per-variant results, and whether the difference is statistically significant. See Experiments. - Discounts — code usage and the revenue behind each. See Discounts. - Ad spend — Meta and Google spend, cost per lead, and return on ad spend, once those integrations are connected. - Engagement patterns — performance by device, hour of day, and weekday. It's the same data behind the Analytics pages — Luigi just lets you interrogate it conversationally. The empty chat suggests starter questions matched to the page you're on, so the first move is one tap. Luigi respects team roles: a teammate only gets answers their role allows — someone without analytics access won't get revenue numbers from Luigi either. ## Give Luigi better context Luigi writes better forms when it understands your store. In **Settings → Store details, fill in your brand context** — your industry, who your customers are, and your brand voice. Every Luigi surface uses it, from the wizard's first draft to builder edits. Your visual identity comes from Branding & themes: confirm your brand there and Luigi styles new content to match automatically. ## Usage and availability Luigi's chat is being rolled out gradually — if you don't see Ask Luigi yet, it isn't enabled for your shop so far. Each conversation draws on your plan's monthly AI allowance; if it runs out mid-month, Luigi tells you directly in the chat, and you can upgrade for a larger allowance or wait for the next month. Your first form's generation during onboarding doesn't count against it. ## Connect external AI agents Beyond the in-app assistant, Formtoro exposes a secure MCP (Model Context Protocol) server, so AI clients like Claude can read your analytics and draft forms on your behalf — the same capabilities, from your own tools. Manage connections and mint scoped API keys in Settings → API and MCP connections. See MCP server for setup, and API keys for scripts and integrations that aren’t MCP clients. ## Next steps - Building forms — the manual controls behind what Luigi does. - Analytics — the dashboards behind Luigi's answers. - Settings & team — set brand context and manage roles. - MCP server — Luigi's capabilities from external AI tools. --- Source: https://formtoro.com/docs/luigi # MCP server > Connect Claude, ChatGPT, or any MCP client to your shop — setup per client, the consent screen, and managing connections. Formtoro isn't only driven from the admin, it's a fully agentic platform. Formtoro runs a hosted MCP (Model Context Protocol) server, so MCP-compatible AI clients — Claude, ChatGPT, your own agent — can work with your shop on your behalf: read your analytics, draft forms, and design branding. The client prompts you to sign in to Formtoro and approve the connection, so you stay in control. Connections are managed in Settings → API and MCP Connections, alongside API keys. The MCP server is part of the AI Insights plan. On other plans the page shows everything in a locked state with an upgrade banner — and if you ever downgrade, existing connections stay visible so you can still revoke them. ## The server URL The server speaks the streamable HTTP transport — connect to it as a remote HTTP server, not a local (stdio) one. The server URL is: ``` https://mcp.formtoro.com/mcp ``` You'll find the same URL, with a copy button, under **Settings → API and MCP Connections → Connect a new client**. ## Connect a client Claude Desktop Formtoro connects as a remote server through Claude's connectors — no config file editing needed: 1. Open Claude Desktop → Settings → Connectors. 2. Choose Add custom connector. 3. Paste the server URL and confirm. Claude then walks you through the Formtoro sign-in and consent screen. Claude Code (CLI) Run this in your terminal — the --transport http flag is required, since without it Claude Code treats the server as a local (stdio) one and the connection fails: ```bash claude mcp add --transport http formtoro https://mcp.formtoro.com/mcp ``` Then run /mcp inside Claude Code, select the MCP "formtoro", authenticate and approve the connection. ChatGPT Open ChatGPT → Settings → Connectors → Add custom MCP server, then paste the server URL. ## Signing in and granting access The first time a client connects, Formtoro asks **which shop you're connecting** — enter your .myshopify.com domain (pasting your admin URL or just the store handle works too). You then sign in through your Shopify account for that shop and land on a consent screen that names the exact client requesting access. Reading analytics is always part of a connection; everything beyond that is a checkbox you tick explicitly: - Form editing — create and edit form drafts. - Form publishing — save versions and turn forms on or off on your live storefront. - Discounts — read your discount definitions. - Branding — read your themes and confirmed brand. - Branding editing — fork and edit themes and reusable styles. - Customer lifetime value — customer-level revenue data. An unticked box is never granted, and a client can't widen its own access later — to change what a connection can do, disconnect it and connect again. These are the same permissions an API key carries; the scopes table spells out what each one covers. ## Managing connections Once approved, the connection appears under **Settings → API and MCP Connections, showing when it was created and last used. Connections are per team member** — you only see the ones you authorized — and you can Disconnect any of them at any time, which immediately revokes access. Disconnected clients move to a separate list for reference. ## Connecting more than one store Each connection is tied to exactly one shop — the one you pick during sign-in. If you run multiple stores, connect the server once per store. In Claude Code, add the server under a different name for each store, then authenticate each one to its own shop: ```bash claude mcp add --transport http formtoro-storea https://mcp.formtoro.com/mcp claude mcp add --transport http formtoro-storeb https://mcp.formtoro.com/mcp ``` Naming the entries after your stores also keeps the assistant from mixing them up — both connections expose the same tools, so the server name is what tells it which store you mean. Claude Desktop and ChatGPT identify a connector by its URL, so they hold one Formtoro connection at a time. To work with a different store there, disconnect the connector and add it again, signing in to the other shop. ## What a connected client can do A connected assistant gets the same tool surface Luigi uses in-app, so it can work with your shop end to end: - Learn your building blocks. list_node_types and list_targeting_options teach it Formtoro's form vocabulary; list_themes, get_theme, and get_shop_brand give it your brand and themes so what it builds looks like yours. - Author forms — always as drafts. create_form builds a new form from a high-level blueprint (or a full schema), get_form + update_form edit an existing one, and validate_form_schema, get_form_issues, and check_publish_readiness let it check its own work — the same issue checks the builder's issues panel runs. Drafts never go live on their own. - Publish — only if you allow it. With Form publishing approved, publish_form saves the draft as a new version (and, if asked, makes it live), and set_form_live turns a form on or off. These are the same actions as Save version and Turn on / Turn off in the builder, with the same checks, and they still respect your role. Without Form publishing, you review the draft in the builder and press Save version yourself. - Design reusable branding (with Branding editing approved): fork and update themes, create and update shared style classes. - Read discounts (list_discounts) so a form it builds can reference a real discount. - Answer analytics questions. Over thirty read tools cover funnels, step drop-off, trends, attribution, revenue by UTM, ad spend, discount performance, A/B experiment results, subscriber breakdowns, customer cohorts and lifetime value, and more. The server also ships ready-made prompts your client can surface — like author_popup, daily_executive_summary, conversion_audit, and experiment_readout — that walk the model through a full task with the right tools. ## Next steps - API keys — scoped keys for scripts, BI tools, and integrations that aren't MCP clients. - Luigi, your AI assistant — the in-app version of the same capabilities. - Settings & team — roles and permissions, which bound what you can grant. --- Source: https://formtoro.com/docs/mcp # Settings & team > Store details, legal & consent copy, storefront domains, assets, team roles, plan & usage, and support. Settings is the admin hub for everything that isn't a single form: your store's identity, legal copy, which domains can load your forms, your team, and your plan. Each row opens a focused page. What you see depends on your role — for example, Team appears for Admins and Owners, and Plan & Usage only for the Owner. ## Store details Three things live here: - Store name — your brand name, auto-populated from Shopify during install. It resolves the {{shop_name}} merge tag in form copy (for example in SMS consent language), so make sure it reads the way you'd write it to a customer. - Store context — six short fields that teach Luigi your business: Industry / Niche, Brand Voice, Target Audience, Business Goals, Product Categories, and Price Range. Luigi uses them to pick relevant questions, match your tone, and suggest strategies. They're auto-populated during onboarding — refining them is one of the highest-leverage minutes you can spend. - Timezone — the timezone used for analytics windows and submission timestamps. Defaults to your browser's local timezone until you save one. ## Branding & themes Your brand colors and form theme catalog. Covered in Branding & themes. ## Assets The image library shared across your forms and branding: upload images, search them by name, and delete ones you no longer need. You can't delete an image a form still uses — Formtoro blocks the delete and tells you, so a live form never loses its artwork. ## Legal & compliance Your policy links and the consent copy used across your forms. For honoring a visitor's cookie-consent / data-sale choices in analytics, see the per-form Customer privacy toggle. Policy URLs - Terms of Service URL — e.g. https://your-store.com/pages/terms - Privacy Policy URL — e.g. https://your-store.com/pages/privacy Your consent fields link to these so shoppers can read your policies. Formtoro nudges you with a warning banner while either is missing. Link text (for non-English stores) - Terms link text — defaults to "Terms & Conditions" - Privacy link text — defaults to "Privacy Policy" This is the clickable wording shoppers actually see. Set it once here and every consent field on every form uses it — a German store writes Nutzungsbedingungen and Datenschutzrichtlinie and never touches it again. Leave a field empty to keep the English default. Existing forms pick the new wording up the next time you save a version. If one specific form needs different wording, you can override it in that form's consent copy — see Consent copy below. Consent copy Customize the text shown in your forms' consent fields: - SMS consent text — the agreement shown with an SMS consent checkbox. - Email disclaimer text — informational text shown with email capture (no checkbox; it's a disclaimer, not an opt-in). Inside this copy you can use these placeholders, which Formtoro fills in: - {{shop_name}} — your store name (from Store details). - {{terms}} — a link to your Terms of Service URL. - {{privacy}} — a link to your Privacy Policy URL. {{terms}} and {{privacy}} use your Link text from above. To use different wording in one place only, write it inside the placeholder: ``` Weitere Informationen finden Sie in unserer {{privacy:Datenschutzrichtlinie}}. ``` The fields show Formtoro's recommended default until you change them; a **Use recommended** button appears whenever your copy differs, so you can always snap back. If your text is missing {{terms}} or {{privacy}}, Formtoro warns you — without them, shoppers see no clickable policy links. New consent fields you add in the builder automatically pick up your saved copy and links. Writing consent copy in another language Translating a consent field is two steps: 1. Set Link text above, so the clickable words are in your language. 2. Rewrite the sentence itself — either here (applies to new consent fields on every form) or on one form: select the consent text in the builder and edit the Content box in the right-hand panel. That box uses the same placeholders, so {{terms}} stays a working link while you rewrite the words around it. The Content box is read-only when the copy contains rich formatting, colored text, a hand-made link, or a merge tag other than {{shop_name}} — those can't be represented as plain text, so Formtoro won't risk destroying them. Edit that copy directly on the canvas instead. Save a new version to apply changes. Policy links and consent copy are baked into a form when a version is saved and published. After changing them, open each affected form and Save version (and turn it on if it's off) so the storefront picks up the new copy — see Republish after changing shared settings. ## Storefront domains Live forms only load when the request comes from an **allowed storefront domain** — this stops arbitrary third-party sites from loading your forms just by knowing a form ID. - Your installed Shopify shop domain is always allowed and can't be removed. - Add every custom storefront host your store serves from. Paste anything — https://Shop.Brand.com/path is normalized to shop.brand.com automatically. - Subdomains are matched exactly — add www.brand.com and shop.brand.com as separate entries. Until you add your live storefront host, forms only load from the Shopify preview domain (Formtoro shows a warning). Edits appear in a contextual save bar at the top — Save applies them to the storefront within moments. This is one half of going live; the other is the theme app embed. See Going live for the full flow and a "not showing" checklist. ## Integrations Connect the tools your submissions flow into — starting with Klaviyo. See Integrations. Configuring integrations requires the Admin or Owner role. ## API and MCP connections Mint scoped API keys and connect AI clients (Claude, ChatGPT) to your shop via the MCP server. See MCP server for client setup and API keys for minting keys and the full scope list. ## Team There are no invitations. Anyone on your Shopify staff who opens Formtoro is added to your team automatically — new members join as Editors. To control who can open the app at all, use Shopify's own staff permissions (Settings → Users in the Shopify admin). Four roles, each including everything below it: - Viewer — read-only: sees forms, analytics, submissions, and settings, but changes nothing. - Editor — creates, edits, publishes, and deletes forms; manages audiences, discounts, assets, branding; edits settings; uses Luigi. - Admin — everything an Editor can, plus configuring integrations and managing the team (change roles, deactivate, reactivate). - Owner — everything, plus Plan & Usage and billing. There is exactly one Owner — the first person who opened Formtoro on your store — and their role can't be changed or deactivated. On the Team page you'll see each member's role, Last seen date, and your seat usage (e.g. "3 of 5 seats used") — your plan sets the seat cap, and new members can't join while you're over it. Admins can change roles and Deactivate members (they lose access until reactivated); only the Owner can change or deactivate another Admin. Deactivated members stay listed so they can be reactivated later. ## Plan & usage Owner-only. Shows your current plan with live meters for everything your plan limits — forms, published forms, audiences, integrations, discounts, and **AI tokens this month** — plus a chart of this month's submissions against your quota, and your plan's features (seats, storage, data retention, AI features, priority support). Upgrade / Manage plan takes you to Shopify's hosted plan-selection page; billing itself is handled entirely by Shopify. If a payment fails or a downgrade is pending, a banner with a grace-period countdown appears here. And if Shopify's billing API is briefly unreachable, Formtoro shows your last known plan rather than blocking you. ## Support Two ways to reach us, available to every role: join the community Slack (the fastest way to reach the team and other Formtoro stores) or **email support** — we read every message. ## Next steps - Getting started — if you're still setting up. - Going live — app embed, domains, and the launch checklist. - Luigi — what your store context unlocks. --- Source: https://formtoro.com/docs/settings # Teasers > Invite shoppers to open a form with a small bubble or banner instead of showing the whole thing. A teaser is a small, clickable prompt that invites shoppers to open the form instead of showing the whole thing immediately — a gentler entry point that keeps the storefront uncluttered. All four display modes support one. A teaser is also where a closed form can go: rather than disappearing for the rest of the visit, a dismissed form can shrink back to its teaser so the shopper can reopen it later. One coherence rule: a form whose trigger is On click (launcher) can't have a teaser — the launcher is its entry point, so the Enable teaser toggle is locked while that trigger is selected. ## Set up a teaser Teasers live in the Teaser tab of the Settings sheet, opened from the builder's title bar: - Enable teaser — turn the teaser on. - Quick presets — one-click starting points: Bottom-left bubble, Top banner, or Bottom banner. - Mode — Bubble (a floating pill anchored to a corner or edge) or Banner (a full-width bar across the top or bottom of the page). - Edge — for Banner mode, Top or Bottom. - Position — for Bubble mode, one of eight anchors (Top Left, Center Left, Bottom Left, Top, Bottom, Top Right, Center Right, Bottom Right). - Initial display — Start open (the full form shows first) or Start as teaser (only the teaser shows until clicked). - Teaser text — Use first visible heading, or Custom text (e.g. _"Get 10% off"_). - Background color and Text color — inherit your theme by default; pick a value to override, and Reset to theme colors to go back. - When dismissed and Allow full close — see when a shopper dismisses the form below. ## Mobile vs. desktop The location controls have Mobile and Desktop tabs. Mode, Edge, Position, and Initial display can each be set differently per screen — for example, a top banner on mobile (where it won't clash with cart drawers) and a corner bubble on desktop. Mobile is the base; the Desktop tab writes overrides, with a Reset to mobile defaults link to clear them. ## When a shopper dismisses the form Two settings on the Teaser tab decide what the close button does: - When dismissed — Collapse to teaser shrinks the form back to its teaser so the shopper can reopen it later; Hide completely removes both form and teaser for the rest of the visit. - Allow full close — gives the teaser its own close control, so a shopper can dismiss the teaser entirely even when the form collapses to it. Two consequences worth knowing: - Closing a teaser with Allow full close is a true end state, so a form set to Until form completed stops showing after it. - An inline form that a shopper dismisses collapses to the same floating teaser popups use. To send a dismissing subscriber to an offer step instead of closing, see send dismissing subscribers to a step. ## Next steps - Display modes & triggers — how, when, and how often a form appears. - Branding — the theme colors a teaser inherits. - Launch buttons — the alternative entry point, placed in your theme. --- Source: https://formtoro.com/docs/teasers # Troubleshooting > Quick fixes for the things merchants most often get stuck on. Most snags in Formtoro come down to a handful of causes. Here are the common ones and how to fix them fast. ## My form isn't showing on the storefront The most common one. Walk the going-live checklist first — it covers the status badge (On, not Draft, Off, or **Paused — limit reached**), the theme app embed, launcher forms, allowed domains, audience, and frequency. Two causes that deserve extra depth: You already count as subscribed Until subscribed is the default frequency for new forms — and it stops showing forms to you surprisingly easily. The moment a visitor submits a step containing an email or phone on any of your forms, that browser is marked subscribed for your store for about 6 months, and every form set to Until subscribed stops appearing there. So if you tested any form with your own email last month, your own popups won't show you anything today. That's the feature working: never nag someone who already gave you their contact. The fix for testing is a private/incognito window — it starts with no subscribed, seen, or dismissed state. Closing a form's teaser or completing the form also stops re-shows, so incognito is the reliable reset for all of it. Your audience rule excludes you If the form targets "new visitors on the homepage" and you're a returning visitor on a product page, it correctly won't show. Run your exact situation through the audience tester — it tells you which rule passes or fails — or temporarily widen the audience. ## My launch button isn't showing Launcher buttons stay hidden until Formtoro confirms the visitor is eligible, so an Off form or a non-matching audience hides the button itself. The launch buttons guide walks through every cause. ## My inline form is invisible on the page An inline form that isn't eligible renders nothing — the block collapses and the surrounding content closes the gap, so there's no empty box to spot. Check, in order: 1. The Formtoro Form block is added to that page's section with the correct form ID (setup). 2. The form is On. 3. You match the form's audience — an excluded visitor (say, a recognized Klaviyo subscriber) sees the section as if the block weren't there. Frequency caps don't apply to inline forms — a merchant-placed section never vanishes because you've "already seen it" — so if it's missing, it's one of the three above. ## My discount isn't applying at checkout - For a magic discount, the reward applies automatically — confirm the form actually has it attached, check the status panel on the Discounts page shows the reward active, and run the Testing and diagnostics panel to simulate a checkout against your exact cart. - For a static code, the code auto-applies to the cart once the shopper subscribes — but the matching code must exist and be active in Shopify. The builder's issues panel flags a code that doesn't exist in Shopify or has expired. If you created the code after the builder flagged it, switch back to the builder tab or click Check again under the field to clear the warning. - If you just created or changed the discount, give Shopify a moment and re-test. ## My consent links are blank or wrong Policy links are compiled into a form when you save a version. If you set or changed your Terms of Service / Privacy Policy URLs (Settings → Legal & compliance) afterward, save a new version of the affected forms so the live copies pick up the new URLs. Also make sure your consent copy still contains the {{terms}} and {{privacy}} tokens — without them, there are no links to render. ## I changed a setting but the storefront didn't update Two different causes, two fixes: - Your form edits aren't live yet. The builder autosaves your draft, but the storefront serves the last saved version — that's why the badge reads On + Unsaved changes. Click Save version to push the draft live. See saving and versions. - You changed a shared setting (policy URLs, consent copy, a theme you want reflected in an already-live form). Those compile in at save time, so save a new version of each affected form. ## Preview looks different from the live form The builder's Preview renders your current draft with the same engine as the live widget — so if the storefront disagrees with it, the storefront is almost certainly serving an older version. Check the badge: **On + Unsaved changes means exactly that. Save version** and the two will match again. ## My custom font isn't showing Work down this list — each step rules out one cause: - Nothing found when you scan. The file must live in your Shopify admin under Content → Files, be a .woff2, .woff, .ttf or .otf, and be under 2 MB. Fonts pasted into the theme code editor or left in a .zip aren't picked up. - The family name looks wrong, or the file was skipped. The name comes from the filename, so rename the file (e.g. Brandon-Bold.woff2), re-upload it, and scan again. See naming your font files. - A banner asks you to reconnect. Your store's authorization predates the permission Formtoro needs to read store files — click Reconnect Shopify in the banner, then scan again. - It renders in the builder but not on the storefront. The published version was saved before the font existed. Save a new version. - You typed the name instead of uploading the file. A hand-typed family Formtoro doesn't know is a "custom font": the name is written into the CSS but no file is loaded, so it only works if your theme already loads that font. Upload the file and pick it from Your store's fonts instead. - Only some weights are bold/italic. Each weight and style is its own file — upload one per variant, with the weight in the filename. ## "Modified elsewhere — reload" while editing A form has one shared draft. If a teammate — or you, in another tab — edits the same form, the builder stops autosaving and shows **Modified elsewhere — reload** so nobody's work is silently overwritten. Reload the page to pick up the other changes; your unsaved edits since the divergence are lost, so if you have work you want to keep, copy it somewhere safe before reloading. Agree on who's editing, or work in one tab at a time. ## A form shows once and never again That's your display frequency working as configured. Until subscribed (the default), Until form completed, Once ever, and **Once per session** all intentionally stop re-showing — closing the teaser counts as a stop signal too. To see the form again while testing, use a private/incognito window, or set the frequency to Every visit temporarily. See how often a form shows. ## I can't find where to rename a field's "key" Field names (the keys your answers are stored under, like email or shopping_interest) are assigned automatically and aren't edited in the inspector. You can freely edit a field's visible label. See the fields reference. ## I'm looking for a control that isn't there A few options exist in the data model but aren't surfaced in the builder yet — for example min/max selections on choice questions and min/max dates on a date field. If you can't find a control, it may be a planned addition rather than a hidden setting. The fields reference lists what's configurable today. ## A dashboard number shows "—" A dash means that figure's source is briefly unavailable — store-wide numbers come from Shopify and update on a delay. Your Formtoro numbers still show. If the whole dashboard is empty, it just needs traffic. See Analytics. ## My AI client won't connect - Double-check you used the exact server URL https://mcp.formtoro.com/mcp. - For Claude Desktop, restart the app after editing the config file. - The client must prompt you to sign in to Formtoro and approve — complete that step. See MCP server. ## Still stuck? Most surprises come down to three things: the storefront serves the **last saved version (not your draft), you're testing as a visitor who's already subscribed or ineligible, or a shared setting needs a new version saved**. Re-check those — in an incognito window — before anything else. --- Source: https://formtoro.com/docs/troubleshooting