> This is part 1 of 3 of the full documentation (pages 1–100 of 226).
> The content is paginated: fetch every part to see all of it.
> Next part: https://docs.zigpoll.com/llms-full.txt/1
> Page index: https://docs.zigpoll.com/llms.txt

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
This site has an agentic ask interface you may use to query the documentation dynamically by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.zigpoll.com/index.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

---

# What is Zigpoll

Zigpoll is a survey widget that can be embedded on any website. You can use Zigpoll to easily gather feedback from your customers throughout the customer journey.

Many users start with Zigpoll's Post Purchase surveys to measure post-purchase attribution.

Many others use Zigpoll for Exit-Intent, on-site, NPS, post-fulfillment, and email surveys. All plans come with unlimited surveys, survey types, integrations, and reporting. Our free plan starts at 50 responses a month so you can test the platform first!

## What now?

#### Start by learning about our product:

{% content-ref url="/pages/iIpxdjT5xTf73ioXv498" %}
[Installation](/installation)
{% endcontent-ref %}

{% content-ref url="/pages/-LZuaccvpi\_yui07Qufh" %}
[Surveys](/polls)
{% endcontent-ref %}

{% content-ref url="/pages/Ec11kTOPoSyQG3USnE0R" %}
[Questions](/questions)
{% endcontent-ref %}

{% content-ref url="/pages/-LZpcq7xblwia2Y2Gtfn" %}
[Accounts](/accounts)
{% endcontent-ref %}

{% content-ref url="/pages/-LZv7BYaBwwvEh3faYDM" %}
[Participants](/participants)
{% endcontent-ref %}

{% content-ref url="/pages/-LZzntn1HSzaiXwIaBqe" %}
[Subscription Plans](/subscription-plans)
{% endcontent-ref %}

{% content-ref url="/pages/-LrVMaacbU4WTFf6p6i5" %}
[Language and Translations](/polls/language-settings)
{% endcontent-ref %}

{% content-ref url="/pages/YjmbuRNE1gP4XkLRiICy" %}
[Top 4 Surveys to Start With](/polls/top-4-surveys-to-start-with)
{% endcontent-ref %}

#### Learn about our most used integrations

{% content-ref url="/pages/NivQeknGw6liAfgyoSrB" %}
[Slack](/integrations/slack)
{% endcontent-ref %}

{% content-ref url="/pages/-MkcNNmSW4fcw0ll2GUS" %}
[Klaviyo](/integrations/klaviyo)
{% endcontent-ref %}

{% content-ref url="/pages/-MkcAljZVNlkwKq4JoDM" %}
[Integrations](/integrations)
{% endcontent-ref %}

#### More advanced?

Check out the links below to learn how to embed **Zigpoll** into your website or SaaS.

{% content-ref url="/pages/-LdEuwApdqoVPEmAorxM" %}
[Javascript API](/javascript-api)
{% endcontent-ref %}

{% content-ref url="/pages/-LZv4lzUKV\_jxUTOtPAr" %}
[Embed](/embed)
{% endcontent-ref %}

{% content-ref url="/pages/-LZv5HhSlUqm6srkUKqh" %}
[Participant Metadata](/embed/participant-metadata)
{% endcontent-ref %}

If you have questions about how to set up your embed code, [contact us](mailto:support@zigpoll.com).

{% hint style="info" %}
If you are signed up for a paid plan, full installation support is included.
{% endhint %}


# Installation

How to install Zigpoll and start surveying your customers

Having trouble installing? Send us a message at <support@zigpoll.com>.

#### Shopify

Install Zigpoll from the [Shopify app store](https://apps.shopify.com/zigpoll). No code is needed.

Your storefront and your checkout are separate installs on Shopify. Turning on one does nothing for the other. See [Shopify App](/shopify-app) for how they fit together.

For surveys on your storefront, switch on the Zigpoll App Embed in your theme:

{% content-ref url="/pages/PGhkx2yhRBS5lz2OY5YE" %}
[Activating Zigpoll on Shopify 2.0](/installation/activating-zigpoll-on-shopify-2.0)
{% endcontent-ref %}

For surveys on the Thank You, Order Status, checkout and customer account pages, add the Zigpoll app block in your checkout editor. For in-store surveys on your registers, use the Shopify POS templates:

{% content-ref url="/pages/UZJFw4wmRdrtb9JR0GUo" %}
[Activating Zigpoll on Shopify Checkout Extensions](/installation/activating-zigpoll-on-shopify-checkout-extensions)
{% endcontent-ref %}

{% content-ref url="/pages/R86E1BcaNbJicc3vtdaO" %}
[Activating Zigpoll on Shopify POS](/installation/activating-zigpoll-on-shopify-pos)
{% endcontent-ref %}

Shopify limits what any app can do on checkout pages, including pop-ups, fonts and styling:

{% content-ref url="/pages/XfpHLFdVpAgwmetLvk0i" %}
[Shopify Checkout Limits](/installation/shopify-checkout-limits)
{% endcontent-ref %}

#### Website builders

If you use a website builder like Framer, Wix, or Webflow, visit [Integrations](/integrations) to see specific instructions for your platform.

#### Manually embed into your site or webapp

To embed Zigpoll into your site or single-page webapp, see [Embed](/embed) for more info.

#### Survey not showing?

{% content-ref url="/pages/onmDspDrHwKj3b6fjzsZ" %}
[Why Is My Survey Not Showing?](/faq/why-is-my-survey-not-showing)
{% endcontent-ref %}


# Activating Zigpoll on Shopify 2.0

Stores using an Online Store 2.0 theme load Zigpoll through an [app embed](https://help.shopify.com/en/manual/online-store/themes/customizing-themes/apps) instead of a script tag. Switch on the Zigpoll app embed in your theme, and your storefront surveys are ready to go.

To enable the app embed on your store, follow the steps below:

1. Install the Zigpoll App via the [Shopify App Store](https://apps.shopify.com/zigpoll).
2. In your Shopify admin, go to **Online Store → Themes**.
3. Click **Customize** for your live theme.
4. Click the **App embeds** icon on the left-hand side.
5. Enable **Zigpoll**.
6. Click **Save**.

{% embed url="<https://www.zigpoll.com/img/video/theme-embed.mp4>" %}

{% hint style="warning" %}
The app embed is switched on per theme. If you publish a new theme or a copy of your theme, switch on the Zigpoll app embed in that theme too.
{% endhint %}

The app embed runs storefront surveys: pop-ups, launchers, page embeds and exit intent. It doesn't reach the Thank You, Order Status or checkout pages. Those need the Zigpoll app block, which is a separate install:

{% content-ref url="/pages/UZJFw4wmRdrtb9JR0GUo" %}
[Activating Zigpoll on Shopify Checkout Extensions](/installation/activating-zigpoll-on-shopify-checkout-extensions)
{% endcontent-ref %}

{% hint style="info" %}
Older installs loaded Zigpoll through a script tag. Shopify turns script tags off on **March 1, 2027**, so switch the app embed on even if your surveys show today. If your store still has the script tag, the **Theme app embed** card on Zigpoll's **Installation** page says so.
{% endhint %}


# Activating Zigpoll on Shopify Checkout Extensions

Add the Zigpoll app block in Shopify's checkout editor so surveys appear on the Thank You and Order Status pages

Shopify's Thank You and Order Status pages now use [Checkout Extensibility](https://help.shopify.com/en/manual/checkout-settings/checkout-extensibility). These pages don't run scripts from apps. For a Zigpoll survey to appear on them, or on customer account pages, add the **Zigpoll app block** in Shopify's checkout editor.

The app block is a separate install from the theme **App Embed**, which runs storefront surveys. A store that shows on-site surveys still needs the app block before post-purchase surveys appear. See [Shopify App](/shopify-app).

Zigpoll's Shopify delivery templates are named after the pages in the checkout editor, so you can match each survey to the page that needs the app block:

| Zigpoll delivery template    | Shopify editor page(s)                     | Plan         |
| ---------------------------- | ------------------------------------------ | ------------ |
| **Thank You & Order Status** | Thank you, Order status                    | All plans    |
| **Order Status Only**        | Order status                               | All plans    |
| **Checkout Steps**           | Information, Shipping, Payment             | Shopify Plus |
| **Customer Accounts**        | Orders, Profile (customer accounts editor) | All plans    |

## Upgrading your Thank You and Order Status pages

Shopify retired the old Thank You and Order Status pages. Shopify's deadline for merchants to upgrade was **August 26, 2026**. On upgraded stores, anything added through **Order status page additional scripts** no longer runs. That includes the older Zigpoll embed code, so a post-purchase survey that relied on it stops appearing.

Shopify's own guide covers the upgrade: [Upgrading to Checkout Extensibility](https://help.shopify.com/en/manual/checkout-settings/checkout-extensibility/checkout-upgrade).

{% hint style="warning" %}
Upgrading does not carry the Zigpoll survey over. After you upgrade, add the Zigpoll app block to the **new** Thank You page and the **new** Order Status page, using the steps below.
{% endhint %}

If your survey stopped collecting responses after a date and nothing changed in Zigpoll, check whether your store upgraded these pages around that date.

## Add the Zigpoll app block

1. Install the Zigpoll app from the [Shopify App Store](https://apps.shopify.com/zigpoll).
2. In Shopify admin, go to **Settings → Checkout → Customize**.
3. Select **Thank you** from the page dropdown at the top of the editor.
4. Click **Add app block** and select **Zigpoll**.
5. Drag the block to where you want the survey to appear. Higher on the page is seen by more buyers.
6. Click **Save**.
7. Select **Order status** from the page dropdown and repeat steps 4–6.

{% hint style="info" %}
When you create your first **Thank You & Order Status** survey, the Zigpoll dashboard shows an **Open checkout editor** button that takes you straight to this screen in your Shopify admin.
{% endhint %}

You can still manage all of your surveys from the Zigpoll dashboard. You don't need to change the block when you edit a survey or swap which survey is live.

{% embed url="<https://www.zigpoll.com/img/video/checkoutextensionsetup.mp4>" %}

## Choosing which survey the block shows

The block doesn't store a survey. Each time the page loads, Zigpoll serves the first live survey whose delivery template matches that page. A survey using **Thank You & Order Status** shows on both pages, and **Order Status Only** shows on Order status alone.

To change which survey buyers see:

1. In Zigpoll, open the survey and go to **Settings → Delivery → Format**. Choose an on-site or page embed format. Link, email and SMS formats never appear in a checkout block.
2. Open the **Locations** tab, click **Use a Template**, and pick **Thank You & Order Status** or **Order Status Only**. Click **Save Changes**.
3. Make sure the survey is **Live**. Hidden and archived surveys are never served to buyers.
4. If more than one live survey uses the same template, hide the ones you don't want showing.

### The Preview survey setting

Click the Zigpoll block in the checkout editor to see its settings. **Preview survey (optional)** changes only what you see inside the editor. Buyers always see the survey your dashboard serves.

| Preview survey value                   | What the editor shows                                                                   |
| -------------------------------------- | --------------------------------------------------------------------------------------- |
| Not set                                | Your first live survey for that page. If none is live, a Zigpoll sample survey appears. |
| **My Active Survey**                   | Your first live survey for that page. If none is live, the block is empty.              |
| A named survey, such as **NPS Survey** | Zigpoll's sample survey of that name, not one of your own.                              |

An empty editor preview with **My Active Survey** selected means no live survey matches that page. A sample survey in the editor is not a sign the block is broken.

The block's other settings adjust copy size, colors and buttons. See [Shopify Checkout Limits](/installation/shopify-checkout-limits) for what they control and why your Zigpoll Design settings don't apply here.

## Thank You page vs. Order Status page

The Thank You page appears once, right after purchase. The Order Status page stays available to your customer, from the order confirmation email or their account, long after the order.

* A response dated weeks after the order usually came from the Order Status page.
* To collect answers only at the moment of purchase, remove the Zigpoll block from the **Order status** page in the checkout editor and keep it on **Thank you**.

### Checkout Steps Surveys (Checkout Survey block)

In addition to the Thank You and Order Status pages, the **Checkout Steps** delivery template shows a survey *during* checkout itself, before the order is placed. To add it:

1. Open the checkout editor.
2. Select the **Information**, **Shipping**, or **Payment** page from the dropdown (or **Checkout** if you use the one-page layout).
3. Add the **Checkout Survey** app block.

{% hint style="warning" %}
Shopify requires a **Shopify Plus** plan to add third-party app blocks to the checkout steps. The Thank You and Order Status blocks above are available on all Shopify plans.
{% endhint %}

**Block Checkout (require the survey before continuing).** The Checkout Survey block can require buyers to complete the survey before they continue checkout. This is a **double opt-in**. It only takes effect when **Block Checkout** is enabled in *both* places:

1. In the checkout editor, on the Checkout Survey block's settings, enable **Block Checkout**.
2. In the Zigpoll dashboard, on the survey's Delivery settings, enable **Block Checkout**.

When the checkout editor setting is on, checkout stays closed while the survey loads, so buyers can't slip past during the brief loading window. If checkout appears stuck for buyers, check that both toggles are set the way you intend.

### Customer Account Surveys

The **Customer Accounts** delivery template uses the **Customer Account Survey** block for the new customer accounts experience (profile and order pages). To add it:

1. In your Shopify admin, go to **Settings → Customer accounts → Customize**.
2. Add the **Zigpoll** app block to the profile or order index page.
3. Click **Save**.

## What the checkout can't do

Shopify's checkout sandbox rules out pop-ups, custom fonts and your Zigpoll Design settings on these pages. It also rules out traffic source data and exit intent.

{% content-ref url="/pages/XfpHLFdVpAgwmetLvk0i" %}
[Shopify Checkout Limits](/installation/shopify-checkout-limits)
{% endcontent-ref %}

## Survey still not showing?

Work through the checkout section of the troubleshooting guide:

{% content-ref url="/pages/onmDspDrHwKj3b6fjzsZ" %}
[Why Is My Survey Not Showing?](/faq/why-is-my-survey-not-showing)
{% endcontent-ref %}

If you have questions about the checkout extension, or about Zigpoll in general, [get in touch](https://www.zigpoll.com/contact).

{% content-ref url="/pages/dZLFEbE2SJneGQtRgDWP" %}
[Legacy Post Purchase Installation](/tutorials/legacy-post-purchase-installation)
{% endcontent-ref %}


# Shopify Checkout Limits

What Shopify's checkout sandbox does not let any app do on the Checkout, Thank You, Order Status and customer account pages

Surveys on Shopify's Checkout, Thank You, Order Status and customer account pages run inside Shopify's checkout sandbox. Shopify only lets apps draw with its own set of interface components there, and it blocks custom scripts, custom styling and pop-ups. These limits apply to every app, not just Zigpoll.

If your survey needs something on this list, run it on your storefront instead. You can also send it by email or SMS, or share a survey link.

## No popups or modals

You can't show a popup survey on the Thank You, Order Status or checkout pages. A checkout block sits inside the page, in the spot where you placed it in Shopify's checkout editor. It cannot open as a pop-up, a slide-in or a launcher tab. It also cannot float over the page.

To get more people to answer an inline block:

* Drag the Zigpoll block higher on the page in the checkout editor, so buyers see it without scrolling.
* Offer a reward for finishing the survey. See [Reward Question](/tutorials/reward-question).

## Colors, fonts and background come from Shopify, not your Design settings

Checkout blocks ignore the survey's **Settings → Design** tab and your account's **Design Defaults**. That covers colors, fonts, custom CSS, launcher shape and position, and header images. Shopify styles the block with your store's checkout branding, which you set in Shopify's checkout editor.

This is why a survey can look one way in your Zigpoll preview and another way on the Thank You page.

You can adjust the block in two places:

* **Your checkout branding.** Colors, corner radius and typography come from Shopify admin → **Settings → Checkout → Customize**.
* **The block's own settings.** Click the Zigpoll block in the checkout editor. Each of these optional settings picks from Shopify's preset styles:
  * **Main Copy Size** and **Main Copy Color**
  * **Additional Copy Size** and **Additional Copy Color**
  * **Fine Print Size** and **Fine Print Color**
  * **Answer Apperance** (Bold or Regular)
  * **Background** (Transparent, Base or Subdued)
  * **Button Color** and **Button Type**
  * **Reward Banner Size** and **Reward Banner Color**
  * **Discount Code Appearance**

These Zigpoll settings still carry over to a checkout block:

* Your questions, answers, logic and translations.
* The **Progress Indicator** setting from **Settings → Design → On-Site**, on the Thank You and Order Status block only. The Checkout Survey and customer account blocks don't show progress.
* **Hide close button** and **Hide back button**, in the **Closing** card on the survey's **Settings → General → Behavior** sub-tab.
* Anonymous mode.

{% hint style="info" %}
The block also has a **Preview survey** setting. It only changes what you see inside the checkout editor. Buyers always see the survey your Zigpoll dashboard serves. See [Checking it works without placing a real order](/faq/why-is-my-survey-not-showing#i-want-to-check-it-works-without-placing-a-real-order).
{% endhint %}

## Custom fonts can't load

Shopify doesn't let apps load their own font files in the checkout. A block uses the typography from your checkout branding, even if you set a custom font for your storefront surveys.

## Answer rows wrap on small screens

A block fills the width Shopify gives it. Answer scales with up to five options sit in one row. Longer scales, such as a 0–10 NPS question, pack in as many buttons as fit. On a narrow phone screen they wrap onto a second row.

To keep a scale on one line, use five options or fewer. You can also move the block to a wider part of the page in the checkout editor.

## No traffic source, UTM or landing page data

Checkout blocks cannot read the address your customer arrived from. They also cannot read the storefront session. Responses collected on the Thank You and Order Status pages have no UTM parameters, referrer or landing page.

To learn how customers found you, ask them. An attribution question on the Thank You page answers this directly. See [Attribution Surveys](/tutorials/attribution-surveys).

## Surveys during checkout need Shopify Plus

The Thank You, Order Status and customer account blocks work on every Shopify plan. Shopify only lets **Shopify Plus** stores add third-party app blocks to the checkout steps themselves (Information, Shipping and Payment). This rule applies to Zigpoll's **Checkout Survey** block.

See [Checkout Steps Surveys](/installation/activating-zigpoll-on-shopify-checkout-extensions#checkout-steps-surveys-checkout-survey-block).

## No exit intent on checkout pages

Exit intent watches the mouse and scrolling on your storefront. Zigpoll can't do that inside the checkout. An exit-intent survey only runs on storefront pages, where the theme App Embed loads Zigpoll.

To ask buyers something before they finish paying, Shopify Plus stores can place the **Checkout Survey** block on a checkout step. It appears inline, not as an exit pop-up.

## Related pages

{% content-ref url="/pages/UZJFw4wmRdrtb9JR0GUo" %}
[Activating Zigpoll on Shopify Checkout Extensions](/installation/activating-zigpoll-on-shopify-checkout-extensions)
{% endcontent-ref %}

{% content-ref url="/pages/onmDspDrHwKj3b6fjzsZ" %}
[Why Is My Survey Not Showing?](/faq/why-is-my-survey-not-showing)
{% endcontent-ref %}


# Activating Zigpoll on Shopify POS

Run Zigpoll surveys on the Shopify POS register after a sale or from a smart grid tile

Zigpoll runs inside the **Shopify POS** app on iOS and Android, so you can collect feedback from in-store customers the same way you do online. Surveys are shown on the register: staff can answer on the customer's behalf, or hand the tablet to the customer to fill in themselves.

There are two POS delivery templates. Pick the one that matches how you want the survey to be triggered:

| Zigpoll delivery template | Where it appears in Shopify POS                        | Triggered by                                              |
| ------------------------- | ------------------------------------------------------ | --------------------------------------------------------- |
| **POS: After Sale**       | The post-purchase screen, right after a sale completes | A **Zigpoll Survey** button on the post-sale action menu  |
| **POS: Smart Grid Tile**  | The POS home screen                                    | A **Zigpoll** tile on your smart grid, tapped at any time |

{% hint style="warning" %}
Shopify does not let apps show anything on the **customer-facing display** (the second screen some registers point at the shopper). POS surveys are always answered on the staff tablet — either by staff, or by handing the tablet to the customer.
{% endhint %}

### Set up

Setup has three parts: create the survey in Zigpoll, switch Zigpoll on in your Shopify POS smart grid editor, then refresh your registers. It takes about five minutes and only has to be done once per store.

#### 1. Create the survey in Zigpoll

1. Install the Zigpoll app from the [Shopify App Store](https://apps.shopify.com/zigpoll) if you haven't already.
2. In the Zigpoll dashboard, create a survey (or open an existing one) and go to **Settings → Delivery**.
3. Under **Locations**, pick the template that matches how you want the survey to be triggered:
   * **POS: After Sale** — shows a button on the register's post-purchase screen after every completed sale.
   * **POS: Smart Grid Tile** — adds a tile to the register's home screen that staff can tap at any time.
4. Add your questions and set the survey **live**. A survey that isn't live never appears on the register.

{% hint style="info" %}
A survey can use only one location template, so create two surveys if you want both a post-sale survey and a tile.
{% endhint %}

#### 2. Switch Zigpoll on in Shopify POS

Both templates are activated from the same screen in your Shopify admin:

1. In Shopify admin, go to **Sales channels → Point of Sale**.
2. Open the **smart grid editor** and choose the smart grid template your registers use (if you have several locations with different layouts, repeat these steps for each template).
3. Click the **Apps** icon in the editor's toolbar to open the **Apps for Point of Sale** panel. Find **Zigpoll survey** under *Zigpoll Customer Surveys* and click it.

Then, depending on the template you chose in Zigpoll:

* **After Sale** — in the Zigpoll survey panel, turn on **Activate on → Post-purchase**.
* **Smart Grid Tile** — on the grid preview, click **Add tile → Add app**, choose **Zigpoll survey**, and drag the tile where you want it. You can rename the tile and pick a color in the tile's panel.

Press **Save** in the top right. Changes are pushed to every register that uses this template.

#### 3. Refresh your registers

1. Make sure the **Shopify POS app** on each register is up to date (App Store / Play Store).
2. **Sign out of POS and sign back in**, or pull down to refresh the home screen. Registers load app changes when they sync, so a register that stays signed in can keep showing the old layout for a while.

#### Test it

* **After Sale**: add any product to the cart, tap **Checkout**, and complete the sale (cash is fine). On the post-purchase screen, tap **Zigpoll survey** — the survey opens in a full-screen modal. Answer it, and the response appears in your Zigpoll dashboard under *Responses* within a few seconds, tagged with the POS order name and location.
* **Smart Grid Tile**: tap the **Zigpoll** tile on the home screen. Each tap starts a fresh survey, so the same register can be handed to customer after customer.

The survey closes itself when the last question is answered; the **×** in the modal's header closes it early.

{% hint style="info" %}
If a survey is set to show once per customer, the After Sale button still appears for a returning customer but opens with a "no survey to show" message.
{% endhint %}

### What Zigpoll records

Each POS response is tagged with the sale it came from and where it was taken, so you can segment in-store feedback:

* **Location** — the POS location's name and id (for example `Toronto Store`), so you can compare stores
* **Staff member** — the id of the staff member pinned into the register
* **Order name** — the POS order the survey followed, on After Sale surveys
* **Customer** — when the sale had a customer attached, the response is linked to their Shopify customer record like any other Shopify survey

### Permissions

Reading a location's name needs one Shopify permission that Zigpoll didn't previously ask for: **Read locations** (`read_locations`). It is used for nothing else.

* **New installs** grant it as part of the normal install screen.
* **Stores that installed Zigpoll before August 2026** are shown Shopify's approval screen for the new permission the next time the app reconnects to the store (for example when you open Zigpoll from your Shopify admin after a token renewal). Until it's approved, POS surveys still work and still record the location **id** — only the name is missing.

See [Shopify Permissions](/faq/shopify-permissions) for what every permission Zigpoll requests is used for.

### Question types on POS

Every question type works on POS except **File Upload**, which is hidden from the question picker on POS surveys because the register has no file picker. A few types look slightly different on the register to fit the POS interface:

* **Dropdown**, **Country** and **Autocomplete** show as a searchable list instead of a native dropdown
* **Consent** shows as a toggle
* **Promo Code** shows the code as text with a QR code the customer can scan, since there is no clipboard on the register
* **Actions** show each link as a QR code for the customer to scan with their own phone

### Common questions

**The button or tile isn't showing.** Work through these in order:

| Check                                                                                                                                                                     | Where                                                                      |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- |
| The survey is **live** and uses **POS: After Sale** or **POS: Smart Grid Tile**                                                                                           | Zigpoll dashboard → the survey → Settings → Delivery                       |
| Zigpoll is activated on the smart grid template the register uses (**Post-purchase** toggle for After Sale, the tile added for Smart Grid) and the template was **saved** | Shopify admin → Point of Sale → smart grid editor → Apps for Point of Sale |
| The register is on that template and at the location you expect                                                                                                           | Shopify admin → Point of Sale → Smart grid → template → Locations          |
| The POS app is up to date and has been **signed out and back in** since you saved                                                                                         | The register                                                               |

**The survey opens but says "No survey to show".** The register reached Zigpoll but no live survey matched: check the template on the survey, and whether it's limited to once per customer.

**Can customers answer on their own phone instead?** Yes — use an **Actions** or **Promo Code** question to show a QR code, or share the survey by [link](/survey-links) or QR code on the receipt.

**Can I send the survey by email or SMS after an in-store sale?** Yes. The [Email](/email-zigpoll-surveys) and [SMS](/tutorials/sms-surveys) delivery formats trigger on Shopify order events, and POS orders fire those events too.

If you have any feedback or questions about **Zigpoll on POS**, don't hesitate to [get in touch](https://www.zigpoll.com/contact).


# iOS SDK

Show Zigpoll surveys inside your iOS app. The SDK presents surveys in a native bottom sheet — you decide exactly when a survey appears by triggering it from code.

{% hint style="info" %}
Prefer to start from working code? Clone the ready-to-run [example app](https://github.com/zigpoll/zigpoll-ios-example). SDK source: [zigpoll-ios](https://github.com/zigpoll/zigpoll-ios).
{% endhint %}

## Requirements

* iOS 15 or later
* Swift 5.7 or later

## Installation

### Swift Package Manager

In Xcode, go to **File → Add Package Dependencies** and enter:

```
https://github.com/zigpoll/zigpoll-ios
```

### CocoaPods

Add to your Podfile and run `pod install`:

```ruby
pod 'Zigpoll'
```

## Set up your survey

1. In the Zigpoll dashboard, create a survey.
2. Set the survey's delivery type to **API** (Delivery Settings → API). This tells Zigpoll the survey only appears when your app requests it.
3. Copy the survey ID from the survey's install section.

{% hint style="info" %}
Leave the survey's response setting on the default (once per participant). URL-dependent response settings are a web concept and are not supported on mobile.
{% endhint %}

## Configure the SDK

Call `configure` once, early in your app's lifecycle (e.g. in your `App` init or `AppDelegate`):

```swift
import Zigpoll

Zigpoll.configure(accountId: "YOUR_ACCOUNT_ID")
```

Your account ID is shown in the dashboard under **Installation**.

## Identify the user (recommended)

```swift
Zigpoll.identify(id: "user_123", metadata: [
    "email": "jane@example.com",
    "name": "Jane"
])
```

Identified users keep their survey state across sessions and devices — a completed survey stays completed if you trigger it again. Without `identify`, an anonymous device-persistent ID is used instead.

Call `Zigpoll.logout()` when the user signs out.

## Trigger a survey

```swift
Zigpoll.trigger(pollId: "SURVEY_ID", from: viewController)
```

The survey questions up in a native bottom sheet. The `from:` parameter is optional — by default the top-most view controller presents the sheet, which works well in SwiftUI apps:

```swift
Button("Give feedback") {
    Zigpoll.trigger(pollId: "SURVEY_ID")
}
```

Responses are recorded question by question, so partial responses are captured even if the user dismisses the sheet mid-survey.

## Metadata

Attach metadata to responses for segmentation, targeting, and personalization:

```swift
Zigpoll.setMetadata(["plan": "pro", "cohort": "2026-Q3"])
```

The SDK automatically includes `source=mobile-sdk`, `platform=ios`, the SDK version, and your app version, so you can filter mobile responses in the dashboard.

## Callbacks

```swift
Zigpoll.onLoad     = { print("survey visible") }
Zigpoll.onComplete = { responses in print("completed", responses) }
Zigpoll.onClose    = { responses in print("closed", responses) }
Zigpoll.onError    = { error in print("error", error) }
```

`onComplete` fires once when the respondent finishes the survey. `onClose` fires whenever the sheet is dismissed, with any responses collected so far.

## Development builds

```swift
Zigpoll.configure(accountId: "YOUR_ACCOUNT_ID", preview: true)
```

With `preview: true`, surveys open and behave normally but responses are not billed or counted in your analytics. Use this in debug/QA builds.

## Notes

* Call all SDK methods on the main thread.
* The SDK has zero third-party dependencies and only presents UI when you trigger a survey — there is no background activity.


# Android SDK

Show Zigpoll surveys inside your Android app. The SDK presents surveys in a native bottom sheet — you decide exactly when a survey appears by triggering it from code.

{% hint style="info" %}
Prefer to start from working code? Clone the ready-to-run [example app](https://github.com/zigpoll/zigpoll-android-example). SDK source: [zigpoll-android](https://github.com/zigpoll/zigpoll-android).
{% endhint %}

## Requirements

* Android 7.0 (API 24) or later
* Kotlin or Java

## Installation

The SDK is distributed via JitPack. Add the repository in `settings.gradle`:

```groovy
dependencyResolutionManagement {
    repositories {
        maven { url 'https://jitpack.io' }
    }
}
```

Then add the dependency in your module's `build.gradle`:

```groovy
dependencies {
    implementation 'com.github.zigpoll:zigpoll-android:master-SNAPSHOT'
}
```

## Set up your survey

1. In the Zigpoll dashboard, create a survey.
2. Set the survey's delivery type to **API** (Delivery Settings → API).
3. Copy the survey ID from the survey's install section.

## Configure the SDK

In your `Application` subclass:

```kotlin
import com.zigpoll.Zigpoll

Zigpoll.configure(context, "YOUR_ACCOUNT_ID")
```

## Identify the user (recommended)

```kotlin
Zigpoll.identify("user_123", mapOf(
    "email" to "jane@example.com",
    "name" to "Jane"
))
```

Call `Zigpoll.logout()` when the user signs out.

## Trigger a survey

```kotlin
Zigpoll.trigger("SURVEY_ID", activity)
```

The survey appears in a bottom sheet. Responses are recorded question by question, so partial responses are captured even if the user dismisses the sheet mid-survey.

## Metadata

```kotlin
Zigpoll.setMetadata(mapOf("plan" to "pro"))
```

The SDK automatically includes `source=mobile-sdk`, `platform=android`, the SDK version, and your app version.

## Callbacks

```kotlin
Zigpoll.onComplete = { responses -> }
Zigpoll.onClose = { responses -> }
Zigpoll.onError = { error -> }
```

## Development builds

```kotlin
Zigpoll.configure(context, "YOUR_ACCOUNT_ID", preview = true)
```

With `preview = true`, surveys open and behave normally but responses are not billed or counted in your analytics.


# Accounts

Not sure you understand how accounts work? Don't worry, you're in the right place. Everything you need to know can be found here.

### What is an account?

An account represents your business on Zigpoll. It contains:

* One or more logins (called **your team**). Your team can make changes to your account like adding surveys or editing styles.
* Account Settings. This includes the default design of all your surveys and your [general settings](/accounts/general-settings).
* One or more [Surveys](/polls) that will end up on your website, in emails, or behind a survey link.

### **Can I have multiple accounts?**

Yes. To create a new account, click **Profile** at the bottom of the sidebar, open **Accounts**, and click **New Account**. Give the account a title and click **Create Account**. Usually people only need one account, but if you have more than one business or web property you may want more than one.

A Shopify store's login can only have one account. To add another store, install the Zigpoll app on that store. See [Managing Multiple Accounts](/accounts/multiple-accounts).

If you run more than one account, you can copy a survey from one to another instead of rebuilding it. See [Migrate a Survey to Another Account](/polls/migrate-survey).

### Can I have multiple users under one account?

Yes. Click **Profile**, open **Accounts**, then open the **Team** tab for the account and click **Add Team Member**.

{% hint style="info" %}
The account owner and any Admin or Billing Admin can add members. Each member is assigned a role (Admin, Editor, Read only, or Billing Admin) — see [Adding Team Members](/tutorials/adding-team-members). Only the account owner can remove members or change roles. If you would like to change the account owner for a particular account, please [contact support](mailto:support@zigpoll.com).
{% endhint %}

### Why did installing the Shopify app create a second account?

Installing Zigpoll on a Shopify store always creates a new account for that store, with its own login. The install doesn't look for an existing Zigpoll login, even one with the same email address. So if you signed up at app.zigpoll.com first and then installed the app, you have two accounts: the one you created and the store's.

To see both from one login, open the store's account from Shopify admin → **Apps → Zigpoll**, then invite your email login from its **Team** tab. Both accounts then appear in the account dropdown at the top left. See [Managing Multiple Accounts](/accounts/multiple-accounts).

Surveys and responses stay in the account that collected them. If you need two accounts linked or merged, for example to move a paid plan onto the store's account, contact <support@zigpoll.com>.

### What happens to my surveys if I uninstall the app or delete my account?

**Uninstalling the Shopify app deletes the store's Zigpoll account.**

* Its surveys stop showing straight away, and every team member loses access.
* Billing ends: Shopify cancels the app charge, and any card subscription on the account is cancelled.
* Reinstalling the app later creates a **new, empty account**. Your old surveys and responses don't come back with it.

If you only want to stop paying, move to the free **Lite** plan instead of uninstalling. Your surveys and data stay put. See [How do I cancel or downgrade to the free plan?](/faq/billing-accounts-and-plans#how-do-i-cancel-or-downgrade-to-the-free-plan)

**Deleting an account** works the same way for accounts created at app.zigpoll.com. The account owner can do it:

1. Go to **Profile → Accounts** and open the **Plan** tab.
2. At the bottom, next to **Need to delete this account?**, click **Click Here**.
3. Click **Delete**, then confirm.

Shopify-installed accounts don't have this option; they're removed by uninstalling the app. **Profile** also has a **Need to delete your profile and all your accounts?** option, which removes your login and every account you own.

{% hint style="warning" %}
Before you uninstall or delete, export anything you want to keep. See [Exporting Data to CSV](/tutorials/exporting-data-to-csv). Treat deletion as permanent. If you deleted an account or uninstalled by mistake, contact <support@zigpoll.com> as soon as possible and include the store or account name.
{% endhint %}


# General Settings

Learn about all the general settings here

Open your account's **Settings → General** to find the settings below. Domain restrictions live under **Settings → Visibility** and notification recipients under **Settings → Notifications**; both are covered at the end of this page.

#### Account title

This is the name of the account. Pick something easy to remember, since you may end up with more than one. For instance, if your survey runs on <https://www.mycompany.com>, "My Company" or "mycompany" is a good choice.

#### Preferred language

Sets the language Zigpoll's AI features use when writing analysis back to you. It defaults to **English** and you can switch it to any language from the dropdown.

This applies to AI features that read and summarize your data, including:

* **Z-GPT Insights** — the weekly AI summaries of Write-Ins
* **Z-GPT Chat** — the conversational AI you can use to ask questions about your data
* **AI-generated action items** on the dashboard

If customers answer in another language, the AI still reads their answers accurately. Your preferred language only controls the language of the AI's reply, not the language of your data.

This setting does **not** affect AI-generated survey content (surveys, questions, or audience profiles built with AI). That content stays neutral so you can tailor it to each survey's audience independently.

#### Account ID

This is your Account ID. Click it to copy it. You may need it for our WordPress plugin, or for custom code that uses our JavaScript API.

#### **Domain restrictions**

Domain restrictions control which websites your surveys can appear on. Find them under **Settings → Visibility**. You also see this choice when you create an account. If you're not sure, it's safe to allow all domains.

If you choose **Allow Zigpoll to be used on all domains**, your surveys can be embedded anywhere on the web, even on sites you don't own. This is rarely a problem, since few people would want your survey on their website. To lock it down, enter your domain name.

If you enter your domain name, you choose between:

* Include Subdomains
* Match Exactly

**Include Subdomains** covers every subdomain of your domain. For example, if your website is **mystore.com**, this includes **www**.mystore.com, \*\*cdn.\*\*mystore.com, and any other subdomain.

If you want your survey to show up on one specific subdomain only (say **blog**.mystore.com), choose the **Match Exactly** option and enter **blog.mystore.com**.

{% hint style="info" %}
If a survey doesn't appear and your browser console shows `[Zigpoll] Invalid domain name detected. Please check your account settings.`, the page's domain isn't on this list. Add the domain, or allow all domains.
{% endhint %}

#### Notification recipients

Find this under **Settings → Notifications**. By default all notifications are sent to the account owner. Add one or more email addresses to **Notification recipients** to send your survey notifications to that list instead. See [Notifications](/notifications) for everything else on that tab.


# Design Defaults

Learn how to make your survey as beautiful as your website.

Design Defaults set how all of your surveys look. Open your account's **Settings → Design Defaults** and choose a tab: **On-Site**, **Survey Page**, **Email**, or **SMS**.

{% hint style="info" %}
These settings apply to all of your surveys. To give one survey its own design, open that survey, go to **Settings → Design**, pick the same tab, and turn on **Override Design Settings**.
{% endhint %}

Click below to learn more about each individual design setting.

{% content-ref url="/pages/-LZuh9ZipIrR3dhmF3EF" %}
[Design and styling](/polls/display-settings)
{% endcontent-ref %}


# Embed Code

Copy and paste to get the party started.

### **Is the embed code required?**

Yes. The embed code is necessary in order to show a Zigpoll on your website.

### **Does the embed code need to be on every page?**

The embed code needs to be on any page where you want to show a Zigpoll. If you don't want a survey on the page, you do not need to include the embed code on that page.

### **Where should I place the embed code?**

You should place the embed code in between the **\<head>** tag at the top of your website. You can also include it before the closing **\<body>** tag if you prefer.

### **Is there a technical breakdown of the embed code?**

Yes. Check out this link:

{% content-ref url="/pages/-LZv4lzUKV\_jxUTOtPAr" %}
[Embed](/embed)
{% endcontent-ref %}


# Surveys

View and reorder your active surveys.

Click **Surveys** in the sidebar to see every [survey](/polls) in your account, listed under **Your Surveys**. Here you can:

* See exactly which surveys you have running at any given time.
* Drag & Drop to reorder your surveys.
* Filter the list with the gear icon: **Visible**, **Hidden** and **Archived** surveys are all shown by default. Untick **Archived** to hide archived surveys.

Each survey is a card:

* **Under the title**, one line says how the survey is delivered: *On-site Delivery*, *Link Delivery* or *Every Page*. Email and SMS surveys say when they send, such as *Email 2 days after an order is paid*.
* **After the delivery**, the card lists any rules that narrow it: the pages it shows on or stays off, a sample percentage, and each audience rule. A survey on the defaults shows only its delivery.
* **Below that line**, any [action logic](/polls/behavior-settings) the survey runs.
* **The footer** shows the counts: questions, views, answers and languages.

## Survey order: the first match wins

As the list itself says: **"Surveys at the top will take priority over the ones below."**

When a visitor or order could match more than one live survey, Zigpoll checks your surveys **top-down** in this list and shows the **first one** whose rules all pass: its [page rules](/polls/visibility-settings#locations), its [targeting settings](/polls/targeting-settings), and its Shopify customer rules. A survey whose rules don't match is skipped, and Zigpoll moves on to the next one.

Use this to layer surveys:

* **Specific above general.** Put a survey for one product, or for **Returning Customers**, above an **All Customers** or **Every Page** survey. If the general survey is on top, it always wins and the specific one never shows.
* **A catch-all at the bottom.** A survey with no targeting at the bottom picks up everyone the surveys above it didn't match.
* **A/B tests.** A survey at 50% above a survey at 100% splits traffic between them. See [A/B Testing Surveys](/tutorials/a-b-testing-surveys).

{% hint style="info" %}
The order of your surveys decides which [display rules](/polls/display-rules) take precedence.
{% endhint %}


# Join Existing Account

To join an existing account, you need an invite from the **account owner, an Admin, or a Billing Admin**. Invite emails expire after 7 days. If yours has expired, ask for a new one. If you don't know who manages the account, [email us](mailto:support@zigpoll.com) and we will get you set up.

Open the link in the invite email to accept it. Signing up separately won't connect you to the account. If the invite opened an empty account or the wrong one, see [Adding Team Members → Troubleshooting](/tutorials/adding-team-members#troubleshooting).


# Google Sign-In

Sign up or log in to Zigpoll with your Google account

You can create a Zigpoll account and log in with your Google account instead of an email address and password. Google sign-in is available on every plan.

### Signing up or logging in

1. Go to [app.zigpoll.com](https://app.zigpoll.com/log-in).
2. Click the **Google** button below the login form.
3. Choose the Google account you want to use.

That's it. The same button works for both signing up and logging in: if you don't have a Zigpoll account yet, one is created for you using your Google email and name, and if you already have one, you are logged straight in.

{% hint style="info" %}
Google sign-in uses a pop-up. If nothing happens when you click the button, check that a content blocker or strict browser privacy setting isn't blocking it, or try another browser.
{% endhint %}

### Team invites

If a teammate has [invited you](/accounts/join-existing-account) to their Zigpoll account, sign in with the Google account that uses the invited email address. Because Google has already verified that address, the invite is connected automatically and you will land in the shared account.

### "You already have an account with this email"

This message means an email-and-password account already exists for the address on your Google account. Log in with your email and password instead. If you have forgotten the password, use the **Forgot password** link on the login page to reset it.

### Shopify stores

If you installed Zigpoll from the Shopify App Store, log in through your Shopify admin rather than with Google. See [Shopify App → Log In](/shopify-app/log-in).

### Security

Zigpoll never sees or stores your Google password. Google sign-in only shares your name, email address, and a Google account ID with Zigpoll so we can recognise you next time. You can revoke Zigpoll's access at any time from your [Google account permissions](https://myaccount.google.com/permissions).


# Managing Multiple Accounts

Learn how to work with more than one Zigpoll account from a single login.

A single Zigpoll login can be a member of any number of accounts. Every account you belong to shows up in the account dropdown on the top left of your dashboard, so you can switch between them with one click.

{% hint style="info" %}
Your browser can only be signed in to one Zigpoll login at a time. Instead of juggling a separate login for each account, connect all of your accounts to one login using the steps below.
{% endhint %}

## Shopify Stores & Collaborators

Each Shopify store install creates its own Zigpoll account with its own login. That login is tied to the store, not to an email address, so it can't be invited into another account. Instead, pick one email address to be your "home" login and invite it into every store's account:

1. Install the [Zigpoll Shopify App](https://apps.shopify.com/zigpoll) on each of your stores.
2. Open the first store's account from Shopify admin → **Apps → Zigpoll**.
3. Click **Profile**, open **Accounts**, then open the **Team** tab.
4. Click **Add Team Member**, enter the email address you want to use, choose a role, and click **Add**.
5. Accept the invite from your inbox. Sign up through the link in the email with that address, using a password or **Sign up with Google**.
6. Repeat steps 2–4 from each other store's account. Once the email login exists, it's usually added right away, with no invite to accept. If you signed up with Google, you get an invite email instead. Log in with Google again to pick it up.

Now log in at app.zigpoll.com with that email login. Every store appears in the account dropdown on the top left, so you can switch between them without logging in and out.

The same steps work for agencies and collaborators: invite each person's email to the accounts they need. See [Adding Team Members](/tutorials/adding-team-members) for roles and troubleshooting.

{% hint style="info" %}
Each store keeps its own plan. A Billing Admin using an email login can change a Shopify store's plan, but Shopify asks for approval of each charge in that store's admin.
{% endhint %}

## Non-Shopify Accounts

If your accounts are not tied to Shopify stores, you don't need a second login at all. One login can own as many accounts as you like:

1. Click **Profile** at the bottom of the sidebar and open **Accounts**.
2. Click **New Account**.
3. Give the account a title and click **Create Account**. Use the account dropdown on the top left to switch between your accounts.

A Shopify store's login can't create extra accounts this way. Install the app on the other store instead.


# Surveys

Not sure you understand surveys? Don't worry, you're in the right place.

### What is a survey in Zigpoll?

A survey represents the popup or embedded form you will see on the page. You can have unlimited surveys with all [Zigpoll plans](/subscription-plans).

Each survey contains a collection of [Questions](/questions) in some order. A question can be variety of things like a question, a statement, or an email capture form. You can learn more about Questions here:

{% content-ref url="/pages/Ec11kTOPoSyQG3USnE0R" %}
[Questions](/questions)
{% endcontent-ref %}

### Creating a survey

Click **New Survey** and Zigpoll walks you through choosing the questions, the delivery, how the survey behaves, and its name.

{% content-ref url="/pages/frgTFx4wSupqMVPjFK8m" %}
[Creating a Survey](/polls/creating-a-survey)
{% endcontent-ref %}

### The survey types that Zigpoll supports

While most customers install Zigpoll for post purchase, Zigpoll supports a wide variety of survey types including:

* Post Purchase in Shopify
* NPS and CSAT
* Homepage Popups
* Exit Intent
* Abandoned Cart
* On-site / On-page
* Contact Us
* Post-fulfillment

### Where you can display a survey to your customers

* Shopify post purchase
* On-site
* Via email
* Via SMS - sent as a link
* Within your SaaS via our [API](/web-api)

### Customizing the appearance of your surveys

You have the ability to modify fonts, colors, borders, and placement of your surveys. You can learn more about that here:

{% content-ref url="/pages/-LZuh9ZipIrR3dhmF3EF" %}
[Design and styling](/polls/display-settings)
{% endcontent-ref %}

### Making sure your survey is visible

By default all surveys are hidden. This is done intentionally so that you can preview the survey before showing it to your customers.

When you switch a survey to be visible it will become public for all to see. You can [preview](/polls/poll-preview) your survey while it is invisible to make sure it works the way you want before going live.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-722ea033e93b4160e1aa9470898399193db2ce3a%2Fsurvey-live-switch.png?alt=media" alt="The Live switch in the survey header" width="580"><figcaption></figcaption></figure>

{% hint style="info" %}
All surveys are **hidden** by default. If you are ready for it to be public, please switch it to **visible**.
{% endhint %}

### Reusing a survey in another account

Built a survey you want to reuse? You can copy it into a different Zigpoll account by exporting it to a file and importing it on the destination account.

{% content-ref url="/pages/LfKDOSPFfQHcHHCFXE37" %}
[Migrate a Survey to Another Account](/polls/migrate-survey)
{% endcontent-ref %}


# Creating a Survey

The four steps between "New Survey" and a survey you can preview

From **Surveys**, click **New Survey**. Zigpoll walks you through four steps, with a live preview of the survey beside them the whole way. Each finished step collapses into a one-line summary you can click to go back and change.

The **New Survey** button is also a menu, so you can jump straight to the part of step 1 you want — *Start from Scratch*, *Start with a Template*, *Generate with AI* — or **Import from JSON** to bring in a survey exported from another account (see [Migrate a Survey to Another Account](/polls/migrate-survey)).

***

## Step 1 — What questions do you want to ask?

Three cards choose how you start:

|                        |                                                                                                                   |
| ---------------------- | ----------------------------------------------------------------------------------------------------------------- |
| **Use a Template**     | Start with a pre-built survey from our library.                                                                   |
| **Start from Scratch** | Write your own questions, one question at a time.                                                                 |
| **Use a Prompt**       | Describe your goal and AI writes the survey. See [Creating Surveys with AI](/tutorials/creating-surveys-with-ai). |

### The template gallery

Picking **Use a Template** opens the gallery underneath. Every template is a card, and the picture on it is drawn from the template's own questions: one row per question, marked by what it asks for — a set of choices, a text box, a rating scale, or a paragraph for a screen that just says something. A short survey draws a short sheet; a long one runs off the bottom of the page. Under the title, each card says how many questions it asks and where we'd suggest delivering it, for example *5 questions · Thank You & Order Status*.

Click **Learn more** on any card to read the full question list before you commit to it.

Templates are grouped into categories, and the heading of the category you are looking at sticks under the search bar as you scroll:

* **Recommended for you** — a shortlist picked for your account, at the top
* **AI Generated** — surveys you have generated from a prompt, so you can reuse them
* **Post Purchase** — Simple, Returning Customers, General, Checkout Satisfaction, Delivery Process, Returns Process
* **Attribution & Discovery** — Attribution, In-Depth Attribution, Customer Segmentation, Competitor Comparison, Word of Mouth, New Visitor
* **Customer Satisfaction** — NPS, Customer Experience, Overall Satisfaction, Product Market Fit, CSAT, CES
* **Exit Intent & Abandoned Cart** — Pre-Purchase Exit, Abandoned Checkout, Exit Intent, Abandoned Purchase, Exit Probe, Reduce Abandonment
* **Feedback & Optimization** — Conversion Rate, Site Feedback, Feature Feedback, Product Descriptions, Site Navigation, Search Experience
* **Engagement** — Contact Us, Giveaway, Reward Email Capture, Customer Goals, Sign-Up Blockers, Improve Sign Up
* **Software (SaaS)** — Product-Market Fit, Onboarding, Upgrade, Downgrade, Cancellation, Feature Requests

Use the search box to filter by name, or **Filter Categories** to hide the groups you don't need. Categories show everything they hold — nothing is tucked away behind a "show more".

{% hint style="info" %}
A template is a starting point, not a commitment. Once the survey is created you can edit, reorder, add and delete questions freely — see [Questions](/polls/question-settings).
{% endhint %}

***

## Step 2 — How do you want to deliver your survey?

The same card treatment picks where and how the survey goes out. **Recommended** sits at the top with the placements that suit the questions you just chose, and the best one is already selected — so if the defaults are right you can simply carry on.

Below that, the rest are grouped:

* **General** — Every Page, Homepage Only, Homepage Pop Up, Feedback, Link Only, Synthetic Research
* **Ecommerce** — Thank You & Order Status, Order Status Only, Checkout Steps, Product Pages, Cart Page, Collections Pages, Customer Accounts, POS: After Sale, POS: Smart Grid, Exit Intent
* **Email & SMS** — Abandoned Checkout, Order Paid, Order Fulfillment, Order Delivered, Order Cancelled, and an **Email Campaign** you send to a list yourself. Stripe and Square accounts get their own events (Checkout Completed, Charge Refunded, New Subscription, Subscription Cancelled, Payment Completed, Refund Processed, Order Fulfilled).
* **Manual** — API Only, Embed Code Snippet, Configure Manually

Cards that depend on an integration carry that platform's mark in the corner, and options that need a connection you don't have aren't offered. **Learn more** shows the exact page rules a placement will set.

**Email Campaign** carries an Email / SMS switch, so you can send the same campaign either way; the card and its details follow whichever you pick.

Everything chosen here is editable afterwards on **Settings → Delivery** — see [Delivery Settings](/polls/visibility-settings).

***

## Step 3 — How should this survey behave?

A short step that only appears when the delivery you picked has something worth asking about. Depending on the placement, that is:

* **Pop-up Settings** — when the survey appears on the page
* **Exit Intent Settings** — sensitivity, timer, device and exit prompt
* **Email / SMS Settings** — which event sends the survey and how long to wait after it
* **Targeting Rules** — which customers or checkouts should see it (Shopify)
* **Re-engagement** — [Nudge Non-Responders](/polls/nudge-non-responders), a one-time reminder for people who don't answer

Anything not asked here has a sensible default and can be changed later under **Settings**.

***

## Step 4 — Name it

Give the survey a title you'll recognise in your list later, such as "Post Purchase Survey 09/2026", then click **Create Survey**.

New surveys are created **hidden**, so you can preview them before anyone sees them. When you're happy, switch the survey to visible.

{% content-ref url="/pages/-LZuj6CN6spxapP1V3pg" %}
[Survey Preview](/polls/poll-preview)
{% endcontent-ref %}


# Survey General Settings

A quick overview of survey settings

Open a survey and go to **Settings → General**. General is split into three sub-tabs in the settings sidebar:

* **Details** — the survey's name, banner, survey ID, and when it is switched on.
* **Behavior** — how people can fill it out and close it, and what is recorded about them.
* **Manage** — the survey's management actions.

{% hint style="info" %}
**Looking for page rules, exclusion rules, embed settings or notifications?** They have moved off this tab:

| Setting                                          | Where it is now                                                                                                                                                                                                                                                                                    |
| ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Page Rules and Exclusion Rules                   | **Settings → Delivery → Locations**. See [Locations](/polls/visibility-settings#locations).                                                                                                                                                                                                        |
| Embed Settings (CSS selector or code snippet)    | **Settings → Delivery → Format**. See [Delivery Settings](/polls/visibility-settings).                                                                                                                                                                                                             |
| Separate survey per page                         | **Settings → Delivery → Frequency → More Options → Page memory** (**Counted per** on Shopify order pages). See [More options](/polls/visibility-settings#more-options).                                                                                                                            |
| Notify When Complete and Notification Recipients | **Settings → Workflows → Notifications** (**Email notifications** and **Notification email recipients**). See [Workflows](/polls/behavior-settings#notifications). Account-wide recipients for every survey are on your account **Settings → Notifications**. See [Notifications](/notifications). |
| {% endhint %}                                    |                                                                                                                                                                                                                                                                                                    |

## General Information

These are on **Settings → General → Details**.

#### Survey title

The name of your survey. Pick something easy to remember, like "Homepage Survey" or "Checkout Survey".

#### Banner

Optionally add a banner that appears on every question of this survey. Use it to tell customers what to expect before they start.

#### Survey ID

The survey's ID. Click it to copy it to your clipboard.

## Behavior

**Settings → General → Behavior** has three cards: **Answering**, **Closing** and **Privacy**. Every setting is shown; there is no **More Options** link.

### Answering

#### Allow edits

Let people edit their answers after submitting.

#### Advance automatically

Move to the next question as soon as an answer is selected.

#### Allow resubmissions

Let a visitor fill out the survey again every time they visit, even if they finished it before. This is useful when you use Zigpoll as a form.

For example, a Contact Us form should accept a submission whenever a visitor wants to send one, whether or not they filled it out before.

{% hint style="info" %}
How often a survey *appears* is set separately, on **Settings → Delivery → Frequency**. If a survey keeps showing when you don't expect it to, see [The survey keeps showing after I closed it](/polls/visibility-settings#the-survey-keeps-showing-after-i-closed-it).
{% endhint %}

#### Reset session

Shown once **Allow resubmissions** is on. Zigpoll treats each survey completion as a brand new participant. This is useful for **kiosk-style** setups that collect feedback from many people on one device, such as a tablet at a checkout counter.

#### Auto focus inputs

Control which inputs are automatically focused when a question becomes visible:

* **All Inputs** (default) — Automatically focus the first input on every question
* **Required Inputs Only** — Only auto-focus inputs on required questions
* **Disabled** — Never auto-focus inputs

#### Hide optional labels

Hides the "Optional" label next to optional questions. Use it for a cleaner look that doesn't flag which questions can be skipped.

### Closing

#### Close when finished

Close the survey once it has been completed.

#### Tap outside to close

Lets mobile visitors close the survey by tapping outside of it.

#### Hide X button

Hides the X (close) button in the top right corner of the survey. Use it to stop visitors dismissing the survey without completing it.

#### Hide close button

Hides the close button that appears at the end of the survey. Use it to keep participants on the final question.

#### Hide back button

Hides the back button on the survey. Use it when you don't want participants to revisit previous questions.

### Privacy

#### Anonymous mode

When enabled, Zigpoll doesn't collect identifying information from participants. Use it when you want to guarantee respondent privacy.

## Activation Schedule

The Activation Schedule is on **Settings → General → Details**. **Schedule** decides whether you switch the survey on and off yourself or let Zigpoll do it on a schedule.

* **I'll switch it on and off myself** — the default. The survey stays exactly as you leave it. Use the Live switch at the top of the page to turn it on or off.
* **On a schedule** — set when the survey **Starts** and **Ends**. For each, choose **When I switch it on** (or **When I switch it off**) or **On a date**, then pick a date and a time. The survey goes live and comes down automatically at those moments. Times are read in your time zone (the time zone of the browser you set them in).

{% hint style="info" %}
The Activation Schedule used to live on **Delivery → Timing** (now **Trigger**). It now sits on **General → Details**, with the rest of the survey's lifecycle settings.
{% endhint %}

## Management Options

On **Settings → General → Manage** you can **Duplicate survey**, **Export survey** (**Download JSON**, a file you can import into another Zigpoll account), **Archive survey**, or **Delete survey**, and import past responses with **Import Response Data**. See [Management Options](/polls/management-options).

## Which survey shows when several match

When more than one live survey matches the same page or customer, Zigpoll checks them **top-down** in the order of your **Surveys** list and shows the **first one** whose rules all pass. A survey hidden by its targeting falls through to the next match. Drag surveys to reorder them. See [Surveys](/accounts/active-polls).


# Design and styling

Learn how to take control of your survey appearance

{% hint style="info" %}
These settings apply to this survey only. To set the design for every survey, use **Settings → Design Defaults**. A survey follows those defaults until you turn on **Override Design Settings** on its own Design tab.
{% endhint %}

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-558d3cdfc560e11e3627a899954edb7533e44cc5%2Fdesign-defaults.png?alt=media" alt="Design Defaults in account Settings"><figcaption></figcaption></figure>

## Where your design applies

Open a survey and go to **Settings → Design**. There's a tab for each place the survey can appear, and each tab has its own **Override Design Settings** switch:

| Tab             | Styles                                                                                                            |
| --------------- | ----------------------------------------------------------------------------------------------------------------- |
| **On-Site**     | The survey on your website: colors, font, layout, launcher, progress indicator, Custom CSS.                       |
| **Survey Page** | The hosted page behind your survey link: logo, background, favicon, page title, social media image, redirect URL. |
| **Email**       | Email surveys: sender, subject and copy, logo, header bar, colors and font.                                       |
| **SMS**         | The text message sent for SMS surveys.                                                                            |

{% hint style="warning" %}
Surveys placed as blocks on Shopify's checkout, Thank You and Order Status pages don't use these settings — Shopify draws them with your checkout branding. See [Shopify checkout limits](/installation/shopify-checkout-limits).
{% endhint %}

#### Visibility

A visible survey is public for anyone to see. A survey that isn't visible never shows on your website, whatever its page rules say.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-722ea033e93b4160e1aa9470898399193db2ce3a%2Fsurvey-live-switch.png?alt=media" alt="The Live switch in the survey header" width="580"><figcaption></figcaption></figure>

{% hint style="info" %}
Only visible surveys show up on your website. Switch a survey to visible once it's configured the way you want.
{% endhint %}

## Styling your survey

To match your survey to your branding, use the options on **Settings → Design → On-Site**.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-360d21d5adea25bd53aa12d3c6008701096a834e%2Fdesign-on-site.png?alt=media" alt="On-Site design settings"><figcaption></figcaption></figure>

#### Background Color

Your brand color for the survey's frame: the launcher, the survey's border and header, the progress indicator and the close button. We suggest you use a complementary color to match your website's branding.

#### Action Color

The color of all buttons and interactive elements in your survey.

#### Notification Color

The color used when there is a notification to show on the launcher — for example, to mark that a survey has been completed by your customer.

#### Custom CSS

Add your own CSS to the survey here. It applies wherever the survey appears, including the hosted survey page. This feature is experimental and selectors may change, so use it at your own risk.

#### Select fonts

Choose your survey font from hundreds of preloaded fonts.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-2b594cc3cce278759fdce3f879593d7d12fe7c43%2Fdesign-font.png?alt=media" alt="The Font settings" width="550"><figcaption></figcaption></figure>

If you want to add in custom fonts see:

{% content-ref url="/pages/w6TnbDEeJuAnnnGakrIz" %}
[Custom Fonts](/polls/display-settings/custom-fonts)
{% endcontent-ref %}

#### Text Direction

Choose **Left to right** or **Right to left** to match your language. Zigpoll detects right-to-left languages (Arabic, Hebrew, Persian, Urdu, and others) automatically. Those surveys mirror their layout, including rating scales, matrix grids, and inputs. You only need this setting to override the automatic behavior.

#### Layout

Three rows control where the survey sits and how big it is:

* **Position** — a 3×3 grid of the corners and edges the survey can occupy. Click a cell; the name and a description of that position appear beside the grid. The center cell is a modal, which opens over the page instead of in a corner.
* **Offset** — a sentence, *20 px from the bottom and 20 px from the right*, whose words follow the position you picked. Edit the numbers to move the survey in from the edges. Offset is not shown for the modal position.
* **Size** — *400 px wide and up to 500 px tall*. The width is fixed; the height is a maximum the survey grows into.

See [Shapes and Placements](/tutorials/shapes-and-placements) for more on each position.

#### Progress Indicator

Four cards show how a respondent sees their progress through the survey, each drawn on a survey panel:

* **Bar** — a thin bar fills across the top.
* **Circle** — a ring fills in the corner.
* **Counter** — the question number, as text (*2 / 5*).
* **None** — no indicator.

This is the only progress setting. Shopify checkout blocks don't show a progress indicator.

## Launcher

Three cards choose how the survey is launched on the page: **Circle** (a round button in the corner), **Bumper** (a tab along the edge of the page) or **No Launcher** (the survey opens on its own — see [Hide the Launcher](/tutorials/hide-the-launcher)). The options below only appear while there is a launcher to set them on.

#### Border Radius and Launcher Scale

Two sliders. **Border Radius** starts at the shape you picked (round for Circle, square-cornered for Bumper), and you can fine-tune it. **Launcher Scale** makes the whole launcher bigger or smaller than its default.

#### Default and After Completion

Two tabs sit above the launcher's Layout, Text and Icon: **Default**, and **After completion**, which shows once someone has finished the survey. On After completion, choose **Same as default** or **Different launcher**. For example, show *Got a sec?* by default and *Thanks!* after. **Different launcher** starts from a copy of the default launcher. **Same as default** switches it back to match. See [Custom Launcher Image](/tutorials/custom-launcher-image#after-completion-optional).

#### Layout (desktop and mobile)

Choose whether your launcher shows the icon and text, the icon only, or the text only. You set this separately for desktop and mobile. Mobile defaults to the icon only.

#### Text

Optional text shown on your launcher.

#### Icon

The icon shown on your launcher. Pick one, or use the **Upload** tile for your own square image. See [Custom Launcher Image](/tutorials/custom-launcher-image). On mobile, your icon shows even if you chose text only for desktop.

{% hint style="info" %}
All plans are fully white-labeled — surveys show no Zigpoll branding unless you turn on **Zigpoll Link**. **Custom CSS** is available on all plans. **Custom Code** (inserting your own code into Zigpoll iframes) requires a **Standard** plan or better.
{% endhint %}

## Images

Different images live in different places:

* **Launcher image** — the button that opens an on-site survey: **On-Site → Launcher → Icon**. See [Custom Launcher Image](/tutorials/custom-launcher-image).
* **Survey background and modal images** — **On-Site → Background Image**, and **Logo Image**, **Side Image** and **Overlay Image** for the modal position.
* **Survey page logo and background** — **Survey Page → Logo** and **Background Image**.
* **Email logo** — **Email → Logo**.
* **Images inside a question** — **Add Image** in the question editor. See [Adding Images to Questions](/tutorials/adding-images-to-questions).

See [Custom Header Image](/tutorials/custom-header-image) for which to use when.

#### Image Sizes and Quality

Zigpoll resizes images when you upload them, so very large files don't slow your survey down:

| Image                                 | Resized to                        |
| ------------------------------------- | --------------------------------- |
| Launcher icon                         | 500 × 500 px, cropped to a square |
| On-Site **Background Image**          | 1080 × 300 px, cropped            |
| On-Site logo                          | 300 px tall                       |
| Survey Page **Logo**                  | 700 px tall                       |
| Survey Page **Background Image**      | 2400 px wide                      |
| Favicon                               | 180 × 180 px                      |
| Image choice answers                  | 1000 px wide, converted to WebP   |
| Other images, such as question images | 1000 px wide                      |

Smaller images are never enlarged. For the sharpest result, upload at least these sizes, and crop to the right shape yourself so the automatic crop doesn't cut anything off. Animated GIFs aren't resized.

## Troubleshooting

#### The Next button is grey

The **Next** button stays grey until the question is answered:

* A single-choice question needs an option picked. If the respondent picks a write-in option such as *Other*, they also have to type something.
* A multi-select question needs enough options picked to meet its selection limit — for example, at least one, or exactly three.

A question set to **Optional** never greys out the button. If a question shouldn't block people, open it and turn on **Optional**, then press **Update Question**.

#### Matrix questions on small screens

On a phone, a Matrix question with more columns than fit scrolls sideways, with an arrow showing there's more. To avoid scrolling, use fewer columns or shorter column labels, or split the rows into separate questions.

#### My custom font isn't showing

See [Custom Fonts](/polls/display-settings/custom-fonts#my-custom-font-isnt-showing).

#### The survey looks different on my Thank You page

Shopify checkout, Thank You and Order Status blocks use Shopify's checkout branding, not these settings. See [Shopify checkout limits](/installation/shopify-checkout-limits).


# Custom Fonts

To use a custom font:

1. Open your survey and go to **Settings → Design → On-Site**. To set it for every survey, use **Settings → Design Defaults → On-Site** instead.
2. Under **Font**, select **Custom** from the **Font Family** dropdown.
3. Enter the name of your font in **Custom Font**, exactly as it's written in the font's CSS (for example `Brandon Grotesque`).
4. Make sure the font's stylesheet can load (see below).
5. Press **Save Changes**.

If you run into any issues, message us at <support@zigpoll.com>.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-44530d9442a7d9ea262316ab176b9af08b9241fc%2Fdesign-custom-font.png?alt=media" alt="Font family set to Custom" width="550"><figcaption></figcaption></figure>

## Loading the font

Naming the font isn't enough. Zigpoll draws the survey inside its own frame, and the font's stylesheet has to reach that frame. There are two ways to do this.

**Your website already loads the font.** Zigpoll copies font stylesheets from your page into the survey automatically when they are:

* a `<link rel="stylesheet">` or `@import` from **Google Fonts**, **Adobe Fonts** (`use.typekit.net`), **Fontshare**, **Bunny Fonts**, **Fontsource** on jsDelivr, or **Cloudflare Fonts**; or
* an `@font-face` rule, in a stylesheet served from your own site, whose `font-family` matches the name in **Custom Font**.

**Otherwise, import it in Custom CSS.** Scroll to **Custom CSS** on the same tab and add an `@import` of the font's stylesheet at the top, for example:

```css
@import url('https://fonts.googleapis.com/css2?family=Lora&display=swap');
```

Custom CSS applies wherever the survey appears, including the hosted survey page. This is also how you get the font onto your survey links.

## My custom font isn't showing

When the font can't load, the survey falls back to a default font. Check:

* **The name matches.** **Custom Font** must be the font's `font-family` name, not the file name.
* **The stylesheet is reachable.** Zigpoll only copies stylesheets from your own site or the font services above. For a font loaded from any other domain, add an `@import` to **Custom CSS** instead.
* **The survey link.** The hosted survey page doesn't have your website's stylesheets. Use the **Custom CSS** `@import`.
* **Shopify checkout.** Checkout, Thank You and Order Status blocks can't load custom fonts. See [Shopify checkout limits](/installation/shopify-checkout-limits).


# Delivery Settings

Zigpoll gives you control over how a survey goes out, where it appears, what triggers it, and how often

{% hint style="info" %}
These settings apply to a single survey, so set them for each one.
{% endhint %}

Open a survey and go to **Settings → Delivery**. The settings are split across four tabs. Which ones appear depends on the delivery format you pick:

| Tab           | What it controls                                                                                                          | Shown for                                       |
| ------------- | ------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- |
| **Format**    | How the survey goes out — on-site pop-up, page embed, link, exit intent, API, email, SMS — and that format's own settings | every format                                    |
| **Locations** | Which pages of your site the survey appears on                                                                            | on-site, page embed (CSS selector), exit intent |
| **Trigger**   | What makes the survey appear: the appearance pattern, launcher and survey timing, device, and exit intent rules           | on-site, page embed, exit intent, API           |
| **Frequency** | How often it appears, what dismisses it, and cart conditions                                                              | everything except link, email and SMS           |

Every tab shares one **Save Changes** button.

{% hint style="info" %}
The **Trigger** tab used to be called Timing, and the **Activation Schedule** that lived on it has moved to **Settings → General → Details**. See [Activation Schedule](/polls/display-rules#activation-schedule).
{% endhint %}

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-f7f9de86be2f29ea71f06001a8fc91cc716a749e%2Fdelivery-format.png?alt=media" alt="Delivery Format settings"><figcaption></figcaption></figure>

### Different survey types have different settings

If you don't see a setting described here, it isn't available for your survey type.

**On-site surveys:** Appearance pattern, launcher and survey timing, locations, frequency

**Site embed surveys:** Embed settings, frequency. There are two ways to embed a survey in a page:

* **Copy & Paste Snippet** — self-contained, with no site-wide Zigpoll script needed.
* **CSS Selector** — uses the site-wide Zigpoll script.

See the [Embed documentation](/embed) for full details.

**Link:** Add UTMs to your link

**Exit Intent:** Exit intent settings, frequency

**API:** JS Code Snippet, appearance pattern, frequency

**Email:** Trigger settings (on the Format tab)

**SMS:** Trigger settings (on the Format tab)

### Locations

Choose which pages your survey appears on.

#### Location Templates

Zigpoll has the most common options as one-click templates, grouped into **General**, **Ecommerce** and **Manual**:

* Every Page
* Homepage Only
* Homepage Pop Up
* Feedback (a launcher people open themselves)
* Link Only
* Thank You & Order Status (Shopify)
* Order Status Only (Shopify)
* Checkout Steps \[Shopify Plus only]
* Product Pages
* Cart Page
* Collections Pages (Shopify)
* Customer Accounts (Shopify)
* POS: After Sale (Shopify POS)
* POS: Smart Grid (Shopify POS)
* Exit Intent
* Embed Code Snippet
* API Only
* Configure Manually

The Shopify templates are named after the pages in your Shopify checkout editor. Add the Zigpoll app block to the matching page. See [Activating Zigpoll on Shopify Checkout Extensions](/installation/activating-zigpoll-on-shopify-checkout-extensions). The POS templates show the survey on the register in the Shopify POS app. See [Activating Zigpoll on Shopify POS](/installation/activating-zigpoll-on-shopify-pos).

The same templates are offered as cards on step 2 of the create flow — see [Creating a Survey](/polls/creating-a-survey).

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-f67065faaffc11672f8d76aebf64dbb318278599%2Fdelivery-location-templates.png?alt=media" alt="Location templates" width="550"><figcaption></figcaption></figure>

#### Do it yourself

Pick **Configure Manually** to write your own page rules. On the **Locations** tab of an existing survey, that's the **Do It Yourself** tab.

1. Add a rule, choose how it matches (**Matches Exactly**, **Starts With**, **Ends With** or **Contains**), and type the page path. The line under each rule shows the pattern Zigpoll will use.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-9bdae58f75a7ed9c0a5b456ec270f0cb602d54df%2Fdelivery-locations-page-rules.png?alt=media" alt="Page rules on the Locations tab" width="550"><figcaption></figcaption></figure>

2. You can keep the survey off certain pages by adding **Exclusion rules**. They use the same match types.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-4e1f4be6ceef5d1ba02318f12ad9fab4226665e4%2Fdelivery-locations-exclusion-rules.png?alt=media" alt="Exclusion rules" width="550"><figcaption></figcaption></figure>

3. By default, query parameters (the `?some=value` part at the end of a URL) are ignored. Turn on **URL query variables** to include them when matching.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-2b848d947d1485004ec75af31172094bfb5b22b2%2Fdelivery-locations-query-variables.png?alt=media" alt="The URL query variables switch" width="550"><figcaption></figcaption></figure>

#### How page rules match

**Rules match the page's path, not the full URL.** The path is everything after your domain: on `https://mystore.com/products/blue-shirt` it is `/products/blue-shirt`. Matching ignores capitalization. A survey with no page rules shows on every page.

| Match type          | Rule         | Shows on                            | Doesn't show on         |
| ------------------- | ------------ | ----------------------------------- | ----------------------- |
| **Matches Exactly** | `/products`  | `/products`, `/products/`           | `/products/blue-shirt`  |
| **Starts With**     | `/products`  | `/products`, `/products/blue-shirt` | `/collections/products` |
| **Ends With**       | `/thank_you` | `/thank_you`, `/pages/thank_you`    | `/thank_you/extra`      |
| **Contains**        | `sale`       | `/sale`, `/collections/summer-sale` | `/products/blue-shirt`  |

{% hint style="warning" %}
**Type a path, not a full URL.** A full address like `https://mystore.com/products` never matches with **Starts With**, **Ends With** or **Contains**, because those rules compare the path only.

With **Matches Exactly**, start the path with `/`. The rule `products` (no leading slash) matches nothing, while `/products` works. A full address does work with **Matches Exactly**, but only on that exact domain: `https://mystore.com/products` won't match `https://www.mystore.com/products` or `https://mystore.de/products`.
{% endhint %}

### Trigger

The Trigger tab controls what makes the survey appear. It opens with a sentence describing what the survey does today, for example *"The launcher appears immediately, and the survey opens once the visitor is 50% down the page."* You can check the behavior without reading every field.

#### Appearance Pattern

Rather than setting the launcher and the survey separately, pick the pattern that matches what you want. Each one writes both at once.

| Pattern                | What it does                                                                                                   |
| ---------------------- | -------------------------------------------------------------------------------------------------------------- |
| **Feedback Button**    | A launcher waits in a corner. People open it when they want to.                                                |
| **Ask on Arrival**     | The survey opens itself as soon as the page loads.                                                             |
| **Ask After Engaging** | The survey waits until someone is halfway down the page.                                                       |
| **Open From Code**     | Nothing shows on its own. You open it from the [Javascript API](/javascript-api) with `window.Zigpoll.open()`. |
| **Ask in a Modal**     | The survey opens centered over the page, with no launcher.                                                     |
| **Custom**             | Set the launcher and the survey separately, using the fields below.                                            |

The highlighted card reflects your saved settings, so a survey set up before patterns existed still shows the pattern that matches it. Editing a field by hand moves the selection to **Custom**.

A pattern also sets whether there is a launcher at all, and whether the survey is a corner widget or a modal. When it changes either, Zigpoll says so under the cards, and the change applies when you save. If a pattern needs a launcher and this survey's launcher is turned off (or the other way round), a notice links to **Settings → Design → On-Site**, where that switch lives.

{% hint style="info" %}
A survey's own design settings replace your account's Design Defaults entirely. So a pattern that changes the launcher or the alignment may turn on a design override for that survey for the first time. The notice under the cards tells you when that will happen.
{% endhint %}

#### Launcher Timing and Survey Timing

Pick **Custom** (or **Ask After Engaging**, which opens the survey block) to set the two timings yourself. Both use the same three controls:

* **Scroll Depth** — wait until the visitor is a certain % down the page
* **Delay** — wait a number of seconds, on the page or across the site
* **Device** — desktop only, mobile only, or both

The two run **in sequence, not in parallel**: Zigpoll waits for the scroll position first, and only then starts the delay timer. "50% and 5 seconds" means *once they are halfway down the page, then five seconds later*.

The **Survey Trigger** block asks who opens the survey: *It opens by itself* or *Someone clicks the launcher*. The timing fields only show for *It opens by itself*. If the launcher is set to appear **after** the survey opens, Zigpoll flags it, since the launcher would never be what opens the survey.

### Exit Intent

These settings are on the **Trigger** tab for exit intent surveys.

**Sensitivity**: How readily Zigpoll decides a visitor is about to leave. Higher sensitivity shows the survey more often, with more false positives. Lower sensitivity shows it less often. The default is **Normal**, which is also the one that collects the most answers — surveys set to High or Extreme interrupt more visitors and are answered less often, not more.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-38aa52268ef51ed2a5aa1cb5ebf07a5a72d9b26d%2Fdelivery-exit-intent-sensitivity.png?alt=media" alt="Exit intent sensitivity" width="550"><figcaption></figcaption></figure>

**Exit intent timer**

The exit intent survey only appears after the visitor has been on your site for at least this long. The default is 20 seconds.

{% hint style="info" %}
**Leave the timer at 20 seconds or more.** Visitors caught in their first 20 seconds on a page answer about a third less often than visitors who have settled in — they are bouncing, not leaving. Lowering the timer buys more pop-ups that are shown at a worse moment; raising it buys fewer, better-timed ones rather than a higher total.
{% endhint %}

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-1027bebbaeab21a9da9fd1e096a332ac83c345ce%2Fdelivery-exit-intent-timer.png?alt=media" alt="Exit intent timer" width="550"><figcaption></figcaption></figure>

**Device**

Show the survey on all devices, only on desktop, or only on mobile. For other on-site surveys, device is part of **Launcher Timing** and **Survey Timing** on the same tab. Leave it on **All Devices** unless you have a reason not to: most exit intent surveys are seen on a phone, and phone visitors answer them more often than desktop visitors do.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-ccf7f1ada4a28a9afb833de1dd89fbcb1899873c%2Fdelivery-exit-intent-device.png?alt=media" alt="Exit intent device setting" width="550"><figcaption></figcaption></figure>

### Frequency

The Frequency tab also opens with a sentence, because its two main controls add up to one: *"The survey appears at most 3 times to the same person, and goes for good after one close."*

#### What dismisses the survey

Pick one of four:

| Tile                  | What it does                                     |
| --------------------- | ------------------------------------------------ |
| **Dismiss on Close**  | Gone for good after one close.                   |
| **Dismiss on Answer** | Survives closes. Gone once answered.             |
| **Dismiss on Reload** | Lingers after answering, until the page reloads. |
| **Never Dismiss**     | Comes back even after they answer.               |

With the first three, answering ends the survey for that person permanently. What differs is what a **close** does. Closes are counted in the visitor's own browser, so they carry over across page loads and repeat visits.

#### Appearance limit

How many times the survey may appear to the same person before it stops on its own. Choose **Appears at most N times to the same person**, or **Keeps appearing with no limit**.

{% hint style="info" %}
If you never set a limit, Zigpoll applies **10**. New surveys are created with a limit of 3.
{% endhint %}

#### Cart conditions

On Shopify stores, show the survey based on the cart's item count or value. The survey only appears when the cart conditions are met, which suits abandoned cart surveys.

{% hint style="info" %}
**On an exit intent survey, this is the single biggest lever.** Exit surveys limited to visitors with something in the cart are answered more than twice as often as ones shown to everybody — the visitor has a reason to tell you what stopped them.
{% endhint %}

#### More options

Open **More Options** at the bottom of the Frequency card for three narrower rules:

* **Exit prompt** — let people close the survey at any time, don't allow closing until it is completed, or ask for confirmation before closing.
* **Page memory** — whether what a visitor has already seen is remembered across the whole site, or separately for each page they land on.
  * **Remember across the whole site** (the default) — the survey keeps its progress wherever it appears. Someone who half-answered it on one page carries on where they left off on the next.
  * **Remember separately for each page** — each URL gets a fresh, empty survey. Use this on dynamic pages, where the same survey really asks about something different each time: order 123 is not order 321.
  * On Shopify order pages this control is labeled **Counted per**. It chooses between showing the survey once per customer or every time they place an order.
* **Memory** — Zigpoll remembers in the visitor's browser what they have already been shown. Choose **Remember what a visitor has seen**, or **Start fresh each browser session**. Use the second on a shared device, such as a kiosk or a tablet at a counter, so each visit counts as a new person.

#### The survey keeps showing after I closed it

Frequency is remembered per browser, so check these in order:

1. **What dismisses the survey.** Only **Dismiss on Close** hides it after a close. With **Dismiss on Answer** a close just collapses it, and it comes back on the next page load. **Never Dismiss** brings it back even after an answer.
2. **Appearance Limit.** Set **Appears at most N times to the same person**. **Keeps appearing with no limit** lets it return indefinitely.
3. **Memory** (under **More Options** on the Frequency card). **Start fresh each browser session** resets the count every time the visitor opens a new browser session. Use **Remember what a visitor has seen** unless the survey runs on a shared device.
4. **Page memory** or **Counted per**. **Remember separately for each page** gives each URL a fresh survey, so it shows again on the next page. On Shopify order pages, **Show each time a customer places an order** shows it again on every order.
5. **Allow resubmissions** on **Settings → General → Behavior** (in the **Answering** card). When on, a finished survey is not remembered, and **Reset session** (shown once resubmissions are on) treats each completion as a new person. Turn both off unless the survey is a contact form or kiosk.
6. **A different browser or device.** Zigpoll's memory lives in the visitor's browser. Clearing site data, a private window or another device counts as a new visitor.

{% hint style="info" %}
**There is no per-survey cooldown** such as "don't show again for 30 days". To space surveys out over time, use **Survey throttling** in your account **Settings → Visibility**: pick **A limited number in a period of time** from the dropdown and set the **Limit**, *Show each customer at most N surveys every N days*. It counts every on-site survey the visitor is shown across your account. Surveys you add to **Excluded surveys** can always show and don't count toward the limit.
{% endhint %}

#### Show a survey only once per customer

Frequency settings are per browser. To stop a Shopify customer seeing a survey again on any device or order, tag them when they respond, then exclude that tag:

1. Open the survey and go to **Settings → Workflows → Shopify**. Turn on **Tag customers** and set the **Shopify Customer Tag** (the default is `Completed Zigpoll Survey`). See [Workflows → Shopify](/polls/behavior-settings#shopify).
2. Go to **Settings → Targeting**. Under **Shopify Targeting Rules**, click **Advanced Rules** and add **Customer Tags → Does Not Include Any →** the same tag.
3. Click **Save Changes**.

The tag can only be added when Zigpoll knows the Shopify customer, such as on Thank You and Order Status pages, order-triggered email and SMS, or a logged-in shopper on your storefront. For on-site surveys, customer rules need the Zigpoll app embed and a logged-in shopper. See [Targeting Settings](/polls/targeting-settings#how-on-site-surveys-identify-the-shopper).

#### Trigger settings for email and SMS

For email and SMS surveys, the trigger is set on the **Format** tab. Choose the event that sends the survey and how long to wait before sending it. The events follow Shopify's definitions.

**Event options**

* Order Created
* Order Paid
* Order Fulfilled
* Order Delivered
* Order Cancelled
* Abandoned Checkout

**Delay options**

* Set the unit of delay (minutes, hours, days)
* Set the number of units

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-53965cf7452327583ef5ec9e3019cea0ddd096d6%2Fdelivery-email-settings.png?alt=media" alt="Trigger settings for an email survey" width="550"><figcaption></figcaption></figure>

### Activation Schedule

The activation schedule is a calendar window for the whole survey rather than a per-page-load rule, so it lives with the survey's other lifecycle settings on **Settings → General → Details**. See [Activation Schedule](/polls/display-rules#activation-schedule).

### Nudge Non-Responders

**Nudge Non-Responders** is on **Settings → Workflows → Reminders**. It sends a one-time reminder to anyone who was sent or shown this survey but didn't respond. The reminder is skipped if they respond first.

See [Nudge Non-Responders](/polls/nudge-non-responders) for full setup, delivery, and customization details.


# Nudge Non-Responders

Automatically send a one-time reminder to people who were sent or presented a survey but didn't respond

**Nudge Non-Responders** automatically sends one reminder to anyone who was sent or shown a survey but didn't respond. Most people who see a survey never answer it, so a reminder recovers responses you would otherwise lose, with no manual follow-up.

The reminder is **one-time** and **self-cancelling**. If the person responds before it goes out, it is skipped. Nobody who has already answered ever receives a nudge.

{% hint style="info" %}
This setting is configured per survey. Turn it on for each survey you want to nudge.
{% endhint %}

### Enabling it

1. Open your survey and go to **Settings → Workflows → Reminders**.
2. Turn on the **Nudge Non-Responders** toggle.
3. Set how long to wait before sending the reminder, in **hours** or **days**. The default is **1 day** after the survey is sent, which is when most people who are going to answer already have.
4. (Optional) Customize the reminder subject (email) or reminder message (SMS) — see [Customizing the reminder](#customizing-the-reminder) below.
5. Click **Save Changes**.

That's it. Eligible non-responders are followed up automatically on the schedule you set.

### How the reminder is delivered

The reminder is sent over the **same channel the survey was delivered on**:

* **Email surveys** (email campaigns, CSV email, Shopify customer-segment email) → a reminder **email**.
* **SMS surveys** (SMS campaigns, CSV SMS, Shopify customer-segment SMS) → a reminder **text message**.
* **Shopify post-purchase / on-site surveys** → a reminder **email**, sent when Zigpoll knows the customer's email for the order, such as the email captured at checkout. Post-purchase reminders are tracked per order. A returning customer who skips a later survey still gets a reminder for that new order.

A reminder needs a way to reach the person: an email address or phone number. Anonymous surveys have no recipient, so the Nudge Non-Responders card is hidden on them.

### Customizing the reminder

When you switch reminders on, the email reminder starts with its own subject line, *"Still have a minute?"*, so it does not read as the same email sent twice. SMS reminders reuse the original message. To change either, use the Nudge Non-Responders card:

* **Reminder subject** *(email surveys)* — a different subject line for the follow-up email, e.g. *"Quick reminder: we'd still love your feedback"*.
* **Reminder message** *(SMS surveys)* — a different text for the follow-up message.

Clear either field to resend the original subject or message instead.

Reminder emails use your survey's email design (colors, logo, header) — adjust it under **Settings → Design → Email** on your survey.

If your survey has [language settings](/polls/language-settings) configured, reminders go out in the same language as the original send.

### When a reminder is skipped

A nudge is **not** sent if:

* The person responds before the reminder is due (the reminder is cancelled the moment a response is recorded).
* The survey is anonymous.
* There is no email address or phone number to reach the person.

### Tracking nudges

Sent reminders are visible in two places:

* **Activity feed** — filter by **Survey Nudges** to see every reminder that was sent.
* **Participant timeline** — a *"Sent a nudge to: …"* entry appears on the participant's history, followed by their response if they came back and answered.

{% hint style="info" %}
Nudge reminders count toward your account's email and SMS sending limits, just like the original survey send. See [Subscription Plans](/subscription-plans) for limit details.
{% endhint %}


# Workflows

What your survey does with a response — notifications, reminders, actions, analysis and Shopify write-back

Workflows are everything a survey does *after* someone responds. Open a survey, go to **Settings → Workflows**, and pick a tab:

| Tab               | What it controls                                                                         |
| ----------------- | ---------------------------------------------------------------------------------------- |
| **Notifications** | Who on your team is emailed when a response comes in                                     |
| **Reminders**     | A one-time nudge to people who were sent or shown the survey but didn't respond          |
| **Actions**       | Rules that run when certain answers are given — webhooks, emails, integrations, Shopify  |
| **Analysis**      | Sentiment analysis and smart classification of responses                                 |
| **Shopify**       | Writing responses, tags and customers back to your Shopify store (Shopify accounts only) |

Every tab shares one **Save Changes** button.

{% hint style="info" %}
Looking for how the survey *appears* — pop-up timing, exit intent, hiding the close button? Those live under [Delivery](/polls/visibility-settings) and **Settings → General → Behavior**.
{% endhint %}

## Notifications

**Email notifications** decides when Zigpoll emails your team about this survey:

* **Email for every partial or complete response**
* **Email only for completed responses**
* **Email only when the respondent gave an email address**
* **Email only when there is a write-in**
* **Do not email me**

Notifications go to your account's recipients unless you enter different addresses in **Notification email recipients**. See [what a notification email includes](/notifications#what-a-notification-email-includes), plus account-wide recipients, weekly recaps and troubleshooting, in [Notifications](/notifications).

## Reminders

**Nudge Non-Responders** sends one reminder to anyone who was sent or shown the survey but hasn't answered. The reminder cancels itself if they respond first. Set the delay, and optionally customize the reminder subject (email) or message (SMS).

{% content-ref url="/pages/VCTpnYbnH8cUwmOfaIQU" %}
[Nudge Non-Responders](/polls/nudge-non-responders)
{% endcontent-ref %}

## Actions

The **Actions** tab runs actions at the **survey level**, based on how someone answers across your entire survey.

### How it works

1. Click **Add Action Logic** to create a new rule.
2. Set one or more **conditions** — for example "survey **is completed**", "survey **is partially completed**", or a specific question's answer. Conditions can be combined with AND/OR logic.
3. Choose one or more **actions** to trigger when the conditions are met.
4. Press **Save Changes**.

### Available actions

**trigger webhook** — Send a POST request to a URL with the full response data.

**send email** — Send an email template to the respondent (**send email to respondent**), to your notification recipients (**send email to myself**), or to addresses you enter (**send email to address**). **send survey request** emails the respondent another survey.

### Integration actions

If you have integrations connected, their actions appear automatically. For example:

* **Slack** — send a notification to a Slack channel
* **Jira**, **ClickUp**, **HubSpot** — create an issue, task or deal
* **Zendesk**, **Gorgias**, **Richpanel**, **Gladly** — open a support ticket or conversation
* **Notion** — add a row to a Notion database
* **Klaviyo** — **subscribe to klaviyo list** adds the respondent to a Klaviyo list you pick. Use it when only some respondents should join, for example those who give a certain answer. See [Klaviyo](/integrations/klaviyo#adding-respondents-to-a-list) for list options and the marketing-consent warning
* **Mailchimp**, **Drip**, **Brevo**, **dotdigital**, **Omnisend**, **Marketo** — subscribe or add the respondent as a contact
* **Braze**, **RudderStack**, **Customer.io**, **Attentive**, **Iterable**, **Permutive** — track the response on the respondent's profile
* **Google Sheets** — write response data to a Google Sheet. Zigpoll creates the sheet automatically when you save, with headers based on your survey questions — you'll be emailed a link when the first response comes in. See [Sync Survey Responses to Google Sheets](/tutorials/sync-survey-responses-to-google-sheets)

### Shopify actions

If you have a Shopify store connected, these actions are available:

* **add tag** → **add customer tag** / **add order tag**
* **add metafield** → **add customer metafield** / **add order metafield**
* **generate reward** → **generate discount code**, **add store credit**, **add free shipping**

{% hint style="info" %}
Actions that require an email address (Klaviyo, Mailchimp, Drip, Omnisend and similar) only fire if Zigpoll has one for the respondent. Shopify tag and metafield actions only fire when the response is tied to a Shopify customer or order — see [Why a customer tag doesn't appear](#why-a-customer-tag-or-metafield-doesnt-appear).
{% endhint %}

### Saving the answer with `{{ value }}`

Tag and metafield actions take a value. Enter `{{ value }}` to save the submitted answer instead of fixed text. One rule then covers every answer option, instead of one rule per option. For tags, pick **response** in the dropdown next to the field, and Zigpoll fills in `{{ value }}` for you.

* On a question's own logic, `{{ value }}` is that question's answer.
* On the Workflows **Actions** tab, `{{ value }}` is the answer to the first question named in the rule's conditions. If the rule only says "survey is completed", it's the first answered question in the survey.
* For a multi-select answer, `{{ value[0] }}` is the first selected option, `{{ value[1] }}` the second, and so on.

**Why a literal `{{value}}` shows up in Shopify.** The placeholder must be the whole value. Zigpoll only replaces it when the field holds nothing but `{{ value }}` (spaces don't matter) or `{{ value[n] }}`. Anything else is written exactly as typed:

* Text around it, like `survey-{{ value }}` — write a fixed tag instead, or tag with `{{ value }}` alone.
* Other brackets, like `{value}` or `[[value]]`.
* `{{ value }}` typed into **Shopify Customer Tag** on the Shopify tab. That field is always a fixed tag; use an **add customer tag** action for answer-based tags.

On the Actions tab, if no answered question can be found for the rule, Zigpoll skips the write rather than saving the placeholder.

### Combining multiple actions

You can add multiple actions to a single rule. For example, when a survey is completed you could send a Slack notification, create a Jira issue, and subscribe the respondent to a Klaviyo list. Adding the same tag to both the customer and the order is fine. Shopify never stores a tag twice on the same record.

You can also create multiple independent rules with different conditions and actions by clicking **Add Action Logic** again.

## Analysis

**Sentiment analysis** — scores the sentiment of each Write-In. On by default.

**Smart classification** — sorts each response into one of the labels you define (for example *Shipping*, *Product quality*, *Price*). Turn it on and enter your labels. Zigpoll classifies new responses as they arrive.

## Shopify

Shown for Shopify accounts only. These settings write survey data back into Shopify whenever a response is tied to a matching order or customer.

| Setting                                  | What it does                                                                                                                                                                                |
| ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Write to order details**               | Adds each answer to the order's **Additional Details** section.                                                                                                                             |
| **Write to order notes**                 | Adds the answers to the order's **Notes**.                                                                                                                                                  |
| **Write to customer notes**              | Adds the answers to the Shopify customer's notes.                                                                                                                                           |
| **Write to customer metafields**         | Writes each answer to its own metafield on the customer, for use in Flow, segments and themes. Turning it on shows **Metafield Namespace**.                                                 |
| **Tag customers**                        | Tags the Shopify customer. Set the tag in **Shopify Customer Tag** (default `Completed Zigpoll Survey`). On by default.                                                                     |
| **Create new customers**                 | When a response includes an email that isn't a Shopify customer yet, creates the customer.                                                                                                  |
| **Accepts marketing**                    | See [below](#what-accepts-marketing-does).                                                                                                                                                  |
| **More Options → Order lookup attempts** | Shopify processes orders asynchronously, so order data can lag the response. Zigpoll retries the lookup by default; set it lower if you'd rather your actions and integrations fire sooner. |

{% hint style="info" %}
Tag, metafield, discount and store-credit writes that depend on *how* someone answered are rules on the [Actions](#shopify-actions) tab, not here.
{% endhint %}

### When Zigpoll writes to Shopify

Everything on this tab, the Shopify actions, and the [Shopify Flow](/shopify-app/shopify-flow) triggers run together, once the response settles:

* **About a minute after the last question**, when the person completes the survey.
* **About 10 minutes after their last answer**, when they stop partway, or when **Allow edits** is on. Partial responses are written too.

For order-based surveys, Zigpoll then looks up the order, retrying for several minutes if Shopify hasn't finished processing it (see **Order lookup attempts**). So a tag or note can take a few minutes to appear. Refresh the customer or order in Shopify before assuming it failed.

{% hint style="info" %}
**Only want to tag completed responses?** **Tag customers** also runs for partial responses. Turn it off, then on the **Actions** tab add a rule: survey **is completed** → **add customer tag**.
{% endhint %}

### Order Details and Order Notes reach other systems

{% hint style="warning" %}
Order **Additional Details** and **Notes** aren't private to Shopify admin. Packing slip templates, 3PL and fulfillment-app imports, and ERPs may print or import them. If survey answers are turning up on packing slips or breaking an order import, turn those two settings off.
{% endhint %}

Zigpoll's post-purchase templates turn **Write to order details** on. To stop writing to the order while keeping the data in Shopify:

1. Open the survey and go to **Settings → Workflows → Shopify**.
2. Turn off **Write to order details** and **Write to order notes**.
3. Keep **Write to customer metafields** on, or add an **add order metafield** action on the **Actions** tab if you need the answer on the order.
4. Press **Save Changes**.

Metafields aren't printed on packing slips or sent to fulfillment apps unless something is set up to read them.

**What Zigpoll writes on the order:**

* **Additional Details:** one line per question. The name is `Zigpoll:` followed by the question's handle; the value is the answer. Options in a multi-select answer are separated by the delimiter set under **Settings → Data Export → Delimiter** (a comma by default). For a form question, each field is written as `Label: value`, and repeated labels are numbered (`Preferred Time 1`, `Preferred Time 2`).
* **Notes:** a block between `*** Start Zigpoll ***` and `*** End Zigpoll ***`, one `handle: answer` line per question. A later write replaces the block instead of adding another.

**Colons or slashes break my importer.** The field names can't be renamed, and `Zigpoll:` always contains a colon. You can remove special characters from the rest: open the question, turn on **Custom handle**, and enter a plain handle. Slashes inside an answer come from the answer option text. If the importer still rejects the fields, turn off **Write to order details**.

### Metafield namespace and key

Use these to find Zigpoll's data in Shopify Flow, customer segments and Liquid.

**Write to customer metafields** writes one customer metafield per question:

* **Namespace:** the **Metafield Namespace** field. If you never change it, Zigpoll writes to `zigpoll`.
* **Key:** the question's handle. That's the question title, unless you set a **Custom handle** on the question.
* **Type:** `multi_line_text_field`. If you've already created a metafield definition with that namespace and key and a different type, Zigpoll retries with the definition's type.

To pick an exact namespace and key for one question, open the question and turn on **Custom metafield configuration**, in the question's **Tracking** settings card. It appears once **Write to customer metafields** is on. Enter a **Namespace** and **Key**, such as `zigpoll` and `hear_about_us`. A short key is much easier to reference than a full question title.

**add customer metafield** and **add order metafield** actions take the namespace and key together as `namespace.key` in the first box, and the value — fixed text or `{{ value }}` — in the second.

In Shopify Flow, reference the metafield by that namespace and key, for example `zigpoll.hear_about_us`. Survey answers are also in the Flow trigger's own **Survey** data; see [Shopify Flow](/shopify-app/shopify-flow).

### Why a customer tag or metafield doesn't appear

**It hasn't been written yet.** Writes happen a minute or more after the survey is completed, and about 10 minutes after the last answer on a partial response. See [When Zigpoll writes to Shopify](#when-zigpoll-writes-to-shopify).

**The response isn't tied to a Shopify customer.** Zigpoll can only tag a customer it can identify:

* **On post-purchase surveys:** the customer on the order.
* **On any survey:** an email address in the response that matches a customer, or creates one when **Create new customers** is on.
* **When passed in:** a `shopify_customer_id` passed to the survey as metadata.

A guest visitor who never gives an email has nothing to tag. Neither does an order with no customer attached. Order tags and order metafields need the order instead. Email and link surveys only have the order if the link passes it, such as `?shopify_order_id=`.

**Tag Customers is off,** or you expected an answer-based tag from the Shopify tab. Answer-based tags are **add customer tag** actions.

**The value was too long or empty.** Order tags are cut to 40 characters and customer tags to 255. An action whose `{{ value }}` resolves to nothing writes nothing.

**A metafield definition has a type the answer doesn't fit.** If you created the definition yourself, check its type in Shopify. Text types always work.

### What Accepts Marketing does

When Zigpoll has an email address for the respondent, **Accepts marketing** marks that Shopify customer as subscribed to email marketing, and to SMS marketing when the survey collected a phone number. It applies to customers Zigpoll creates and to existing customers who aren't already subscribed. It never unsubscribes anyone.

Leave it off unless your survey asks for marketing consent. In accounts created on or after August 13, 2026, new surveys start with it off. In older accounts it's on unless you turn it off.


# Targeting Settings

Control who sees your surveys

Open a survey and go to **Settings → Targeting**. Targeting settings control who gets to see your survey. This may be useful if:

* You want to limit surveys displayed to a certain country or language
* You only want to survey people who come from a specific traffic source (paid ads, Google)
* You only want to survey people on mobile / desktop

You have access to the following settings:

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-a8d967e5024a28ccd731e4733578cbb53ab8a6aa%2Fsurvey-targeting-rules.png?alt=media" alt="Targeting settings" width="550"><figcaption></figcaption></figure>

#### Percentage

The percentage of visitors who see your survey. For example, at 50%, one out of every two visitors is shown your survey. Visitors are picked at random.

#### Referral

Shows your survey only to visitors from a traffic source you choose. For example, if you select "Traffic to your site from a search engine", only visitors who found you through Google, Yahoo, Bing and similar see your survey.

You can also limit a survey to paid traffic (visits with an ad engine UTM), specific referring sources, or organic traffic.

#### Country

Shows your survey only to visitors from the countries you choose. Use it to target your domestic or international customers. Location comes from the visitor's IP address.

#### Region

Narrows a survey to specific states, provinces, or regions (for example California or Ontario). Regions are listed with their country and matched on their ISO 3166-2 code, so the same rule works across countries. Like Country, this uses the visitor's IP address. If a region can't be determined, the rule is skipped instead of blocking the survey.

#### Browser

Surveys only visitors using a specific browser (Chrome, Safari, Firefox, Internet Explorer, or Edge). Use it to investigate your experience on a particular browser.

#### Device Type

Surveys visitors based on their device: mobile, tablet, or desktop. Use it when an experience or a question only applies to one kind of device.

#### Language

Shows surveys only to customers with matching languages, or hides them from those languages. Use it to survey a specific group of customers, such as French speakers.

Where the language comes from depends on where the survey shows:

* **On your site**, Zigpoll reads the page's `<html lang>` attribute, which Shopify themes set to the storefront language. If the page has none, it uses the visitor's browser language. A `?lang=` parameter in the page URL overrides both.
* **On Shopify checkout, Thank You and Order Status pages**, it uses the language the customer is checking out in, as reported by Shopify.

A base language matches every region: a rule for `fr` catches `fr-FR` and `fr-CA`. A regional rule such as `fr-CA` matches only that region, plus visitors whose page reports just `fr`.

To translate your survey, see:

{% content-ref url="/pages/-LrVMaacbU4WTFf6p6i5" %}
[Language and Translations](/polls/language-settings)
{% endcontent-ref %}

#### IP Address

Restricts your survey to a specific set of IP addresses, or hides it from them. To cover a whole range, use CIDR notation (for example `203.0.113.0/24`). This is useful for excluding your own office or agency from results.

#### Hostnames

Shows a survey only on certain domains, or everywhere except certain domains. The rule matches the domain the survey appears on, for example `shop.example.com` versus `staging.example.com`. One account can then show different surveys on production and staging, or on several storefronts.

#### Metadata

Shows a survey only when certain metadata is present, or only when it is not. Each entry is a key and value pair that must match exactly. Metadata includes:

* What your site passes to Zigpoll (see the JavaScript API).
* Values Zigpoll records automatically, such as `utm_source`, `utm_medium`, `utm_campaign`, `landing-page`, `original-referrer`, and the browser language.

For example, `utm_campaign` = `spring-sale` shows a survey only to visitors who arrived through that campaign.

#### Visitors

Shows the survey to first-time visitors only, or to returning visitors only. Zigpoll counts visits in the visitor's browser, so a visitor who clears site data or switches devices counts as new again. A visitor who lands through an email or SMS link (`utm_medium=email` or `sms`) counts as returning on their first visit, since they already know your brand. To target by *purchase history* on Shopify, use the Customer rules below instead.

#### Page Views

Shows a survey only after a visitor has viewed a certain number of pages. Use it to wait until customers have had time to explore your website.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-3854fbc50c39962b4efd64d209cd0c34c09c7b0c%2Fsurvey-targeting-page-views.png?alt=media" alt="The Page Views setting" width="550"><figcaption></figcaption></figure>

### Stripe and Square Targeting Rules

Surveys triggered by Stripe or Square events get their own rule section (see [Stripe](/integrations/stripe) and [Square](/integrations/square)). Use it to show a survey only for payments that match:

* An amount or currency.
* A metadata value.
* Specific product or price IDs (Stripe), or item IDs (Square).

### Shopify Targeting Rules

On Shopify, you can show a survey only to certain groups of customers. These settings appear automatically for every on-site survey on a Shopify store. They also appear for surveys using a Shopify-specific delivery method, such as Thank You & Order Status, Order Status Only, Checkout Steps, or email/SMS triggers.

#### Where each rule group applies

| Placement                                                   | Customer rules                   | Cart & Order rules                          |
| ----------------------------------------------------------- | -------------------------------- | ------------------------------------------- |
| On-site: widget, exit intent, embedded with page rules      | Yes                              | No — there is no order yet                  |
| Embed Code Snippet (direct embed by survey ID)              | No — shows wherever you place it | No                                          |
| Thank You & Order Status, Order Status Only, Checkout Steps | Yes                              | Yes                                         |
| Shopify POS post-purchase screen                            | Yes                              | Yes                                         |
| Shopify POS smart grid tile                                 | No                               | No                                          |
| Email / SMS sent from an order trigger, abandoned checkout  | Yes                              | Yes (abandoned checkout has no order rules) |

#### How on-site surveys identify the shopper

On storefront pages Zigpoll knows who the shopper is only when they are **logged in to their Shopify customer account**. The Zigpoll app embed passes the logged-in customer to the survey, and Zigpoll reads their orders count, tags and total spent from Shopify.

{% hint style="warning" %}
**Customer rules on on-site surveys require the Zigpoll app embed.** Enable it in your theme editor under **App embeds** — see [Activating Zigpoll on Shopify](/installation/activating-zigpoll-on-shopify-2.0). Stores still using the legacy script tag or a manually pasted snippet cannot identify logged-in shoppers, so every visitor is treated as a new customer there.
{% endhint %}

A **logged-out visitor is treated as a new customer with no orders**. That means:

* A **New Customers** survey shows to logged-out visitors and to logged-in shoppers with fewer than two orders.
* A **Returning Customers** survey shows only to logged-in shoppers with two or more orders.
* A **Customer Tags — Includes** rule never matches a logged-out visitor; a **Does Not Include** rule always does.
* To target by sign-in status itself, use the **Customer Account** rule (**Logged In** / **Logged Out**) under Advanced Rules. It also needs the app embed.

This is the most accurate signal Shopify offers. For a logged-out visitor, Shopify itself has no record of past purchases. No app can tell a first-time buyer from a returning one who hasn't signed in. To target first-time or returning *visitors* by browser instead, use the **Visitors** rule above.

#### Combining Shopify rules with Targeting rules

Shopify Targeting Rules are applied **in addition to** the general Targeting settings on the same survey. The general settings and the Shopify rules must both pass. So you can layer them:

* **Visitors: first-time** + **New Customers** → first visit on this browser *and* not a logged-in returning customer.
* **Visitors: returning** + **Returning Customers** → a known repeat buyer on a browser that has been here before.
* **Page Views ≥ 3** + **Customer Tags includes VIP** → engaged VIPs only.

To show a different survey to each group, create one survey per segment, for example one with **New Customers** and one with **Returning Customers**. Zigpoll checks the customer rules before choosing which survey to show, so each shopper gets the one that matches them. This also applies to exit-intent surveys.

#### Basic Options

One-click presets: **All Customers**, **New Customers** only, **Returning Customers** only, **Contains Subscription** (order includes a subscription item), or **Does Not Contain Subscription**. The subscription presets are only offered where an order is available.

#### Advanced Rules

Click **Advanced Rules** to combine multiple conditions and control exactly when surveys are shown. Click **Add condition** to add a row, pick a rule, pick an operator, then enter the values. Available rules:

**Cart rules**

* **Product Ids** — which products were purchased
* **Variant Ids** — which product variants were purchased
* **Collection Ids** — whether purchased products belong to given collections
* **Product Tags** — tags on the purchased products
* **Product Type** — the type of the purchased products

**Order rules**

* **Order Total** — the order's total value
* **Discount Code** — a discount code entered on the order
* **Discount Application** — any applied discount by title (including automatic discounts)
* **Order Source** — where the order was placed, matched exactly against Shopify's source name (for example `web`, `pos`, or `subscription_contract` for subscription renewals). Type the value and press Enter.
* **Order Tags** — tags on the order *(not available for Checkout Steps surveys)*. See [Order tags and the Thank You page](#order-tags-and-the-thank-you-page) below.
* **Order Location Id** — the order's location, including fulfillment locations
* **Subscription Items** — whether the order contains a subscription (selling plan) item
* **Shipping Option** — the shipping method chosen, matched on its title or code (e.g. "Express Shipping") *(not available for Checkout Steps surveys)*
* **Payment Method** — the payment gateway used on the order, matched against Shopify's gateway name (e.g. `shopify_payments`, `paypal`, `gift_card`, or a manual method such as `Cash on Delivery (COD)`) *(not available for Checkout Steps or abandoned checkout surveys)*. Matching ignores capitalization, spaces and punctuation. A value matches whenever the gateway name contains it, so `cod`, `cash on delivery`, and `Cash on Delivery (COD)` all match the same orders. Wallets like Shop Pay, Apple Pay, and Google Pay all process through Shopify Payments and report as `shopify_payments`.
* **Shipping Country** — the country of the order's shipping address *(not available for Checkout Steps or abandoned checkout surveys)*. Orders without a shipping address (local pickup, digital goods) don't match "Is One Of" rules. For location targeting that isn't tied to the order's shipping address, use the general Country rule instead.
* **Shipping Region** — the state, province, or region of the order's shipping address *(not available for Checkout Steps or abandoned checkout surveys)*. Regions are listed with their country, since region codes repeat across countries. Adding a Shipping Country rule narrows the region list to those countries. Orders whose shipping address has no region don't match "Is One Of" rules. Regions are matched on their ISO 3166-2 code, the same standard Shopify uses for addresses. A small number of regions worldwide have no assigned code and aren't available for targeting.

**Customer rules**

* **Orders Count** — how many orders the customer has placed
* **Customer Tags** — tags applied to the customer
* **Customer Total Spent** — the customer's lifetime spend
* **Customer Account** — **Logged In** or **Logged Out**: whether the shopper is signed in to their Shopify customer account *(on-site surveys only)*. Use **Logged Out** to show a survey only to anonymous visitors, or **Logged In** for account holders.
* **B2B Customer** — **Is B2B** or **Is Not B2B**: whether the signed-in shopper is a B2B company contact, as reported by Shopify *(on-site surveys only)*. A logged-out visitor is never B2B, so **Is Not B2B** hides a survey from your wholesale buyers while every other visitor still sees it.

Most list-based rules support **Includes Any / Includes All / Does Not Include Any / Does Not Include All** operators. Numeric rules support the full set of comparisons, such as equals, greater than and less than. Combine rules to build precise segments.

#### Entering products, variants and collections

**Product Ids**, **Variant Ids** and **Collection Ids** store Shopify's numeric IDs. You can fill them two ways:

* **Search by title.** Start typing the product or collection title and pick it from the list. For **Variant Ids**, type the *product* title; each variant is listed as `Product - Variant`. The rule shows the title next to the ID once saved.
* **Paste the ID.** Type or paste the number and press **Enter** to add it. You can find it in Shopify admin: open the product, variant or collection, and copy the number at the end of the page URL (for example `.../products/8123456789`).

{% hint style="warning" %}
**SKUs, handles and product names typed without picking them from the list are not accepted.** The rule compares the IDs on the order, so a SKU such as `LBXS` or a handle such as `blue-shirt` in these fields never matches and the survey won't show. Search by title, or use the numeric ID.
{% endhint %}

**Product Tags**, **Product Type**, **Customer Tags**, **Order Tags**, **Discount Code**, **Shipping Option** and **Payment Method** are free-text: type each value and press **Enter** (or click away) to add it. There is no lookup list. Tags and product types must match the **whole** value, though capitalization is ignored. A partial value such as `Muster` does not match a product type of `Muster (Klick-Vinyl)`.

#### How rules combine: AND and OR

Rules are read top to bottom as one list. The first row starts with **when**. Each row after it starts with **or** or **and**:

* Rows joined by **or** form a group. The group passes when **any one** of its rows passes.
* Choosing **and** on a row starts a second group. The survey shows only when **both groups** pass.

You can have at most two groups, so the full logic is *(any rule in group 1) AND (any rule in group 2)*.

Inside a single row, the operator decides how the values combine:

| Operator                 | Passes when                                                   |
| ------------------------ | ------------------------------------------------------------- |
| **Includes Any**         | at least one of the listed values is on the order or customer |
| **Includes All**         | every listed value is on the order or customer                |
| **Does Not Include Any** | none of the listed values are there                           |
| **Does Not Include All** | not every listed value is there (one or more is missing)      |

{% hint style="warning" %}
**Two exclusions joined by "or" don't both apply.** "Product Ids Does Not Include Any A **or** Customer Tags Does Not Include Any VIP" shows the survey whenever *either* is true. To require both, set the second row to **and**, or put both products in one **Does Not Include Any** row.
{% endhint %}

#### Example: exclude one product

To show a Thank You page survey for every order *except* orders containing one product:

1. Open the survey and go to **Settings → Targeting**.
2. Under **Shopify Targeting Rules**, click **Advanced Rules**.
3. Set the row to **when Product Ids → Does Not Include Any**, then search for the product and select it.
4. Click **Save Changes**.

To exclude several products, add them all to that same row. **Does Not Include Any** hides the survey if the order contains any of them.

To show a *different* survey for that product instead, create a second survey with **Product Ids → Includes Any → the product**, and place it above the catch-all survey in your Surveys list. Zigpoll checks surveys top-down and shows the first one whose rules match. See [Survey Order](/accounts/active-polls).

#### Order tags and the Thank You page

Shopify doesn't give checkout apps the order's tags or source on the **Thank You** page. Zigpoll sees them as empty there. An **Order Tags** or **Order Source** rule set to **Includes** never matches on that page, and one set to **Does Not Include** always does. On the **Order Status** page, and for order-triggered email and SMS, Zigpoll looks up the order itself, so tags that exist at that moment are read.

Tags added by **Shopify Flow** or another app are applied a moment after the order is created. A customer who reloads the Order Status page right away may not have them yet.

For surveys that must render as soon as the order is placed, target what is on the order at checkout instead: **Product Ids**, **Collection Ids**, **Product Tags**, **Product Type**, **Discount Code** or **Subscription Items**.

#### Keeping subscription renewals out of order surveys

Recurring subscription orders fire the same **Order paid**, **Order fulfilled** and **Order delivered** triggers as regular orders. There are two ways to keep them out:

* **Skip renewals only.** Add **Order Source → Excludes → `subscription_contract`**. Shopify gives renewal orders this source name, so the customer's first subscription order still gets the survey.
* **Skip every order with a subscription item.** Use the **Does Not Contain Subscription** basic option, or **Subscription Items → Does Not Contain Subscription**. This also skips the first order that started the subscription.

#### Shopify Markets

There is no **Market** rule. Shopify has deprecated its single-market API for apps, so target the dimension the market stands for:

* **Shipping Country** or **Shipping Region** (Advanced Rules) for Thank You, Order Status, email and SMS surveys.
* **Country** or **Region** (based on the visitor's IP address) for on-site surveys.
* **Language** for markets that differ by language, such as a French storefront.

{% content-ref url="/pages/ONZbTE8bnyvcrHwFaSly" %}
[Advanced Shopify Targeting](/tutorials/advanced-shopify-targeting)
{% endcontent-ref %}


# Language and Translations

Show your survey in the language of your respondent

Open a survey and go to **Settings → Language**.

{% hint style="info" %}
These settings apply to this specific survey only. To translate every survey at once, use the **account language settings** link at the bottom of the survey's Language tab. Account-wide translations are used by any survey that doesn't have its own language settings turned on.
{% endhint %}

{% embed url="<https://youtu.be/SgZEGGktX9k>" %}

If your customers speak multiple languages, you can show each of them your survey in their own language.

A customer browsing your store in French sees the French version of your survey. A customer browsing in Spanish sees the Spanish version. If a customer's language has no translation, they see your default copy.

You control every translation, so you don't have to rely on Google Translate getting it right. Translations are stored in Zigpoll, not in Shopify, so there is nothing to set up in Shopify's translation apps.

### How Zigpoll picks the language

| Where the survey shows                                               | Language used                                                                                                                                                                                                                                                                   |
| -------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| On your site (pop-up, embed, exit intent)                            | The language the page declares (its `<html lang>` attribute). Shopify themes set it to the storefront language the shopper chose, including per-market languages and translated URLs like `/fr/`. If the page doesn't declare one, Zigpoll uses the visitor's browser language. |
| Shopify checkout, Thank You, Order Status and customer account pages | The language the customer is checking out in, as reported by Shopify.                                                                                                                                                                                                           |
| Survey links (`survey.zigpoll.com/...`)                              | The visitor's browser language.                                                                                                                                                                                                                                                 |
| Email and SMS invitations                                            | See [How Zigpoll knows the customer's language](#how-zigpoll-knows-the-customers-language) below.                                                                                                                                                                               |

Zigpoll doesn't use the visitor's IP address or a VPN location to pick the language.

There is no language picker or switch button inside the survey itself. Respondents don't choose a language: Zigpoll picks it from the rules above, and you can force one with `?lang=` (next section). To offer a choice, link to the survey once per language, each link with its own `?lang=`.

#### Force a language with `?lang=`

To force a language regardless of the browser, add `?lang=` and a language code to the survey link. This also works on the address of the page the survey shows on. For example:

* `https://survey.zigpoll.com/SURVEY_ID?lang=fr`
* `https://survey.zigpoll.com/SURVEY_ID?lang=pt-BR`

The code must match a language you've added to the survey. Otherwise the default copy is shown.

### Changing the default language

Your **default** copy is what everyone sees when their language has no translation. The questions and answer options use whatever you wrote them in. The survey buttons and messages start in English. To change them:

1. Open the survey and go to **Settings → Language**, then the **Buttons & Hints** tab.
2. Edit the **Default** column directly, or use **Translate Default CTAs** to translate every default button, hint and message into another language at once. **Reset Default CTAs** puts them back.
3. Click **Save Changes**.

Launcher text is edited on **Settings → Design → On-Site**, not here.

### Where to find auto-translations

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-5647ef8e4deb04706ee7a188c6190fcd15c088f3%2Flanguage-settings.png?alt=media" alt="Language Settings"><figcaption></figcaption></figure>

### Auto translating your survey

When you add a language, one click of **Auto translate** translates everything in that language card:

* **Questions tab:** your questions and answer options.
* **Buttons & Hints tab:** buttons and actions, words and phrases, error and alert messages, launcher content, the reward banner, and your email and SMS invitation copy.

You can edit any translation by hand afterwards.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-edc317f3fc15ff4e1db77e9bb0e6c1d80b0d3113%2Flanguage-auto-translate.png?alt=media" alt="The Auto-translate button on a language card" width="559"><figcaption></figcaption></figure>

{% hint style="warning" %}
Click **Save Changes**, or your translations won't be saved and you'll have to redo them.
{% endhint %}

### Previewing your translations

The preview panel on the Language tab shows the language card you're editing, live, including unsaved changes. Switch between three views to check each channel before you save: **survey**, **email**, and **SMS**.

### Translating action button URLs

On questions with action buttons, each language card has its own **Button URL**. Use it when, for example, your French customers should land on your French site. Leave it blank to use the button's default link. **Auto translate** never changes URLs, so set them yourself for each language.

### Right-to-left languages

Surveys in right-to-left languages (Arabic, Hebrew, Persian, Urdu, and others) display right-to-left automatically. The layout, rating scales, matrix grids, and inputs are all mirrored. To force a direction yourself, use the **Text Direction** design setting.

### Region-specific languages

You can add both a base language and region-specific variants, for example `fr` (French) and `fr-CA` (French, Canada). The language picker lists variants under their base language, including `zh-TW` (Chinese, Traditional, Taiwan), `pt-BR` (Portuguese, Brazil), `es-MX` (Spanish, Mexico) and `en-GB` (English, United Kingdom).

A visitor with a `fr-CA` locale sees:

1. Your `fr-CA` translations, where you've provided them.
2. Your `fr` translations for anything you haven't translated into `fr-CA`.
3. Your default copy for anything left.

Visitors from any other French-speaking region get `fr`. This works everywhere the survey appears, including Shopify checkout and Thank You / Order Status pages.

### Translating your Email and SMS invitations

Each language card also has an **Email Copy** and an **SMS Message** section. Fill these in, and Zigpoll sends the matching language whenever it knows the customer's language. A French customer receives your French email or text. Everyone else receives your default copy.

You can translate:

* **Email**: subject, header, body, button, and footer
* **SMS**: the message text (max 125 characters)

Any field you leave blank uses your default copy, so you can translate only the subject line if that's all you need. The email body opens in an editor window. It supports the same template variables as your default email, so variables like `{{ first_name }}` work in every language.

{% hint style="info" %}
Your **default** email and SMS copy is still edited on the survey's Email and SMS tabs. The language cards only hold the translations.
{% endhint %}

#### How Zigpoll knows the customer's language

The language is detected automatically depending on how the survey is delivered:

| Delivery method                                                        | Language source                                                             |
| ---------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| Shopify checkout / Thank You / Order Status / customer account surveys | The buyer's Shopify locale                                                  |
| Shopify order events (paid, fulfilled, delivered)                      | The order's customer locale from Shopify                                    |
| Abandoned checkout emails                                              | The checkout's customer locale from Shopify                                 |
| Shopify Flow actions                                                   | The customer's locale from Shopify                                          |
| Shopify customer segment campaigns                                     | Each customer's locale from Shopify                                         |
| CSV campaigns (email and SMS)                                          | An optional `locale` (or `lang` / `language`) column — e.g. `fr` or `fr-CA` |
| Stripe events                                                          | The checkout locale or the customer's preferred language                    |
| Nudge reminders                                                        | The language of the original send                                           |
| Manually pasted recipient lists                                        | Not available — default copy is sent                                        |

Region-specific languages work the same way they do for surveys. A `fr-CA` customer gets your `fr-CA` translations where provided, then `fr`, then your default copy.

When a message is sent in a customer's language, the survey link carries that language too. A customer who clicks through from a Japanese email or text sees the survey in Japanese, whatever their browser settings. This applies to Zigpoll survey links. Custom links are left untouched.

### How translated answers are reported

Answers are always recorded under your **original** (default-language) option, whichever language the customer saw. A customer who picks *Très satisfait* on the French survey is counted under *Very satisfied*. Results, charts and exports combine every language into one set of options. Question logic matches the original options too, so you only build it once.

Write-Ins are kept exactly as the customer typed them, in their own language.

{% hint style="warning" %}
**Seeing old or unexpected question text for some customers?** Translations are separate copies of your questions. If you change a question or its options after translating, update or re-run **Auto translate** for each language, or customers in that language keep seeing the old wording.
{% endhint %}


# Management Options

Learn how to manage your legacy surveys and keep your account clean.

When old surveys pile up, you can archive them or delete them.

You'll find both in two places:

* The **⋯** menu on each survey in your **Surveys** list, and on the survey's dashboard.
* **Settings → General → Manage** inside the survey, in the **Management Options** card.

#### The survey ⋯ menu

| Item                                      | What it does                                                                                                                                                                                                                                             |
| ----------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Edit Survey** / **Edit Questions**      | Opens the survey's settings or its questions.                                                                                                                                                                                                            |
| **View Dashboard** / **View Table**       | Opens the survey's results.                                                                                                                                                                                                                              |
| **Preview Survey** / **Open Public Link** | Shows the survey as respondents see it. **Open Public Link** appears while the survey is active.                                                                                                                                                         |
| **Hide Survey** / **Activate Survey**     | Takes the survey offline or puts it live. Its data is kept either way.                                                                                                                                                                                   |
| **Duplicate Survey**                      | Copies the survey's questions, settings, logic and translations, with no responses. The copy starts inactive, at the top of your list.                                                                                                                   |
| **Export CSV**                            | Emails you a CSV of the survey's responses. See [Exporting Data to CSV](/tutorials/exporting-data-to-csv).                                                                                                                                               |
| **Download Survey JSON**                  | Downloads the survey's definition (questions, settings, and logic) so you can import it into another account. It contains no responses.                                                                                                                  |
| **Copy Survey ID**                        | Copies the survey's ID.                                                                                                                                                                                                                                  |
| **Archive Survey** / **Unarchive Survey** | See below.                                                                                                                                                                                                                                               |
| **Clear Preview Responses**               | Deletes the answers left by previewing the survey or by test emails and texts, and leaves real responses alone. Only shown while the survey has preview answers. See [Deleting Survey Responses](/tutorials/deleting-responses#clear-preview-responses). |
| **Reset Survey Data**                     | Deletes all of the survey's responses. Only offered in the survey's first 48 hours. See [Deleting Survey Responses](/tutorials/deleting-responses#start-a-survey-over).                                                                                  |
| **Delete Survey**                         | See below.                                                                                                                                                                                                                                               |

Team members with the **Read only** role don't see the items that change a survey.

**Management Options** on **Settings → General → Manage** has **Duplicate survey**, **Export survey** (**Download JSON**), **Archive survey** (a switch), and **Delete survey**.

#### **Archive The Survey**

Archiving a survey takes it offline and moves it to the bottom of your **Surveys** list. You keep all of its data, and you can **unarchive** it at any time.

To hide archived surveys from your list, click the gear icon above your **Surveys** list and untick **Archived**. To bring a survey back, open its **⋯** menu and choose **Unarchive Survey**. Unarchiving doesn't make it live again. Choose **Activate Survey** when you're ready.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-d74f6aa77b73e80085ec1881852a24f02c139ebf%2Fsurvey-archive.png?alt=media" alt="Archive survey in Management Options" width="550"><figcaption></figcaption></figure>

#### Delete The Survey

Only delete a survey if you are **100% sure** you no longer want it or **any of the data associated with it.** Archiving is usually the better choice.

Choose **Delete Survey** from the **⋯** menu, type **permanently delete**, and confirm.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-6a781e1aef4553128797dab95e84ef2a1dd3f9d6%2Fsurvey-delete.png?alt=media" alt="Delete survey in Management Options" width="550"><figcaption></figcaption></figure>

{% hint style="info" %}
Deleting a survey removes the survey and all of its data. **This action cannot be undone.** It also doesn't lower the number of responses counted toward your monthly plan limit.
{% endhint %}


# Questions

View and reorder your questions.

A survey will naturally contain one or more Questions. These questions will be displayed in the order shown in this list. In this section you can:

* See exactly which questions you are showing within your survey.
* Drag & Drop to reorder your questions.
* Temporarily remove a question without deleting it: open the question's context menu (⋯) and choose **Hide Question**. Hidden questions show a badge in the listing and are skipped when the survey runs; choose **Show Question** to bring one back.
* Hiding and showing a question can also be automated. Through the [MCP server](/integrations/mcp), ask your AI assistant to hide or show a question (it calls `update_slide` with `settings: { hidden: true }` or `false`). Through the [Web API](/web-api), send `settings.hidden` to `/slide/update` together with the question's other settings, since the API replaces the whole settings object.

{% hint style="info" %}
Reordering your questions will change the order they appear, the update will happen instantly once you drag and drop. You can click through a preview your survey in the neighboring window.
{% endhint %}

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-e347b129b6e0172bdfa67c8291fa4e25f6663086%2Fquestions-page.png?alt=media" alt="The Questions page"><figcaption></figcaption></figure>

#### Templates and inspiration questions

Zigpoll has collected survey questions being asked by some of the fastest growing ecommerce brands using the platform and added them to our template library.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-44ab390ce3f95bf84cad657a8d4d155be1d14a20%2Fnew-question-template-menu.png?alt=media" alt="Start with a Template in the New Question menu" width="640"><figcaption></figcaption></figure>

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-215a5f9130fc9da10e870ae08d0cdb6b4646ed91%2Fquestion-templates.png?alt=media" alt="The Question Templates window"><figcaption></figcaption></figure>


# Survey Preview

See your Zigpoll survey in action before taking it live

To try a fully working version of your survey before it goes live, click **Preview** on the survey. The survey opens in a new window, where you can answer every question and follow your logic.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-31bbe61d68f4f90ef19e97fddb2ad37c973fe006%2Fsurvey-preview-icon.png?alt=media" alt="The preview icon in the survey header" width="580"><figcaption></figcaption></figure>

{% hint style="info" %}
The preview works for hidden surveys too, so you can perfect your survey before it goes live.
{% endhint %}

## What the preview does

* **Answers don't count.** Answers you give in the preview don't count toward your monthly response limit, and preview views aren't tracked.
* **It always starts fresh.** The preview ignores any progress saved in your browser, so every preview starts from the first question.
* **It matches the survey's format.** On-site surveys open on a sample page. Thank You & Order Status surveys open on a sample Thank You page. Email and link surveys open as the survey page.

{% hint style="warning" %}
The sample Thank You page uses your Zigpoll Design settings. On your real Thank You page, Shopify styles the block with your checkout branding instead. To see the real look, use the Shopify checkout editor. See [Shopify Checkout Limits](/installation/shopify-checkout-limits).
{% endhint %}

## Sharing a preview with teammates

The preview link only opens for people signed in to Zigpoll with access to your account.

* **Teammates:** add them to your account, then send them the preview link. See [Adding Team Members](/tutorials/adding-team-members).
* **Anyone else:** send the survey's link once the survey is **Live**. A hidden survey's link shows nothing. Answers given through the survey link count as real responses. See [Public Link](/public-link).

## Previewing on your phone

Open the preview link in your phone's browser and sign in to Zigpoll. The preview shows the survey at your phone's screen size.

To see an on-site survey exactly as mobile visitors do, visit your live site on the phone itself rather than using browser emulation.

## Previewing on your live site

A hidden survey never loads on your site. The preview window is the only place it shows. To check a survey on your real pages before customers see it:

1. Limit where it appears. On **Settings → Delivery → Locations**, restrict the survey to a page your customers don't visit.
2. Set the survey to **Live** and open that page in a private window.
3. When you're happy, widen the Locations rules to the pages you want.

For Thank You and Order Status surveys, use the Shopify checkout editor instead. See [Checking it works without placing a real order](/faq/why-is-my-survey-not-showing#i-want-to-check-it-works-without-placing-a-real-order).

## My test run is stuck on the end screen

A survey link or on-site survey remembers in your browser that you finished it. If you open it again in the same browser, it goes straight to the end, or doesn't appear at all. This is expected. It stops real customers from being asked twice.

To take the survey again:

* Open it in a private or incognito window, or
* Clear the site data for the survey's page in your browser settings. For a survey link, that's `survey.zigpoll.com` or your custom survey domain.

The dashboard preview isn't affected. It always starts from the first question.


# Migrate a Survey to Another Account

Copy an existing survey from one Zigpoll account into another by exporting it to a JSON file and importing it on the destination account.

To move a survey between accounts, export it to a `.json` file and import that file into the other account. Use this to:

* Reuse a proven survey across multiple brands or clients.
* Hand a template off to a colleague.
* Copy a survey from a staging account into your production account.

Migration happens in two steps:

1. **Export** the survey from the source account to a JSON file.
2. **Import** that file into the destination account.

{% hint style="info" %}
**This migrates the survey itself — not its responses.** The export file contains the survey definition (questions, answer options, logic, settings, translations, and any email templates it uses). Collected responses, analytics, and sentiment data are **not** included. If you also need to move historical response data, see [Importing data](/polls/importing-data).
{% endhint %}

### Before you start

* You need access to **both** accounts — the one you are exporting from and the one you are importing into. Imports always go into the account you are currently viewing, so you must be able to switch to the destination account.
* Integrations (Shopify, Stripe, Square, Klaviyo, etc.) are connected **per account**. If your survey relies on an integration, make sure that integration is connected on the destination account too. See [Troubleshooting](#troubleshooting) below.

## Step 1 — Export the survey from the source account

1. Open the survey you want to migrate and go to its **Settings → General → Manage** sub-tab.
2. In the **Management Options** card, find **Export survey**.
3. Click **Download JSON**.
4. Your browser downloads a JSON file named after the survey, for example `Post-Purchase Survey_2026-6-22.json`.

The exported file is a portable survey definition. It includes:

* The survey **title** and all of its **questions** and answer options
* **Branching and skip logic**, display rules, and workflow settings
* **Design, targeting, and delivery settings**
* **Languages and translations**
* Any **account email templates** the survey references (follow-up emails and send-email actions are bundled into the file automatically)

It does **not** include responses, vote counts, sentiment, timestamps, or anything tied to the original survey's identity.

## Step 2 — Switch to the destination account

Use the account switcher to open the account you want to import the survey into. The import always goes into the account you are currently in, so you can only import into an account you have access to.

## Step 3 — Import the survey

1. Go to your **Surveys** list in the destination account.
2. Click **New Survey** and choose **Import from JSON**.
3. Drag your exported `.json` file into the upload area, or click to select it.
4. Click **Upload**.

{% hint style="info" %}
You can also import from **Account Settings → Survey Import**. Both routes use the same importer.
{% endhint %}

{% hint style="info" %}
**Moving to a new Shopify store?** Export and import each survey as described here. The copy gets a new survey ID and survey link, so update any links you've shared. To keep your response history as well, see [Multi-Store Management](/faq/multi-store-management#im-moving-to-a-new-shopify-store-can-i-keep-my-surveys-and-history).
{% endhint %}

Zigpoll recreates the survey in the destination account, including its questions, logic, settings, and translations, and opens it in the editor. Any email templates bundled in the export are added to the destination account as well.

{% hint style="info" %}
**Imported surveys start hidden.** A new import is inactive, so it never goes live before you've reviewed it. You'll turn it on in the next step.
{% endhint %}

## Step 4 — Review and activate

Finish setup before the survey goes live:

1. **Review the settings** — confirm targeting, delivery, and design look right in the new account.
2. **Reconnect anything account-specific** — re-check integration actions, notification recipients, and webhooks so they point at the destination account's connections.
3. **Activate it** — turn on visibility / set the survey active when you're ready. See [Delivery Settings](/polls/visibility-settings).

## What migrates and what doesn't

| Migrates                                           | Does **not** migrate                                            |
| -------------------------------------------------- | --------------------------------------------------------------- |
| Survey title, questions, and answer options        | Responses and vote counts                                       |
| Branching / skip logic and display rules           | Analytics and sentiment data                                    |
| Design, targeting, delivery, and workflow settings | The original survey's ID and history                            |
| Languages and translations                         | Live/active status (imports start hidden)                       |
| Referenced email templates                         | Integration connections (must exist on the destination account) |

## Troubleshooting

**"Invalid survey format uploaded."** The file must be a JSON file produced by Zigpoll's **Export survey** option. Re-export from the source survey and upload that file. Editing the JSON by hand can break the format.

**My responses didn't come over.** That's expected — migration moves the survey definition only. To bring historical response data into the new survey, use the CSV-based [Importing data](/polls/importing-data) flow.

**My integration actions or webhooks aren't working.** Integrations are connected per account. Connect the relevant integration on the destination account, then confirm the survey's actions and webhooks reference it.

{% hint style="info" %}
Need help moving a survey or its data between accounts? [Contact us](https://www.zigpoll.com/contact) and we'll be glad to help.
{% endhint %}


# Importing data

Import historical responses from another Zigpoll survey to keep all your data in one place and use Zigpoll's analysis tools on it.

To do this, export the responses from your old survey, then make sure the CSV is formatted correctly.

{% hint style="info" %}
Looking to copy the **survey itself** — its questions, logic, and settings — into another account? That's a separate flow. See [Migrate a Survey to Another Account](/polls/migrate-survey). This page covers importing historical **response data** from a CSV.
{% endhint %}

#### Exporting your historical response data from Zigpoll

Export the responses from your old survey to CSV. See [Exporting Data to CSV](/tutorials/exporting-data-to-csv).

{% hint style="info" %}
**Download JSON** on a survey's **Settings → General → Manage** sub-tab exports the survey definition as a JSON file, not its responses. Use it to [copy the survey](/polls/migrate-survey), not to move data.
{% endhint %}

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-84249d3248172b40fd11a56cc1628da19852d157%2Fsurvey-export-json.png?alt=media" alt="Export survey in Management Options" width="550"><figcaption></figcaption></figure>

#### Preparing your data for import

[Click here](https://www.zigpoll.com/sample_zigpoll_import.csv) to download a sample CSV file.

The first row of the CSV is the header. Each row after it becomes one response. Use these column headers:

* **Question ID** — one column per question, with the answer in each row. To find a question's ID, open the survey, go to **Questions**, select the question, and open its **Dashboard**. Click the **Question Id** card to copy it.
* **shopify\_customer\_id** — a special header for Shopify customer IDs. It identifies the participant who gave the response. Leave it out if you don't have them.
* **email** or **name** — also identify the participant when there's no Shopify customer ID. Optional.
* **shopify\_order\_id** — a special header for Shopify order IDs. Leave it out if you don't have them.
* **order\_value** — the value of the order. Leave it out if the response isn't tied to a purchase.
* **timestamp** — when the response was originally given. Optional.

Any other columns are saved as metadata on the response.

#### Running the import

1. Open the survey you want to import into and go to **Settings → General → Manage**.
2. In the **Import Response Data** card, drop your CSV into **Upload import CSV** and click **Import CSV**.
3. Check the summary. It tells you which columns matched questions in this survey. If none match, check that your header row uses the question IDs from this survey.
4. Click **Import**.

The import runs in the background, so you can leave the page. You'll get an email when it has finished.

Need help migrating data or preparing your CSV, even from another provider? Contact <support@zigpoll.com> and we'll help.

{% hint style="info" %}
Coming from another survey tool? See [Migrating from Delighted to Zigpoll](/tutorials/migrate-from-delighted) for a provider-specific walkthrough.
{% endhint %}

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-60cdc98ebd2ca1007a17f2105fed1193d1161c47%2Fsurvey-import-response-data.png?alt=media" alt="The Import Response Data card" width="550"><figcaption></figcaption></figure>


# Top 4 Surveys to Start With

Make the most of the platform by starting with these surveys

After reviewing how some of the fastest-growing ecommerce brands use our surveys, here are four easy-to-implement surveys. These are survey questions that are easy to install, fast to collect data, and designed to provide immediate business value.

***

#### 1. Post-Purchase Attribution ("How did you hear about us?")

Traditional attribution is failing marketing agencies and brands because platforms like GA4 struggle to track view-through conversions and often incorrectly label sales as "direct".

* The Goal: Uncover the true drivers of your sales, including "hidden" channels like influencers, podcasts, or word-of-mouth (WoM).
* Why it works: It captures the customer’s actual journey.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-3bd545ea863eee947c7b1ade7d952c5e6e8128cd%2Fquestion-type-single-choice.png?alt=media" alt="Survey question: How did you hear about us?" width="444"><figcaption></figcaption></figure>

***

#### 2. Conversion Diagnostics ("What almost stopped you from purchasing?")

Don't guess why your site isn't converting. Ask the visitors who just navigated it. This is your most powerful tool for Conversion Rate Optimization (CRO).

Ask this question in post-purchase or in exit-intent popups.

* The Goal: Identify "conversion killers" such as bugs, pricing confusion, or missing information.
* Why it works: You can run this as a post-purchase question or as an exit-intent survey for visitors about to bounce.

**One brand discovered that customers almost didn't purchase due to missing colorways. Launching those colorways led to a 6-figure product line.**

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-92080fdb544a7fd04ba4615b66180ff1e3176e6f%2Fquestion-type-long-answer.png?alt=media" alt="Survey question: What almost stopped you from purchasing from us?" width="444"><figcaption></figcaption></figure>

***

#### 3. Gift Tracking and Segmentation ("Who are you buying for?")

Gift buying is consistently higher than you think!

* The Goal: Asking this question in post-purchase helps with determining what % of your customers are gift-purchasers, when gift buying starts to increase, and who the gift recipient is.
* Why it works: Knowing if a customer is buying for themselves vs. as a gift changes everything.

**One brand discovered that 30% of their purchasers were women buying gifts for partners**, leading them to completely overhaul their ad creative.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-952ed16e7f713c5ba2b69d78405753ea54f39431%2Fsurvey-example-gift.png?alt=media" alt="Survey question: Who are you buying for?" width="444"><figcaption></figcaption></figure>

***

#### 4. Abandoned Cart Diagnostics ("Why are you leaving?")

When a visitor adds items to their cart but doesn't check out, you have a unique opportunity to capture their feedback at the moment of highest intent.

* The Goal: Understand the specific blockers at checkout, such as shipping costs, payment issues, or simply waiting for a discount.
* Why it works: You can trigger exit-intent surveys specifically for cart-leavers.

**One brand realized that over 50% of abandoned carts were from customers just testing to see if they could trigger a coupon code.**

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-838c7ed8ecc8bfdea62208e2d01007bb890ed2d0%2Fsurvey-example-abandoned-cart.png?alt=media" alt="Survey question: Why are you leaving?" width="444"><figcaption></figcaption></figure>


# Questions

Not sure you understand questions? Don't worry, you're in the right place. Everything you need to know can be found here.

### What is a question?

A question a building block of a survey - and generally can be viewed as a "question".

A survey must contain at least one question before it can be made visible, but a survey can have as many questions as you want. A question can be of several different types.

### **What kind of questions are there?**

There are over two dozen question types, grouped into Choice, Rating & Ranking, Open Ended, Content, and Other. More are added regularly. Your current options are pictured below:

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-5c2781beecbda2ecbd4f56f1d23acc3cb50e378c%2Fquestion-types.png?alt=media" alt="The question type picker"><figcaption></figcaption></figure>

You can learn more about each one in the section below.

{% content-ref url="/pages/2DTgdCIZNDybWe4HLTi2" %}
[Types of Questions](/questions/types-of-questions)
{% endcontent-ref %}

{% hint style="info" %}
If you have an idea for a new type of question, please [let us know](mailto:support@zigpoll.com)!
{% endhint %}

### Can I reorder my questions after I have created them?

Yes. To reorder the questions go to the parent survey's page and you will see all your questions listed under the [survey preview section](/polls/poll-preview), you can drag and drop these questions to change the order.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-a21e888f82effbf7589a534a1b8e35d438c32fbe%2Fquestion-management.png?alt=media" alt="The Question Management list" width="701"><figcaption></figcaption></figure>


# Types of Questions

Learn about all the different types of questions at your disposal.

There are currently 26 types of questions. Each type behaves differently and was built to help you collect the right data from your customers and site visitors.

All of the options allow you to enter a Title, Subtitle, and Body Copy.

The rest of this doc dives into each type of question, how it can be used, and an example picture. We recommend hopping into Zigpoll's free plan and experimenting with different questions yourself!

#### Multiple Choice

This type lets you create several answer options. Your customer can pick one or more.

Once the customer submits the answer, the results can be shown (this is optional, you can hide it if you prefer by deselecting **Show Results**). You can have as many answers as you like.

You can also add a **Write-in Answer**: a last option where people type their own response. What they type is collected and shown with the other answers on the dashboard.

You can also lay the answer options out in up to **4 columns** using the **Layout** setting (available on Multiple Choice and Single Choice questions).

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-6ff02cc6c61c49135e1e2997df94169fa5b5cd1f%2Fquestion-type-multiple-choice.png?alt=media" alt="A Multiple Choice question" width="444"><figcaption></figcaption></figure>

#### Single Choice

This type lets you create several answer options. Your customer can pick one.

Once the customer submits the answer, the results can be shown (this is optional, you can hide it if you prefer by deselecting **Show Results**). You can have as many answers as you like.

You can also add a **Write-in Answer**: a last option where people type their own response. What they type is collected and shown with the other answers on the dashboard.

Like Multiple Choice, Single Choice supports the **Layout** setting to lay options out in up to 4 columns.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-3bd545ea863eee947c7b1ade7d952c5e6e8128cd%2Fquestion-type-single-choice.png?alt=media" alt="A Single Choice question" width="444"><figcaption></figcaption></figure>

#### Dropdown

A single-select question presented as a compact dropdown menu. Ideal when you have many options but want to keep the question visually small.

#### Mosaic

A multiple-choice question where the answer options render as a tiled grid directly in the question, letting respondents tap selections quickly. Great for visual, fast-moving surveys with many short options.

#### Autocomplete

A single-select question with a searchable, type-ahead input. As the respondent starts typing, the list of answer options filters down to matches.

This is ideal when you have a long list of choices — for example a product, store location, or brand — that would be unwieldy as a dropdown or a list of multiple-choice options. You can add as many options as you like, and (like Single Choice) include a **Write-in Answer** that lets respondents type in their own value.

#### Matrix

Ask several questions that share the same set of answer options, laid out as a grid: each **row** is a question and the **columns** are the shared choices. Respondents pick one option per row, or several per row if you turn on **Multiple selections**.

This is ideal for rating multiple items on a single, consistent scale — for example rating Shipping, Packaging, and Support each as "Poor / Okay / Great" in one compact question instead of three separate ones.

Each row is reported as its own breakdown on your dashboard, just like a Single Choice question, so there is no extra work to analyze the results. You can optionally enable **Randomize Rows** and **Randomize Answers** to shuffle the rows and columns (pin any you'd like to keep in place), and the whole question can be marked optional.

**Multiple selections** (in the question's Settings, or the Rows menu) turns the grid's radio buttons into checkboxes so a respondent can pick more than one answer in each row — for example "Which of these have you used?" across several products. A row still needs at least one pick unless the question is optional, and **Selections per row** (shown once Multiple selections is on) lets you require at least, exactly, or at most a number of picks in every row. The Matrix input inside a **Form** has the same Multiple selections toggle, without the per-row rule. Your results then work the way a Multiple Choice question's do: each row's percentages start as the **share of answers** in that row, and clicking a percentage switches to **penetration rate** — the share of respondents who picked that answer, where a row can add up to more than 100%. The question also gets a **Selections** count beside **Answers**. In exports and integrations a row with several picks reads `Row: Answer + Answer`.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-1944681f1d33d8ffd6d0f4e1568a3cb76a7f654d%2Fquestion-type-matrix.png?alt=media" alt="A Matrix question" width="444"><figcaption></figcaption></figure>

#### Short Answer

Write-in in a single line box. You can set placeholder text or fine print.

Once you have enough volume of write-ins, Zigpoll will help with summarizing themes and responses.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-bb6ba8493d032834de672d6a880dde67a8e8541c%2Fquestion-type-short-answer.png?alt=media" alt="A Short Answer question" width="444"><figcaption></figcaption></figure>

#### Long Answer

Write-in in a multi-line box. You can set placeholder text or fine print.

Once you have enough volume of write-ins, Zigpoll will help with summarizing themes and responses.

**File uploads** (in the question's Settings, under Answering) lets respondents attach files to what they write. The text box gains an attach bar along its bottom edge, so a "Describe the issue" question can take a photo or a receipt without a second question. Attaching is always optional, and an answer still needs some text: files on their own are not accepted. Turn on **File types** beneath it to accept only certain kinds of file.

The files are kept with the answer. On the Answers and Participant pages they appear under the text, as links (images open in place). In exports and integrations, where an answer is one value, it reads `the text [Files: link, link]`, and notification emails list each file as a link. Logic rules, sentiment and AI summaries read the text only.

In the Shopify checkout and thank-you page extensions the question shows as a plain Long Answer, without the attach bar.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-92080fdb544a7fd04ba4615b66180ff1e3176e6f%2Fquestion-type-long-answer.png?alt=media" alt="A Long Answer question" width="444"><figcaption></figcaption></figure>

#### Binary choice

Useful if you want a "Yes/No" answer between two choices.

For example: "Are you buying this for someone else?"

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-8d82c9cd3f1fb26ac3dac84065cc927b0b34efa9%2Fquestion-type-binary-choice.png?alt=media" alt="A Binary Choice question" width="444"><figcaption></figcaption></figure>

#### Form Panel

A question that allows you to have multiple fields. These are best used for "contact us" or support forms.

When creating each field within a form panel, you have the option to set the type of question (email, long answer, phone number, date etc.) and whether the field is optional or required.

When filled out, the responses will be grouped together on your dashboard for convenience.

A **Long Answer** field has a **File uploads** switch. Turn it on and the field becomes one box: the text area, with an attach bar along its bottom edge. Attaching is optional even when the field itself is required, and **File types** beneath the switch limits what is accepted. The files are recorded as their own answer, named after the field ("Question/Comment Files"), and it is left out wherever the form's answers are listed if nothing was attached. In the Shopify checkout and thank-you page extensions the two show as separate fields, a text area followed by an optional file upload.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-91d890d38bcf0d8ba2254a29b12c37145039bd52%2Fquestion-type-form-panel.png?alt=media" alt="A Form Panel question" width="444"><figcaption></figcaption></figure>

#### File Upload

File uploads let respondents upload files, and you can restrict the number of files allowed, file type, and max file size. This can be useful for wholesale use cases, support, or for custom designs!

File Upload isn't available on [Shopify POS](/installation/activating-zigpoll-on-shopify-pos) surveys, since the register has no file picker; it's hidden from the question picker when a survey uses a POS delivery template.

Additionally - if you would like your user to take a picture, enable the "mobile auto-capture" field. When enabled the camera will pop up on mobile devices automatically for a streamlined experience. This will limit the number of files accepted to 1 file only. Great when you're expecting photos or UGC content.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-a5610e81ea2743f54ae4e7a8efe31b90246898ee%2Fquestion-type-file-upload.png?alt=media" alt="A File Upload question" width="444"><figcaption></figcaption></figure>

#### Image Choice

Upload a set of images to allow customer to pick from. Can upload unlimited images in theory, but best to cap it at 6.

The **Selections** setting controls how many images must be picked, and the image columns setting how many are shown per row. (Image Choice columns are separate from the **Layout** setting on choice questions and have no 4-column cap.)

Best used for product/design feedback or to see whether respondents remember a particular ad creative — for example, testing ad recall on channels like TV.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-bedac479b7be20fee588640e206da4e1c43d0f72%2Fquestion-type-image-choice.png?alt=media" alt="An Image Choice question" width="444"><figcaption></figcaption></figure>

#### Consent

Useful if you want to opt-in users for marketing communications or Terms & Services.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-52ee812e2f6d420a2662577d95e7733756052a1e%2Fquestion-type-consent.png?alt=media" alt="A Consent question" width="444"><figcaption></figcaption></figure>

#### Country

Allow respondents to select from a list of countries.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-9771e8618a68f84980b12b86b4339b69f12fc71c%2Fquestion-type-country.png?alt=media" alt="A Country question" width="444"><figcaption></figcaption></figure>

#### Date

Let respondents pick a date — useful for capturing birthdays, delivery dates, or event dates for follow-up.

The answer is stored as the calendar day the respondent picked (for example `2026-09-14`), with no time or time zone, so it reads the same in your dashboard, exports, and integrations no matter where the respondent is.

#### Star Rating

This type is useful if you want to get a 1-5 rating from your customers. The UI is large, colorful, and simple to optimize engagement, and you can customize the labels.

*For example: How would you rate our support?*

Two settings control the look:

* **Type** — rate with **Stars** or **Hearts**.
* **Style** — choose from over a dozen illustrated styles: Default, Emoji, 3D, Anime, Clay, Comic Book, Crystal Glass, Hand Drawn Doodle, Holographic, Oil Painting, Origami Paper, Pixel, and Watercolor.

When a respondent picks a rating, every star up to their selection fills in — so a 4-star answer shows four filled stars, not just one.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-c09fef74385b3aeb0b97fb8a1875626a6924f7f3%2Fquestion-type-star-rating.png?alt=media" alt="A Star Rating question" width="444"><figcaption></figcaption></figure>

#### Slider

Useful for a scale measurement of a metric.

You have the ability to change labels, change the increment of the slider.

If you want the slider to represent options 10,20,30... you would set increment to 10.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-42a895adbec9745930c4100a059dd9a127a46ac6%2Fslider-answer-options.png?alt=media" alt="Slider answer options: range and increment" width="681"><figcaption></figcaption></figure>

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-6c3872d58a93c12528968c8d2ee4602e4c734bd9%2Fquestion-type-slider.png?alt=media" alt="A Slider question" width="444"><figcaption></figcaption></figure>

#### Email Capture

This will create an email capture form. The user is required to enter his or her email before proceeding with the survey.

{% hint style="info" %}
The emails will be saved to your account and can be exported into your mailing list at any time.
{% endhint %}

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-ee296d50f60dbe8a59eb6a41e3afd2e795ca9fb7%2Fquestion-type-email.png?alt=media" alt="An Email question" width="444"><figcaption></figcaption></figure>

#### Phone Number

Collects a phone number using a specially formatted input that validates and formats the number as the respondent types. Useful for follow-up, SMS opt-ins, or support.

Set a **Default Country** in the question editor to pre-select the country code most of your respondents will use. Phone fields inside a Form question have their own Default Country setting and fall back to the question's default when none is set.

{% hint style="info" %}
Like email capture, collected phone numbers are saved to your account and can be exported at any time. You can also send SMS survey invitations to these numbers.
{% endhint %}

#### Range

Create a list of inputs from 1-10. This type is useful if you want to do a heat check on a new feature.

*For example: How do you like our new feature from 1-5?*

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-87c2977c51a191e72a79e73175c0dc5b0620ec83%2Fquestion-type-range.png?alt=media" alt="A Range question" width="444"><figcaption></figcaption></figure>

#### Satisfaction

This is another useful type for capturing user feedback. It is more limited in that you only have five emotions, but it can be helpful for getting a quick reaction to a new feature.

*For example: How satisfied are you with our return policy?*

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-eba8210e9a0245e0b60c0d043f09a08c9b5dcbd4%2Fquestion-type-satisfaction.png?alt=media" alt="A Satisfaction question" width="444"><figcaption></figcaption></figure>

#### Promo Code

Add a question that displays a discount code!

Full tutorial below

{% content-ref url="/pages/Unv1KnjO66PubFN1WBCb" %}
[Adding discount codes to your survey](/tutorials/adding-discount-codes-to-your-survey)
{% endcontent-ref %}

#### Actions

Actions were designed to send respondents to another link. This is particularly useful if you want to send them to social media platforms, another page on your site, or to leave a review.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-a4a685fb4724a8bb10fdb8f50928fa7238826043%2Fquestion-type-actions.png?alt=media" alt="An Actions question" width="444"><figcaption></figcaption></figure>

#### Text & Image

A content-only question (no question) that displays a title, copy, and optionally an image. Use it to introduce your survey, add context between sections, or make an announcement.

#### Thank You

A closing content question shown after the survey is complete. Use it to thank respondents, set expectations for follow-up, or point them somewhere next.

{% hint style="info" %}
All responses will be saved to your dashboard and can be exported at any time.
{% endhint %}

#### Ranked Choice

Let respondents rank from a set of options. You can set the minimum number of answers you want to be ranked.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-b6bd787d9f6f455dd605ac67126d8004626f689e%2Fquestion-type-ranked-choice.png?alt=media" alt="A Ranked Choice question" width="444"><figcaption></figcaption></figure>


# Question Logic

Show a question only for certain answers (branching), skip ahead, end the survey or run actions using question logic.

Question logic changes what happens in your survey based on how someone answers its questions.

Open a question (**Questions →** the question **→ Details**). There are two kinds of logic:

* **Action Logic** runs after someone answers *this* question: skip ahead, end the survey, redirect, set metadata, or send the answer to another tool. Click **Add Action Logic**.
* **Presentation Logic** decides whether *this* question is shown at all, based on earlier answers or metadata. Click **Add Presentation Logic**.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-806f0ae3f8cf1f9648400407f09ca2396b0d0381%2Fquestion-logic.png?alt=media" alt="Action Logic rules on a question" width="681"><figcaption></figcaption></figure>

## Branching: show a question only for certain answers

To give respondents different follow-up questions depending on their answer, put **Presentation Logic** on each follow-up. Don't use **Skip to** for this.

1. Add the follow-up questions after the question they depend on.
2. Open a follow-up and click **Add Presentation Logic**.
3. Choose **show** and add a condition on the earlier question. For more than one answer, click **Add condition** and join them with **or**.
4. Click **Update Question**, then repeat for the other follow-ups.

For example, with a Single Choice question *What's stopping you today?* (answers *Not sure which to pick*, *Need more information*, *Just browsing*):

* An **Actions** question with a booking button: show when the question **= (is equal to)** *Not sure which to pick* **or** **= (is equal to)** *Need more information*.
* A **Text & Image** question and an **Email** question after it: give both the same condition, show when the question **= (is equal to)** *Just browsing*.

A follow-up with **show** stays hidden unless its condition matches, so each respondent sees only the questions for their answer. Everyone else carries on to the next question they can see.

{% hint style="info" %}
**Why not Skip to?** **Skip to** only jumps ahead. The questions it jumps over are still shown to everyone who doesn't take that jump, and after the question you skip to the survey carries on in order, into the next path's questions. Keeping paths apart with skips takes an extra **Skip to** or **End Survey** at the end of every path. Presentation Logic needs none of that.
{% endhint %}

## Conditions

Logic starts with a **condition**: a rule that must be met for its **action** to take place.

A condition is based on the answer to the question. For example, a condition can check whether an answer is > or < a certain value, or equals a specific value.

You can combine conditions to build more complex logic. Click **Add condition**, then choose **and** or **or** between them. **and** is evaluated before **or**, so *A or B and C* means *A, or (B and C)*.

## Operators by question type

Which operators you can pick depends on the question type:

| Question type                                 | Operators                                                                                             |
| --------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
| Every answerable question                     | **is submitted**, **= (is equal to)**                                                                 |
| Multiple Choice, Mosaic, Image Choice, Matrix | also **includes any**, **includes all**, **does not include any**, **does not include all**           |
| Range, Slider                                 | also **>**, **≥**, **<**, **≤**                                                                       |
| Short Answer, Long Answer, Phone, Form Panel  | also **contains**, **does not contain**                                                               |
| Text & Image, Reward, Thank You               | **is presented**                                                                                      |
| Metadata                                      | **=**, **>**, **≥**, **<**, **≤**, **contains**, **does not contain**, **exists**, **does not exist** |

{% hint style="warning" %}
**For Multiple Choice, use includes any or includes all, not "="**. "=" compares the whole set of selected answers at once, so it only matches one exact combination. **includes any** matches if any of the answers you list was selected, and **includes all** matches only if every one was.
{% endhint %}

**For Single Choice, Dropdown, Binary Choice and Autocomplete, use "="** once per answer and join the conditions with **or**. **includes any** isn't offered for these, because each person picks only one answer.

{% hint style="warning" %}
**Changed a question between Multiple Choice and Single Choice?** Re-check the conditions that use it on later questions. A condition whose operator the new type doesn't offer, such as **includes any** on a Single Choice question, turns into **is submitted** the next time you click **Update Question** on that later question. It then matches everyone who answered, so a follow-up meant for some answers shows to everyone.
{% endhint %}

Answers are matched against your original (default-language) options, so logic works the same in every translation.

{% hint style="info" %}
For **Matrix** questions, a condition can target a single question (row) — for example "if the *Delivery* row is rated Poor." Pick the question from the row dropdown when building the condition, or leave it on **any row** to match against every option selected across the whole matrix. If the matrix allows **Multiple selections**, a row can hold several answers, so a row condition behaves as it does for a Multiple Choice question: **=** matches only when that answer is the row's single pick, and **includes any** matches when it is one of the picks.
{% endhint %}

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-a1c6682644857a631e7a3ffcf858e28754487aa1%2Fquestion-logic-conditions.png?alt=media" alt="A logic rule with several conditions joined by or" width="661"><figcaption></figcaption></figure>

When a condition is met, the **action** you define takes place. An action can happen inside your survey, like **skip** or **end survey**. It can also happen outside it, like **adding a metafield to Shopify** or **adding a customer tag**.

## Actions for all users

Choose from these actions:

* **Continue to the next question -** move to next question
* **End Survey** - finish the survey here, skipping any questions after this one.
* **Skip to -** direct to another question. After the question you skip to, the survey carries on **in order** from there, unless that question has its own logic. To finish a branch early, add **End Survey** to the last question of that branch.
* **Redirect To -** Send to a specific URL or web address. See [Redirect To](#redirect-to) below.
* **Run code -** Trigger a webhook or execute a script
* **Send Email -** Send an email to the respondent or yourself
* **Set / Unset metadata -** Store a value on the response (or remove one)
* **Increment / Decrement / Multiply / Divide metadata -** Adjust a numeric metadata value. A key that has never been set starts at 0.

## How rules are evaluated

When a question has several logic rules:

* **The first matching rule wins for where to go next.** Rules are checked from the top, and the highest rule that matches decides **Skip to**, **End Survey** or **Continue**. Put your most specific rules at the top.
* **All other answers will** is the catch-all row. It only decides where to go when no rule above it chose **Skip to**, **End Survey** or **Continue**.
* **Redirect To**, **Run code** and the metadata actions run for **every** rule that matches, not just the first.

{% hint style="warning" %}
**A redirect-only rule doesn't stop the catch-all.** If "equals *Very happy* → Redirect To page A" has no Skip, End or Continue action, the **All other answers will** row still runs, and its redirect fires too. Add **End Survey** (or **Continue**) to the specific rule so the catch-all is skipped.
{% endhint %}

## Redirect To

* Enter the full address, such as `https://mystore.com/pages/thanks`. If you leave off `https://`, Zigpoll adds it.
* The redirect fires when the question is submitted and the rule matches. On desktop the page opens in a **new tab**. On mobile the visitor is sent there in the **same tab**.
* **Redirect To doesn't work on Shopify checkout, Thank You or Order Status pages**, because Shopify doesn't let apps navigate the customer away from those pages. Use an **Actions** question with a button link instead, so the customer can click through.
* To send people somewhere when they finish, add the redirect to the last question with the condition **is submitted** (or **is presented** on a Text & Image question).

## The Back button

**Back** returns to the question the person actually came from, following any skips they took. It doesn't simply go to the question above in the list. When they answer again, the logic runs on the new answer, so a changed answer can take them down a different path. To stop people going back, turn on **Hide back button** under **Settings → General → Behavior** (in the **Closing** card).

## Adding a follow-up for "Other"

1. On the choice question, turn on **Write-in Answer** and set the **Write-in Label** (for example `Other`).
2. Add the follow-up question right after it.
3. On the follow-up, click **Add Presentation Logic** and show it when the choice question **= (is equal to)** `Other` (use **includes any** for Multiple Choice).

Logic matches the write-in by its label, not by what the person typed. What they typed is still saved and shown with the other answers.

## Presentation Logic

**Presentation Logic** shows or hides the current question when its conditions are met. A question with **show** stays hidden unless its conditions match. A question with **hide** is shown unless they match. Each question uses one Presentation Logic rule, so put all of its conditions in that one rule, joined with **and** or **or**. It's how you build branches: see [Branching](#branching-show-a-question-only-for-certain-answers).

## Metadata conditions

Besides answers, a condition can read **metadata**: values passed in from your site, or values stored by the metadata actions above. Pick **metadata** as the condition's source and enter the key name.

A metadata condition can compare against a fixed value (`metadata.score > 10`) **or against another metadata key**, with an optional offset. Choose **metadata** in the value picker and enter the other key:

* `metadata.a > metadata.b` — a is strictly larger than b
* `metadata.a > metadata.b + 1` — a leads b by at least 2
* `metadata.a >= metadata.b + -1` and `metadata.a <= metadata.b + 1` — a and b are tied or within one point

A key that has never been set counts as 0 in comparisons.

{% hint style="info" %}
**Scoring quizzes — "which option was picked most?"**

Give each answer style its own counter. On every question, add logic like *when this question is A → increment metadata `a` by 1* (and likewise `b`, `c`, `d`). Then add one result question per outcome, each using **Show or hide this question** with metadata conditions, for example:

* Show "Classic" when `metadata.a > metadata.b + 1` **and** `metadata.a > metadata.c + 1` **and** `metadata.a > metadata.d + 1`
* Show a blended "Romantic & Modern" result when `metadata.b >= metadata.c + -1` **and** `metadata.b <= metadata.c + 1`, and both b and c beat a and d.

Counters update before the next question's visibility is evaluated, so result questions placed at the end of the survey see the final totals.
{% endhint %}

## Integration actions

If you have integrations connected, their actions appear in the dropdown. These actions send the full survey response, not just the current question.

**Slack** — Send a notification to a selected Slack channel.

**Jira** — Create a new issue in a selected Jira project.

**ClickUp** — Create a new task in a selected ClickUp list.

**HubSpot** — Create a new deal in a selected HubSpot pipeline.

**Zendesk** — Create a new support ticket.

**Notion** — Add a new row to a selected Notion database.

**Klaviyo** — Subscribe the respondent to a selected Klaviyo list.

**Google Sheets** — Write a row of response data to a Google Sheet. Zigpoll creates the sheet automatically when you save, with headers based on your survey questions. You will be emailed a link to the sheet when the first response comes in.

**Mailchimp** — Subscribe the respondent to a selected Mailchimp audience.

**Drip** — Subscribe the respondent to a selected Drip campaign.

**Omnisend** — Add the respondent as a contact in Omnisend.

**Marketo** — Create or update a lead and add them to a static list in Adobe Marketo.

{% hint style="info" %}
Integration actions only appear when the corresponding integration is connected in your [Integration Settings](/integrations). Actions that require an email (Klaviyo, Mailchimp, Drip, Omnisend) only fire if the respondent has provided an email address.
{% endhint %}

## Additional actions for Shopify stores

On a Shopify store, these actions are also available:

* **Add Customer Tag** — needs a valid Shopify customer ID (`shopify_customer_id`) or email in the response's metadata.
* **Add Order Tag** — needs a valid Shopify order ID (`shopify_order_id`) in the response's metadata.
* **Add Customer Metafield** — if you map it to a metafield definition you created, Zigpoll writes the answer in that definition's type. See [Why a customer tag or metafield doesn't appear](/polls/behavior-settings#why-a-customer-tag-or-metafield-doesnt-appear).
* **Add Order Metafield** — if you map it to a metafield definition you created, Zigpoll writes the answer in that definition's type.
* **Generate Reward** — generate a discount code or add free shipping.
* **Add Store Credit** — give the respondent Shopify store credit.

To write the respondent's own answer into a tag or metafield, see [Saving the answer with `{{ value }}`](/polls/behavior-settings#saving-the-answer-with-value). If a tag or metafield never shows up in Shopify, see [Why a customer tag or metafield doesn't appear](/polls/behavior-settings#why-a-customer-tag-or-metafield-doesnt-appear).

## My logic isn't working

Check these in order:

1. **Rule order.** The highest matching rule decides where to go next. Move specific rules above general ones, and remember the **All other answers will** row is only a fallback.
2. **The operator.** For Multiple Choice use **includes any** or **includes all**, not **=**. For Single Choice, use **=** once per answer joined with **or**. For numbers on a Range or Slider, use **>** or **<**.
3. **A follow-up shows to everyone.** Either the respondent reached it through a **Skip to** instead of it being hidden with Presentation Logic (see [Branching](#branching-show-a-question-only-for-certain-answers)), or its condition became **is submitted** after the earlier question's type changed. Open the follow-up and check its Presentation Logic.
4. **The value still exists.** If you renamed or deleted an answer option after building the rule, pick the answer again in the rule.
5. **Skip then falls through.** After a **Skip to**, the survey continues in order from that question. Add **End Survey** where a branch should stop.
6. **Redirects on Shopify checkout pages.** **Redirect To** can't navigate on checkout, Thank You or Order Status pages.
7. **The survey was already completed.** Zigpoll remembers progress in the browser, so testing again in the same browser doesn't start from a clean slate. Test in a private window.
8. **Update Question.** Logic isn't live until you click **Update Question**.


# Template Variables

Make your questions dynamic using template variables

Template variables put dynamic text into a question: a customer's name, a value from your site, or an answer they gave earlier in the same survey. Write them inside double curly braces, like `{{name}}`. Zigpoll uses [Handlebars](https://handlebarsjs.com) syntax, so conditionals and loops work too.

Variables work in a question's title, subtitle, copy, disclaimer, scale labels, placeholders, form field labels, and **Actions** button titles and links. They don't work in answer options.

### Where the values come from

A variable can be any of these, in order of priority:

1. **`window.Zigpoll.templateVariables`** set by JavaScript on your page.
2. **An earlier answer in the same survey**, by that question's handle.
3. **Metadata**, such as values you pass in or that Zigpoll records (for example `utm_source`).

### Use a value from your page

For example, say you want to greet your customer by name in your survey:

> Welcome Jason, do you have a minute to fill out our survey?

**1.** Add a template variable to your page with JavaScript. In this example it's called **name**, and PHP fills it in from a user object. Replace this with whatever fits how your website is built.

```javascript
// Add this code right below your Zigpoll embed code.
window.Zigpoll.templateVariables = {
      name: <?php echo $user.name ?>
}
```

**2.** Use the **name** variable in your question. In this example it goes in the question's copy, so enter something like this in the copy box:

```javascript
Hey, {{#if name}}{{name}}{{else}}Mysterious Person{{/if}} do you have a minute to fill out our survey?
```

The question now shows the customer's name if it exists, or "Mysterious Person" if it doesn't.

You can also use the shorter `print` helper for a fallback: `Hey {{print name "there"}}!`

### Pipe an earlier answer into a later question

Each question has a **handle**. By default it is the question's title. To pipe an answer, give the earlier question a short handle with no spaces:

1. Open the earlier question, for example *Which product did you buy?*
2. Turn on **Custom handle** and set the **Handle** to `product`.
3. Click **Update Question**.
4. In a later question, write `How would you rate the {{product}}?`

A customer who picked *Travel Mug* sees *How would you rate the Travel Mug?* For a Multiple Choice question, the selected answers are joined with commas. The value updates as soon as the earlier question is answered.

{% hint style="info" %}
Use letters, numbers and underscores in handles you pipe. A handle with spaces or punctuation, like a full question title, doesn't work as `{{handle}}`.
{% endhint %}

### Why do I see `{{ }}` instead of a value?

* **A variable with no value renders as blank, not as braces.** Use `{{#if}}` or `{{print name "fallback"}}` to show something instead.
* **Literal braces mean the template couldn't be read.** Common causes are a typo such as a missing closing brace, quotes or spaces inside the braces (`{{ "product" }}`), or a handle with spaces. Fix the syntax and click **Update Question**.
* **The field doesn't support variables.** Answer options show text exactly as written.
* **The value is set too late.** Set `window.Zigpoll.templateVariables` right after your embed code, before the survey loads.


# Answer Importing

If you want to import answers in bulk you can do so via a CSV file. To activate this feature try the following:

* Go to your Question edit page
* Scroll down to the Answer Options section
* Click the "three dots" icon on the right hand side
* Select Import Answers
* Upload your CSV file.

The CSV file was designed to be as simple as possible. It works as follows:

|          |          |       |
| -------- | -------- | ----- |
| Answer 1 | handle-1 | url-1 |
| Answer 2 | handle-2 | url-2 |
| Answer 3 | handle-3 | url-3 |

The first column contains the label of each answer option. The second column contains the handle for each answer option. And the third column contains the url for each answer option (this is only for image-type answers).

The handle and image columns are entirely optional and can be left out. If the handle is left out, we will generate a handle for you automatically. We recommend leaving the handle column empty entirely unless you have a good reason.

See below for some example templates:

Example 1: [Answers only](https://zigpoll.com/answer-import-template.csv)

Example 2: [Answers and handles](https://zigpoll.com/answer-handle-import-template.csv)

Example 3: [Answers, handles, and images](https://www.zigpoll.com/image-answer-import-template.csv)


# Links in Answer Options

Add clickable links to your answer option labels using a simple markdown syntax.

You can add a clickable link to any answer option label using a simple markdown-style syntax:

```
[link text](https://your-url.com)
```

For example, a Legal Consent checkbox label like this:

```
I agree to the [Terms of Service](https://example.com/terms) and [Privacy Policy](https://example.com/privacy)
```

will display as "I agree to the Terms of Service and Privacy Policy" with both links clickable.

No special editor is needed — just type the syntax directly into the answer option's label field on the Question edit page.

### Where it works

Links are supported in the answer labels of the following question types:

* **Multiple Choice**
* **Single Choice**
* **Binary Choice**
* **Mosaic**
* **Consent** (the Checkbox Label field — the most common use case, e.g. linking to your terms or privacy policy)

Links render everywhere these questions are shown: the on-site survey widget, public survey links, email and SMS surveys that open in the browser, the dashboard preview, and Shopify checkout and post-purchase surveys (where they render using Shopify's native link component).

### Behavior

* Links always open in a **new tab**, so the participant never loses their place in the survey.
* Clicking a link does **not** select or deselect the answer — only clicking elsewhere on the option does.
* Only `http://` and `https://` URLs are supported.

### Things to keep in mind

* The link syntax is stored as part of the answer's text. This means the raw `[link text](url)` syntax will appear anywhere the answer value is shown as plain text — for example in CSV exports and integration payloads. The link text itself is what participants see in the survey.
* Dropdown, Autocomplete, Rank, and Image Choice questions do not render links — the syntax will appear as plain text there, so we recommend only using it with the question types listed above.
* If you translate your survey, keep the `[text](url)` syntax intact in the translated label and translate only the link text.


# Analytics, AI, and Reporting

How to review and analyze your data using Zigpoll's built-in reporting features

Zigpoll comes with a built in suite of analytics that makes it easy to understand responses at high volume. Here's an overview:

{% hint style="info" %}
**Available on every plan, including Lite.** Automatic account insights, automatic survey insights, write-in themes & summaries, and Z-GPT chat with your data are all included on every Zigpoll plan. Plans only differ in the monthly AI analysis credit allotment used for on-demand insights — see [Subscription Plans](/subscription-plans).
{% endhint %}

The AI features below (Z-GPT Insights, Z-GPT Chat, and AI action items) write their replies in the language set under [Preferred language](/accounts/general-settings#preferred-language) in your account's General Settings. Change it there if you'd like your AI summaries and chat replies in another language.

#### Charts

Zigpoll has built in charts and data visualization.

You can see these in the dashboard and the charts are auto-generated for each question.

#### Lifetime tiles and the date range

The tiles along the top of your account **Dashboard** and a survey's **Dashboard** always show lifetime totals, however you set the date range. They are **Answers**, **Write-Ins**, **Participants**, and, for email or SMS surveys, **Emails Sent** or **SMS Sent**. The small change figure beside each one compares it with the previous period.

Pick a date range on the survey card or a question card below them, and those cards switch to the range you chose. That covers **Views**, **Opens**, **Closes**, **Responses**, **Participants**, **Completions**, and the rates. The charts and per-answer totals follow it too. The **Charts** page has its own date picker.

#### Response Rate, Answer Rate, and the other rates

| Rate                | Where         | What it measures                                                                                    |
| ------------------- | ------------- | --------------------------------------------------------------------------------------------------- |
| **Response Rate**   | Survey card   | Responses, one per person who took the survey, divided by the number of times the survey was shown. |
| **Engagement Rate** | Survey card   | Times people engaged with the survey, divided by the number of times it was shown.                  |
| **Completion Rate** | Survey card   | Times the survey was finished, divided by the times people engaged with it.                         |
| **Answer Rate**     | Question card | The share of views of this question that produced an answer.                                        |
| **Engagement Rate** | Question card | The share of participants who engaged with this question in any way, including skipping past it.    |
| **Dropoff Rate**    | Question card | The share of participants who stopped filling out the survey at this question.                      |

**Views** on a question card counts how many times that question was viewed. **Views** on the survey card counts how many times the survey was viewed.

#### Share of Answers and Penetration Rate

On **Multiple Choice**, **Mosaic**, and **Image Choice** questions, click the percentage beside any answer to switch how percentages are worked out:

* **Share of Answers**: the answer's count divided by all answers picked on the question. The percentages add up to 100%.
* **Penetration Rate**: the answer's count divided by the number of people who engaged with the question. It reads as "what share of people picked this". Because one person can pick several answers, the percentages can add up to more than 100%.

The toggle isn't available while a metadata filter is applied.

#### Cross tabs

A cross tab shows how people who gave one answer answered another question. For example, "what % of people who answered X answered Y".

1. On a survey's **Dashboard**, go to a fixed-choice question's card.
2. Click **Cross Tab**, or choose **Cross Tabulate Answers** from the question's **⋯** menu.
3. In the **Cross Tabulate** window, pick the two questions to compare and a date range.
4. Click **Generate Cross Tab**.

The result is a heatmap. Use **Flip Axis** to swap the questions, or the **Download CSV** icon to save the table. Cross tabs aren't available for ranking questions.

#### Revenue and AOV on the Charts page

For questions answered on a Shopify thank-you or order status page, the Charts page adds a metric picker next to the interval picker: **Responses**, **Attributed Revenue** or **Average Order Value**. Every chart on the page follows the metric you choose, including the previous-period comparison, so you can see revenue by answer week over week for an attribution question. Each answer is credited with the full order total behind it, so on a multi-select question the revenue across answers can exceed store revenue; AOV divides by the answers that carry an order value.

#### Answers by field

Below the time series, every fixed-choice question whose responses carry attribution or traffic metadata shows an **Answers by** module. Pick a field and the module splits the question's answers by it. The first two fields, **Reported Channel** and **Reported Source**, are what the customer said: Zigpoll reads them from each customer's answer to the survey's attribution question, as described under [Reported channel and source](#reported-channel-and-source). The rest are what was tracked. On-site surveys offer the fields Zigpoll reads from the URL the customer arrived on: UTM source, medium, campaign, content and term, referrer, landing page, and Meta or Google ad parameters (campaign, ad set, ad, placement). Post-purchase, abandoned checkout and order-triggered email or SMS surveys also offer what Shopify recorded on the order: the last-click source and source type, the order's landing page and referrer, and the discount code. Only fields present on the question's responses are offered, and a question with none of them shows no module. Each row is one value with its responses, share and, where the responses have an order behind them, attributed revenue and AOV; expand a row to see how those customers answered, and use the heatmap for the full answer-by-value grid. Common spellings of a channel (for example "Facebook", facebook.com and the Facebook app) are folded into one row. The first tile, **Has UTM medium** or **Has last-click source**, is the share of responses that carry the field (**Used a discount code** for the discount pivot), and the empty bucket is named to match: **No UTM medium**, **No tracked source**, **No discount code**. With **Compare to previous period** on, each row also shows its change in responses and attributed revenue against the previous window. On a "How did you hear about us?" question this is the stated-versus-tracked attribution check; on a "Who is this purchase for?" question it shows which campaigns bring gift buyers. The same report is available to the API as `GET /poll/attribution` and to AI assistants as the `analyze_attribution` MCP tool.

**Projected totals.** Only some of the customers who see a survey answer it. The **Surveyed** tile gives how many customers the survey reached in the selected range and the share who answered this question, and the **Projected totals** switch beside the field picker lifts every row from those who answered to everyone surveyed: responses are divided by the response rate, and revenue is each row's AOV times its projected responses, so shares and AOV do not move. It is an estimate that assumes the customers who skipped the survey are like the ones who answered, and the table says so underneath while it is on. The switch is offered only when the range can be projected honestly: views were recorded, the question has at least 30 responses, the response rate is 5% or more, no filter is applied (a filter narrows responses but not views), and the range does not have more responses than views. Add `?projected=1` to the Charts page URL to open it projected. The [Reporting API](https://apidocs.zigpoll.com/) returns the same projected figures, and the reason when a projection isn't available.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-47ef7912931691c0065d016327cb684e288b73fb%2Fanalytics-question-chart.png?alt=media" alt="A question&#x27;s results chart on the Dashboard" width="682"><figcaption></figcaption></figure>

You have the ability to change the format of the chart by pressing the icons underneath it, on the right:

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-400f1a951b84b3def4455d597eecac57790bbbf1%2Fanalytics-chart-formats.png?alt=media" alt="The chart format icons" width="682"><figcaption></figcaption></figure>

The generated charts can be easily exported for reporting or adding to question decks. Hover over the chart and click the menu icon that appears underneath the date range to do so:

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-511e3ea8e0dc99c4787942b067e68e039bebe1ec%2Fanalytics-chart-export.png?alt=media" alt="The chart export menu" width="682"><figcaption></figcaption></figure>

#### Reported channel and source

**Reported Channel** and **Reported Source** in the **Answers by** picker come from the survey itself. Zigpoll reads each customer's answer to the survey's attribution question ("How did you hear about us?"), including "Other" write-ins and any follow-up question such as "Which podcast?", and adds two metadata keys to the response a few minutes after it is submitted:

* `attribution_channel` is one value from a fixed list, such as `instagram`, `search`, `podcast` or `word_of_mouth`. "Instagram" picked as a fixed answer and "insta" typed into "Other" both land on `instagram`.
* `attribution_source` is the name the customer gave, when they gave one, such as "The Daily", "@somehandle" or "ChatGPT".

There is nothing to set up. No AI model is involved, and your sentiment and AI settings don't affect it.

The other fields in the picker are tracked: they hold what the URL, the UTMs or Shopify recorded about the visit. The reported fields hold the customer's own answer. The two can disagree, and where they do is the useful part. A customer whose last click was a Google search may say a podcast sent them, and word of mouth has no tracked value at all. Pick **Reported Channel** on any other question, such as "Who is this purchase for?", to split its answers by how customers say they found you. Or filter the page to one reported channel and then pick a tracked field to see how that channel's customers actually arrived.

Reports trail new responses by about a minute, or up to ten minutes for a survey that was left unfinished. Responses collected before this was released don't have the two fields unless Zigpoll support backfills them for your account. The full list of values is in [Special Variables](/embed/poll-metadata/special-variables#reported-attribution-metadata), and [How do I find out how customers heard about my store?](/tutorials/attribution-surveys) covers how a question is recognized and how to collect the named source.

#### Filtering results by metadata

You can narrow any question's results down to the responses that carry a particular piece of metadata — for example, only the customers who purchased a specific product, ordered above a certain total, or responded from a particular country or device.

Look for the filter icon next to the date range. It appears in three places:

* **Dashboard** — on each question's results panel
* **Answers** — above the list of answers
* **Charts** — next to the date picker

Clicking it opens a **Filter Responses** window. Pick a field, then pick a value — the dropdown shows how many responses match each value, and the filter applies as soon as you choose one. The active filter shows on the button itself, with an **x** to clear it.

The fields available depend on what your responses actually carry:

* **Attribution**: Reported Channel and Reported Source, which Zigpoll reads from the customer's answer to the survey's attribution question (see [Reported channel and source](#reported-channel-and-source)). Reported Channels also appears when a multi-select attribution question had more than one channel picked
* **Shopify**: Products Purchased, Order Total, and Locale are attached automatically to post-purchase survey responses
* **Location & Language, Device, and Page**: country, region, device, browser, the page the survey was answered on, and similar fields collected with each response
* **Custom**: any [metadata](/embed/participant-metadata) you attach through the embed code or survey links

**Products Purchased supports selecting multiple products.** Tick as many as you like — the results include any response whose order contains at least one of the selected products.

While a filter is active, everything recalculates from the matching responses: the per-answer tallies and charts on the Dashboard, the list on the **Answers** page, and every chart on the Charts page — including the **Compare to previous period** overlay, which compares filtered against filtered so the deltas stay apples-to-apples. The filter follows you as you switch between questions in the same survey, so you can walk a segment through the whole survey question by question.

{% hint style="info" %}
The field and value lists are built from your most recent responses, so a value that stopped appearing a long time ago may not be offered — and on very high-volume questions the Dashboard tallies reflect the most recent responses rather than all history. The Charts page always computes filtered results over the full selected date range.
{% endhint %}

#### Z-GPT Insights - embedded AI summarization on surveys

Write-ins are some of the most valuable data, while also being the type of responses that are the hardest to analyze.

Z-GPT is a built-in analytics feature that will summarize responses and help extract trends on your behalf, instead of asking an intern or manually reading yourself.

Once you hit a certain volume of responses (\~25) we send it to an LLM to extract summaries. This runs once a week.

These summaries are present in the Dashboard or when you click into a specific survey. On a survey's Dashboard, scroll below a question's results to find them.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-88400fa14872196a86432939ba59fb8dabb06cd6%2Fanalytics-survey-dashboard.png?alt=media" alt="A survey Dashboard"><figcaption></figcaption></figure>

Here are examples of AI summarization on one of Zigpoll's attribution surveys.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-6d103ea2b307709a03a4039df44a12d54a6c1e15%2Fanalytics-zgpt-insights.png?alt=media" alt="Z-GPT Insights on a survey Dashboard" width="649"><figcaption></figcaption></figure>

#### Z-GPT Chat

You can ask questions directly on your data using chat. This can be found in the "Insights" tab in the sidebar.

You have the ability to change which survey the data is being pulled from by selecting the survey at the top.

You can also **export a chat conversation to Markdown** to share or archive an analysis, and the Insights page shows your remaining monthly **insight credit** balance (with an upgrade link when you're running low). Credit allotments per plan are listed in [Subscription Plans](/subscription-plans).

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-c238bc431fa50025050e5ab0af361db028bff9b5%2Fanalytics-insights-chat.png?alt=media" alt="The Insights chat"><figcaption></figcaption></figure>

#### Report generation and data export

You can generate a custom report with the columns you care about then export to CSV.

To start, go to "Table" in the sidebar.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-be46d95b5c85b466666ac1508dd3e6b0d496c443%2Fanalytics-table.png?alt=media" alt="The Table page"><figcaption></figcaption></figure>

Select the survey you want to build a table for:

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-4264d6fd8581af0f88ca3f4f992938ba58dd08bb%2Fanalytics-table-survey-select.png?alt=media" alt="The survey dropdown on the Table page"><figcaption></figcaption></figure>

From here, you can select the fields that you want to export and date range you want to export:

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-66a2d66a53536129d0c075da439827635313cc88%2Fanalytics-table-columns.png?alt=media" alt="Choosing columns and a date range on the Table page"><figcaption></figcaption></figure>

#### Sending into other services

Many users want to perform deeper dives into their data. Zigpoll has a wide set of integrations supporting this.

The most common of these are exporting to [Google Sheets](/integrations/google-sheets), logging events into product analytics platforms like [Segment](/integrations/segment), and pulling response data from the [Reporting API](https://apidocs.zigpoll.com/). Please see [Integrations](/integrations) for more.


# Ask Ziggy

Ask Ziggy is the AI helper built into the Zigpoll dashboard. Ask it how something works, or tell it what to change and approve the edit.

Ask Ziggy™ is a chat panel inside the Zigpoll dashboard. It knows which page you are on, can read your surveys and responses, and can propose changes — a new survey, an extra question, a Spanish translation, a targeting rule — that you review and apply with one click. Nothing is saved until you approve it.

It is available on every plan and to every team member.

## Opening the panel

Click the sparkles icon in the top-right of the dashboard, next to Help, or press **⌘ .** (Ctrl+. on Windows) from any page. The same shortcut closes it. The panel remembers whether you left it open.

New accounts also see **Not sure where to get started? Ask Ziggy** at the bottom of the onboarding checklist.

The chip under the panel header shows what Ziggy is looking at — for example *Account › Post-Purchase Survey › How did you hear about us? › Question editor*. Move to a different page and the context follows you.

## What you can ask

**Questions about Zigpoll.** Ziggy searches this documentation before answering "how does X work" questions and links the page it used.

> Why isn't this survey showing on my thank-you page?
>
> What is the difference between a survey link and a public link?

**Questions about your account.** Plan, renewal, response limits, connected integrations, team size, language and consent settings.

> What plan am I on and how many responses do I have left this month?

**Questions about your data.** Ziggy can read responses, summaries, verbatims, trends, drop-off, participant and Shopify order data, and compare surveys.

> What are the top three reasons people gave for almost not buying?
>
> Compare response rates across my surveys this month.

**Changes.** Describe what you want and Ziggy proposes it.

> Build a post-purchase "how did you hear about us" survey.
>
> Add an NPS question at the end of this survey.
>
> Translate this survey into Spanish.
>
> Only show this survey to orders shipping to Canada.

**Getting around.** Ziggy can open dashboard pages by name and open a few dialogs directly.

> Take me to Integrations.
>
> Show me the QR code for this survey.
>
> Export these responses to CSV.
>
> Delete this participant's test responses.

When the thread is empty, four **Try asking** suggestions appear. They are picked for the page you are on and for where your account is — a brand-new account gets prompts about creating and installing a first survey, an account with lots of responses gets prompts about analysis.

## Reviewing and applying changes

Every change Ziggy wants to make arrives as a **proposal card** with a one-line summary, a **Details** toggle that shows exactly what will be written, and **Apply** and **Discard** buttons. If a single request produces several changes — a new survey and its five questions, say — a bar underneath offers **Apply All** and **Discard All**.

Proposals appear once Ziggy has finished the turn, so you always review the complete set.

After you apply a change, the dashboard opens the form it landed in: a new survey opens on its Questions tab, an edited question opens in the editor, a translation opens the Language tab, a webhook opens Integrations. Check the result there.

{% hint style="warning" %}
**Applied changes are permanent.** There is no undo. Proposals that overwrite or send something — editing or reordering questions, replacing translations, changing action rules, sending an email or SMS invitation, deleting a webhook — are marked **This can't be undone** while they wait for your decision. Read the Details before applying those.
{% endhint %}

### Editing the question you have open

If you are in the question editor and ask for a wording change — *shorten this*, *add an "Other" option with a text box* — Ziggy proposes it against the **unsaved draft** on your screen rather than the saved question. Applying fills the form; you still click **Save**, so you can adjust before anything is stored.

### What runs without a proposal

Two things happen immediately when Ziggy decides to do them, because they change nothing in your account: opening a dashboard page, and opening a dialog (CSV export, QR code, share link, invite a team member, Contact Us, the Clear Preview Responses or Reset Survey Data confirmation, or the Delete Responses checkboxes on a participant's page). The QR code and share link dialogs only exist once a survey is live, Clear Preview Responses only while the survey has preview answers, and Reset Survey Data only while the survey is under 48 hours old. Deleting still needs your confirmation in the dialog Ziggy opened.

## What Ziggy can change

| Area               | Examples                                                                                                  |
| ------------------ | --------------------------------------------------------------------------------------------------------- |
| Surveys            | Create, duplicate and publish surveys; change delivery, targeting, trigger, frequency and design settings |
| Questions          | Add, edit, retype and reorder questions, including logic and branching; commit staged changes             |
| Languages          | Write translations for one language at a time; existing languages are merged, not replaced                |
| Action rules       | Add or remove survey actions such as Shopify tags, Klaviyo events, redirects and webhook triggers         |
| Links              | Generate a trackable survey link                                                                          |
| Invitations        | Send an email or SMS survey invitation — only when you explicitly ask to send                             |
| Synthetic research | Start or cancel a research run                                                                            |
| Webhooks           | Create a signed webhook or delete one (account admins only)                                               |

Every proposal is validated before it is shown to you — a multiple-choice question with no answers, a matrix with one column, or a redirect with no URL is sent back to Ziggy to fix rather than offered to you.

## Team roles

Ziggy respects the role of whoever is signed in. See [Adding Team Members](/tutorials/adding-team-members) for how roles are assigned.

| Role                        | What Ziggy does                                                                                                         |
| --------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| Owner, Admin, Billing admin | Everything above, including webhooks                                                                                    |
| Editor                      | Everything except creating or deleting webhooks                                                                         |
| Read only                   | Answers questions and analyzes data. Cannot propose changes, open pages or open dialogs; it explains what to do instead |

A change a role is not allowed to make is never proposed. If one slips through — for example a thread started by an admin and continued by an editor — the card reads *Your role doesn't allow this change. Ask an account admin.*

## Reaching a person

If Ziggy cannot find an answer, thinks you have hit a bug, or the request is something only the Zigpoll team can do (billing corrections, account changes), it says so and opens the **Contact Us** form with your details filled in. You can also just ask: *how do I reach support?*

## Usage and limits

* Each message you send uses one **insight credit**, from the same monthly pool as the Insights page. Applying a proposal does not use a credit. Credit allotments per plan are listed in [Subscription Plans](/subscription-plans). A running balance appears in the panel when you are close to the limit.
* Long requests are capped at ten tool steps per message. If Ziggy runs out it tells you and you can ask it to continue.
* Press **Stop** to cancel a reply in progress.
* The conversation lasts for your session and is kept as you move between pages. It is cleared when you reload the browser or click the refresh icon in the panel header.
* From inside a survey, Ziggy focuses on that survey. For account-wide questions — *compare all my surveys* — ask from the account dashboard.

## Privacy

Ziggy is powered by an OpenAI model. Requests are sent with retention disabled, so nothing about your account or your customers is stored by OpenAI or used for training.

With each message Ziggy receives your question, the earlier turns of the conversation, what page you are on (including the unsaved contents of a question you are editing), and a summary of your account: store name and websites, plan and limits, responses used this month, language, currency, domains, which integrations are connected, and team size by role. Integration credentials, API keys, and team members' email addresses are never sent. Survey responses are read only when your question needs them, through the same tools available in the [MCP server](/integrations/mcp).

Each request is authenticated with a short-lived key that is deleted when the reply finishes.

## Related

* [Analytics, AI, and Reporting](/analytics-ai-and-reporting) — Z-GPT Insights and the Insights-page chat for deep analysis of a single survey
* [MCP server](/integrations/mcp) — the same tools Ziggy uses, from Claude, ChatGPT, Perplexity and other assistants
* [Web API](/web-api)


# Response Rate Benchmarks

See how your survey's response, engagement, completion and clickthrough rates compare to thousands of real Zigpoll surveys of the same type

Every survey dashboard shows a **Typical: x–y%** line under each rate so you can tell at a glance whether a survey is performing well. The ranges come from real Zigpoll customer data, not made-up industry numbers, and they are included on every plan, including Lite.

### Which rates are benchmarked?

| Rate                        | How it is calculated                                                            |
| --------------------------- | ------------------------------------------------------------------------------- |
| **Response Rate**           | Responses (one per person who took the survey) ÷ times the survey was presented |
| **Engagement Rate**         | Survey engagements (a click or interaction) ÷ times the survey was presented    |
| **Completion Rate**         | Survey completions ÷ times the survey was engaged with                          |
| **Email Clickthrough Rate** | Recipients who opened the survey ÷ emails delivered                             |

You will find these on the survey's dashboard, next to the gauges for each rate.

### Surveys are compared to surveys like them

A pop-up on a busy product page and an email sent to recent customers behave completely differently, so a single "industry average" would be meaningless. Instead, each survey is benchmarked against surveys delivered the same way:

* **On-site widgets** — pop-ups, launchers and slide-ins on your website
* **Inline embeds** — surveys embedded in the page content
* **Shopify checkout surveys** — post-purchase surveys on the thank-you and order status pages
* **Survey links** — surveys opened from a shareable link or QR code
* **Email surveys** — surveys sent from Zigpoll via email

For example, an on-site widget typically sees a response rate of a couple of percent, a post-purchase survey on the thank-you page tens of percent, and a survey link or email survey higher still. All can be perfectly healthy; the "Typical" line tells you what healthy looks like for *your* type of survey.

If we don't yet have enough data for a survey type (for example synthetic research), the rate is shown without a range rather than against a misleading comparison. The same applies when surveys of a type are too different from each other to share one range. Inline embeds are the current example: an embed on a product page answers at around 1%, while an embed on a dedicated survey page answers at 60–90%, so their response and engagement rates carry no range.

### How the ranges are calculated

* Benchmarks are computed from the trailing 90 days of activity across the Zigpoll customer base, with one data point per survey.
* Surveys with fewer than 200 presentations are excluded so that low-traffic surveys don't skew the numbers.
* Surveys whose tracking counters are inconsistent (for example more engagements than presentations, which a page re-render can cause) are excluded rather than counted as 100%.
* A survey type needs at least 50 qualifying surveys before it gets its own range.
* The **Typical** line shows the 10th to the 25th percentile. In other words, roughly three quarters of all surveys of that type land at or above the top of the range: it is a floor to clear, not a target to chase, and a survey below it is genuinely in the bottom quarter.
* A range is only shown when surveys of that type cluster together. If the median survey is more than three times the top of the range, the surveys are too different from each other to share one, and the rate is shown without a range.
* The ranges are refreshed regularly from live data, so they drift as customer behaviour changes.

### Reading the numbers

* **Above the range** — your survey clears the typical band, like most surveys of its type do. Nothing to fix here.
* **Inside the range** — you are in line with typical surveys. Small tweaks can still move the needle.
* **Below the range** — worth a look. Common fixes are shortening the survey, adjusting when and where it appears, or adding an incentive.

### Improving a low rate

* **Low response or engagement rate (on-site)** — review your [Display Rules](/polls/display-rules) and [Targeting Settings](/polls/targeting-settings) so the survey appears at the right moment, and try a [Reward question](/tutorials/reward-question) with a discount code.
* **Low completion rate** — trim questions, move the most important question first, and check [Question Logic](/questions/question-logic) so people only see questions that apply to them.
* **Low email clickthrough rate** — review the subject line and design in [Email Survey Design](/tutorials/email-survey-design), and send a follow-up with [Nudge Non-Responders](/polls/nudge-non-responders).

{% hint style="info" %}
Benchmarks are only shown for real surveys with enough traffic. Synthetic research responses are never included in the benchmark data.
{% endhint %}


# Synthetic Research

Generate AI-powered survey responses from configurable audience profiles

Synthetic Research lets you generate realistic AI-powered survey responses from virtual respondents that match your target demographics. Instead of waiting days or weeks for real customers to respond, you can get directional data in minutes by defining audience profiles and letting the AI fill out your survey on their behalf.

***

## Why use Synthetic Research?

* **Test survey logic before going live** — Catch broken flows, confusing questions, or missing answer options before real customers see your survey.
* **Validate question wording** — See how different audiences interpret your questions and whether the responses make sense.
* **Pre-populate dashboards for demos** — Show stakeholders what a completed survey looks like with realistic data.
* **Research audiences you don't have access to** — Explore how different demographics might respond without needing to recruit them.
* **Get directional data fast** — When you need quick signal on a question, synthetic responses can give you a starting point within minutes.

***

## How it works

1. **Create a survey** — Build your survey with the questions you want answered.
2. **Open the Audience tab** — Navigate to your survey and click on the **Audience** tab.
3. **Configure audience profiles** — Pick a template (like US General Population or Young Professionals) or build profiles from scratch. Each profile defines a demographic segment with attributes like age, gender, geography, and more.
4. **Set your research goal and context** — Optionally describe what you want to learn and provide business context to improve response quality.
5. **Set completion count** — Choose how many virtual respondents should complete the survey (1 to 1,000).
6. **Click Generate Responses** — The AI generates responses for each profile, respecting your survey's branching logic and question rules.
7. **View results** — Responses appear in your standard analytics dashboard, just like real responses.

{% hint style="info" %}
Synthetic responses are tagged with `isSynthetic` metadata so you can always distinguish them from real customer responses.
{% endhint %}

***

## Monthly limits

Each plan includes a monthly quota of synthetic answers. Answers are calculated as **completions x answerable questions** — so a 5-question survey with 100 completions uses 500 answers. This quota is separate from your plan's response limit, and synthetic research never counts toward it.

| Plan       | Monthly Answers |
| ---------- | --------------- |
| Lite       | 100             |
| Standard   | 2,000           |
| Premium    | 3,000           |
| Advanced   | 4,000           |
| Growth     | 5,000           |
| Scale      | 7,500           |
| Premier    | 10,000          |
| Enterprise | 20,000          |

{% hint style="info" %}
Non-answerable question types (copy, thank-you, reward, and action questions) are not counted toward your synthetic answer total.
{% endhint %}

{% hint style="info" %}
On a plan that predates the September 2026 lineup (Basic, Plus, Pro, or a legacy Premium or Ultimate subscription)? You keep the quota you signed up with — check **Settings → Plans & Limits** for your account's exact allotment.
{% endhint %}

***

## Next steps

{% content-ref url="/pages/EuCKBdraxbiD0SmWhX5D" %}
[Running Your First Research](/synthetic-research/running-your-first-research)
{% endcontent-ref %}

{% content-ref url="/pages/52bW7NYC6qduWDfXHEfF" %}
[Audience Profiles Reference](/synthetic-research/audience-profiles-reference)
{% endcontent-ref %}

{% content-ref url="/pages/xIfRWjKlV8LQQzDo34iJ" %}
[Analytics, AI, and Reporting](/analytics-ai-and-reporting)
{% endcontent-ref %}


# Running Your First Research

Step-by-step guide to generating your first synthetic research responses

This guide walks you through generating your first set of synthetic research responses, from choosing an audience to viewing results.

***

## Prerequisites

* An existing survey with at least one answerable question (any type except copy, thank-you, reward, or action).
* Available synthetic answer quota on your plan. See [monthly limits](/synthetic-research#monthly-limits) for details.

***

## Step 1: Open the Audience tab

Navigate to your survey in the Zigpoll dashboard and click the **Audience** tab. If this is your first time running synthetic research on this survey, you'll see the profile builder.

***

## Step 2: Choose an audience template

Select a template from the **Template** dropdown to pre-fill your audience profiles. There are 9 templates available:

* US General Population
* Young Professionals
* Enterprise Decision Makers
* Millennials
* Gen Z
* Gen X
* Baby Boomers
* New Mothers
* Young Men

You can also select **Build from scratch** to start with a blank profile.

{% hint style="info" %}
Templates are starting points — you can edit any profile's name, percentage, or demographic attributes after applying a template.
{% endhint %}

***

## Step 3: Configure audience profiles

Each profile represents a demographic segment of your virtual audience. For each profile, you can set:

* **Profile Name** — A label for this segment (e.g., "Young Adults 18-34").
* **Percentage** — What share of total completions this profile gets. All percentages must total 100%.
* **Demographic Attributes** — 10 optional fields (Age Range, Gender, Geography, Role/Occupation, Salary Range, Education, Relationship Status, Family Status, Interests, Hobbies) plus a free-form Custom Attributes field.

Click **Add Profile** to add more segments. When you adjust one profile's percentage, the others automatically redistribute to keep the total at 100%.

***

## Step 4: Set research goals and context

Under the **Research Goals** section, you can optionally provide:

* **Research Goal** — Describe what you want to learn (e.g., "Understand customer satisfaction with our checkout flow"). This helps the AI generate more relevant and focused responses.
* **Business Description** — Describe your business or product. If you have a Shopify store or domain connected, this is auto-filled for you. You can edit it at any time.

Both fields are optional, but providing them significantly improves response quality.

***

## Step 5: Configure output settings

Under **Output Settings**, configure:

* **Number of Completions** — How many virtual respondents should complete the survey. Enter a number from 1 to 1,000.
* **Response Language** — Choose from 94+ supported languages. Defaults to English.

Review the **Summary** section below to see a breakdown of completions per profile and the total number of answers that will be used from your quota.

***

## Step 6: Generate

Click **Generate Responses** to start the process. The AI will begin generating responses for each profile according to your configuration.

***

## Step 7: Monitor progress

Once generation starts, you'll see a progress screen with:

* A **progress bar** showing completions out of the total, updated every 3 seconds.
* A **status badge** indicating the current state:

| Status     | Description                                                 |
| ---------- | ----------------------------------------------------------- |
| Generating | Responses are actively being generated                      |
| Completed  | All completions finished successfully                       |
| Incomplete | Generation finished but some completions were not completed |
| Failed     | Generation encountered an error                             |
| Cancelled  | You manually cancelled the generation                       |

You can **cancel** generation at any time. Any completions that already finished will be kept.

{% hint style="info" %}
You'll receive an email notification when generation completes or if it fails.
{% endhint %}

***

## Step 8: View results

Once generation finishes, you have three options:

* **View Data** — Opens the standard analytics dashboard where you can see charts, response breakdowns, and AI insights for your synthetic responses.
* **Reset Data** — Permanently deletes all responses, participants, and events for this survey so you can start fresh.
* **Duplicate** — Creates a copy of the survey (without responses) so you can run new research with different audience profiles.

{% hint style="warning" %}
**Reset Data** is permanent and cannot be undone. All responses, participants, and events for the survey will be deleted.
{% endhint %}

***

## Tips for better results

* **Be specific with profiles** — "Female, 28-34, urban, tech worker" produces more realistic responses than just "Mixed, 18-65."
* **Add business context** — Telling the AI about your industry and products helps it generate responses that feel authentic to your domain.
* **Start small** — Run 10-20 completions first to check quality before scaling up to hundreds.
* **Use research goals** — A clear goal like "understand purchase hesitation" produces more focused responses than leaving it blank.
* **Check your survey logic** — Synthetic respondents follow your branching logic and display rules. Make sure your flows work as intended before generating.

***

## Next steps

{% content-ref url="/pages/52bW7NYC6qduWDfXHEfF" %}
[Audience Profiles Reference](/synthetic-research/audience-profiles-reference)
{% endcontent-ref %}

{% content-ref url="/pages/xIfRWjKlV8LQQzDo34iJ" %}
[Analytics, AI, and Reporting](/analytics-ai-and-reporting)
{% endcontent-ref %}


# Audience Profiles Reference

Complete reference for audience profile templates, demographic attributes, and configuration options

This page is a complete reference for all audience templates, demographic attributes, and configuration options available in Synthetic Research.

***

## Audience Templates

Zigpoll includes 9 pre-built audience templates. Each template defines a set of profiles with demographic attributes already filled in. You can use them as-is or customize them after applying.

### US General Population

| Profile              | Percentage | Age Range | Geography | Salary     | Education |
| -------------------- | ---------- | --------- | --------- | ---------- | --------- |
| Young Adults (18-34) | 25%        | 18-34     | US        | $30k-$60k  | Mixed     |
| Middle-Aged (35-54)  | 40%        | 35-54     | US        | $50k-$100k | Mixed     |
| Seniors (55+)        | 35%        | 55+       | US        | $40k-$80k  | Mixed     |

### Young Professionals

| Profile               | Percentage | Age Range | Geography     | Role                   | Salary      | Education                  |
| --------------------- | ---------- | --------- | ------------- | ---------------------- | ----------- | -------------------------- |
| Early Career (22-28)  | 40%        | 22-28     | US - Urban    | Junior/Entry Level     | $40k-$70k   | Bachelor's Degree          |
| Mid Career (29-35)    | 35%        | 29-35     | US - Urban    | Mid-Level Professional | $70k-$120k  | Bachelor's/Master's Degree |
| Senior Career (36-42) | 25%        | 36-42     | US - Suburban | Senior/Manager         | $100k-$160k | Master's/MBA               |

### Enterprise Decision Makers

| Profile        | Percentage | Age Range | Role           | Salary      | Education                  |
| -------------- | ---------- | --------- | -------------- | ----------- | -------------------------- |
| C-Suite        | 20%        | 40-60     | CEO/CTO/CFO    | $200k+      | MBA/Advanced Degree        |
| VP/Director    | 35%        | 35-55     | VP/Director    | $150k-$250k | Master's/MBA               |
| Senior Manager | 45%        | 30-50     | Senior Manager | $100k-$180k | Bachelor's/Master's Degree |

### Millennials

| Profile                   | Percentage | Age Range | Salary     | Interests                                 |
| ------------------------- | ---------- | --------- | ---------- | ----------------------------------------- |
| Early Millennials (35-43) | 50%        | 35-43     | $60k-$110k | Technology, Travel, Wellness              |
| Late Millennials (28-34)  | 50%        | 28-34     | $45k-$85k  | Social Media, Experiences, Sustainability |

### Gen Z

| Profile              | Percentage | Age Range | Role              | Salary    | Interests                             |
| -------------------- | ---------- | --------- | ----------------- | --------- | ------------------------------------- |
| College-Age (18-22)  | 45%        | 18-22     | Student/Part-Time | $0-$25k   | Social Media, Gaming, Activism        |
| Early Career (23-28) | 55%        | 23-28     | Entry Level       | $30k-$55k | Content Creation, Mental Health, Tech |

### Gen X

| Profile            | Percentage | Age Range | Salary     | Family Status              |
| ------------------ | ---------- | --------- | ---------- | -------------------------- |
| Mid Gen X (48-53)  | 50%        | 48-53     | $80k-$140k | Has teenage/adult children |
| Late Gen X (44-47) | 50%        | 44-47     | $70k-$120k | Has school-age children    |

### Baby Boomers

| Profile                 | Percentage | Age Range | Role             | Salary     | Interests                        |
| ----------------------- | ---------- | --------- | ---------------- | ---------- | -------------------------------- |
| Working Boomers (60-67) | 40%        | 60-67     | Senior/Executive | $80k-$150k | Health, Finance, Travel          |
| Retired Boomers (68-78) | 60%        | 68-78     | Retired          | $40k-$80k  | Gardening, Grandchildren, Health |

### New Mothers

| Profile                  | Percentage | Age Range | Gender | Family Status           | Interests                          |
| ------------------------ | ---------- | --------- | ------ | ----------------------- | ---------------------------------- |
| First-Time Moms (25-32)  | 50%        | 25-32     | Female | New mother, first child | Parenting, Baby Products, Wellness |
| Experienced Moms (30-40) | 50%        | 30-40     | Female | Mother of 2+ children   | Family, Organization, Self-Care    |

### Young Men

| Profile                       | Percentage | Age Range | Gender | Role                   | Salary    | Interests                          |
| ----------------------------- | ---------- | --------- | ------ | ---------------------- | --------- | ---------------------------------- |
| College-Age Men (18-22)       | 35%        | 18-22     | Male   | Student/Part-Time      | $0-$25k   | Gaming, Fitness, Sports            |
| Early Career Men (23-28)      | 40%        | 23-28     | Male   | Entry-to-Mid Level     | $35k-$65k | Fitness, Technology, Career Growth |
| Established Young Men (29-34) | 25%        | 29-34     | Male   | Mid-Level Professional | $55k-$95k | Finance, Travel, Relationships     |

***

## Demographic Attributes

Each profile has 10 standard demographic fields plus a free-form custom field. All fields are optional.

| Field               | Key                  | Example                             |
| ------------------- | -------------------- | ----------------------------------- |
| Age Range           | `ageRange`           | 25-34                               |
| Gender              | `gender`             | Female, Male, Mixed                 |
| Geography           | `geography`          | US - Northeast                      |
| Role/Occupation     | `role`               | Software Engineer                   |
| Salary Range        | `salary`             | $50k-$100k                          |
| Education           | `education`          | Bachelor's Degree                   |
| Relationship Status | `relationshipStatus` | Married                             |
| Family Status       | `familyStatus`       | Has children                        |
| Interests           | `interests`          | Technology, Travel                  |
| Hobbies             | `hobbies`            | Reading, Gaming                     |
| Custom Attributes   | `custom`             | Tech-savvy, prefers mobile shopping |

The **Custom Attributes** field is a free-form text area where you can add any additional context about the profile that doesn't fit into the standard fields.

***

## Profile Weighting

Profile percentages control how completions are distributed across your audience segments. Percentages must total 100%.

When you adjust one profile's percentage, the remaining profiles automatically redistribute their percentages to maintain a 100% total. For example, if you have three profiles and set one to 50%, the other two will split the remaining 50%.

When you add a new profile, all profiles are automatically redistributed to equal shares (e.g., 4 profiles get 25% each).

***

## Configuration Options

| Option                | Description                                                                                          | Range                   |
| --------------------- | ---------------------------------------------------------------------------------------------------- | ----------------------- |
| Research Goal         | Describe what you want to learn from this research. Helps the AI focus its responses.                | Free text (optional)    |
| Business Description  | Describe your business, product, or industry. Auto-filled from Shopify store or domain if connected. | Free text (optional)    |
| Number of Completions | How many virtual respondents complete the survey.                                                    | 1 - 1,000               |
| Response Language     | The language responses are generated in.                                                             | 94+ supported languages |

***

## How Synthetic Answers Are Counted

Your monthly synthetic quota is measured in **answers**, not completions. The formula is:

> **Answers = Answerable Questions x Completions**

For example, a survey with 5 answerable questions and 100 completions uses 500 answers. Synthetic answers never count toward your plan's response limit.

The following question types are **not counted** as answerable and do not consume answers:

* Copy
* Thank-you
* Reward
* Action

All other question types (single choice, multiple choice, short answer, long answer, binary choice, form panel, star rating, slider, email capture, range, satisfaction, NPS, dropdown, ranked choice, image choice, consent, country, file upload, etc.) are counted as answerable.

***

## Status Reference

| Status     | Description                                                                 |
| ---------- | --------------------------------------------------------------------------- |
| Generating | The AI is actively generating responses. Progress updates every 3 seconds.  |
| Completed  | All requested completions finished successfully.                            |
| Incomplete | Generation finished but some completions could not be completed.            |
| Failed     | An error occurred during generation. Check the error message for details.   |
| Cancelled  | You manually stopped generation. Any completions already finished are kept. |

***

## Supported Question Types

Synthetic Research can generate responses for all answerable question types, including:

* Single Choice
* Multiple Choice
* Short Answer
* Long Answer
* Binary Choice
* Form Panel
* Star Rating
* Slider
* Email Capture
* Range
* Satisfaction
* NPS
* Dropdown
* Ranked Choice
* Image Choice
* Consent
* Country

{% hint style="info" %}
Survey logic (both action rules and display conditions) is fully respected during synthetic response generation. The AI follows the same branching paths that a real respondent would.
{% endhint %}


# Embed

Have questions about how to embed your Zigpoll? Look no further.

At the core of any non-Shopify Zigpoll implementation is the embed code. Find it by clicking **Installation** in the sidebar.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-ba8c896b89eefaf0e9ca79c37505e28458817369%2Finstallation-embed-code.png?alt=media" alt="The Installation page with the embed code"><figcaption></figcaption></figure>

If you copy and paste that code into the **\<head>** tag of your website, you are all set.

The embed code looks something like this:

```javascript
<script type='application/javascript'>
  ;(function () {
    window.Zigpoll = {
      accountId: 'YOUR_ACCOUNT_ID'
    };

    var script = document.createElement("script");
    script.type = "text/javascript";
    script.charset = "utf-8";
    script.src = "//cdn.zigpoll.com/static/js/main.js";
    script.async = true;

    document.head.appendChild(script);
  }());
</script>
```

{% hint style="info" %}
**YOUR\_ACCOUNT\_ID** will be replaced the id for your particular account.
{% endhint %}

{% hint style="info" %}
[Contact us](mailto:support@zigpoll.com) if you need help installing the embed code. For paid plans we offer end to end installation support.
{% endhint %}

If you're on a site builder like Framer, Wix, or Webflow - see [Integrations](/integrations) for more detailed instructions on implementing Zigpoll into your platform.

#### Single Page Web Apps

If you have a single page webapp you can still use Zigpoll. All you need to do is run the following code immediately **after** you change a page within your app.

```
window.Zigpoll.refresh();
```

#### Load a specific survey by ID

If you want to load a specific survey on a particular page, you can do so by adding a parameter called **pollId** to the Zigpoll object. Find the ID on the survey's **Settings → General → Details → Survey ID**. For example:

```
<script type='application/javascript'>
  ;(function () {
    window.Zigpoll = {
      accountId: 'YOUR_ACCOUNT_ID',
      pollId: 'YOUR_SURVEY_ID'
    };

    var script = document.createElement("script");
    script.type = "text/javascript";
    script.charset = "utf-8";
    script.src = "//cdn.zigpoll.com/static/js/main.js";
    script.async = true;

    document.head.appendChild(script);
  }());
</script>
```

This loads the survey with id **YOUR\_SURVEY\_ID** and overrides the page rules on **Settings → Delivery → Locations** and the rules on **Settings → Targeting**. The survey still has to be live. For the full list of what still applies, see [Which settings still apply](/javascript-api#which-settings-still-apply).

## Inline Embedding

Zigpoll supports two methods for embedding a survey directly into your page content. Both render the survey inline rather than as a popup or slide-in widget.

To use either, open the survey, go to **Settings → Delivery → Format**, choose **Page Embed**, and pick a method under **Embed Settings**.

### Copy & Paste Snippet

This is the simplest way to embed a survey. It is a single, self-contained code block that you paste wherever you want the survey to appear. No global embed script is required, and page rules are bypassed — the survey loads exactly where you place the snippet.

You can find this snippet under **Settings → Delivery → Format → Embed Settings → Copy & Paste Snippet**.

```html
<div id="zigpoll-embed-YOUR_POLL_ID"></div>
<script type="application/javascript">
  ;(function () {
    window.Zigpoll = window.Zigpoll || {};
    window.Zigpoll.accountId = 'YOUR_ACCOUNT_ID';
    window.Zigpoll.pollId = 'YOUR_POLL_ID';
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.charset = "utf-8";
    script.src = "//cdn.zigpoll.com/static/js/main.js";
    script.async = true;
    document.head.appendChild(script);
  }());
</script>
```

{% hint style="info" %}
**YOUR\_ACCOUNT\_ID** and **YOUR\_POLL\_ID** will be pre-filled with the correct values when you copy the snippet from the dashboard.
{% endhint %}

### CSS Selector

This method uses the global embed script (installed in your `<head>` tag as described above) together with a container element on the page that matches a CSS selector you configure.

1. Make sure the **global embed code** is installed in your site's `<head>` tag.
2. Add a container element on the page where you want the survey to appear:

```html
<div id="zigpoll-embed-target"></div>
```

3. Under **Settings → Delivery → Format → Embed Settings**, choose **CSS Selector** and set **Selector** to match the container (e.g. `#zigpoll-embed-target`).

With this method, page rules and display settings are still respected, giving you centralized control over when and where the survey appears.

If no element matches the selector, Zigpoll also looks for `#zigpoll-embed-target` and `#zigpoll-embed-` followed by the survey ID before giving up.

### Which method should I use?

|                | Copy & Paste Snippet                                                          | CSS Selector                                                                      |
| -------------- | ----------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
| **Setup**      | Paste one code block — done                                                   | Install global script + add a container element + configure selector in dashboard |
| **Page rules** | Bypassed — survey always loads where the snippet is placed                    | Respected — survey follows your delivery settings                                 |
| **Best for**   | Landing pages, page builders, or placing multiple surveys on one page quickly | Sites where you want centralized control over display rules and visibility        |

### Multiple surveys on one page

Both methods support placing multiple surveys on a single page.

* **Copy & Paste Snippet**: Each snippet is fully independent. Paste as many snippets as you need — each one loads its own survey.
* **CSS Selector**: Use a unique selector for each survey (e.g. `#zigpoll-survey-1`, `#zigpoll-survey-2`) and configure each survey's delivery settings to point to its own container.

### One survey, one format

A survey has a single delivery format, so the same survey can't be both a pop-up and a page embed. Duplicate the survey and give each copy its own format.

### Styling an embedded survey

Zigpoll draws the survey inside its own frame, so CSS on your page doesn't reach it. Style it on **Settings → Design**, or add rules under **Custom CSS** there.

### Troubleshooting

If an embed doesn't appear, see [My embedded survey isn't showing up](/faq/embedding-surveys-on-specific-pages#my-embedded-survey-isnt-showing-up).


# Participant Metadata

Get the most out of your implementation by tracking participant metadata.

In the next section you can learn more about [Participants](/participants). In short, Participants allow you to keep track of how individuals have responded to your polls. Participants are automatically tracked based on their session with the basic embed code, but you can save extra data to the participant by adding the following code below the embed code:

```
    <script type="text/javascript">
      window.Zigpoll.user = {
        handle: USER_HANDLE,
        id: USER_ID,
        metadata: {
          first_name: USER_FIRST_NAME,
          last_name: USER_LAST_NAME,
          email: USER_EMAIL
        }
      };
    </script>
```

The additional fields you can explore are the following:

* Handle *\<String>*
* Id *\<String>*
* Metadata *\<Object>*

#### Handle

Handles are intended to be an easy way to view your participants list. For example you might want to list your participants by their first and last name followed by their email address.

#### Id

Id's are unique identifiers for your participants. If you do not supply an ID a unique ID will be provided for you, but it will refresh at the end of each session. **This means that if a user clears their cache, they will be re-created with a new id unless you explicitly pass one in.** You will likely want to replace this with the user id value that you use within your particular database.

#### **Metadata**

Metadata allows you to save any additional information about a Participant that you like. To add more data, just add a key and a value to the metadata object.

{% hint style="info" %}
[Contact us](mailto:support@zigpoll.com) if you need help implementing participant tracking. For paid plans we offer full support.
{% endhint %}


# Survey Metadata

Get the most out of your implementation by tracking metadata.

Metadata lets you save some additional information to your survey if you like.

For instance if your survey is on the checkout page you might want to save some additional information like "order\_number", "shipping\_address", "customer\_id", etc...

In order to do this, you will want to use the window\.Zigpoll.metadata JSON object. Simply fill it out with the additional information you want to send and place it on your page before the embed code loads. For example, see the code below:

```
    <script type="text/javascript">
      window.Zigpoll.metadata = {
        {
          order_number: ORDER_NUMBER,
          shipping_address: SHIPPING_ADDRESS,
          customer_id: CUSTOMER_ID
      };
    </script>
```

## Editing metadata from the dashboard

Metadata is normally set by the embed or an integration when the response is recorded, but you can adjust it afterwards. On the **Responses** page, click a response to expand it, open the **⋯** menu in its top-right corner and choose **Edit Metadata**. Add, change or remove key/value pairs and click **Save**. A key may contain letters, numbers, dashes and underscores. Keys written by Shopify, Stripe or Square are shown but locked. Edited metadata appears in the response's details, in the metadata filter and in CSV exports.


# Special Variables

Some metadata has special meaning with the Zigpoll dashboard.

```
shopify_customer_id
```

If **shopify\_customer\_id** is passed it will connect the underlying Shopify customer information to the response.

```
shopify_order_id
```

If **shopify\_order\_id** is passed it will connect the underlying Shopify customer information to the response.

```
order_amount
```

If **order\_amount** is passed it will pass through a value to the response. This value will be used to add additional metrics like Revenue and Average Order Value to the Zigpoll dashboards.

### Automatic Shopify metadata

On Shopify surfaces (checkout, Thank You, Order Status, and customer account surveys), Zigpoll attaches these metadata keys automatically — you can use them in template variables, segments, and exports:

| Key                      | Value                                                                                |
| ------------------------ | ------------------------------------------------------------------------------------ |
| `shopify_customer_email` | The customer's email                                                                 |
| `shopify_customer_phone` | The customer's phone number                                                          |
| `shopify_order_total`    | The order total                                                                      |
| `shopify_currency_code`  | The order's currency code                                                            |
| `shopify_line_items`     | The order's line item titles, comma-separated                                        |
| `shopify_market`         | The buyer's country code (formerly the Shopify Market handle, deprecated by Shopify) |
| `shopify_country_code`   | The buyer's country code                                                             |
| `browser-language`       | The buyer's language (e.g. `fr`)                                                     |
| `browser-locale`         | The buyer's region-qualified locale (e.g. `fr-CA`)                                   |

These keys are also available as [template variables](/questions/template-variables) in your question copy.

### Order journey and shipment metadata

When a response is tied to a Shopify order (through `shopify_order_id`, or automatically on the Thank You and Order Status surfaces), Zigpoll also pulls the order's customer journey and shipment details from Shopify and adds them to the response a few minutes after it is submitted:

| Key                                                                   | Value                                                 |
| --------------------------------------------------------------------- | ----------------------------------------------------- |
| `daysToConversion`                                                    | Days between the customer's first visit and the order |
| `landingPage`                                                         | The page the customer first landed on                 |
| `referrerUrl`                                                         | The site that referred the customer                   |
| `source`, `sourceType`, `sourceDescription`                           | Where the visit came from, as Shopify classifies it   |
| `referralCode`                                                        | A referral code attached to the visit, if any         |
| `utm_source`, `utm_medium`, `utm_campaign`, `utm_term`, `utm_content` | UTM parameters from the visit that led to the order   |
| `shopify_tracking_company`                                            | The shipping carrier or carriers                      |
| `shopify_tracking_number`                                             | The shipment tracking number or numbers               |
| `shopify_tracking_url`                                                | The shipment tracking link or links                   |

Only keys with a value are written. A survey completed before a carrier is assigned adds no tracking keys, and Zigpoll checks again about three minutes after submission to catch fulfillments created in the meantime. Multiple shipments are comma-separated.

### Reported attribution metadata

When a survey has an attribution question ("How did you hear about us?"), Zigpoll reads the respondent's answer, including an "Other" write-in and any follow-up question the answer leads to, and adds these keys to the response. They are written about a minute after a completed response and up to ten minutes after a partial one. There is nothing to set up: a question counts as an attribution question when three or more of its fixed answer options read as distinct channels, in any language.

| Key                    | Value                                                                                                                                                                                       | Present                                                                                                                                                     |
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `attribution_channel`  | The channel the respondent reported, one value from the list below                                                                                                                          | On every response that answered the attribution question                                                                                                    |
| `attribution_source`   | A normalized name for what the respondent named, such as `The Daily`, `@somehandle`, `Wirecutter` or `ChatGPT`. For a write-in that matches no channel, the cleaned-up text of the write-in | Only when the answer names something. Never on surveys in anonymous mode, and never for answers longer than 40 characters, email addresses or phone numbers |
| `attribution_channels` | The channels picked, comma-separated                                                                                                                                                        | Only when a multi-select attribution question had more than one distinct channel picked. `attribution_channel` is then `multiple`                           |

`attribution_channel` is always one of: `ai_assistant`, `tiktok`, `instagram`, `facebook`, `youtube`, `pinterest`, `snapchat`, `reddit`, `linkedin`, `x`, `podcast`, `social`, `search`, `influencer`, `marketplace`, `email`, `sms`, `tv_streaming`, `radio`, `press`, `affiliate_or_review`, `direct_mail`, `out_of_home`, `online_ad`, `event`, `retail_store`, `professional_referral`, `existing_customer`, `gift`, `word_of_mouth`, `community`, `online`, `other`, `unknown`, `multiple`. A write-in that matches none of the channels is `other`, and an answer that names nothing ("don't remember") is `unknown`.

These keys are reserved. Zigpoll sets them itself, and any value your page or embed code sends under a key starting with `attribution_` is ignored.

Like other response metadata, the keys appear in CSV exports as `Survey Metadata: attribution_channel` and `Survey Metadata: attribution_source`, in the Reporting API, and in every integration that receives response metadata. If a survey has more than one attribution question, the first one in the survey's order is used. Responses collected before this was released don't have the keys unless Zigpoll support backfills them for your account. See [How do I find out how customers heard about my store?](/tutorials/attribution-surveys) for setting up the question and its follow-ups.


# Participants

Dig deeper into individual participant data and view response history

By default, a unique id is assigned to everyone who fills out a survey on your website. This id is unique for each customer's session and will follow them around on the website as they fill out your surveys.

Each session id becomes a participant in your participants list. You can customize the ID and metadata for each participant by following the instructions in our [participant metadata](/embed/participant-metadata) section.

#### How participants are named

Each participant is listed under a handle. Zigpoll uses the first of these it finds: a `name` in the participant's metadata, an `email` in their metadata, their Shopify customer id, or an email address they typed into a survey. If none are present, the participant is listed by their id.

#### How participants are merged into one record

The same person often shows up on more than one surface — your storefront widget, a Shopify checkout or Thank You page survey, an email or SMS survey link. Zigpoll automatically merges these into a single participant record when it can identify them as the same person:

* The **Shopify customer id** is the authoritative join key — two records with the same customer id are merged, and two records with *different* customer ids are never merged.
* A verified customer **email** (from Shopify or survey metadata) can also join records. Free-text email answers typed into a survey are deliberately **not** used for merging, so a typo can't fold two people together.

Merging happens automatically in the background, and old session ids keep working — looking up a merged-away id resolves to the combined participant, so exports and integrations don't break.

{% content-ref url="/pages/-LZv5HhSlUqm6srkUKqh" %}
[Participant Metadata](/embed/participant-metadata)
{% endcontent-ref %}

#### How Zigpoll Participants interact with Shopify

For customers who have purchased from your brand, Zigpoll will automatically sync historical survey data with the matching customer records in Shopify. This is all displayed within Zigpoll's participant dashboard.

From Zigpoll, you'll be able to see key Shopify data including the customer email, orders, and any other available metadata in Shopify.

We join these records using the Shopify customer id (with email as a fallback — see above). See a demo screenshot below:

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-99ffd9fb83623e0a3d515784eeba005d3fcce1b5%2Fparticipant-detail.png?alt=media" alt="A participant with Shopify customer data and engagement history"><figcaption></figcaption></figure>

#### Viewing participant history and activity

Zigpoll stores data on each participant, allowing you to see how they responded to your surveys and associated metadata such as IP address, geo, and any Shopify related data such as customer email or orders.

To access the participant history, click **Participants** in the sidebar. Inside a survey, its own **Participants** page lists only the people who answered that survey.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-4f946d5262687f555e131278c6f1172022ea15ae%2Fparticipants-list.png?alt=media" alt="The Participants page"><figcaption></figcaption></figure>

You can choose to view participants for **All Surveys** or a specific survey via the drop down menu. To find someone, use the search box: it matches names, ids, and email addresses.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-c7ff5ec896748cf5ff285d44ca3b6a8ed485c161%2Fparticipants-filter.png?alt=media" alt="The survey dropdown and search box on the Participants page"><figcaption></figcaption></figure>

And if you want to drill deeper into a specific participants, you can click into each participant to see their entire history.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-033ab37b29b5dfe6cefee02d7c61303224f44910%2Fparticipants-open.png?alt=media" alt="A participant in the list"><figcaption></figcaption></figure>

The participant opens with their details on the left and their engagement history on the right, as in the screenshot in the Shopify section above.

#### Exporting participants

Click **Export to CSV** on the **Participants** page. Turn on **Include Responses** to add each participant's answers to a survey, then click **Email CSV**. The file is emailed to you. See [Exporting Data to CSV](/tutorials/exporting-data-to-csv).

#### Deleting a participant or their responses

Open the participant and click **More Actions**:

* **Delete Participant** removes the person and everything they submitted.
* **Delete Responses** lets you tick individual responses to remove.

Both are permanent and don't lower your monthly response count. See [Removing Participant Data](/tutorials/removing-participant-data) and [Deleting Survey Responses](/tutorials/deleting-responses).


# Subscription Plans

We offer a variety of plans that should fit any sized business

### Our Plans

All plans come with unlimited survey types, survey questions, live surveys, branching logic, presentation logic, premium integrations, custom CSS, and general support via <support@zigpoll.com>.

All plans also include our full AI analytics suite — **automatic account insights, automatic survey insights, Write-In themes & summaries, and Z-GPT chat with your data**. The only thing that varies by plan is the monthly AI analysis credit allotment used to generate on-demand insights.

Response limits are metered in **responses** — one per participant taking a survey, however many questions they answer. See [How we calculate responses](/subscription-plans/how-we-calculate-responses) for details.

{% hint style="info" %}
Already subscribed? If your account is on one of the plans below, your limits are the ones listed here. If you're on an older plan that is no longer listed, you keep that plan's price and limits. The lineup below applies to new subscriptions and plan changes.
{% endhint %}

#### Lite : Free

This is our most basic plan. Best for hobbies, development websites, or just testing the platform!

* 50 responses per month
* Send 100 emails per month
* Send 5 SMS messages per month
* 100 synthetic research answers per month
* 25 AI analysis credits per month

#### Standard : $39/mo ($29/mo when billed annually)

Our most popular plan, built for the needs of most small businesses. You get:

* 200 responses per month
* Send 2,500 emails per month
* Send 250 SMS messages per month
* Installation support
* Copywriting support
* White label support
* Automatic exports
* Custom sender domain
* Custom survey domain
* 2,000 synthetic research answers per month
* 50 AI analysis credits per month

#### Premium : $79/mo ($59/mo when billed annually)

More room than Standard, plus programmatic access. Everything in Standard, and:

* 350 responses per month
* Send 5,000 emails per month
* Send 500 SMS messages per month
* API access
* MCP access
* 3,000 synthetic research answers per month
* 100 AI analysis credits per month

#### Advanced : $129/mo ($97/mo when billed annually)

Great for growing businesses. Everything in Premium, and:

* 600 responses per month
* Send 10,000 emails per month
* Send 1,000 SMS messages per month
* Priority customer support
* 4,000 synthetic research answers per month
* 150 AI analysis credits per month

#### Growth : $199/mo ($149/mo when billed annually)

For stores collecting feedback at volume. Everything in Advanced, and:

* 1,000 responses per month
* Send 25,000 emails per month
* Send 2,000 SMS messages per month
* 5,000 synthetic research answers per month
* 250 AI analysis credits per month

#### Scale : $249/mo ($187/mo when billed annually)

Serious research programs across every channel. Everything in Growth, and:

* 2,000 responses per month
* Send 40,000 emails per month
* Send 3,000 SMS messages per month
* 7,500 synthetic research answers per month
* 400 AI analysis credits per month

#### Premier : $399/mo ($299/mo when billed annually)

Our largest self-serve plan. Everything in Scale, and:

* Unlimited responses
* Send 50,000 emails per month
* Send 4,000 SMS messages per month
* Dedicated setup call
* 10,000 synthetic research answers per month
* 600 AI analysis credits per month

#### Enterprise : Contact us

For teams with procurement, security, and data requirements. Everything in Premier, and:

* Unlimited responses with custom email and SMS volumes
* SSO (SAML) and SCIM provisioning
* Signed DPA and security-questionnaire support
* Custom MSA, uptime SLA with credits, and invoicing/PO billing
* Data warehouse sync (BigQuery, Snowflake, S3)
* Industry benchmark reports
* Unlimited sub-accounts with multi-brand rollup reporting
* Dedicated CSM, quarterly business reviews, and a shared Slack channel
* Managed synthetic research with custom AI panels
* Full service setup
* Full service auditing
* Full service reporting

Enterprise is sales-assisted. Contact us at <support@zigpoll.com> to get set up.

#### **Custom : Price Varies**

If none of these plans fit your needs, contact us at <support@zigpoll.com>. We'll set you up with a plan that suits your business.


# How we calculate responses

Wondering how your responses add up?

A response counts toward your account whenever a participant takes one of your surveys. One person taking one survey is **one response**, however many questions the survey has or they answer. If a participant fills out all of a 3 question survey, that's 1 response. If they stop after the first question, that's still 1 response.

Each question they answer is tracked separately as an **answer**. Your dashboard shows answers so you can see how much data each question collects. Answers don't count toward your plan limit.

Previews of your own surveys from the Zigpoll dashboard and synthetic (AI) research never count as responses.

{% hint style="info" %}
**Changed on September 1, 2026.** Before that date, plan limits counted every answered question: a 3 question survey completed by one person used 3 of your monthly allowance. Since September 1, 2026, limits count one response per person taking a survey. The plan limit numbers were re-based to match (see [Subscription Plans](/subscription-plans)). Support replies and emails from before that date that describe per-question counting no longer apply.
{% endhint %}

### Responses, Answers, and Write-Ins

You'll see three counters on your dashboard and in the API:

* **Responses** — one participant taking your survey. This is the number your plan limit applies to.
* **Answers** — one question answered by one participant. A single response can produce many answers, one for each question they answer.
* **Write-Ins** — free-text answers (short answers, long answers, write-in answers). They're a subset of your answers, tracked separately so you can see how much qualitative feedback you're collecting.

A 3 question survey completed by 10 participants would show **10 responses** and **30 answers**.

{% hint style="info" %}
[Synthetic research](/synthetic-research) has its own separate monthly quota per plan, measured in synthetic answers. It never counts toward your response limit.
{% endhint %}

### When a repeat visit counts again

By default, each participant can take a survey only once. Returning to a survey you already started continues the same response instead of starting a new one.

To let people take a survey more than once:

1. Open the survey and go to **Settings → General → Behavior**.
2. In the **Answering** card, turn on **Allow resubmissions**.

With it on, the survey restarts from the first question every time it loads. Each load that gets at least one answer is a new response. This suits contact-us style forms, but it can use up your allowance much faster.


# Notifications

Learn how to control your Zigpoll email notifications.

Zigpoll can email you each time someone responds to a survey, and once a week with a recap of your account. You control both from two places:

* **Settings → Notifications** for the whole account.
* **Settings → Workflows → Notifications** inside a survey, for that survey only.

### **Account Notification Settings**

Go to **Settings → Notifications** to find the following items:

#### **Notification Recipients**

By default all notifications will be emailed to the account owner's email address. If you would like to send them to someone else, or to more than one person, add the addresses here and press **Update Account**.

For accounts created through the Shopify app, the account owner's email is your Shopify store's email address. If that inbox isn't the one you read, add the address you want here.

This list also receives operational alerts about your account, including [webhook failure alerts](/integrations/webhooks#if-your-endpoint-stops-working) when one of your endpoints stops accepting deliveries.

#### Send Weekly Recaps

By default, we will send you a weekly recap of your account's performance to the emails listed in the Notification Recipients above. If you would like to disable these notifications, flip the switch and you will no longer receive them.

The recap is sent every Monday at 7 AM Eastern and covers the previous week, Monday to Sunday. It is skipped for any week with nothing to report. It contains:

| Figure           | What it counts                                                                              |
| ---------------- | ------------------------------------------------------------------------------------------- |
| **Answers**      | Answers to fixed-choice questions, such as multiple choice, rating, and dropdown questions. |
| **Write-Ins**    | Typed answers.                                                                              |
| **Participants** | People who first answered one of your surveys that week.                                    |
| **Emails**       | Email addresses your surveys collected that week.                                           |

Each figure shows the percentage change from the week before. Below them, the recap lists a few recent write-ins and, when available, recent AI insights from one of your surveys.

#### Response Limit Notification

Choose which emails Zigpoll sends about your monthly response limit:

| Option                                                                                  | Warning email | Limit reached email |
| --------------------------------------------------------------------------------------- | ------------- | ------------------- |
| **Notify when I have reached 85% of my monthly limit.** (you can change the percentage) | Yes           | Yes                 |
| **Do not notify until I reach my limit.**                                               | No            | Yes                 |
| **Do not notify me when I reach my monthly limit.**                                     | No            | No                  |

* **The warning email** is sent once a month, when your responses reach the percentage you set (85% unless you change it). Its subject reads "You have reached 85% of your response limit for the month." If your plan also has email or SMS limits, the same warning covers those.
* **The limit reached email**, "You've reached your response limit", is sent once a month, when your responses go past your plan's limit.

Zigpoll checks every hour, so either email can arrive up to an hour after you cross the line. Both go to your **Notification Recipients**, or to the account owner if that list is empty. Both reset on the 1st of the month, along with your response count.

{% hint style="warning" %}
**Do not notify me when I reach my monthly limit.** turns off both emails, including the limit reached email. If you choose it, you won't get an email when your surveys hit the limit. See [What happens when I reach my response limit?](/faq/billing-accounts-and-plans#what-happens-when-i-reach-my-response-limit)
{% endhint %}

#### Survey Notifications

The bottom of **Settings → Notifications** lists every survey with a switch. Flip a survey's switch off to stop its response emails. Click the survey's name to open its own notification settings.

{% hint style="info" %}
Switching a survey back on from this list sets it to **Email for every partial or complete response**. To choose a narrower option, open the survey's own settings.
{% endhint %}

### Survey Notification Settings

To stop receiving notifications from your survey, try the following:

1. Go to Apps → Zigpoll → **Surveys** → select your survey
2. Click **Settings → Workflows → Notifications**
3. Under **Email notifications**, select **Do not email me** and press **Save Changes**.

#### Edit your survey notification settings

To edit your notification settings, try the following:

1. Go to Apps → Zigpoll → **Surveys** → select your survey
2. Click **Settings → Workflows → Notifications**

**Email notifications** decides when this survey emails you:

| Option                                                   | When the email is sent                            |
| -------------------------------------------------------- | ------------------------------------------------- |
| **Email for every partial or complete response**         | Whenever someone answers at least one question.   |
| **Email only for completed responses**                   | Only when someone finishes the survey.            |
| **Email only when the respondent gave an email address** | Only when the response includes an email address. |
| **Email only when there is a write-in**                  | Only when the response includes a typed answer.   |
| **Do not email me**                                      | Never.                                            |

You get one email per person per survey, not one per question. Zigpoll waits until the person is done, then sends a single email with all of their answers:

* **Completed responses** are emailed about a minute after the last question.
* **Partial responses** are emailed about 10 minutes after the person's last answer. Each new answer restarts the wait.

#### Notification email recipients

By default, any notification emails will be sent to the recipients defined in your account's **Settings → Notifications**, or to the owner's email address if none are specified. If you would like to send notifications for a particular survey to a different email address, enter the addresses here and press **Save Changes**.

Zigpoll picks recipients in this order and uses the first list it finds:

1. The survey's own **Notification email recipients**.
2. The account's **Notification Recipients**.
3. The account owner's email address.

{% hint style="warning" %}
The survey's recipient field starts out showing your account list. Once you edit it and save, that survey keeps its own copy. Later changes to the account list won't reach it. To make the survey follow the account list again, remove every address from the survey's field and save.
{% endhint %}

#### What a notification email includes

Each email names the account, the survey, and the participant, with links back to your dashboard. It lists every answer the person gave, with each question's type. It also shows any email addresses they submitted. When the person gave an email address, replying to the notification emails them directly.

It also lists the response's metadata, such as the page URL, UTM parameters, and any values you passed in. For Shopify stores, when a response is tied to an order, Zigpoll looks the order up. The email then shows both:

* `shopify_order_number`: the order number your customers see, such as `#1001`.
* `shopify_order_id`: the internal order ID, linked to the order in your Shopify admin.

A response only carries order details when the survey knows which order it belongs to. Post-purchase surveys on the Thank You and Order Status pages send them automatically. Email and link surveys only have them if the link carries the order, for example `?shopify_order_id={{ shopify_order_id }}`.

Under **More Options**, you can change two things:

* **Metadata in notifications**: choose **Include all metadata**, **Hide all metadata**, or **Include selected metadata only**. The selected option takes a comma-separated list of keys, such as `shopify_order_number, order_total`.
* **Notification Email Logo**: put your own logo in the email header.

### Troubleshooting

#### I stopped getting notification emails

Check these in order:

1. **The survey is set to Do not email me.** Open the survey's **Settings → Workflows → Notifications** and check **Email notifications**. Also check the survey's switch in the **Survey Notifications** list under **Settings → Notifications**. Both change the same setting.
2. **The option only fires for some responses.** **Email only for completed responses** skips people who leave partway through. The email-address and write-in options skip responses without them.
3. **The emails go to a different address.** The survey may have its own recipient list. See "Notifications still go to the old address" below.
4. **Your address bounced.** If an email to your address ever failed permanently, or was marked as spam, Zigpoll stops sending anything to that address. Email <support@zigpoll.com> with the address and we'll clear it.
5. **The email is in spam.** Notifications come from `notifications@zigpoll.com` and weekly recaps from `support@zigpoll.com`. Add both to your contacts.

If only the weekly recap stopped, someone may have clicked the unsubscribe link in a recap. That turns off **Send Weekly Recaps**. Turn it back on in **Settings → Notifications**.

#### Notifications still go to the old address

A survey's own recipient list always beats the account list. If you changed **Notification Recipients** under **Settings → Notifications** and one survey still emails the old address, that survey has its own list:

1. Open the survey and go to **Settings → Workflows → Notifications**.
2. Look at **Notification email recipients**.
3. Replace the old address, or remove every address so the survey uses the account list again.
4. Press **Save Changes**.

Repeat for each survey that still emails the old address. If neither list has any addresses, emails go to the account owner. For Shopify-created accounts that's the store email.

#### Slack notifications

You can also send response notifications to a Slack channel. See the Slack integration guide:

{% content-ref url="/pages/NivQeknGw6liAfgyoSrB" %}
[Slack](/integrations/slack)
{% endcontent-ref %}


# Shopify App

Seamlessly integrate Zigpoll into your Shopify Store

On a Shopify store, the [Shopify App](https://apps.shopify.com/zigpoll) installs Zigpoll for you, with no code.

#### **Install on Shopify**

Install the app from the [Shopify App Store](https://apps.shopify.com/zigpoll). Then create a survey and set it to **Live**.

After you install, open Zigpoll from Shopify admin → **Apps → Zigpoll**. The **Installation** page in the sidebar has a card for each place a survey can run, with the steps for that surface.

#### Storefront and checkout are separate installs

Shopify runs your storefront and your checkout in different places, so each needs its own install. Turning one on does nothing for the other.

| Install                       | Where you turn it on                                                     | What it runs                                                        |
| ----------------------------- | ------------------------------------------------------------------------ | ------------------------------------------------------------------- |
| **Theme app embed**           | Shopify theme editor → **App embeds** → **Zigpoll**                      | Storefront surveys: pop-ups, launchers, page embeds and exit intent |
| **Zigpoll app block**         | Shopify checkout editor, on the **Thank you** and **Order status** pages | Thank You & Order Status surveys                                    |
| **Checkout Survey** app block | Shopify checkout editor, on the checkout steps (Shopify Plus)            | Checkout Steps surveys                                              |
| **Zigpoll** app block         | Shopify customer accounts editor                                         | Customer account surveys                                            |
| Zigpoll POS tile              | Shopify POS smart grid editor                                            | Shopify POS surveys                                                 |

If on-site surveys show but post-purchase surveys don't, or the other way around, the missing install is usually the cause.

{% content-ref url="/pages/PGhkx2yhRBS5lz2OY5YE" %}
[Activating Zigpoll on Shopify 2.0](/installation/activating-zigpoll-on-shopify-2.0)
{% endcontent-ref %}

{% content-ref url="/pages/UZJFw4wmRdrtb9JR0GUo" %}
[Activating Zigpoll on Shopify Checkout Extensions](/installation/activating-zigpoll-on-shopify-checkout-extensions)
{% endcontent-ref %}

{% hint style="info" %}
Surveys on your in-store registers use the Shopify POS app instead — see [Activating Zigpoll on Shopify POS](/installation/activating-zigpoll-on-shopify-pos).
{% endhint %}

#### Script tags are being retired

Zigpoll used to add a script tag to your theme automatically. Shopify is retiring script tags: Zigpoll can no longer add one, and any existing script tag stops working on **March 1, 2027**. The **theme app embed** replaces it and works on every theme.

If your store still has the old script tag, the **Theme app embed** card on the **Installation** page tells you so. Switch the app embed on before March 1, 2027, or your on-site surveys will stop showing. Once it's on, you can remove the old script tag from the same card. Leaving both on in the meantime is fine, because Zigpoll only loads once.

{% embed url="<https://www.zigpoll.com/img/video/theme-embed.mp4>" %}


# Log In

How to log in to Zigpoll through Shopify

If you installed Zigpoll from the Shopify App Store, log in through your Shopify admin:

1. Go to your Shopify store's admin section (ex: mystore.myshopify.com/admin).
2. Click **Apps → Zigpoll**.
3. Zigpoll logs you in and opens your dashboard.

You can also go to [app.zigpoll.com](https://app.zigpoll.com/log-in) and click **Log in with Shopify**.

Anyone with access to the store's Shopify admin can open Zigpoll this way. If the person who installed Zigpoll has left, someone else with Shopify admin access can still get in.

## Troubleshooting

### Password reset says the email was sent, but nothing arrives

A store that installed Zigpoll from Shopify logs in through Shopify and has no Zigpoll password. There's nothing to reset, so no reset email is sent, even though the page shows **Email Sent!**. Use **Log in with Shopify** or Shopify admin → **Apps → Zigpoll** instead.

### Logging in with my email opens an empty account

Typing the store's email address and a password on the login page doesn't find the Shopify install, because that login has no password. Zigpoll treats it as a new sign-up and creates a separate, empty login. Your surveys are still in the store's account. Log out and use **Log in with Shopify**.

### Can I log in without Shopify?

A store's own login always goes through Shopify. You can't add a password or Google sign-in to it. To reach the account from app.zigpoll.com directly, give an email login access to it:

1. Open Zigpoll from Shopify admin → **Apps → Zigpoll**.
2. Click **Profile**, open **Accounts**, then open the **Team** tab.
3. Click **Add Team Member**, enter the email address, choose a role (for example **Admin**), and click **Add**.
4. Accept the invite from that inbox. Sign up through the link with a password or with **Sign up with Google**.

From then on, that login can use app.zigpoll.com and switch to the store from the account dropdown at the top left. Plan changes on a Shopify-billed account still need approval in the store's Shopify admin. See [Adding Team Members](/tutorials/adding-team-members).

### I see a different account than I expected

Each store has its own Zigpoll account, and each login method (Shopify, email and password, Google) is a separate login. Log out and log back in with the method that has the account you need. See [Managing Multiple Accounts](/accounts/multiple-accounts).


# Shopify Flow

Utilize our Shopify Flow Integration

Zigpoll adds three triggers and one action to Shopify Flow.

### Triggers

#### Zigpoll Survey Completed

Fires for every response to any Zigpoll survey. Includes a **Survey** object:

| Field       | What it holds                                                                                                             |
| ----------- | ------------------------------------------------------------------------------------------------------------------------- |
| `ID`        | The survey's ID                                                                                                           |
| `Title`     | The survey's title                                                                                                        |
| `URL`       | A link to this response in your Zigpoll dashboard                                                                         |
| `Responses` | One entry per answered question: `Handle` (the question's handle), `Type` (the question type) and `Response` (the answer) |
| `Metadata`  | Every metadata item on the response, as `Name` and `Value`                                                                |

#### Zigpoll Survey Completed (with email capture)

Includes a **Customer** reference alongside the Survey object, so you can act on the customer record in your workflow. It only fires when the response is tied to a Shopify customer — see [below](#my-flow-isnt-running).

#### Zigpoll Survey Completed (with order capture)

Includes the **Customer** and **Order** references alongside the Survey object. It only fires when the response is tied to both a customer and an order, which in practice means post-purchase surveys.

{% hint style="warning" %}
Triggers whose names end in **\[Deprecated]** will expire. If your workflows use *Zigpoll Post Purchase/Order Status Survey Completed \[Deprecated]* or *Zigpoll Survey Completed (with email capture) \[Deprecated]*, rebuild them on the triggers above.
{% endhint %}

{% hint style="info" %}
Survey answers can also be written to customer metafields, which Flow can read. For the namespace and key Zigpoll uses, see [Metafield namespace and key](/polls/behavior-settings#metafield-namespace-and-key).
{% endhint %}

### Actions

#### Send Email Survey

Sends a Zigpoll email survey to a customer from within a Flow workflow. It takes:

* **Customer** (required) — the customer to email, usually from the workflow's trigger.
* **Order** (optional) — attaches the order to the response.
* **Survey ID** (required) — the survey to send. Find it by opening the survey and going to **Settings → General → Details → Survey ID**.

This lets you send surveys based on any condition Flow can express — customer tags, order values, fulfillment events, and so on.

### My Flow isn't running

#### The trigger hasn't fired yet

Zigpoll fires its Flow triggers after a short wait, not the moment someone answers:

* **About a minute after the last question**, when the person completes the survey.
* **About 10 minutes after their last answer**, when they stop partway, or when the survey has **Allow edits** turned on.

For post-purchase surveys, Zigpoll also waits for Shopify to finish processing the order. It retries for several minutes (see **Order lookup attempts** on the [Settings → Workflows → Shopify](/polls/behavior-settings#shopify) tab). Give a test response several minutes before checking the workflow's run history.

{% hint style="info" %}
Despite the names, the triggers also fire for partial responses once the person stops answering. If your workflow should act only on a particular answer, check the **Responses** list in it.
{% endhint %}

#### "with email capture" never fires

This trigger needs a Shopify customer. Zigpoll finds one from:

* the customer on the order, for post-purchase surveys;
* a `shopify_customer_id` passed to the survey as metadata;
* an email address given in the survey that matches a Shopify customer — or creates one, if **Create new customers** is on under **Settings → Workflows → Shopify**.

A visitor who never gives an email has no customer. Neither does an email that doesn't match a customer while **Create new customers** is off. In both cases, only **Zigpoll Survey Completed** fires.

#### "with order capture" never fires

This trigger needs an order as well as a customer. Post-purchase surveys on the Thank You and Order Status pages carry the order automatically. On-site, email and link surveys don't, unless the link passes it (for example `?shopify_order_id=`). Use **Zigpoll Survey Completed (with email capture)** for those.

#### The workflow uses a deprecated trigger

Deprecated triggers are being retired. Rebuild the workflow on one of the current triggers.

#### The workflow isn't turned on

Flow only runs workflows that are turned on. Open the workflow in Shopify Flow and check its status and run history.

#### Send Email Survey doesn't send

* The **Survey ID** must belong to the Zigpoll account connected to this store.
* The customer must exist in Shopify with an email address.
* Emails count toward your plan's monthly email limit. Once you reach it, Zigpoll skips the send.


# Web Pixel Events

Subscribe to Zigpoll lifecycle and answer events from a Shopify Custom Pixel

Zigpoll's Shopify checkout extension publishes a documented set of [Web Pixels custom events](https://shopify.dev/docs/api/web-pixels-api/emitting-data) so you can react to survey activity from a Shopify Custom Pixel — fire a Klaviyo flow when a survey completes, push answers into GA4 / GTM, kick off a loyalty action when a question is answered, etc.

All events use the `zigpoll:` namespace and fire from the Zigpoll post-purchase / order-status / customer-account surfaces.

{% hint style="info" %}
If you're only after a quick GA4 setup, the simpler [GA4 Shopify Pixel](/integrations/ga4-shopify-pixel) recipe uses the legacy `zigpoll-event` channel and is easier to copy-paste. This page is the full event reference for richer integrations.
{% endhint %}

### Event catalog

| Event                      | When it fires                                                                                                                                                                                                                                        |
| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `zigpoll:poll_rendered`    | The first time a survey's frame is shown to the shopper on this surface                                                                                                                                                                              |
| `zigpoll:poll_opened`      | The survey widget expands / becomes interactive                                                                                                                                                                                                      |
| `zigpoll:slide_viewed`     | A new question becomes the active question                                                                                                                                                                                                           |
| `zigpoll:answer_submitted` | Any answer is accepted by the server — fires once per submitted question, for every interactive question type (single-choice, multi-choice, dropdown, rating, satisfaction, NPS, range, free-response, form, email-capture, rank, date, file-upload) |
| `zigpoll:poll_completed`   | All required questions have been answered. Payload includes an `answers` array with every collected response                                                                                                                                         |
| `zigpoll:poll_closed`      | The shopper dismisses the widget without completing                                                                                                                                                                                                  |
| `zigpoll:poll_hidden`      | The widget is hidden permanently (`hideAfterSubmission` / `hideAfterClose`)                                                                                                                                                                          |

### Base payload

Every `zigpoll:*` event includes these fields on `event.customData`:

| Field               | Type                | Description                                                                                    |
| ------------------- | ------------------- | ---------------------------------------------------------------------------------------------- |
| `pollId`            | string              | Internal survey id                                                                             |
| `pollHandle`        | string              | Slugified survey title                                                                         |
| `pollTitle`         | string              | Survey title                                                                                   |
| `surface`           | string              | `shopify_checkout`, `shopify_thank_you`, `shopify_order_status`, or `shopify_customer_profile` |
| `shopifyOrderId`    | string \| undefined | The Shopify order id when available                                                            |
| `shopifyCustomerId` | string \| undefined | The Shopify customer id when available                                                         |
| `myshopifyDomain`   | string              | The store's `.myshopify.com` domain                                                            |
| `timestamp`         | string              | ISO-8601 timestamp of the event                                                                |

### Answer payload (`zigpoll:answer_submitted` and entries in `zigpoll:poll_completed.answers[]`)

Per-question answer entries match the shape Zigpoll uses everywhere else — webhooks, mailer, Klaviyo bridge:

| Field        | Type                   | Description                                                                                    |
| ------------ | ---------------------- | ---------------------------------------------------------------------------------------------- |
| `key`        | string                 | The question's handle (the identifier you set in the survey editor)                            |
| `value`      | string \| number       | Compiled human-readable answer. Joined with `,` for multi-answer types                         |
| `arrayValue` | string\[] \| undefined | Present for multi-answer questions (multi-choice, rank, form) — the answer choices as an array |
| `slideId`    | string                 | Internal question id                                                                           |

#### How `value` is shaped per question type

| Question type                                  | Example `value`                           | `arrayValue`        |
| ---------------------------------------------- | ----------------------------------------- | ------------------- |
| `single-choice`, `dropdown`                    | `"Blue"`                                  | —                   |
| `multi-choice`                                 | `"Blue, Green"`                           | `["Blue", "Green"]` |
| `rank`                                         | `"#1 Apple, #2 Pear"`                     | —                   |
| `rating`, `satisfaction`, `nps`, `range`       | `4`                                       | —                   |
| `free-response`, `short-answer`, `long-answer` | `"I like the ocean"`                      | —                   |
| `email-capture`                                | `"alice@example.com"`                     | —                   |
| `form`                                         | `"Name: Alice, Email: alice@example.com"` | —                   |
| `date`                                         | `"03/15/2026"`                            | —                   |
| `file-upload`                                  | `"https://…/file1, https://…/file2"`      | —                   |

### Subscribing from a Custom Pixel

1. Go to your **Shopify Dashboard → Settings → Customer Events**.
2. Click **Add custom pixel**.
3. Paste a subscription block like the one below:

```javascript
analytics.subscribe('zigpoll:answer_submitted', (event) => {
  const { key, value, arrayValue, slideId, pollId, surface, shopifyOrderId } = event.customData;

  // `value` is the compiled answer (string or number).
  // `arrayValue` is populated for multi-choice / rank / form.
  console.log(`Survey ${pollId} - ${key}: ${value}`);
});

analytics.subscribe('zigpoll:poll_completed', (event) => {
  const { pollId, answers, shopifyOrderId } = event.customData;

  // answers is an array of {key, value, arrayValue, slideId} entries
  answers.forEach(({ key, value }) => {
    console.log(`${key}: ${value}`);
  });
});
```

### Forwarding to GA4 with the new events

If you want richer GA4 events than the legacy [GA4 Shopify Pixel](/integrations/ga4-shopify-pixel) recipe gives you — for example, separate events for `Survey Started`, `Question Answered`, and `Survey Completed` — replace the legacy subscription with one block per event:

```javascript
var f = document.getElementsByTagName('script')[0];
var j = document.createElement('script');
j.async = true;
j.src='https://www.googletagmanager.com/gtag/js?id=G-XXXX';
f.parentNode.insertBefore(j, f);

window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-XXXX');

analytics.subscribe('zigpoll:answer_submitted', (event) => {
  const { key, value, pollId, pollTitle } = event.customData;
  gtag('event', 'zigpoll_answer_submitted', {
    event_category: 'Zigpoll',
    event_label: pollTitle,
    zigpoll_poll_id: pollId,
    zigpoll_question: key,
    zigpoll_response: value
  });
});

analytics.subscribe('zigpoll:poll_completed', (event) => {
  const { pollId, pollTitle, answers } = event.customData;
  gtag('event', 'zigpoll_poll_completed', {
    event_category: 'Zigpoll',
    event_label: pollTitle,
    zigpoll_poll_id: pollId,
    zigpoll_answer_count: answers.length
  });
});
```

### Security note

Per Shopify's own [Web Pixels docs](https://shopify.dev/docs/api/web-pixels-api/emitting-data#publishing-custom-events), custom events can be published by anyone with browser-console access — including the shopper. Treat the payloads as untrusted input for security-sensitive decisions; they're fine for analytics, attribution, and triggering downstream marketing flows, but don't grant rewards or change account state purely based on a `customData` value.

### Backward compatibility

The original `zigpoll-event` channel that the [GA4 Shopify Pixel](/integrations/ga4-shopify-pixel) recipe subscribes to is still published unchanged. Existing pixels keep working — these new namespaced events are additive.


# Affiliate Program

Earn 50% revenue share on every referral with the Zigpoll Affiliate Program.

Zigpoll offers a 50% revenue share affiliate program. When you refer a customer who converts to a paid plan, you earn 50% of their plan's price every month, for as long as their account stays on a paid plan.

#### **Step 1: Create an Affiliate Account**

Register at <https://app.zigpoll.com/affiliate-sign-up>. After completing the form, you will be directed to your affiliate dashboard. You can come back to it any time from **Profile → Affiliate**, which has **Overview**, **Payouts**, and **Referrals** tabs.

#### **Step 2: Configure Your Payout Method**

On the **Overview** tab, go to **Payout Settings** and choose how you want to be paid:

* **Stripe:** connect a Stripe account, and payouts are sent to it on the 28th of each month.
* **PayPal:** enter the PayPal email address where we should send payments.

#### **Step 3: Share Your Affiliate Links**

In the **Affiliate Links** section of the **Overview** tab, you will find two referral links: a general **Affiliate link** and a **Shopify affiliate link** that goes to the Zigpoll listing on the Shopify App Store. Share these with prospective customers.

Referrals are tracked for 30 days from the initial click. Any account created within that window will be attributed to you.

#### **Step 4: Track Referrals and Payouts**

Follow your referrals and earnings on two tabs of your affiliate dashboard. Payouts are made on the **28th of each month**.

* **Referrals** tab: your referrals, their accounts, and their subscriptions.
* **Payouts** tab: your **Estimated Payout** for the month, and **Payout History** of past commissions with the accounts they came from.

### How commission is calculated

* **Monthly plans:** 50% of the plan's monthly price, each month the referred account is on a paid plan.
* **Annual plans:** billed at 25% off, so you earn 50% of what the customer pays, spread across the year. That works out to 37.5% of the plan's monthly list price each month.
* **Not included:** accounts on the free plan, accounts that have been deleted, and accounts using a promotion such as a free month.

Commission stops when the referred account moves to the free plan or is deleted, and starts again if it returns to a paid plan.

{% hint style="info" %}
Have a question about a specific payout? Contact <support@zigpoll.com>.
{% endhint %}


# Public Link

Learn about how to best utilize your Survey's public link.

Every survey comes with a public link for easy sharing. Once the survey is live, click the link icon in the survey's header (next to the **Live** switch) to open it in a new tab. Surveys delivered as a link also show it in the **Public Link** card under **Settings → Delivery → Format**, with the **Link** format selected. It looks like `https://survey.zigpoll.com/SURVEY_ID`. Accounts with a [custom survey domain](/custom-survey-domains) see their own domain instead.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-77ed39497014db5bef99123e5fdef85fd51d8afb%2Fsurvey-public-link-icon.png?alt=media" alt="The public link icon in the survey header" width="580"><figcaption></figcaption></figure>

***

## Social Media Metadata

When you share your survey link on social media, messaging apps (iMessage, WhatsApp, Slack), or anywhere that generates a link preview, Zigpoll automatically includes Open Graph metadata so your survey looks great.

By default, shared links will display the Zigpoll branding. You can customize this in the **Metadata** section under the survey's **Settings → Design → Survey Page**.

#### Social Media Image

Upload a custom image that will appear in link previews when your survey is shared. This image is used as the `og:image` for platforms like Facebook, Twitter/X, LinkedIn, iMessage, and Slack.

For best results, use an image that is at least 1200x630 pixels.

#### Page Title

Set a custom title for your survey's share page. This will appear as the link preview title instead of the default "Zigpoll : Survey Name" format.

#### Favicon

Upload a custom favicon to replace the default Zigpoll icon in the browser tab when respondents visit your survey link. The uploaded image is automatically cropped to a square and resized to 180x180 pixels, which covers standard favicons and Apple Touch Icons.

{% hint style="info" %}
These settings can be configured at the **account level** (applied to all surveys) or overridden at the **survey level**. Navigate to Settings → Design Defaults → Survey Page for account-wide settings, or a survey's Settings → Design → Survey Page for survey-specific settings.
{% endhint %}

***

## Query Parameters

All query parameters added to your survey's public link will be appended as survey metadata. You can type them onto the end of the link yourself, or click **Add query variables to your public link** in the **Public Link** card (**Settings → Delivery → Format**, with the **Link** format selected) to build the URL with a form. This means if you want to tag a specific respondent, you could do so via the following url:

`https://survey.zigpoll.com/SURVEY_ID?tag=email_survey`

The link above would add metadata called **tag** with value **email\_survey** to any participant that responds to the survey via that url.

This is also useful if you are embedding a survey within an email template and want to track customer information. For example, to email a survey automatically when a Shopify order is fulfilled, add the following to your public link and send it in that email:

`https://survey.zigpoll.com/SURVEY_ID?shopify_customer_id={{ customer.id }}&shopify_order_id={{ order.id }}`

The link above will dynamically add the customer id, and the order id to each participant. This allows you to keep track of who filled out your survey and gives you the opportunity to respond to them if necessary.

### Parameters with special meaning

| Parameter                                  | What it does                                                                                                                                                                                                                                         |
| ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `lang`                                     | Opens the survey in that language, for example `?lang=fr` or `?lang=fr-CA`. It overrides the visitor's browser language. The survey must have that language set up under **Settings → Language**. See [Language Settings](/polls/language-settings). |
| `email`                                    | Attaches the respondent's email address to their response.                                                                                                                                                                                           |
| `shopify_customer_id` / `shopify_order_id` | Link the response to a Shopify customer or order.                                                                                                                                                                                                    |
| `a`                                        | Pre-selects an answer to the first question, by its handle or title. Zigpoll's own survey emails use this when a customer clicks an answer inside the email.                                                                                         |

{% hint style="warning" %}
When your account reaches its monthly response limit, surveys stop showing everywhere, including public links. They start working again when the limit resets on the 1st of the month or when you upgrade.
{% endhint %}


# Survey Links

Generate unique, trackable survey links with metadata and optional expiration dates.

Zigpoll allows you to generate unique survey links with custom metadata and optional expiration dates. This is useful for distributing personalized survey URLs across any channel — email platforms, CRMs, spreadsheets, or direct outreach.

Each generated link creates a tracked activity in Zigpoll, so you can see exactly which link a response came from and what metadata was attached to it.

{% hint style="info" %}
Looking for one static, shareable URL for your survey instead of per-recipient tracked links? That's the [Public Link](/public-link).
{% endhint %}

***

### Accessing Survey Links

1. Open your survey in the Zigpoll dashboard.
2. In the sidebar, click **Campaigns → Survey Links**.

***

### Manual Link Generation

The **Manual** tab lets you generate one link at a time with custom metadata.

#### Adding Metadata

Metadata is added as key-value pairs. These values are attached to any response collected via the generated link, making it easy to track the source or context of each response.

1. Click **Add metadata to your survey link** (or **Add Variable** if rows already exist).
2. Enter a **key** (e.g., `customer_id`, `source`, `campaign`) and a **value** (e.g., `12345`, `email`, `spring_sale`).
3. Add as many key-value pairs as needed.
4. Click the **x** button on any row to remove it.

#### Setting an Expiration

Use the **Expiration** dropdown to control how long the link remains valid:

* **No Expiration** (default) — the link never expires.
* **1 Day** — expires 24 hours from generation.
* **1 Week** — expires 7 days from generation.
* **1 Month** — expires 1 month from generation.
* **1 Year** — expires 1 year from generation.

After expiration, the link will no longer load the survey.

#### Generating the Link

Click **Generate Link** (either the button inside the card or the header button). The generated URL will appear in the **Generated Links** card below the form. You can click any link to copy it to your clipboard.

Each entry in the Generated Links card shows the URL along with the metadata and expiration that were set when it was created.

#### Downloading Generated Links

Click the **Download CSV** button at the bottom of the Generated Links card to export all links as a CSV file. The CSV includes:

* A **survey links** column with the generated URLs.
* One column per unique metadata key, with the corresponding values.
* An **expiresAt** column (only included if at least one link has an expiration set).

***

### CSV Link Generation

The **CSV Upload** tab lets you generate links in bulk by uploading a CSV file.

#### CSV Format

* Each **column header** becomes a metadata key.
* Each **row** generates one unique survey link with that row's values as metadata.
* A reserved **expiresAt** column can be used to set per-row expiration dates. Any date format is accepted (e.g., `2026-04-01`, `04/01/2026`, `April 1, 2026`). This column is not included as metadata.

**Example CSV:**

```
customer_id,source,campaign,expiresAt
12345,email,spring_sale,2026-04-01
67890,sms,winter_promo,2026-06-15
11111,partner,referral,
```

In this example:

* Three links will be generated.
* Each link will have `customer_id`, `source`, and `campaign` as metadata.
* The first two links will have expiration dates; the third will not expire.

#### Generating and Downloading

1. Upload your CSV file using the drag-and-drop uploader.
2. Click **Generate Links**.
3. A new CSV file named `survey-links.csv` will automatically download. It contains all the original columns from your uploaded CSV plus an additional **survey links** column with the generated URLs.

***

### How It Works

When you generate a survey link, Zigpoll creates a tracked **activity** with:

* **Type:** `generated`
* **Trigger:** `dashboard`
* **Metadata:** the key-value pairs you specified.
* **Expiration:** the date you selected (if any).

You can view all generated link activities on the **Activity** page for your survey.

When a respondent opens the generated link and submits a response, the metadata from the link is automatically attached to their response. This allows you to filter and segment responses by any metadata field.

***

### Use Cases

* **Personalized email campaigns** — Generate a unique link per customer with their ID embedded as metadata, then distribute via your own email platform (Klaviyo, Mailchimp, etc.).
* **Multi-channel attribution** — Add a `source` metadata field to track whether responses came from email, SMS, social media, or other channels.
* **Time-limited surveys** — Use expiration dates to ensure links are only valid during a specific campaign window.
* **Partner and referral tracking** — Generate links with partner IDs to attribute responses to specific partners or affiliates.
* **Bulk distribution** — Use CSV upload to generate hundreds of personalized links at once and distribute them via spreadsheet or CRM import.

***

### Plan Limits

Each plan includes a monthly allowance of generated links. You can view your current usage under **Settings → Plans & Limits**. If a batch would go over what is left, Zigpoll stops and tells you how many links you can still generate, for example *"You can only generate 20 more survey links on this plan."*

{% hint style="warning" %}
**Response limits apply to links too.** When your account reaches its monthly response limit, your surveys stop showing to customers everywhere, including generated survey links, public links, and links in email and SMS surveys. They start working again when the limit resets on the 1st of the month or when you upgrade.
{% endhint %}

See our plans for more details:

{% content-ref url="/pages/-LZzntn1HSzaiXwIaBqe" %}
[Subscription Plans](/subscription-plans)
{% endcontent-ref %}


# Javascript API

Want to create some custom behavior for your Zigpoll?

The `window.Zigpoll` object also carries three data members documented on their own pages: [`window.Zigpoll.user`](/embed/participant-metadata) (participant identity and metadata), [`window.Zigpoll.metadata`](/embed/poll-metadata) (survey metadata), and [`window.Zigpoll.templateVariables`](/questions/template-variables) (dynamic question copy).

To gate Zigpoll on a visitor's cookie consent, see [Cookie Consent](/cookie-consent) for `window.Zigpoll.consent()` and `window.Zigpoll.requireConsent`.

#### Single Page **Web** Apps

If you have a single page website you can still use Zigpoll. All you need to do is run the following code immediately **after** you change a page within your app.

```javascript
window.Zigpoll.refresh();
```

Run it too after your app inserts a container that an embedded survey should render into.

#### Programmatically Toggle The Survey

If you want to toggle your Zigpoll programmatically (like when a user clicks a button) use the following function.

```javascript
window.Zigpoll.toggle();
```

This will toggle your Zigpoll open and closed.

Alternatively you can use:

```
window.Zigpoll.open();
window.Zigpoll.close();
```

To open and close the Zigpoll respectively.

These functions only work once Zigpoll has loaded a survey on the page. Call them from `onload` (below) if your code might run first.

#### Opening a specific survey

Set the survey's format to **API** under **Settings → Delivery → Format** to load it only from your own code. The **API** format shows ready-made snippets. The pattern is to set the survey ID, then open the survey once it has loaded:

```javascript
window.Zigpoll.pollId = "YOUR_SURVEY_ID";
window.Zigpoll.onload = function () {
  window.Zigpoll.open();
};
window.Zigpoll.refresh();
```

Find the survey ID on **Settings → General → Details → Survey ID**.

#### Which settings still apply

When a survey is loaded by its ID, Zigpoll serves that exact survey instead of choosing one for the page. So:

| Setting                                                                                                                                      | Applies?                                                                                         |
| -------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ |
| The survey being live (visible)                                                                                                              | Yes. A survey that isn't live won't load.                                                        |
| Your account's monthly response limit                                                                                                        | Yes. At the limit, surveys stop showing everywhere.                                              |
| **Settings → Design**                                                                                                                        | Yes.                                                                                             |
| **Settings → Delivery → Frequency** — hiding the survey after it's closed or completed                                                       | Yes, for surveys that pop up in a corner or edge. Your code still decides when to call `open()`. |
| **Settings → Delivery → Locations** (page rules)                                                                                             | No. Your code decides the page.                                                                  |
| **Settings → Targeting** — device, geography, region, language, referrer, page views, sessions, metadata, IP, and the percentage of visitors | No. Check these in your own code before calling `open()`.                                        |
| Shopify customer rules on **Targeting**                                                                                                      | Yes, except for a **Copy & Paste Snippet** page embed, which skips them.                         |

For example, to show the survey to about 20% of visitors, pick a random number in your code and only call `open()` when it's under 0.2.

#### Trigger Event Once Zigpoll Is Loaded

To trigger some behavior once the Zigpoll has loaded, use the onload parameter of the Zigpoll object. For example:

```
window.Zigpoll.onload = function () { console.log('Zigpoll loaded') }
```

This will run once immediately after the Zigpoll has been loaded on your page.

#### Trigger Event When A Question Is Answered

To react the moment a respondent answers a question — before they finish the survey — set the `onAnswer` parameter of the Zigpoll object:

```
window.Zigpoll.onAnswer = function (answer, responses) { console.log(answer.slide.title, answer.value) }
```

`onAnswer` is called once for each answer, right after Zigpoll has saved it, for every question type. It receives two arguments:

* `answer` — the answer that was just given. It has the same shape as an entry in `onClose` / `onComplete`: `slide` (the question, including its `handle`, `title`, and `type`) and `response` (the submitted answer; multi-select questions also include a `responses` array). It also carries `value`, the answer as a single display string — the text of the chosen option, the typed text, the rating, or the selected options joined with commas.
* `responses` — every answer submitted so far in this survey, in question order, in the same shape.

Match on the question's `handle` (set it under the question's settings so it does not change when you edit the title) to act on one specific question:

```
window.Zigpoll.onAnswer = function (answer) {
  if (answer.slide.handle === 'plan-interest') {
    window.dataLayer.push({ event: 'zigpoll_plan_interest', value: answer.value });
  }
}
```

`onAnswer` fires again if a respondent edits an answer (when editing is allowed), so treat the latest call for a given `handle` as the current answer. Errors thrown inside your function are logged and never stop the survey from advancing.

#### Trigger Event When Zigpoll Is Completed

To run some behavior once a respondent has answered every required question, set the `onComplete` parameter of the Zigpoll object:

```
window.Zigpoll.onComplete = function (responses) { console.log('Zigpoll completed', responses) }
```

`onComplete` fires once per survey, with the respondent's submitted answers in the same shape as `onClose` below. Use `onClose` instead if you also want to hear from respondents who leave partway through.

#### Trigger Event When Zigpoll Is Closed

To run some behavior when a respondent closes the Zigpoll — for example after they finish a survey — set the `onClose` parameter of the Zigpoll object:

```
window.Zigpoll.onClose = function (responses) { console.log('Zigpoll closed', responses) }
```

`onClose` is called with the respondent's submitted answers: an array with one entry per answered question. Each entry contains the `slide` (the question) and the `response` (the submitted answer); multi-select questions also include a `responses` array.

```
window.Zigpoll.onClose = function (responses) {
  responses.forEach(function ({ slide, response }) {
    console.log(slide.title, response);
  });
}
```


# Cookie Consent

Gate Zigpoll on your visitor's cookie consent, on Shopify or any other platform

Zigpoll stores a small amount of data in the visitor's browser — a page-view counter, a session counter, the referring site, the landing page, and any campaign parameters on the URL — and uses it to decide which survey to show. In regions that require opt-in consent, that data should only be collected once the visitor has agreed.

Zigpoll handles this automatically on Shopify, and gives you a JavaScript API to drive it from any other consent manager.

When consent is denied, Zigpoll is entirely absent: nothing is written to the browser, nothing about the visitor is sent to Zigpoll's servers, and the survey script is never loaded. When consent is granted the survey appears immediately, with no page reload.

## Shopify — automatic

If you use the Zigpoll app embed on Shopify, this is already handled. Zigpoll reads Shopify's [Customer Privacy API](https://shopify.dev/docs/api/customer-privacy) and only collects data when `analyticsProcessingAllowed()` is true. It also listens for the `visitorConsentCollected` event, so a visitor who accepts partway through their session gets the survey right away, and one who withdraws consent stops being tracked immediately.

This works with any Shopify consent app — Pandectes, Consentmo, Cookiebot and others — because Zigpoll reads the consent decision from Shopify rather than from the app. That matters, because Shopify does not guarantee the order in which app embeds load.

{% hint style="warning" %}
**Configure your consent regions in Shopify.** Go to **Settings → Customer privacy** in your Shopify admin and set the regions that require consent.

Until you do, Shopify reports that analytics processing is allowed, and Zigpoll — along with every other app that respects the Customer Privacy API — will treat visitors as consenting until your banner records a decision.
{% endhint %}

### Showing surveys without waiting for consent

If you would rather your surveys show to every visitor — before a consent decision, and to visitors who decline — you can say so in the dashboard under **Settings → Visibility → Cookie consent**: pick **Show surveys to everyone** from the dropdown and click **Save Changes**.

With that setting on, Zigpoll treats consent as granted on your storefront: surveys appear immediately and Zigpoll stores its page-view and session counters in the visitor's browser as it normally would. You are the data controller for your store, so make sure this is covered by your privacy policy. The default, **Wait for consent (recommended)**, is the right choice for most stores.

To read the setting, Zigpoll makes one small request before consent — only on a page where Shopify has reported that analytics is not allowed. It carries your store's identity and nothing about the visitor: no page URL, no counters, no cookies. On a store that has not opted in, that request is the only thing that happens, and Zigpoll stays absent exactly as described above.

Anything your page sets itself — `requireConsent`, `analyticsConsent`, `respectGPC` — still takes precedence over the dashboard setting. Changes take effect on your storefront within a few minutes.

## Survey links and shared surveys

Consent gating applies to surveys embedded in your storefront. It does not apply to surveys opened from a [survey link](/survey-links) or [public link](/public-link), which are hosted on Zigpoll's own domain and only load because the respondent chose to open them.

## Inline embeds and named surveys

A page that names a specific survey is not gated either. That covers the inline embed snippet — a survey you place on a specific page, such as a returns or contact form — and the "show on click" and "load programmatically" snippets: anything that sets `window.Zigpoll.pollId`. You put that survey on that page deliberately, and a visitor who has declined cookies can still use a form you put in front of them.

This applies to every Zigpoll survey on that page, not just the named one, and holds even if the visitor later declines your banner on it. If you would rather those surveys wait for consent like everything else, opt back in **before** the Zigpoll script tag:

```html
<script>
  window.Zigpoll = window.Zigpoll || {};
  window.Zigpoll.gateEmbeds = true;
</script>
```

`requireConsent`, `respectGPC` and an explicit `analyticsConsent` still take precedence over this exemption.

## Any other platform

Use the JavaScript API. It works on WordPress, BigCommerce, custom storefronts, and on Shopify if you would rather drive Zigpoll from your own consent manager than from Shopify's.

### 1. Lock Zigpoll before it loads

Set `requireConsent` **before** the Zigpoll script tag. Zigpoll will do nothing at all until you tell it otherwise.

```html
<script>
  window.Zigpoll = window.Zigpoll || {};
  window.Zigpoll.requireConsent = true;
</script>
<!-- your existing Zigpoll embed code goes here -->
```

### 2. Tell Zigpoll the decision

Call `consent()` from your consent manager's callback, whenever the decision is made or changed.

```javascript
window.Zigpoll.consent('granted');
window.Zigpoll.consent('denied');
```

It also accepts a Google Consent Mode style object, so you can forward what your consent manager already gives you:

```javascript
window.Zigpoll.consent({ analytics: 'granted' });
window.Zigpoll.consent({ analytics_storage: 'granted' });
```

Call it as often as you like, in either direction. Granting starts Zigpoll without a page reload. Denying stops it and removes the data Zigpoll stored.

On Shopify, calling `consent()` — or declaring `analyticsConsent` — tells Zigpoll that you are driving consent, and it stops listening to Shopify's Customer Privacy API for the rest of the page. Your decision is not overturned by the visitor's next click on a Shopify consent banner.

### Setting the decision up front

If you already know the answer when the page renders — for example your consent manager wrote it to a cookie on a previous visit — you can declare it instead of calling a function:

```html
<script>
  window.Zigpoll = window.Zigpoll || {};
  window.Zigpoll.analyticsConsent = 'denied';   // or 'granted'
</script>
```

Use `consent()` for anything that happens after the page loads.

## Examples

### Cookiebot

```javascript
window.addEventListener('CookiebotOnAccept', function () {
  window.Zigpoll.consent(Cookiebot.consent.statistics ? 'granted' : 'denied');
});
window.addEventListener('CookiebotOnDecline', function () {
  window.Zigpoll.consent('denied');
});
```

### OneTrust

```javascript
OneTrust.OnConsentChanged(function () {
  var groups = window.OnetrustActiveGroups || '';
  /* C0002 is OneTrust's default Performance/Analytics category. */
  window.Zigpoll.consent(groups.indexOf('C0002') !== -1 ? 'granted' : 'denied');
});
```

### Google Consent Mode / dataLayer

```javascript
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
  event: 'zigpoll_consent_ready',
  eventCallback: function () {
    window.Zigpoll.consent({ analytics_storage: 'granted' });
  }
});
```

### WordPress Consent API

```javascript
document.addEventListener('wp_listen_for_consent_change', function (e) {
  var changed = e.detail;
  if (changed.statistics) {
    window.Zigpoll.consent(changed.statistics === 'allow' ? 'granted' : 'denied');
  }
});
```

## Blocking the script instead

If your consent manager blocks scripts by category rather than calling an API, you can categorize Zigpoll's script tag directly and skip the JavaScript entirely. Zigpoll belongs in the **statistics / analytics** category.

Cookiebot:

```html
<script type="text/plain" data-cookieconsent="statistics"
        src="//cdn.zigpoll.com/static/js/main.js"></script>
```

OneTrust:

```html
<script type="text/plain" class="optanon-category-C0002"
        src="//cdn.zigpoll.com/static/js/main.js"></script>
```

This works, but the API is preferable where you have the choice: a blocked script cannot start when the visitor later accepts, so those visitors see no survey until they load a new page.

## Global Privacy Control

Zigpoll can treat a [Global Privacy Control](https://globalprivacycontrol.org/) signal as a denial. This is off by default, because GPC is primarily a "do not sell or share" signal rather than an analytics one, some browsers send it for every visitor, and Shopify already accounts for it in its own privacy settings.

```javascript
window.Zigpoll.respectGPC = true;
```

## Checking your setup

`getConsentState()` returns `'unknown'`, `'allowed'` or `'denied'`:

```javascript
window.Zigpoll.getConsentState();
```

To confirm it's working, open your browser's developer tools:

* **Network** — decline consent and reload. There should be no request to `api.zigpoll.com` other than, on Shopify, a single `consent-policy` lookup that carries only your store's identity — and no `/shim`, `/data` or `embed.js`.
* **Application → Local Storage** — there should be no `zigpoll-` keys.
* Accept consent. The survey should appear without reloading the page.

If Zigpoll runs when you expect it not to, check that `requireConsent` is set **before** the Zigpoll script tag. Set afterwards, it has no effect.

## What happens to data already collected

If a visitor grants consent and later withdraws it, Zigpoll stops immediately and removes the counters, referrer, landing page and campaign parameters it stored in the browser.

Their session counter starts again from zero if they consent again later, so a returning customer will look like a new visitor. This is a deliberate consequence of honouring the withdrawal.

To delete survey responses that have already been submitted, see [Removing Participant Data](/tutorials/removing-participant-data).


# Web API

Interact with your survey data using our api service

The Zigpoll REST API lets you manage surveys, questions, responses, participants, translations, and webhooks programmatically.

* **Base URL:** `https://v1.zigpoll.com` (not `api.zigpoll.com`)
* **Authentication:** send your [API key](/integrations/api-key) in the `Authorization` header. The key on its own and `Bearer <key>` both work.
* **Plan:** API access requires a **Premium** plan or higher.
* **Roles:** your key carries your team role — Read only keys can't write, and webhook/integration endpoints require an API key from an **Owner**, **Admin**, or **Billing Admin**.

### Plan errors

A request for an account whose plan doesn't include API access returns HTTP `403` with:

```json
{ "error": "This account's plan does not include API access. Please upgrade to the Premium plan or higher." }
```

Listing surveys without an `accountId` skips accounts that don't have API access. If none of your accounts has it, you get:

```json
{ "error": "None of your accounts are on a plan with API access. Please upgrade to the Premium plan or higher." }
```

Upgrade under **Settings → Plans & Limits**, or use a key from a login that belongs to an account on an eligible plan.

### What you can do

* **Surveys & questions** — create, update, list, and duplicate surveys; manage and reorder questions (every question type is supported, including matrix, autocomplete, and phone capture); attach action logic.
* **Responses & participants** — list responses, response summaries, and participants; export data.
* **Translations** — read and update per-language survey translations.
* **Webhooks** — create, list, and delete [signed webhooks](/integrations/webhooks) (requires an API key from an **Owner**, **Admin**, or **Billing Admin**; the signing secret is returned only once, on create).
* **Counters** — every survey and account exposes the three counters: responses (`surveyResponseCount`, the metered unit — one per participant taking a survey), answers (`submissionCount`, one per question answered), and write-ins (`responseCount`). See [How we calculate responses](/subscription-plans/how-we-calculate-responses).

### Full reference

Every endpoint, schema, and example is in the official API reference:

<https://apidocs.zigpoll.com/>

{% hint style="info" %}
Looking for the in-browser widget API (`window.Zigpoll.*`) instead? See the [Javascript API](/javascript-api).
{% endhint %}


# Integrations

Connect your favorite apps with Zigpoll

## Email and SMS Platforms

* [Klaviyo](/integrations/klaviyo)
* [Attentive](/integrations/attentive)
* [MailChimp](/integrations/mailchimp)
* [Dotdigital](/integrations/dotdigital)
* [GetResponse](/integrations/getresponse)
* [ActiveCampaign](/integrations/activecampaign)
* [Omnisend](/integrations/omnisend)
* [Drip](/integrations/drip)

## Workflow and automations

* [n8n](/integrations/n8n)
* [Make](/integrations/make)
* [Zapier](/integrations/zapier)
* [Shopify Flow](https://docs.zigpoll.com/shopify-app/shopify-flow)
* [Slack](/integrations/slack)
* [Google Sheets](/integrations/google-sheets)
* [ClickUp](/integrations/clickup)
* [Jira](/integrations/jira)
* [HubSpot](/integrations/hubspot)
* [Zendesk](/integrations/zendesk)
* [Richpanel](/integrations/richpanel)
* [Notion](/integrations/notion)

## Product Analytics and Event Tracking

* [Segment](/integrations/segment)
* [Heap](/integrations/heap)
* [Amplitude](/integrations/amplitude)
* [Mixpanel](/integrations/mixpanel)
* [Klar](/integrations/klar)
* [Google Analytics](/integrations/google-analytics)
* [GA4 Shopify Pixel](/integrations/ga4-shopify-pixel)
* [Google Tag Manager](/integrations/google-tag-manager)

## Add Zigpoll to your SaaS

* [API Key](/integrations/api-key)
* [Webhooks](/integrations/webhooks)

## AI Assistants

* [MCP (AI Assistants)](/integrations/mcp)
  * [Connect to Claude](/integrations/mcp/mcp-claude)
  * [Connect to ChatGPT](/integrations/mcp/mcp-chatgpt)
  * [Connect to Codex](/integrations/mcp/mcp-codex)
  * [Connect to Manus](/integrations/mcp/mcp-manus)
  * [Connect to OpenClaw](/integrations/mcp/mcp-openclaw)
  * [Connect to Perplexity](/integrations/mcp/mcp-perplexity)
* [Shopify Sidekick](/integrations/shopify-sidekick)

## Payment Platforms

* [Stripe](/integrations/stripe)
* [Square](/integrations/square)

## Other ecommerce apps

* [Gorgias](/integrations/gorgias)
* [Opensend](/integrations/opensend)
* [Triple Whale](/integrations/triple-whale)
* [Intelligems](/integrations/intelligems)
* [Flashy](/integrations/flashy)
* [Aftership](/integrations/aftership)
* [Shopify Email](/integrations/shopify-email)

## Translation

* [Weglot](/integrations/weglot)

## Site builders

* [Shopify](/integrations/shopify)
* [Wix](/integrations/wix)
* [Squarespace](/integrations/squarespace)
* [Framer](/integrations/framer)
* [Funnelish](/integrations/funnelish)
* [Canva](/integrations/canva)
* [Wordpress](/integrations/wordpress)
* [Linktree](/integrations/linktree)
* [Webflow](/integrations/webflow)
* [Weebly](/integrations/weebly)
* [Bigcommerce](/integrations/bigcommerce)
* [Centra](/integrations/centra)
* [Adobe Commerce](/integrations/adobe-commerce)
* [Prestashop](/integrations/prestashop)
* [MedusaJS](/integrations/medusajs)


# Klaviyo

Get the most out of Zigpoll and Klaviyo

#### Step #1: Create your integration

* Get your Public and Private Keys from Klaviyo. You can access your keys by following the steps here: <https://help.klaviyo.com/hc/en-us/articles/115005062267-How-to-Manage-Your-Account-s-API-Keys>

{% hint style="info" %}
Make sure the keys have **Full Access** enabled for **Events** and **Profiles**.\
\
**NOTE:** If you want to **Auto Subscribe** new customers to your list then you will need to also add **Full Access** for **Subscriptions** and **Lists**.
{% endhint %}

* In Zigpoll, go to **Integrations** in the account sidebar and turn on **Klaviyo**. Shopify merchants open Zigpoll from Shopify admin → **Apps → Zigpoll** first. Klaviyo is set up once for the whole account, not inside each survey.
* Enter your public and private keys into the input fields and save.

{% hint style="success" %}
The first time you connect, Zigpoll sends a one-time **Zigpoll Integration Connected** event to your Zigpoll account email. The integration then appears in Klaviyo right away, without waiting for your first survey response. Open **Analytics → Metrics** to confirm it's working. This event is only a setup confirmation. Your survey data flows in as described below.
{% endhint %}

#### Step #2: Collect Your Data

Once you connect, data flows into your Klaviyo account. If you use our Shopify integration, Zigpoll uses the Shopify customer data to match each response to the right email address. Otherwise, if your survey has an email question, Zigpoll uses that answer to find an existing Klaviyo profile or create a new one.

If you send your survey's [public link](/public-link) from a Klaviyo email, no extra setup is needed to identify the respondent. Klaviyo appends its `_kx` tracking parameter to the link, and Zigpoll uses it to look up the recipient's Klaviyo profile and attach their email to the response. Don't add `_kx` to the link yourself (for example `?_kx={{ person.id }}`): Zigpoll can only look up the value Klaviyo appends to links it tracks, so a hand-written one leaves the response without an email. To pass the email explicitly, add `?email={{ email }}` instead. See [Klaviyo URL Templates](/tutorials/klaviyo-url-templates) if you also want to pass order or customer data.

Zigpoll also captures **phone numbers** from survey responses. A phone can come from a phone-number question or be typed into a free-text answer, and the Shopify customer phone is used when available. Zigpoll adds it to the respondent's Klaviyo profile in E.164 format (e.g. `+14155551234`). When the response also has an email, the phone goes on that same profile, so you don't end up with duplicates. Otherwise Zigpoll creates or updates a profile keyed by the phone number. The phone is stored on the profile only. Zigpoll does not subscribe anyone to SMS marketing.

When someone completes a survey, Zigpoll sends Klaviyo an event named after that survey: **`[Zigpoll] Completed Survey: <your survey title>`**. Each of your surveys gets its own metric. The event holds that survey's answers, keyed by each question's handle. To change how an answer is labeled in Klaviyo, edit that question's handle.

Zigpoll also sends the customer's average sentiment score. Use it to build campaigns and trigger flows that grow customer lifetime value.

The event also carries the response's metadata as event properties. When the survey has an attribution question ("How did you hear about us?"), that includes `attribution_channel`, the channel the customer reported (for example `instagram`, `podcast` or `word_of_mouth`), and `attribution_source`, the name they gave when there is one (for example "The Daily"). Use them in a flow trigger filter or a conditional split, for example to send a different follow-up to customers who came from a podcast. These two are event properties only. They are not saved on the Klaviyo profile. See [Reported attribution metadata](/embed/poll-metadata/special-variables#reported-attribution-metadata) for every value.

#### Profile properties

Each answer is also saved on the Klaviyo profile as a custom property named `Zigpoll: <question handle>`. The profile also gets **Zigpoll Sentiment**, **Zigpoll Raw Sentiment**, and a **Zigpoll Participant** link back to the participant in Zigpoll. Open a profile in Klaviyo and look under its custom properties to check that data is arriving.

#### When the event is sent

The event is sent about a minute after someone finishes the survey. If they stop partway through, it is sent with the answers they gave, about 10 minutes after their last answer. After that, Klaviyo can take a few more minutes before the metric appears as a flow trigger. A new survey's metric only exists in Klaviyo after its first response, so submit a test response on the live survey before building the flow.

{% hint style="warning" %}
**The event only reaches Klaviyo when the response has an identity.** Zigpoll needs an email address or phone number for the respondent. It finds one when:

* the survey has an email or phone question, or a typed answer contains one;
* the survey link carries `?email=` (see [Klaviyo URL Templates](/tutorials/klaviyo-url-templates));
* the link was clicked in a Klaviyo email, so it carries Klaviyo's `_kx` parameter;
* on Shopify, the customer is known from their order or login.

Anonymous responses with none of these are not sent to Klaviyo.
{% endhint %}

#### Will past responses sync?

No. Only responses collected after you connect Klaviyo are sent. To get older data into Klaviyo, export it from Zigpoll and import it into Klaviyo yourself.

#### Will this create duplicate profiles?

Zigpoll matches profiles by email. If a Klaviyo profile with that email exists, the answers are added to it. If not, Klaviyo creates one. A phone number is added to the email's profile only if that profile has no phone yet. Zigpoll never overwrites an existing phone, and skips a phone that already belongs to another profile. A new, phone-only profile is created only when a response has a phone number and no email.

#### Adding respondents to a list

There are two ways to add respondents to a Klaviyo list:

* **Auto Subscribe (account level).** On the Klaviyo card on the **Integrations** page, turn on **Auto Subscribe** and click **Add Auto-Subscribe List**. Pick a **Survey** (or **All Surveys**) and a **List**. A list set for a specific survey wins over the **All Surveys** list.
* **Subscribe to Klaviyo list (an Action).** In a survey's **Settings → Workflows → Actions**, or in a question's logic, add the **subscribe to klaviyo list** action and pick a list. Use this when only some respondents should join the list, for example those who give a certain answer.

{% hint style="danger" %}
**Auto Subscribe changes marketing consent.** Every respondent with an email is added to the list with email marketing consent set to **Subscribed**. That includes people who unsubscribed from your emails before, so they start receiving marketing again. Turn it on only if your survey asks for, and records, consent to marketing, for example with a clear opt-in question. Check your obligations under GDPR, CAN-SPAM, and similar laws. If your list uses double opt-in, Klaviyo may hold new subscribers until they confirm.

Auto Subscribe never subscribes anyone to SMS marketing.
{% endhint %}


# Brevo

Get the most out of Zigpoll and Brevo

#### Step #1: Create your integration

* Get your API key from Brevo. You can generate one in your Brevo dashboard under **SMTP & API → API keys**: <https://app.brevo.com/settings/keys/api>

{% hint style="info" %}
Make sure the API key has access to **Contacts** and **Lists** so Zigpoll can fetch your lists and subscribe new contacts.
{% endhint %}

* In Zigpoll: Go to **Integrations** in the account sidebar and enable the Brevo Integration
* Paste your API key into the input field and press save.

#### Step #2: Pick a list (optional)

Toggle **Auto Subscribe** to subscribe respondents to a Brevo contact list automatically. You can choose a single list for **All Surveys**, or map specific surveys to specific lists. Brevo lists load from your account once your API key is saved.

#### Step #3: Collect Your Data

Once your integration is enabled, Zigpoll will create or update a Brevo contact each time a respondent submits a survey (provided we have an email for them — either from a Zigpoll email field, or from your Shopify customer data if you use our Shopify integration).

The following contact attributes are sent on every submission:

* `SENTIMENT` — the respondent's average sentiment score (numeric)
* `SENTIMENT_LABEL` — `positive`, `neutral`, or `negative`
* `ZIGPOLL_PARTICIPANT_URL` — a deep link to the participant's record in Zigpoll
* `SMS` — the respondent's phone number, stored on Brevo's reserved `SMS` contact attribute, when one is available (see below)
* One attribute per question, named after the question's handle (uppercased, with non-alphanumeric characters converted to underscores)

When a phone number is captured from the survey response — from a dedicated phone-number field or a phone number typed into a free-text/short-answer question (or the customer phone from your Shopify integration, which is preferred when connected) — Zigpoll normalizes it to strict E.164 format (e.g. `+14155551234`) and stores it on the contact. Numbers that can't be validated are dropped. The phone is saved on the contact only; Zigpoll does not opt the contact into SMS marketing.

{% hint style="warning" %}
**Important:** Brevo only stores attributes that have been pre-defined in your account. Any attribute Zigpoll sends that doesn't already exist in Brevo will be silently dropped.

Before you go live, head to **Contacts → Settings → Contact attributes** in Brevo and create the attributes above (`SENTIMENT`, `SENTIMENT_LABEL`, `ZIGPOLL_PARTICIPANT_URL`) plus one entry per question handle you want to capture. Use type **Text** for most fields, **Number** for `SENTIMENT`, and **Date** for date questions.
{% endhint %}

#### Conditional subscribes via question logic

You can also subscribe respondents to a list based on how they answered a particular question. In any question's editor, open the **Logic** section, add a condition, and choose **Subscribe to Brevo list** as the action. The contact will be added to the chosen list only when the condition is met — useful for routing happy customers and detractors to different lists, or for opt-in flows triggered by a specific answer.

#### Using the data

Brevo will treat the new contact like any other — you can build segments off the attributes Zigpoll syncs (e.g. everyone with `SENTIMENT_LABEL = negative`), trigger automations from list membership, or include the survey data as merge tags in your campaign emails.


# Dotdigital

Get the most out of Zigpoll and Dotdigital

#### Step #1: Create your integration

* In Dotdigital, create a dedicated **API user**. Go to **Settings → Access → API users** and add a new user: <https://developer.dotdigital.com/docs/setting-up-an-api-user>. Dotdigital will give the API user its own email address (something like `apiuser-xxxxxxxx@apiconnector.com`) and you set its password.

{% hint style="info" %}
Use the **API user's** email and password — not your normal Dotdigital login. Zigpoll auto-detects your account's region (EU, US or APAC) for you, so there's no endpoint to configure.
{% endhint %}

* In Zigpoll: Go to **Integrations** in the account sidebar and enable the Dotdigital Integration
* Paste the API user email and password into the input fields and press save.

#### Step #2: Pick an address book (optional)

Toggle **Auto Subscribe** to add respondents to a Dotdigital **address book** automatically. You can map specific surveys to specific address books, or choose a single address book for **All Surveys**. Your address books load from your account once your credentials are saved.

#### Step #3: Collect Your Data

Once **Auto Subscribe** is enabled and an address book is selected, Zigpoll will create or update a Dotdigital contact in that address book each time a respondent submits a survey (provided we have an email for them — either from a Zigpoll email field, or from your Shopify customer data if you use our Shopify integration).

The following contact **data fields** are sent on every submission:

* `SENTIMENT` — the respondent's average sentiment score (numeric)
* `SENTIMENT_LABEL` — `positive`, `neutral`, or `negative`
* `ZIGPOLL_PARTICIPANT_URL` — a deep link to the participant's record in Zigpoll
* One data field per question, named after the question's handle (uppercased, with non-alphanumeric characters converted to underscores)

{% hint style="warning" %}
**Important:** Dotdigital only stores data fields that have been pre-defined in your account. Any data field Zigpoll sends that doesn't already exist in Dotdigital is ignored — and the whole contact update is rejected if a field is missing, so Zigpoll automatically retries without the extra fields (the contact is still added to the address book, but the survey data won't be saved until the fields exist).

Before you go live, head to **Settings → Data fields** in Dotdigital and create the fields above (`SENTIMENT`, `SENTIMENT_LABEL`, `ZIGPOLL_PARTICIPANT_URL`) plus one entry per question handle you want to capture. Use type **Text** for most fields, **Numeric** for `SENTIMENT`, and **Date** for date questions.
{% endhint %}

#### Conditional subscribes via question and survey logic

You can also subscribe respondents to an address book based on how they answered a particular question. In any question's editor, open the **Logic** section (or open the survey's **Settings → Workflows → Actions**), add a condition, and choose **Subscribe to Dotdigital address book** as the action. The contact is added to the chosen address book only when the condition is met — useful for routing happy customers and detractors to different books, or for opt-in flows triggered by a specific answer.

#### Using the data

Dotdigital will treat the new contact like any other — you can build segments off the data fields Zigpoll syncs (e.g. everyone with `SENTIMENT_LABEL = negative`), trigger programs from address book membership, or include the survey data as personalization in your campaigns.


# Attentive

Send survey responses and SMS/email subscribers into Attentive

Integrating Zigpoll with Attentive automatically pushes survey responses into Attentive as a custom event and profile attributes — and can optionally subscribe respondents to your Attentive marketing. Use this to trigger journeys, build segments, and personalize SMS/email based on real customer feedback.

***

### Step 1: Get Your Attentive API Key

1. Log into your Attentive account.
2. Create a **private API key** (used as a Bearer token). See Attentive's [authentication guide](https://docs.attentive.com/docs/authentication).
3. Copy the key.

{% hint style="info" %}
Treat the API key like a password — it can send messages to your subscribers on your behalf.
{% endhint %}

***

### Step 2: Enable the Attentive Integration in Zigpoll

1. Log in to your Zigpoll Dashboard.
2. Navigate to **Integrations** from the left-hand menu.
3. Find **Attentive** and toggle it on.
4. Paste your **API Key**.
5. *(Optional)* Enter a **Sign-up Source ID** — found in Attentive under **Sign-up Units** (the ID column). Only used when Auto Subscribe is on.
6. *(Optional)* Toggle **Auto Subscribe** to opt respondents into Attentive marketing on submission.
7. Press **Save**.

{% hint style="warning" %}
**Auto Subscribe** opts the respondent into Attentive SMS/email marketing. Only enable it if you have valid consent and a real sign-up source — subscribing survey respondents to SMS marketing has TCPA/consent implications.
{% endhint %}

***

### What Data Gets Sent

Once enabled, every survey submission sends the following to Attentive:

**Custom event** (`POST /events/custom`):

* Event type: `Completed a Zigpoll` (configurable per action — see below)
* Properties include the survey title, sentiment and sentiment label, a link to the participant's Zigpoll profile, and all question responses (snake\_cased)

**Custom attributes** (`POST /attributes/custom`):

* The same properties, attached to the user's Attentive profile for segmentation

**Subscription** (`POST /subscriptions`, only if Auto Subscribe is on):

* Uses your Sign-up Source ID if set; otherwise subscribes to `MARKETING` with a default locale

Users are matched by **phone number** when the respondent provides one — either in a dedicated phone-number field or typed into any survey answer (normalized to E.164, e.g. `+14155551234`); the Shopify customer phone is used when available — otherwise by **email**. If neither is available, nothing is sent.

{% hint style="info" %}
Attentive has no concept of "lists." Segmentation is driven by custom events (journey triggers), profile attributes, and sign-up sources — which is exactly what this integration sends.
{% endhint %}

***

### Conditional events via survey & question logic

You can fire a **specific** Attentive event based on how someone answered. On the survey's **Settings → Workflows → Actions** tab, or in any question's **Logic** section, add a condition and choose **Track in Attentive** as the action.

Each action has an optional **event name** field. Whatever you enter becomes the Attentive custom-event `type`, so you can point different conditions at different journeys — e.g. route detractors into a win-back journey and promoters into a referral journey. Leave it blank to use `Completed a Zigpoll`.

{% hint style="warning" %}
The event name must **exactly** match the custom event configured in your Attentive journey trigger (case- and space-sensitive).
{% endhint %}

***

### Shopify stores

If you use Zigpoll's Shopify integration, the Attentive event, attributes, and subscription are sent **after** Shopify enrichment — so they include the customer's Shopify email (even when it wasn't typed into the survey) and order metadata, the same as our Klaviyo and Brevo integrations.

***

### Example Use Cases

* **Trigger an SMS journey** when a customer leaves negative feedback.
* **Build segments** from survey responses such as attribution, product preferences, or sentiment.
* **Personalize messaging** using profile attributes synced from survey data.
* **Route by condition** — fire a distinct Attentive event per answer to drive different journeys.


# Privy

Create and update Privy contacts from your survey respondents

Integrating Zigpoll with Privy lets you automatically create and update contacts in Privy when someone completes a survey. Survey answers are attached to the contact as custom fields, so you can build segments and trigger email and SMS campaigns based on real customer feedback.

***

### Step 1: Create Your Privy API Token

1. Log into your Privy account.
2. Go to **Settings** (bottom-right) and click **API**.
3. Select **Create Token**.
4. Give the token **Read & Write Contacts** permission and **no expiration date**.
5. Copy the token.

{% hint style="info" %}
API access must be enabled on your Privy account. If your token doesn't work despite being valid, contact Privy support to enable API access.
{% endhint %}

***

### Step 2: Enable the Privy Integration in Zigpoll

1. Log in to your Zigpoll Dashboard.
2. Navigate to **Integrations** from the left-hand menu.
3. Find **Privy** and toggle it on.
4. Paste in your **API Token**.
5. Press **Save**.

***

### Step 3: Configure Options

* **Tags** (optional): Comma-separated tags applied to every contact created or updated in Privy (e.g. `survey-respondent, vip`).
* **Auto Subscribe**: Opts the respondent into Privy email and SMS marketing on survey completion. Only enable this if you have valid consent — subscribing survey respondents has CAN-SPAM/TCPA/consent implications. When this is off, contacts are still created/updated, but their consent status is left unchanged.
* **Remove Prefixes**: By default, custom fields are prefixed with "Zigpoll:" (e.g., `Zigpoll: How did you hear about us?`). Enable this to remove the prefix, which is useful if you want to match survey data with existing contact fields.

***

### What Data Gets Sent

Once enabled, every survey submission creates or updates a Privy contact with:

* **Email** and/or **phone number** (phone is normalized to E.164; resolved from the response or from Shopify order/customer data when available)
* **Email & SMS consent** set to `subscribed` — only when Auto Subscribe is enabled
* **Tags** — if configured
* **Custom fields** — each question response, plus survey metadata (order ID, product info, etc.) when available, and a `Zigpoll: Participant` field linking back to the participant's detail page in Zigpoll

Contacts are matched by email or phone number.

***

### Example Use Cases

* **Grow your list** by capturing survey respondents directly into Privy.
* **Build segments** based on survey responses like attribution answers or product preferences.
* **Trigger email & SMS campaigns** off survey feedback (e.g. follow up with detractors).
* **Enrich existing contacts** with survey data stored as custom fields.


# Braze

Send survey responses and customer profiles into Braze

Integrating Zigpoll with Braze lets you automatically push survey responses into your Braze dashboard as custom events and user attributes. Use this data to build segments, trigger campaigns, and personalize messaging based on real customer feedback.

***

### Step 1: Get Your Braze REST API Key

1. Log into your Braze Dashboard.
2. Navigate to **Settings > API Keys**.
3. Create a new REST API key (or use an existing one) with the **users.track** permission enabled.
4. Note your **REST API Endpoint** (e.g., `rest.iad-01.braze.com`). This is shown on the same page.

{% hint style="info" %}
Make sure the API key has the **users.track** permission enabled. If you plan to subscribe users to a subscription group via survey actions, also enable the **subscription.status.set** permission.
{% endhint %}

***

### Step 2: Enable the Braze Integration in Zigpoll

1. Log in to your Zigpoll Dashboard.
2. Navigate to **Integrations** from the left-hand menu.
3. Find **Braze** and toggle it on.
4. Enter your **REST API Key** and **REST Endpoint**.
5. Press **Save**.

***

### Step 3: Configure Options

* **Send User Attributes** (on by default): Updates the Braze user profile with survey response data as custom attributes each time a survey is submitted. Turn this off if you only want to track events.
* **Remove Prefixes**: By default, custom attributes are prefixed with "Zigpoll:" (e.g., `Zigpoll: How did you hear about us?`). Enable this to remove the prefix, which is useful if you want to match survey data with existing user attributes.

***

### What Data Gets Sent

Once enabled, every survey submission sends the following to Braze:

**Custom Event:**

* Event name: `Zigpoll Survey Completed`
* Event properties include the survey title and all question responses

**User Attributes** (if enabled):

* Each question response is stored as a custom attribute on the user profile
* A `Zigpoll: Participant` attribute links back to the participant's detail page in Zigpoll
* Survey metadata (order ID, product info, etc.) is included if available

Users are matched by their participant ID as the `external_id`. If an email address is available, it is also attached to the profile. If a phone number is captured from the survey response (or, when Shopify is connected, the Shopify customer phone), it is normalized to E.164 format and stored on the user's standard `phone` attribute. This only stores the number on the profile — it does not opt the user into SMS marketing or change any subscription group.

***

### Example Use Cases

* **Trigger a follow-up campaign** when a customer reports a negative experience.
* **Build segments** based on survey responses like attribution answers or product preferences.
* **Personalize messaging** using custom attributes from survey data.
* **Subscribe users** to a specific email or SMS list based on their survey answers.


# Mailchimp

Get the most out of Zigpoll and Mailchimp

#### Step #1: Create your integration

1. Get your Api Key from Mailchimp. You can access your key by following the steps here: <https://mailchimp.com/help/about-api-keys/>
2. In Zigpoll: Go to **Integrations** in the account sidebar and enable the Mailchimp Integration
3. Enter your api key into the input fields and press save.

#### Step #2: Collect Your Data

Once your integration has been completed, any email that is captured from any survey on your website will be added into your Mailchimp audience at the same time.


# GetResponse

#### Step #1: Create your integration

1. Get your Api Key from GetResponse. You can access your key by following the steps here: <https://www.getresponse.com/help/where-do-i-find-the-api-key.html>
2. Get your list token from GetResponse. You can get your list token following the steps here: <https://support.exitbee.com/email-marketing-crm-integrations/how-to-find-your-get-response-list-id>
3. In Zigpoll: Go to **Integrations** in the account sidebar and enable the GetResponse Integration
4. Enter your api key and list token into the input fields and press save.

#### Step #2: Collect Your Data

Once your integration has been completed, any email that is captured from any survey on your website will be added into your GetResponse audience at the same time.


# Omnisend

Get the most out of Zigpoll and Omnisend

#### Step #1: Create your integration

1. Get your API Key from Omnisend. You can access your Api key by following the steps here: <https://support.omnisend.com/en/articles/1061890-generating-api-key>. Be sure to select **I want to set up custom permissions for this API key** and make sure that both **Contacts** and **Events** are selected.
2. In Zigpoll: Go to **Integrations** in the account sidebar and enable the Omnisend Integration
3. Enter your API key into the input field and press save.

{% hint style="info" %}
**Already connected?** API keys created before survey events were added only carry the **Contacts** permission, so your contacts will keep syncing but no events will be sent. To start triggering automations, generate a new API key in Omnisend with **Events** enabled and save it in Zigpoll.
{% endhint %}

#### Step #2: Collect Your Data

Once your integration has been completed, data will start flowing into your Omnisend account. If you use our Shopify integration, we will use the user data provided to associate it with the correct email address. If not, but you have an email input field, the results from that field will be used to identify any existing Omnisend profiles or it will create a new one.

We will also pipe through your customer's average sentiment score and survey results. You can use this sentiment score to create mailing campaigns and trigger other events that will help grow your customer lifetime value.

When a survey is completed, Zigpoll sends a custom event named `[Zigpoll] Completed Survey: <survey title>` to Omnisend, carrying the survey answers along with any campaign metadata. Use it as an automation trigger or in a segment rule to follow up on a response — the event appears in Omnisend automatically the first time it is sent, so there is nothing to set up on their side. Events require the **Events** permission on your API key (see Step #1).

When a new contact is created, Zigpoll also adds the respondent's phone number as a separate `phone` identifier with its SMS channel set to a non-subscribed status, when one is available. The phone is captured from the survey response — a dedicated phone-number field or a phone number typed into a free-text/short-answer question (or the customer phone from your Shopify integration, which is preferred when connected) — and normalized to strict E.164 format (e.g. `+14155551234`); numbers that can't be validated are dropped. The phone is stored on the contact only; Zigpoll does not opt the contact into SMS marketing.


# Gorgias

How to get started with Gorgias

Zigpoll offers two ways to integrate with Gorgias:

1. **Ticket Creation** — Automatically create Gorgias tickets from survey responses, complete with participant info and all submitted answers.
2. **HTTP Integration** — Display Zigpoll customer data directly within Gorgias tickets using Gorgias's HTTP integration widget.

You can use either or both.

***

## Ticket Creation

Connect your Gorgias account to Zigpoll and automatically create support tickets from survey responses. Each response generates a new ticket in your Gorgias helpdesk, complete with the survey title, participant info, and all submitted answers. If the respondent provides an email address, Zigpoll will set them as the ticket customer so the ticket is linked to their Gorgias profile.

**Step #1: Generate a Gorgias API Key**

1. Log in to your Gorgias helpdesk.
2. Go to **Settings > REST API**.
3. Click **Add API Key**, give it a description (e.g., "Zigpoll"), and click **Create**.
4. Copy the generated API key.

**Step #2: Connect Gorgias in Zigpoll**

1. In Zigpoll: Go to **Integrations** in the account sidebar and enable the Gorgias Integration.
2. Enter your **Subdomain** — this is the part before `.gorgias.com` in your Gorgias URL. For example, if your URL is `mycompany.gorgias.com`, enter `mycompany`.
3. Enter the **Admin Email** — the email address of the Gorgias admin or agent account associated with the API key.
4. Paste the **API Key** you generated in Step 1.

**Step #3: Configure Ticket Creation**

1. Click "Click here to add a ticket configuration."
2. **Select a Survey** — Choose which survey should trigger ticket creation, or select "All Surveys" to create tickets for every survey response.

**Step #4: Configure Ticket Creation Rules**

Choose when tickets should be created:

* **Create a ticket if the survey is partially completed** — A ticket is created for every response, even if the survey is not fully completed.
* **Create a ticket only if the survey is fully completed** — Tickets are only created once the participant finishes the entire survey.
* **Create a ticket only if the respondent submitted an email address** — Tickets are only created when the participant provides an email.
* **Create a ticket only if an write-in is submitted** — Tickets are only created when the participant writes a free-text answer.

**Step #5: Save Changes**

Click "Save Changes" to activate the integration.

**That's it.** Zigpoll will now create a new ticket in your Gorgias helpdesk each time a matching survey response is submitted. The ticket will include the survey name, participant details, and all responses.

### Ticket Details

Each ticket created by Zigpoll includes:

* **Subject** — "New Survey Response: {survey title}"
* **Message Body** — Survey title, participant name, all question-and-answer pairs, email address (if provided), and any metadata (UTM parameters, Shopify data, etc.)
* **Customer** — Set to the respondent's email address if available, which automatically creates or matches a Gorgias customer profile
* **Channel** — `api`

### Multiple Configurations

You can add multiple configurations to route different surveys to separate ticket workflows. Click "Click here to add another ticket configuration" to add additional entries. Each configuration has its own survey filter and ticket creation rules.

### Survey Actions

You can also trigger Gorgias ticket creation from a survey's **Settings → Workflows → Actions** tab. Add a "create gorgias ticket" action to create tickets based on specific survey logic rules, such as when a particular answer is selected or a condition is met.

***

## HTTP Integration (Display Data in Gorgias)

You can also use Gorgias's HTTP integration to display Zigpoll customer data directly within Gorgias tickets. This is a pull-based integration where Gorgias fetches data from Zigpoll when a ticket is opened.

**Step #1: Get your Gorgias Integration Link and API Key**

1. In Zigpoll: Go to **Integrations** in the account sidebar and enable the Gorgias Integration. Copy the generated Integration URL to your clipboard. You will need it later.
2. Scroll down to API Keys and create an API key. Copy it for later.

**Step #2: Create your Gorgias HTTP Integration**

Once you have your link, you will need to create an HTTP integration within Gorgias so that it knows where to collect the data. Gorgias has documentation for this, so please review their official steps here: [https://developers.gorgias.com/docs/display-third-party-data-within-tickets.](https://developers.gorgias.com/docs/display-third-party-data-within-tickets) In summary, you will want to:

* Within Gorgias, go to the HTTP Integration page: Gorgias -> Settings -> Integrations -> HTTP Integrations.
* Select the 'Add Integration' button at the top right of the page.
* Fill out the name, description, HTTP Method, and Headers, as collected from the previous steps and select 'Ticket created' and 'Ticket message created' options for Triggers and select 'Add Integration.' Paste in the URL from the previous step where it says URL.
* Click Add Header and add a header. Name it **Authorization** and enter your API key from Step 1 for the value.
* Lastly, once you have received a ticket from a user with third party data, enter the ticket and select the gear icon on the right of the page. Drag the new information into the info bar and select 'Save'.
* You should now be able to view Zigpoll customer information directly from Gorgias.

And that's it! Once you have your data feed coming in from Zigpoll you will be able to see satisfaction reports and survey data from your customers along with the rest of your Gorgias data.


# Gladly

How to get started with Gladly

Zigpoll integrates with [Gladly](https://www.gladly.com/) to automatically survey your customers when a conversation is closed — and, optionally, to write each response back into Gladly as a note on the customer's timeline.

**How it works**

1. When a conversation is closed in Gladly, Gladly sends a webhook to Zigpoll.
2. The webhook only contains IDs, so Zigpoll uses your Gladly API credentials to look up the customer's email (and phone), then sends them the survey. The first question can be embedded directly in the email so customers can answer in one click.
3. If you enable write-back, the response is added to that customer's Gladly timeline as a conversation note.

You choose which survey to send per webhook, so you can send different surveys for different inboxes or topics.

***

## Step #1: Generate a Gladly API Token

1. Log in to Gladly.
2. Go to **Settings > API Tokens**.
3. Create a new API token associated with an admin or agent user, and copy it. Note the email address of that user — you'll need both.

> Gladly's API uses Basic authentication: the agent email is the username and the API token is the password.

## Step #2: Connect Gladly in Zigpoll

1. In Zigpoll: go to **Integrations** in the account sidebar and enable the Gladly integration.
2. Enter your **Subdomain** — the part before `.gladly.com` in your Gladly URL. For example, if your URL is `mycompany.gladly.com`, enter `mycompany`. If your Gladly URL includes a region (for example `mycompany.us-1.gladly.com`), include it: enter `mycompany.us-1`.
3. Enter the **Agent Email** — the Gladly user that owns the API token.
4. Paste the **API Token** from Step #1.

These credentials let Zigpoll resolve the customer when a conversation closes and write responses back into Gladly.

## Step #3: Add a Survey and Copy its Webhook URL

1. Under **Surveys**, click "Click here to add a survey."
2. Select the **survey** to send when a conversation closes.
3. Choose the **Response Write-back** rule for this row (see below). Select "Don't write responses back to Gladly" to disable write-back.
4. (Optional) Under **Exclude Topics**, select any topics that should *not* trigger this survey — for example `spam`, `auto-close`, or `not support related` (see [Excluding Topics](#excluding-topics) below).
5. **Save Changes.** Saving generates the survey's secure webhook URL (it contains a per-account secret token).
6. Copy the generated webhook URL — you'll paste it into Gladly in the next step.
7. Add more rows if you want — each survey gets its own webhook URL.

> **Keep the URL private.** The webhook URL contains a secret token that authenticates requests to Zigpoll. Treat it like a password — anyone with the URL could trigger surveys to your customers.

## Step #4: Create the Webhook in Gladly

1. In Gladly, go to **More Settings > Webhooks**.
2. Add a new webhook using the URL you copied in Step #3, and subscribe it to the **Conversation Closed** event.
3. Save the webhook.

The webhook URL's secret token authenticates every request to Zigpoll, so no additional signing setup is required.

**Note:** A Gladly webhook fires for **every** closed conversation — it can't be scoped to a specific topic or inbox in Gladly. To stop certain conversations (spam, auto-closed, not support related, etc.) from being surveyed, use the **Exclude Topics** option on the survey, described below.

## Step #5: Save Changes

Click "Save Changes" in Zigpoll to activate the integration.

**That's it.** When a conversation is closed in Gladly, Zigpoll sends the chosen survey to the customer. If write-back is enabled, the response is added to the customer's Gladly timeline.

***

## Response Write-back Rules

Each survey has its own write-back rule that controls when a response is written back into Gladly as a conversation note:

* **Don't write responses back to Gladly** — Disable write-back for this survey.
* **Write back if the survey is partially or fully completed** — A note is created for every response, even if the survey is not finished.
* **Write back only if the survey is fully completed** — Notes are only created once the participant finishes the entire survey.
* **Write back only if an write-in is submitted** — Notes are only created when the participant writes a free-text answer.

Write-back is applied to responses that originated from a Gladly-triggered survey, so the note is attached to the correct customer.

## Excluding Topics

A Gladly webhook fires on **every** closed conversation, so by default a survey is sent for all of them. Often you don't want to survey conversations that were closed as spam, auto-closed, or otherwise marked as not support related.

Each survey row has an **Exclude Topics** picker listing your Gladly topics. Select any topics that should suppress the survey: when a conversation closes with one of those topics applied, Zigpoll skips the send for that survey. (This also suppresses the corresponding write-back, since no survey is sent.)

A few notes:

* The picker shows the topics from your Gladly account. If you don't see it, make sure your Subdomain, Agent Email, and API Token are saved and valid — the list is fetched using those credentials.
* Exclusions are **per survey**, so different surveys can exclude different topics.
* Matching is based on the topics applied to the conversation at the time it closes. To reliably exclude spam, pair this with a Gladly **Rule** that applies a "spam" topic (Rules *can* apply topics — they just can't call Zigpoll's webhook directly).

## Survey Actions

You can also trigger Gladly write-back from a survey's **Settings → Workflows → Actions** tab. Add a "create gladly conversation" action to write a note based on specific survey logic rules, such as when a particular answer is selected or a condition is met.


# ActiveCampaign

#### Step #1: Create your integration

1. Get your Api Key from ActiveCampaign. You can access your key by following the steps here: <https://help.activecampaign.com/hc/en-us/articles/207317590-Getting-started-with-the-API>
2. Get your Api URL from ActiveCampaign. You can get your list token following the steps here: <https://help.activecampaign.com/hc/en-us/articles/207317590-Getting-started-with-the-API>
3. In Zigpoll: Go to **Integrations** in the account sidebar and enable the ActiveCampaign Integration
4. Enter your api key and api url into the input fields and press save.

#### Step #2: Collect Your Data

Once you connect, every email captured by a survey on your website is added to your ActiveCampaign audience right away. Each contact gets a tag called Zigpoll and a note with their responses for each survey they fill out.

When a new contact is created, Zigpoll also stores the respondent's phone number on the contact's standard `phone` field, when one is available — captured from a dedicated phone-number field or a phone number typed into a free-text/short-answer question (or the customer phone from your Shopify integration, which is preferred when connected). The number is normalized to strict E.164 format (e.g. `+14155551234`), and numbers that can't be validated are dropped. The phone is saved on the contact only; Zigpoll does not opt the contact into SMS marketing. Existing contacts continue to receive tags only, as before.


# Slack

How to get started with slack

**Step #1: Enable your Slack Integration**

1. In Zigpoll: Go to **Integrations** in the account sidebar and enable the Slack Integration.
2. Click the button labelled "Add to Slack"
3. Select a workspace and channel where you want Zigpoll to post to.

**Thats it.** Zigpoll will automatically post all notifications to the Slack workspace and channel account that you have specified.

<figure><img src="https://1643988190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LZpanNFqg3aCUZgXh3X%2Fuploads%2Fgit-blob-71f5d5670bfa44b4f610146319d85043042e8d66%2Fintegrations-slack.png?alt=media" alt="The Slack integration"><figcaption></figcaption></figure>


# Google Analytics

**Step #1: Enable your Google Analytics Integration**

1. In Zigpoll: Go to **Integrations** in the account sidebar and enable the Google Analytics Integration.

**Thats it.** Zigpoll will automatically use the Google Analytics account that you have loaded on each page. We track the following events:

* When a survey is opened we send an event with Action = **Poll Opened**
* When a survey is closed we send an event with Action = **Poll Closed**
* When a survey is completed we send an event with Action = **Poll Completed**
* When a response is submitted we send an event with Action = **Poll Submission**

The event labelled **Poll Submission** gets an extra **Event Value**. This Event Value is the response that the customer has submitted along with the handle of the poll.

So, for example, if you have a poll with handle *post-purchase* and the response to a particular question is *Very Satisfied* you will see the following as the Event Value in Google Analytics: **post-purchase : Very Satisfied**.


# Shopify

Get the most out of Zigpoll and Shopify

To set up your Shopify integration, please install the app here: <https://apps.shopify.com/zigpoll>


# Google Sheets

Automatically write survey responses into a Google Sheet

Connect Google Sheets to Zigpoll to automatically pipe survey responses into a spreadsheet. Once set up, every matching submission appends a new row in real time — no exports or manual work required.

## Setup

1. Navigate to **Integrations** in your Zigpoll dashboard.
2. Find **Google Sheets** and toggle it on.
3. Click **Click To Authenticate** and sign in with your Google account.
4. Grant Zigpoll access. You'll be returned to Zigpoll with a confirmation that your account is connected.

{% hint style="info" %}
Zigpoll requests the `drive.file` scope, so it can only see and edit the spreadsheets it creates for you — it cannot read the rest of your Google Drive.
{% endhint %}

## Sending responses to a sheet

After connecting, add a **write to google sheet** action on a survey's **Settings → Workflows → Actions** tab. Zigpoll creates the spreadsheet for you and appends a row each time your action's conditions are met. You can also choose exactly which columns to sync.

For a full walkthrough, see the tutorial:

{% content-ref url="/pages/mtYMiol9sp57oml4S74n" %}
[Sync Survey Responses to Google Sheets](/tutorials/sync-survey-responses-to-google-sheets)
{% endcontent-ref %}

## Two ways to fill a sheet

|                | **write to google sheet** action                                       | **Export CSV to Sheets** scheduled export                                                  |
| -------------- | ---------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ |
| Set up in      | The survey's **Settings → Workflows → Actions**, or a question's logic | **Scheduled Exports** in the sidebar                                                       |
| When it writes | Each time a response meets your condition                              | Daily, weekly, or monthly, at the hour you choose                                          |
| What it writes | Adds one row per response                                              | Clears the sheet and writes the full export again (one tab per survey for **All Surveys**) |
| Sheet name     | **Zigpoll Responses**                                                  | The survey name and date range, updated on every run                                       |

The export window on your dashboard also has **Save to Sheets** once Google Sheets is connected. It puts a one-off export into a new Google Sheet and emails you the link.

See [Automations](/tutorials/automations) for scheduled exports.

## Troubleshooting

#### Which sheet does Zigpoll write to?

Zigpoll writes to a spreadsheet it creates itself, never to one you made. When you save a **write to google sheet** action, Zigpoll creates a spreadsheet named **Zigpoll Responses** with a header row: **Submitted At**, **Email**, **Participant ID**, then one column per question. Rows go on the first tab. When a response has a column the sheet doesn't have yet, such as a new question or metadata key, Zigpoll adds that column at the end.

To open the sheet, click **View Sheet** on the saved action. Each action has its own sheet.

{% hint style="warning" %}
Because of the `drive.file` permission, Zigpoll can't write to a sheet you created, or to a copy of its sheet. Rename, move, or add tabs to the sheet Zigpoll created, but keep your responses on its first tab.
{% endhint %}

#### I get a permission error, or rows stopped appearing

If Zigpoll's access to your Google account expires or is removed, rows stop appearing, and Zigpoll doesn't show an error. To reconnect:

1. Go to **Integrations** and toggle **Google Sheets** off.
2. Toggle it back on, click **Click To Authenticate**, and sign in with the same Google account you used before.
3. Allow the access Google asks for, then click **Save Changes**.

If saving a **write to google sheet** action shows "Failed to create Google Sheet. Please check your Google Sheets integration and try again.", reconnect the same way and save the action again.

If you deleted the sheet, remove the action, then add it again and save. Zigpoll creates a new sheet.

#### My scheduled export's sheet name changes every day

Scheduled exports rename their sheet after the survey and the dates covered each time they run. The link stays the same. To keep the name fixed, go to **Integrations → Google Sheets**, turn on **Maintain Sheet Titles**, and click **Save Changes**.

#### Can a scheduled export add new rows to the same sheet each time?

It writes to the same sheet every run, but it replaces the rows rather than adding to them. The sheet holds the dates set under **What should we automate?**, such as the last 7 days. To build up every response in one sheet, for example for a Looker Studio dashboard, set the export to **all time**. To add a row as each response comes in, use the **write to google sheet** action instead.

#### My All Surveys export made a separate sheet for each survey

Earlier versions did that. Now an **All Surveys** export writes one sheet with a tab for each survey. On its next run, Zigpoll moves every survey into one of those sheets and emails its link. The other sheets stop updating, so you can delete them.

#### My scheduled export made a new sheet with a different link

When a scheduled export can't open its sheet, for example because it was deleted or access was lost, Zigpoll creates a new sheet and emails the new link to the export's recipients. Update any tools that read from the old link.

#### How do I change when a scheduled export runs?

Open **Scheduled Exports**, change **When should we run it?** on the export's card, and click **Save Changes**. You can run it daily, weekly on a chosen day, or monthly on a chosen date, at the hour and timezone you pick. See [Automations](/tutorials/automations).


# Data Studio

Build live dashboards on your Zigpoll surveys, questions, and responses using the Zigpoll Community Connector for Data Studio.

### 📊 What you can do

Connect Zigpoll to [Data Studio](https://lookerstudio.google.com) and visualize your survey data alongside the rest of your reporting stack. Common use cases:

* Time-series charts of responses, completes, and presentations
* NPS / CSAT averages and distributions, broken down by survey or question
* Cross-survey engagement comparisons
* Period-over-period trend reporting (this month vs. last month)
* Embeddable, shareable dashboards for execs, CS, or marketing

### 🚀 How to install

1. **Get your Zigpoll API key.** Open your Zigpoll dashboard → **Integrations** → **API Keys** → **Create Api Key**. Copy the key. (Full instructions: [API Key](/integrations/api-key).)
2. **Find your accountId.** Open the **Settings** page in your Zigpoll dashboard — your accountId is shown there.
3. **Add the connector to Data Studio.** Open this URL in a browser logged into the Google account you want to own the data source:

   ```
   https://lookerstudio.google.com/datasources/create?connectorId=<DEPLOYMENT_ID>
   ```

   Data Studio will prompt you to authorize the connector, then ask for your Zigpoll API key.
4. **Choose a dataset.** Pick one of:
   * **Polls overview** — one row per survey, with lifetime counts (responses, completes, presentations, etc.).
   * **Daily aggregates** — one row per day × survey × question × answer, perfect for time-series charts.
   * **NPS aggregates** — one row per day × NPS-style question, with promoter / passive / detractor counts and a daily NPS score.
5. **Enter your accountId** in the connector config and (optionally) a specific `pollId` if you only want to chart a single survey.
6. Click **Connect** and start building reports.

### 📐 Datasets

#### Polls overview

One row per poll. Useful for top-line summaries and survey leaderboards.

| Field                                                                                                | Type         | Notes           |
| ---------------------------------------------------------------------------------------------------- | ------------ | --------------- |
| `pollId`, `pollTitle`, `pollSlug`                                                                    | Text         |                 |
| `createdAt`                                                                                          | Date/time    |                 |
| `pollType`, `status`                                                                                 | Text         |                 |
| `responseCount`, `voteCount`, `completeCount`, `presentationCount`, `emailCount`, `participantCount` | Number (sum) | Lifetime totals |

#### Daily aggregates

One row per day × poll × question × answer handle. Ideal for time-series and answer-distribution charts.

| Field                                | Type         | Notes                                                                              |
| ------------------------------------ | ------------ | ---------------------------------------------------------------------------------- |
| `day`                                | Date         | Bucketed by UTC by default                                                         |
| `pollId`, `pollTitle`                | Text         |                                                                                    |
| `slideId`, `slideTitle`, `slideType` | Text         |                                                                                    |
| `answerHandle`, `answerTitle`        | Text         |                                                                                    |
| `valueType`                          | Text         | e.g. `response`, `form-response`                                                   |
| `count`                              | Number (sum) | Number of responses for this answer on this day                                    |
| `rankSum`                            | Number (sum) | Sum of ranks (use `rankSum / count` for average rank, e.g. NPS or rating averages) |

#### NPS aggregates

One row per day × NPS-style question (any question of type `range`, `star-rating`, or `satisfaction`). Buckets the answer handles into detractor / passive / promoter using the same rules the in-app NPS chart uses, so the dashboard NPS matches what you see inside Zigpoll.

| Field                                                           | Type         | Notes                                                                                                                                                                                                                                                                                                 |
| --------------------------------------------------------------- | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `day`                                                           | Date         |                                                                                                                                                                                                                                                                                                       |
| `pollId`, `pollTitle`                                           | Text         |                                                                                                                                                                                                                                                                                                       |
| `slideId`, `slideTitle`, `slideType`                            | Text         |                                                                                                                                                                                                                                                                                                       |
| `detractorCount`, `passiveCount`, `promoterCount`, `totalCount` | Number (sum) | Per-day counts in each bucket                                                                                                                                                                                                                                                                         |
| `npsScore`                                                      | Number (avg) | Per-day NPS score, `(promoters − detractors) / total × 100`. Aggregation is set to AVG so it works at day granularity. **For weekly / monthly rollups create a Data Studio calculated field:** `(SUM(promoterCount) − SUM(detractorCount)) / SUM(totalCount) * 100` to get a properly weighted score. |

Bucketing rules: handles are bucketed by their position in the answer list. With ≥ 6 answers (e.g. an 11-point 0–10 scale): the bottom 70% are detractors, the next 20% are passives, the top 10% are promoters. With ≤ 5 answers (e.g. a 1–5 satisfaction scale): the bottom 50% are detractors, the next 30% are passives, the top 20% are promoters.

### 📏 Limits

* The connector clamps date ranges to a maximum of **90 days** per query. Use Data Studio's date control to navigate further back; the connector will paginate within each window.
* Pagination caps: 10,000 rows per page for **Polls overview**, 100,000 rows per page for **Daily aggregates**, with up to 50 pages per request.
* The connector caches responses for 60 seconds (`Cache-Control` header) to keep large dashboards snappy.

### 🛠️ Troubleshooting

* **"This API key doesn't have access to that account"** — Confirm the accountId you entered matches the account the API key was generated under, and that your account has API access enabled (Premium plan or higher).
* **"Zigpoll API key was rejected"** — The key was revoked or removed. Generate a fresh key on the **API Keys** tab and reconnect the data source.
* **Data Studio shows "no data"** — Try widening the date range, removing any `pollId` filter, or confirming the chosen dataset matches the chart you're building.

### 🔄 Refreshing data

Data Studio caches connector data per the `Cache-Control` header (60s). To force a refresh inside a report, click **Resource → Manage data freshness** or use the **Refresh data** option on a chart.


# n8n

All you need to know about our n8n integration

## How to Install verified community nodes in the n8n app <a href="#install-verified-community-nodes-in-the-n8n-app" id="install-verified-community-nodes-in-the-n8n-app"></a>

Limited to n8n instance owners

Only the n8n instance owner can install and manage verified community nodes. The instance owner is the person who sets up and manages user management. All members of an n8n instance can use already installed community nodes in their workflows.

Admin accounts can also uninstall any community node, verified or unverified. This helps them remove problematic nodes that may affect the instance's health and functionality.

### Install a community node <a href="#install-a-community-node" id="install-a-community-node"></a>

To install the Zigpoll [verified community node](https://docs.n8n.io/integrations/creating-nodes/deploy/submit-community-nodes/#submit-your-node-for-verification-by-n8n):

1. Go to the **Canvas** and open the **nodes panel** (either by selecting '+' or pressing <kbd>Tab</kbd>).
2. **Search** for the node that you're looking for. If there is a matching verified community node, you will see a **More from the community** section at the bottom of the nodes panel.
3. Select the node you want to install. This takes you to a detailed view of the node, showing all the supported actions.
4. Select **install**. This will install the node for your instance and enable all members to use it in their workflows.
5. You can now add the node to your workflows.

Enable installation of verified community nodes

Some users may not want to show verified community nodes in the nodes panel of their instances. On n8n cloud, instance owners can toggle this in the [Cloud Admin Panel](https://docs.n8n.io/manage-cloud/cloud-admin-dashboard/). Self-hosted users can use [environment variables](https://docs.n8n.io/hosting/configuration/environment-variables/nodes/) to control the availability of this feature.

### Uninstall a community node <a href="#uninstall-a-community-node" id="uninstall-a-community-node"></a>

To uninstall a community node:

1. Go to **Settings** > **Community nodes**.
2. On the node you want to install, select **Options** ![Three dots options menu](https://docs.n8n.io/_images/common-icons/three-dot-options-menu.png).
3. Select **Uninstall package**.
4. Select **Uninstall Package** in the confirmation modal.

### 🔗 What is n8n?

n8n is a fair-code licensed workflow automation tool that lets you connect any API or service together. It's open source, highly customizable, and ideal for power users looking to own their data and logic.

#### 🚀 What You Can Do with the Zigpoll Integration

* Trigger workflows when a survey is completed
* Send survey data to Google Sheets, Slack, Discord, Airtable, or your internal tools
* Route responses to different tools based on metadata, tags, or user input
* Add customer tags to your e-commerce store based on answers
* Kick off onboarding sequences, alerts, or internal workflows in real time

Each trigger payload includes the answers (keyed by question handle), survey metadata, and — when the respondent provides them — their **email** and **phone number** (phone in E.164 format, e.g. `+14155551234`), so you can route or send SMS follow-ups downstream.

#### 🔧 How to Install the Zigpoll Community Node in n8n

1. Open your n8n instance.
2. Go to Settings → Community Nodes.
3. Click Install Community Node.
4. Enter: n8n-nodes-zigpoll
5. Click Install, and wait for the package to be added.

You’re now ready to start building workflows using Zigpoll triggers and actions!

#### 🔑 How to Find and Use Your Zigpoll API Key

1. Log in to your Zigpoll dashboard.
2. Go to **Integrations** and open the **API Keys** card.
3. Click **New API Key**, label it "n8n", and click **Create API Key**. Copy the key.
4. In n8n, add a new credential under Zigpoll API and paste your key.

That’s it! You’re now connected and can begin using all available triggers and actions.

{% hint style="warning" %}
The n8n node uses the Zigpoll API, which requires the **Premium** plan or higher. On other plans, listing surveys returns *"This account's plan does not include API access. Please upgrade to the Premium plan or higher."*
{% endhint %}

#### Endpoints (for the HTTP Request node)

If you'd rather not install the community node, call the API directly. Send requests to `https://v1.zigpoll.com` with your key in the `Authorization` header:

| Method   | Path         | Purpose                                                                                             |
| -------- | ------------ | --------------------------------------------------------------------------------------------------- |
| `POST`   | `/n8n/hooks` | Subscribe a webhook URL. Body: `{ "targetUrl": "<your n8n webhook URL>", "pollId": "<survey id>" }` |
| `DELETE` | `/n8n/hooks` | Unsubscribe. Same body                                                                              |
| `GET`    | `/polls`     | List your surveys, to find a survey id                                                              |

For every other endpoint, see the [API reference](/web-api).

#### 📥 Sample Workflows

To help you get started, we’ve also published example workflows like:

* Send a Slack message when a Zigpoll response includes a negative NPS
* Create a HubSpot contact for every survey completion
* Push answers to a Google Sheet in real-time

<br>


# API Key

Learn how to get your API key which you can use to connect Zigpoll to any workflow

### 🔑 How to Create Your Zigpoll API Key

1. Log in to your Zigpoll dashboard.
2. Go to **Integrations** in the account sidebar and open the **API Keys** card (under **API Keys & Webhooks**).
3. Click **New API Key**, enter an **API Key Label** (for example "Zapier"), and click **Create API Key**.
4. Copy the key.

Paste the key into the tool you're connecting, such as Zapier, Make, or n8n.

{% hint style="info" %}
**A key belongs to your login, not to one account.** It can reach every Zigpoll account your login has access to. If you manage several stores, sign in as the user who belongs to the account you want to connect before you create the key. To remove a key, click **Delete** next to it.
{% endhint %}

### Using your key

Send it in the `Authorization` header on requests to `https://v1.zigpoll.com`. See the [API reference](/web-api) for endpoints.

### Requirements and permissions

* **Plan**: direct API access requires a **Premium** plan or higher. On other plans, requests return `403` with *"This account's plan does not include API access. Please upgrade to the Premium plan or higher."* Tools built on the API, such as Zapier, Make, n8n, and MCP, need the same plan.
* **Role**: your key carries your team role. **Read only** keys can't make writes, and **Editor** keys can't manage webhooks or integrations. Those endpoints need a key from an **Owner**, **Admin**, or **Billing Admin**. See [Adding Team Members](/tutorials/adding-team-members) for role details.


# MCP (AI Assistants)

Connect Zigpoll to AI assistants like Claude using the Model Context Protocol (MCP)

Zigpoll's MCP server gives AI assistants like Claude direct access to your survey data and analytics. Ask questions in plain English — get answers instantly. No coding required.

## What is MCP?

The [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) is an open standard that lets AI assistants interact directly with external services. Think of it like a USB port for AI — a standard way to plug services into any AI assistant that supports it.

Zigpoll's MCP server gives AI assistants a set of tools to read your survey data, run analytics, and even create new surveys on your behalf. The full list is under [Available Tools](#available-tools).

{% hint style="warning" %}
**Plan requirement:** MCP uses the Zigpoll API, which is included on the **Premium** plan and higher. On a plan without API access you can still sign in, but tools that read or change survey data fail with: *"This account's plan does not include API access. Please upgrade to the Premium plan or higher."* See [Subscription Plans](/subscription-plans).
{% endhint %}

## What You Can Do

* Summarize survey responses and identify key trends
* Analyze participant engagement, devices, and geographic distribution
* Compare performance across multiple surveys
* Correlate answers between questions
* Analyze Shopify order data alongside survey responses
* Get AI-generated insights and recommendations
* Create, publish, and duplicate surveys using natural language
* Run AI-powered synthetic research with configurable audience profiles
* Send survey invitations by email, SMS, or a unique trackable link

## Quick connect guides

Step-by-step pages for the most popular clients:

* [Connect Zigpoll to Claude](/integrations/mcp/mcp-claude) (Claude Desktop & Claude Code)
* [Connect Zigpoll to ChatGPT](/integrations/mcp/mcp-chatgpt)
* [Connect Zigpoll to Codex](/integrations/mcp/mcp-codex)
* [Connect Zigpoll to Manus](/integrations/mcp/mcp-manus)
* [Connect Zigpoll to OpenClaw](/integrations/mcp/mcp-openclaw)
* [Connect Zigpoll to Perplexity](/integrations/mcp/mcp-perplexity)

Or follow the generic setup below for any MCP-compatible client.

## Setup

### Step #1: Have Your Zigpoll Login Ready

Authorization uses your Zigpoll login — there's no API key to copy or paste. When you connect, your AI client opens a browser window to authorize with Zigpoll:

* **If you're already logged into Zigpoll** in that browser, authorization completes automatically — you'll briefly see a loading screen, then be returned to your client.
* **If you're not logged in**, you'll see a Zigpoll sign-in page. Sign in with your email and password, Google, or Shopify.

Your client then stores a secure token, so you only do this once. Behind the scenes, Zigpoll creates an API key labeled "MCP" for your login (visible under **Integrations → API Keys**) — you don't need to do anything with it.

### Step #2: Connect to Your AI Client

Connecting **Claude**, **ChatGPT**, **Codex**, **Manus**, **OpenClaw**, or **Perplexity**? Each has its own step-by-step page:

{% content-ref url="/pages/5TuzHTEstOBBPDGnKL36" %}
[Connect to Claude](/integrations/mcp/mcp-claude)
{% endcontent-ref %}

{% content-ref url="/pages/AdrL9juXS20zk9i1kR9t" %}
[Connect to ChatGPT](/integrations/mcp/mcp-chatgpt)
{% endcontent-ref %}

{% content-ref url="/pages/3xlYen1RC34qBoNaQENk" %}
[Connect to Codex](/integrations/mcp/mcp-codex)
{% endcontent-ref %}

{% content-ref url="/pages/xJ1XBkIwEKLtUVIfuJHO" %}
[Connect to Manus](/integrations/mcp/mcp-manus)
{% endcontent-ref %}

{% content-ref url="/pages/R55k82yc5vQoeWV4vzgk" %}
[Connect to OpenClaw](/integrations/mcp/mcp-openclaw)
{% endcontent-ref %}

{% content-ref url="/pages/SmK4FsxJWpQz4OwnEByf" %}
[Connect to Perplexity](/integrations/mcp/mcp-perplexity)
{% endcontent-ref %}

For other MCP-capable clients:

{% tabs %}
{% tab title="Cursor" %}

1. Open **Settings → MCP**
2. Click **Add new MCP server**
3. Set the name to `zigpoll` and the URL to:

```
https://mcp.zigpoll.com/mcp
```

4. Save. Cursor opens a browser window to authorize — sign into Zigpoll if prompted (authorization completes automatically if you're already logged in).
   {% endtab %}

{% tab title="Windsurf" %}

1. Open **Settings → MCP**
2. Add a new MCP server with the URL:

```
https://mcp.zigpoll.com/mcp
```

3. Save. Windsurf opens a browser window to authorize — sign into Zigpoll if prompted (authorization completes automatically if you're already logged in).
   {% endtab %}
   {% endtabs %}

{% hint style="info" %}
**How authentication works:** `mcp.zigpoll.com` uses a standard browser-based OAuth login tied to your Zigpoll account. Setting a static `Authorization: Bearer <api-key>` header will not work — your login is exchanged for a secure token through the browser authorization flow.
{% endhint %}

### Step #3: Verify Your Connection

Try asking your AI assistant:

> "List my Zigpoll accounts"

or

> "Show me my recent surveys"

The assistant will use the Zigpoll tools automatically to fetch your data.

## Example Prompts

### Survey Overview

* "List all my surveys and their response counts"
* "Show me the details of my post-purchase survey"

### Response Analysis

* "Summarize the responses for my NPS survey from the last 30 days"
* "What are the daily response trends for my customer satisfaction survey?"

### Participant & Engagement

* "What devices and browsers are my respondents using?"
* "Where are my survey respondents located?"

### Cross-Question Analysis

* "How do NPS scores correlate with purchase type?"
* "Compare order values for each answer on my attribution question"

### Shopify

* "What products are most purchased by customers who found us through TikTok?"

### Survey Creation

* "Create a new NPS survey for my account"
* "Add a multiple choice question asking about customer satisfaction"
* "Hide the second question in my exit intent survey" (and "Show it again" to undo)

## Available Tools

{% hint style="info" %}
You don't need to memorize these — just describe what you want in natural language and the AI will pick the right tool.
{% endhint %}

### Data Access

| Tool                    | Description                                                                      |
| ----------------------- | -------------------------------------------------------------------------------- |
| `get_me`                | Get info about the current authenticated user                                    |
| `list_accounts`         | List all accounts for the authenticated user                                     |
| `get_account`           | Get details of a specific account                                                |
| `list_polls`            | List all surveys for an account                                                  |
| `get_poll`              | Get details of a specific survey                                                 |
| `list_slides`           | List all questions for a survey                                                  |
| `get_slide`             | Get details of a specific question                                               |
| `list_responses`        | List responses with pagination and filtering                                     |
| `list_participants`     | List participants with pagination and filtering                                  |
| `list_emails`           | List collected email addresses                                                   |
| `get_verbatims`         | Read the Write-Ins people typed, optionally from one group of respondents        |
| `get_translations`      | See which languages a survey is translated into and what still needs translating |
| `get_poll_action_logic` | See a survey's Action Logic rules and the actions available to the account       |
| `list_webhooks`         | List the signed webhooks registered on a survey                                  |

### Reference

| Tool             | Description                                                     |
| ---------------- | --------------------------------------------------------------- |
| `search_docs`    | Search the Zigpoll documentation                                |
| `get_schema`     | Field-by-field reference for survey settings and question types |
| `list_templates` | List built-in survey templates and delivery presets             |
| `get_template`   | Get a template's questions or a delivery preset's settings      |

### Analytics

| Tool                              | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| --------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `analyze_response_trends`         | Analyze response trends over time with answer distribution                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| `analyze_participants`            | Analyze participant engagement and behavior                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| `get_response_summary`            | Get response summary with answer distribution and key metrics                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| `compare_poll_performance`        | Compare performance metrics across multiple surveys                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| `analyze_location_metadata`       | Geographic and traffic source analysis (country, UTM, referrer)                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| `analyze_device_metadata`         | Device, browser, and OS distribution of respondents                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| `analyze_response_metadata`       | Analyze custom metadata fields from responses                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| `analyze_participant_metadata`    | Analyze participant properties and custom fields                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| `analyze_shopify_line_items`      | Analyze Shopify line items from response metadata                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| `analyze_order_values`            | Analyze order values and revenue breakdown by answer                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| `analyze_attribution`             | Attribution report for a "How did you hear about us?" question: attributed revenue, AOV and share per answer by day/week/month with change versus the previous period, plus survey answers cross-tabbed against the Shopify last-click source, UTMs, landing page, referrer or discount code, including the unattributed share. Set `group_by` to `attribution_channel` or `attribution_source` to group by the channel and the named source the customer reported in their own answer, write-ins and follow-up questions included |
| `correlate_slides`                | Correlate responses between two questions                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| `group_answers`                   | Group multiple answers together for comparison                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| `correlate_metadata_with_answers` | Correlate metadata (UTM, landing page) with answers                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| `analyze_dropoff`                 | Show where respondents abandon a survey, question by question                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| `get_insights`                    | Get AI-generated insights with key findings and recommendations                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |

### Survey Management

| Tool                       | Description                                                                                                                                                           |
| -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `create_poll`              | Create a new survey                                                                                                                                                   |
| `update_poll`              | Update an existing survey's settings                                                                                                                                  |
| `create_slide`             | Add a new question to a survey                                                                                                                                        |
| `update_slide`             | Update an existing question, including **Hide Question**: `settings: { hidden: true }` takes it out of the survey without deleting it, `hidden: false` shows it again |
| `commit_staged`            | Save a survey or question that was staged with a dry run                                                                                                              |
| `publish_poll`             | Make a survey live and visible to respondents                                                                                                                         |
| `duplicate_poll`           | Create a clean copy of a survey (questions included, no response data)                                                                                                |
| `reorder_slides`           | Change the order of questions in a survey                                                                                                                             |
| `delete_slide`             | Delete a question from a survey (existing answers stay in exports)                                                                                                    |
| `delete_poll`              | Delete a survey (requires confirmation)                                                                                                                               |
| `set_translations`         | Write translations for one language of a survey                                                                                                                       |
| `add_poll_action_logic`    | Add an Action Logic rule that runs actions when a response comes in                                                                                                   |
| `remove_poll_action_logic` | Remove an Action Logic rule from a survey                                                                                                                             |
| `create_webhook`           | Register a signed webhook that receives a survey's responses                                                                                                          |
| `delete_webhook`           | Remove a signed webhook from a survey                                                                                                                                 |

### Synthetic Research

| Tool                         | Description                                                    |
| ---------------------------- | -------------------------------------------------------------- |
| `start_synthetic_research`   | Generate AI survey responses from weighted audience profiles   |
| `get_research_status`        | Check the progress of a running research job                   |
| `cancel_synthetic_research`  | Cancel a running research job (keeps generated responses)      |
| `generate_audience_profiles` | Generate audience profiles from a natural-language description |

### Distribution

| Tool                   | Description                                                                 |
| ---------------------- | --------------------------------------------------------------------------- |
| `send_email`           | Send an email survey invitation to one or more recipients                   |
| `send_sms`             | Send an SMS survey invitation to one or more phone numbers                  |
| `generate_survey_link` | Generate a unique, trackable survey link (optional metadata and expiration) |

## Supported Clients

* [Claude Desktop and claude.ai](https://claude.ai/download) (as a custom connector)
* [Claude Code (CLI)](https://docs.anthropic.com/en/docs/claude-code)
* [ChatGPT](/integrations/mcp/mcp-chatgpt) (as a custom connector in Developer Mode)
* [Codex CLI](/integrations/mcp/mcp-codex)
* [OpenClaw](/integrations/mcp/mcp-openclaw)
* [Cursor](https://www.cursor.com/)
* [Windsurf](https://codeium.com/windsurf)
* [Manus](https://manus.im/)
* [Perplexity](https://www.perplexity.ai/)
* Any MCP-compatible client

## Troubleshooting

**Authentication errors** — Connecting should open a browser authorization page. If it doesn't appear, find the "Connect" or "Authenticate" prompt in your client and trigger it (in Claude Code, run `/mcp`). Sign in with the Zigpoll login whose data you want to access. If you're already logged in, authorization completes automatically with that login. If the "MCP" API key was revoked (**Integrations → API Keys**), disconnect and reconnect to issue a new one. A static `Authorization: Bearer <api-key>` header is not supported; authentication must go through the browser flow.

**"Authorization expired"** — An authorization request is valid for 10 minutes and can only be used once. If the page sat open too long, or you refreshed or went back after approving, close it and start the connection again from your AI client.

**"The requesting application is no longer registered"** — Your client's saved registration no longer matches. Remove the Zigpoll server or connector from your client, add it again, and authorize.

**"This account's plan does not include API access"** — The account is on a plan without API access. Upgrade to **Premium** or higher, or connect with a login that belongs to an account on an eligible plan.

**Tools not appearing** — Restart your AI client after adding the MCP server configuration.

**Rate limiting** — The MCP server has automatic retries built in. If you hit rate limits, wait a moment and try again.


# Connect to Claude

Connect Zigpoll to Claude (Claude Desktop and Claude Code) with MCP so you can analyze survey responses and build surveys in plain English.

Connect your Zigpoll surveys to **Claude** using the [Model Context Protocol (MCP)](https://modelcontextprotocol.io/). Once connected, Claude can read your survey responses, run analytics, and even create surveys — just ask in plain English. No coding required.

This guide covers both **Claude Desktop** and **Claude Code (CLI)**. For other AI clients, see the [MCP overview](/integrations/mcp).

{% hint style="info" %}
**How authorization works:** there's no API key to copy or paste. When you connect, Claude opens a browser window to authorize with Zigpoll. If you're already logged into Zigpoll in that browser, authorization completes automatically — you'll briefly see a loading screen, then be returned to Claude. If you're not logged in, sign in with your email and password, Google, or Shopify. Claude then stores a secure token, so you only do this once.
{% endhint %}

{% hint style="warning" %}
**Plan requirement:** MCP uses the Zigpoll API, which is included on the **Premium** plan and higher.
{% endhint %}

## Claude Desktop (and claude.ai)

Zigpoll is a remote MCP server, so you add it as a **custom connector**, not by editing `claude_desktop_config.json`. That file is for servers that run on your own computer, and a `url` entry there does not connect.

1. In Claude, open **Settings → Connectors**.
2. Click **Add custom connector**.
3. Name it `Zigpoll` and enter the server URL:

```
https://mcp.zigpoll.com/mcp
```

4. Click **Add**, then **Connect**. A browser window opens to authorize with Zigpoll. Sign into Zigpoll if prompted — if you're already logged in, authorization completes automatically.
5. In a chat, make sure the Zigpoll connector is turned on in the tools menu.

Connectors you add on claude.ai are also available in Claude Desktop when you're signed into the same Claude account. On Team and Enterprise plans, an owner may need to allow custom connectors first. Menu names can change as Claude updates.

## Claude Code (CLI)

1. Add the server from your terminal:

```bash
claude mcp add --transport http zigpoll https://mcp.zigpoll.com/mcp
```

2. Run `/mcp` inside Claude Code and select **zigpoll** to authenticate.
3. A browser window opens — sign into Zigpoll if prompted (authorization completes automatically if you're already logged in).

{% hint style="info" %}
**How authentication works:** `mcp.zigpoll.com` uses a standard browser-based OAuth login tied to your Zigpoll account. Setting a static `Authorization: Bearer <api-key>` header will not work — your login is exchanged for a secure token through the browser authorization flow.
{% endhint %}

## Verify Your Connection

Ask Claude:

> "List my Zigpoll accounts"

or

> "Show me my recent surveys"

Claude will use the Zigpoll tools automatically to fetch your data.

## Example prompts

* "Summarize the responses for my NPS survey from the last 30 days"
* "What devices and browsers are my respondents using?"
* "How do NPS scores correlate with purchase type?"
* "Create a new post-purchase survey for my account"

For the full list of tools and more examples, see the [MCP overview](/integrations/mcp). For ideas on what to build, see [Ideas for Using Zigpoll MCP](/tutorials/zigpoll-mcp-use-cases).

## Troubleshooting

* **I edited `claude_desktop_config.json` and nothing happens** — remove the Zigpoll entry from that file and add Zigpoll as a custom connector instead (see Claude Desktop above).
* **No authorization window appears** — run `/mcp` in Claude Code, or click **Connect** on the Zigpoll connector in Claude's **Settings → Connectors**.
* **"Authorization expired"** — the Zigpoll authorization page is valid for 10 minutes and works only once. Close it and click **Connect** again in Claude.
* **"The requesting application is no longer registered"** or another redirect error — remove the Zigpoll connector (or run `claude mcp remove zigpoll` in Claude Code), add it again, and reconnect.
* **"This account's plan does not include API access"** — the Zigpoll account is on a plan without API access. Upgrade to **Premium** or higher.
* **Tools not appearing** — restart Claude after adding the server, and check that the connector is turned on for the chat.
* **Connected to the wrong Zigpoll account** — authorization uses whichever Zigpoll login is signed in to your browser. Log in as the correct user at [app.zigpoll.com](https://app.zigpoll.com), then disconnect and reconnect the server.
* **Authentication errors** — the connection authenticates with an API key labeled "MCP" that Zigpoll creates automatically. If it was revoked under **Integrations → API Keys**, disconnect and reconnect to issue a new one.

If none of these help, email <support@zigpoll.com> with the exact error and the client you're using.


# Connect to ChatGPT

Connect Zigpoll to ChatGPT with a custom MCP connector in Developer Mode to analyze survey data and create surveys in natural language.

Connect your Zigpoll surveys to **ChatGPT** as a custom MCP connector using the [Model Context Protocol (MCP)](https://modelcontextprotocol.io/). Once connected, ChatGPT can read your survey responses, run analytics, and create surveys — just ask in plain English.

For other AI clients, see the [MCP overview](/integrations/mcp).

{% hint style="warning" %}
**Plan requirement:** MCP uses the Zigpoll API, which is included on the **Premium** plan and higher.
{% endhint %}

{% hint style="info" %}
Custom MCP connectors require **Developer Mode**, available on ChatGPT **Pro, Plus, Business, Enterprise, and Education** plans on the web (not the mobile apps). Menu labels evolve as ChatGPT updates — "Apps" and "Connectors" refer to the same area. On **Business and Enterprise** plans, a workspace admin may first need to allow custom MCP connectors in the workspace permission settings.
{% endhint %}

## Step 1: Enable Developer Mode

1. In ChatGPT on the web, open **Settings → Apps & Connectors** (may appear as **Connectors**).
2. Open **Advanced settings** and turn on **Developer mode**.

## Step 2: Add the Zigpoll connector

1. Back in **Apps & Connectors**, click **Create** (or **Create app**).
2. Enter the details:
   * **Name:** `Zigpoll`
   * **MCP Server URL:** `https://mcp.zigpoll.com/mcp`
3. Set the authentication type to **OAuth**.
4. Check the box confirming you trust the provider, then click **Create**.
5. From the connector's details page, click **Connect** (or **Connect Zigpoll**). A Zigpoll authorization tab opens:
   * **If you're already logged into Zigpoll** in that browser, authorization completes automatically — you'll briefly see a Zigpoll loading screen, then be returned to ChatGPT with a "connection successful" message. No API key or extra steps needed.
   * **If you're not logged in**, you'll see a Zigpoll sign-in page. Sign in with your email and password, Google, or Shopify, and authorization completes from there.

{% hint style="warning" %}
A successful connection is **not** the last step. The connector must also be enabled inside each conversation (Step 3 below) — otherwise ChatGPT will say it can't access your Zigpoll data even though the connection succeeded.
{% endhint %}

{% hint style="info" %}
`mcp.zigpoll.com` uses a standard browser-based OAuth login tied to your Zigpoll account. You never paste an API key into ChatGPT, and a static API-key header is not supported — the browser flow exchanges your Zigpoll login for a secure token.
{% endhint %}

## Step 3: Enable Zigpoll in your chat

Custom connectors are only active in conversations where you turn them on:

1. Start a **new chat** and click the **+** (plus) button in the message box.
2. Choose **More → Developer mode** (may appear directly as **Developer mode**).
3. Toggle on the **Zigpoll** connector for the conversation.
4. Ask away. Being explicit helps ChatGPT pick the right tool, e.g.:

> "Use the Zigpoll app to list my accounts"

> "Use Zigpoll to summarize the responses from my NPS survey"

A good first prompt is *"List my Zigpoll accounts"* — it confirms the connection works and that you're connected to the right Zigpoll account.

## Example prompts

* "List all my surveys and their response counts"
* "Where are my survey respondents located?"
* "Compare order values for each answer on my attribution question"
* "Create a new customer satisfaction survey"

For the full list of tools and more examples, see the [MCP overview](/integrations/mcp). For ideas on what to build, see [Ideas for Using Zigpoll MCP](/tutorials/zigpoll-mcp-use-cases).

## Troubleshooting

* **"ChatGPT says it can't access Zigpoll" or "not connected" after a successful setup** — the connector is almost always turned off in the current conversation. Start a new chat and enable Zigpoll via **+ → Developer mode** (Step 3). The connector stays on for the rest of that conversation, but each new chat needs it enabled again.
* **The authorization tab flashed and closed without asking for anything** — that's expected. If you were already logged into Zigpoll, authorization completes automatically; the "connection successful" message means it worked.
* **Developer mode not visible** — confirm your plan supports it and that you're on the web app, not the mobile app. On Business/Enterprise plans, ask a workspace admin to enable custom MCP connectors for the workspace.
* **Connected to the wrong Zigpoll account** — authorization uses whichever Zigpoll login is signed in to your browser. Log in as the correct user at [app.zigpoll.com](https://app.zigpoll.com), then disconnect and reconnect the connector in ChatGPT.
* **Authentication errors** — the connector authenticates with an API key labeled "MCP" that Zigpoll creates automatically. If it was revoked under **Integrations → API Keys**, disconnect and reconnect the connector to issue a new one.
* **"This account's plan does not include API access"** — the Zigpoll account is on a plan without API access. Upgrade to **Premium** or higher.


# Connect to Codex

Connect Zigpoll to the OpenAI Codex CLI as an MCP server to analyze survey data and create surveys from your terminal.

Connect your Zigpoll surveys to the **OpenAI Codex CLI** as an MCP server using the [Model Context Protocol (MCP)](https://modelcontextprotocol.io/). Once connected, Codex can read your survey responses, run analytics, and create surveys — straight from your terminal.

For other AI clients, see the [MCP overview](/integrations/mcp).

{% hint style="warning" %}
**Plan requirement:** MCP uses the Zigpoll API, which is included on the **Premium** plan and higher.
{% endhint %}

{% hint style="info" %}
Connecting to a remote MCP server over HTTP requires a recent version of the Codex CLI (with streamable HTTP support). Update Codex if the steps below don't match your version.
{% endhint %}

## Step 1: Add Zigpoll to your Codex config

Open `~/.codex/config.toml` and add a server entry:

```toml
[mcp_servers.zigpoll]
url = "https://mcp.zigpoll.com/mcp"
```

## Step 2: Authenticate

Run the OAuth login from your terminal:

```bash
codex mcp login zigpoll
```

A browser window opens to authorize with Zigpoll. If you're already logged into Zigpoll in that browser, authorization completes automatically — you'll briefly see a loading screen, then be returned to Codex. If you're not logged in, sign in with your email and password, Google, or Shopify. Codex stores a secure token, so you only do this once.

{% hint style="info" %}
`mcp.zigpoll.com` authenticates through a browser-based OAuth flow tied to your Zigpoll account, so there's no API key to copy or paste. A static `bearer_token` / `Authorization` header will not work. Use `codex mcp login` as shown above.
{% endhint %}

## Step 3: Verify your connection

Start Codex and ask:

> "List my Zigpoll accounts"

Codex will use the Zigpoll tools automatically to fetch your data.

## Example prompts

* "Summarize the responses for my NPS survey from the last 30 days"
* "What are the daily response trends for my customer satisfaction survey?"
* "Correlate my NPS scores with purchase type"
* "Create a new NPS survey for my account"

For the full list of tools and more examples, see the [MCP overview](/integrations/mcp). For ideas on what to build, see [Ideas for Using Zigpoll MCP](/tutorials/zigpoll-mcp-use-cases).

## Troubleshooting

* **Server not connecting** — confirm your Codex version supports remote (streamable HTTP) MCP servers, and that the `url` in `config.toml` is exactly `https://mcp.zigpoll.com/mcp`.
* **Connected to the wrong Zigpoll account** — authorization uses whichever Zigpoll login is signed in to your browser. Log in as the correct user at [app.zigpoll.com](https://app.zigpoll.com), then re-run `codex mcp login zigpoll`.
* **Authentication errors** — the connection authenticates with an API key labeled "MCP" that Zigpoll creates automatically. If it was revoked under **Integrations → API Keys**, re-run `codex mcp login zigpoll` to issue a new one.
* **"This account's plan does not include API access"** — the Zigpoll account is on a plan without API access. Upgrade to **Premium** or higher.


# Connect to Manus

Connect Zigpoll to Manus as a custom MCP server so the agent can analyze your survey data and create surveys in natural language.

Connect your Zigpoll surveys to **Manus** as a custom MCP server using the [Model Context Protocol (MCP)](https://modelcontextprotocol.io/). Once connected, Manus can read your survey responses, run analytics, and create surveys — just ask in plain English.

For other AI clients, see the [MCP overview](/integrations/mcp).

{% hint style="warning" %}
**Plan requirement:** MCP uses the Zigpoll API, which is included on the **Premium** plan and higher.
{% endhint %}

{% hint style="info" %}
Manus connects to Zigpoll through its **Custom MCP Servers** feature. Menu labels evolve as Manus updates — "Integrations", "Connectors", and "Custom MCP Servers" refer to the same area.
{% endhint %}

{% hint style="info" %}
**How authorization works:** there's no API key to copy or paste. When Manus first uses a Zigpoll tool, it opens a browser window to authorize with Zigpoll. If you're already logged into Zigpoll in that browser, authorization completes automatically; if not, sign in with your email and password, Google, or Shopify. Manus then stores a secure token, so you only do this once.
{% endhint %}

## Step 1: Open Custom MCP Servers

1. In Manus, open **Settings → Integrations → Custom MCP Servers**.
2. Click **Add Server**.

## Step 2: Add the Zigpoll server

Enter the server details:

* **Server name:** `Zigpoll`
* **Server URL:** `https://mcp.zigpoll.com/mcp`
* **Authentication:** leave blank (or choose **OAuth** if offered)

Save. Manus verifies the connection and loads Zigpoll's available tools.

{% hint style="warning" %}
Don't enter an API key into the authentication or custom-header field. `mcp.zigpoll.com` uses a browser-based OAuth login tied to your Zigpoll account and does not accept a static API-key or `Authorization: Bearer` header. Your login is exchanged for a secure token in the next step.
{% endhint %}

## Step 3: Authorize with Zigpoll

The first time Manus uses a Zigpoll tool, it pauses and prompts you to log in. A browser window opens to authorize with Zigpoll. If you're already logged into Zigpoll, authorization completes automatically after a brief loading screen. Otherwise, sign in with your email and password, Google, or Shopify. Manus stays connected for future sessions.

## Step 4: Use it

Ask Manus to work with your survey data. Being explicit helps it pick the right tool, e.g.:

> "Use Zigpoll to list my accounts"

> "Use Zigpoll to summarize the responses from my NPS survey"

## Example prompts

* "List all my surveys and their response counts"
* "Where are my survey respondents located?"
* "Compare order values for each answer on my attribution question"
* "Create a new customer satisfaction survey"

For the full list of tools and more examples, see the [MCP overview](/integrations/mcp). For ideas on what to build, see [Ideas for Using Zigpoll MCP](/tutorials/zigpoll-mcp-use-cases).

## Troubleshooting

* **Server won't verify or no tools load** — confirm the URL is exactly `https://mcp.zigpoll.com/mcp` and that the authentication field is left blank so Manus uses the OAuth login flow.
* **No authorization window appears** — trigger a Zigpoll tool in a chat to start the login, or reconnect the server from **Settings → Integrations → Custom MCP Servers**.
* **Connected to the wrong Zigpoll account** — authorization uses whichever Zigpoll login is signed in to your browser. Log in as the correct user at [app.zigpoll.com](https://app.zigpoll.com), then reconnect the server.
* **Authentication errors** — the connection authenticates with an API key labeled "MCP" that Zigpoll creates automatically. If it was revoked under **Integrations → API Keys**, reconnect the server to issue a new one. A static API-key header is not supported; authentication must go through the browser login flow.
* **"This account's plan does not include API access"** — the Zigpoll account is on a plan without API access. Upgrade to **Premium** or higher.


# Connect to OpenClaw

Connect Zigpoll to OpenClaw with MCP so your personal AI agent can analyze survey responses and build surveys from WhatsApp, Telegram, Discord, and more.

Connect your Zigpoll surveys to [**OpenClaw**](https://openclaw.ai) — the open-source, multi-channel AI agent gateway — using the [Model Context Protocol (MCP)](https://modelcontextprotocol.io/). Once connected, you can ask your OpenClaw agent about survey results, run analytics, and even create surveys from any channel it lives in: WhatsApp, Telegram, Discord, and more. No coding required.

For other AI clients, see the [MCP overview](/integrations/mcp).

{% hint style="warning" %}
**Plan requirement:** MCP uses the Zigpoll API, which is included on the **Premium** plan and higher.
{% endhint %}

{% hint style="info" %}
**How authorization works:** there's no API key to copy or paste. When you connect, OpenClaw gives you an authorization link to open in your browser. If you're already logged into Zigpoll in that browser, authorization completes automatically; if not, sign in with your email and password, Google, or Shopify. OpenClaw then stores a secure token, so you only do this once.
{% endhint %}

## Add Zigpoll to OpenClaw

1. On the machine running your OpenClaw gateway, add the Zigpoll MCP server:

```bash
openclaw mcp add zigpoll \
  --url https://mcp.zigpoll.com/mcp \
  --transport streamable-http \
  --auth oauth \
  --oauth-scope mcp:read
```

`mcp:read` is the only scope Zigpoll's server offers. Despite its name, it doesn't limit which tools your agent can call. To restrict tools, see [Optional: limit which tools your agent can use](#optional-limit-which-tools-your-agent-can-use).

2. Start the login flow:

```bash
openclaw mcp login zigpoll
```

3. OpenClaw prints an authorization URL. Open it in your browser — sign into Zigpoll if prompted (authorization completes automatically if you're already logged in).
4. If your browser can't redirect back automatically (for example, when OpenClaw runs on a remote server), copy the authorization code shown after approving and finish the login from the terminal:

```bash
openclaw mcp login zigpoll --code <paste-code-here>
```

{% hint style="info" %}
**How authentication works:** `mcp.zigpoll.com` uses a standard browser-based OAuth login tied to your Zigpoll account. Setting a static `Authorization: Bearer <api-key>` header will not work — your login is exchanged for a secure token through the browser authorization flow.
{% endhint %}

## Verify your connection

Check the server from the terminal:

```bash
openclaw mcp list
openclaw mcp doctor zigpoll --probe
```

Then message your agent on any connected channel:

> "List my Zigpoll accounts"

or

> "Show me my recent surveys"

Your agent will use the Zigpoll tools automatically to fetch your data.

## Optional: limit which tools your agent can use

Zigpoll's tools include ones that create and delete surveys and send emails or SMS. If you want your agent to be read-only, add a tool filter so only data and analytics tools are available:

```bash
openclaw mcp set zigpoll '{
  "url": "https://mcp.zigpoll.com/mcp",
  "transport": "streamable-http",
  "auth": "oauth",
  "toolFilter": {
    "include": ["get_*", "list_*", "analyze_*", "compare_*", "correlate_*", "group_answers"]
  }
}'
```

Remove the `toolFilter` block (or re-run the `openclaw mcp add` command above) to restore full access.

## Example prompts

* "Summarize the responses for my NPS survey from the last 30 days"
* "What devices and browsers are my respondents using?"
* "How do NPS scores correlate with purchase type?"
* "Create a new post-purchase survey for my account"

For the full list of tools and more examples, see the [MCP overview](/integrations/mcp). For ideas on what to build, see [Ideas for Using Zigpoll MCP](/tutorials/zigpoll-mcp-use-cases).

## Troubleshooting

* **Running OpenClaw on a headless server** — the OAuth login needs a browser somewhere. Open the authorization URL on your laptop, approve, then pass the code back with `openclaw mcp login zigpoll --code <code>`. Until login completes, OpenClaw simply leaves Zigpoll out of the agent's tools rather than erroring.
* **Tools not appearing** — run `openclaw mcp status --verbose` to confirm the server is authorized and connected, and check that a `toolFilter` isn't excluding the tools you expect.
* **Connected to the wrong Zigpoll account** — authorization uses whichever Zigpoll login is signed in to your browser. Log in as the correct user at [app.zigpoll.com](https://app.zigpoll.com), then re-run `openclaw mcp login zigpoll`.
* **Authentication errors** — the connection authenticates with an API key labeled "MCP" that Zigpoll creates automatically. If it was revoked under **Integrations → API Keys**, re-run `openclaw mcp login zigpoll` to issue a new one.
* **"This account's plan does not include API access"** — the Zigpoll account is on a plan without API access. Upgrade to **Premium** or higher.


# Connect to Perplexity

Connect Zigpoll to Perplexity as a custom connector so it can analyze your survey data and create surveys in natural language.

Connect your Zigpoll surveys to **Perplexity** as a custom connector using the [Model Context Protocol (MCP)](https://modelcontextprotocol.io/). Once connected, Perplexity can read your survey responses, run analytics, and create surveys — just ask in plain English.

For other AI clients, see the [MCP overview](/integrations/mcp).

{% hint style="warning" %}
**Plan requirement:** MCP uses the Zigpoll API, which is included on the **Premium** plan and higher.
{% endhint %}

{% hint style="info" %}
Custom connectors require a paid Perplexity plan (**Pro**, **Max**, or **Enterprise**) and are available in Perplexity on the web and in the desktop apps. The Comet browser currently only supports Perplexity's built-in connector catalog, not custom connectors.
{% endhint %}

{% hint style="info" %}
**How authorization works:** there's no API key to copy or paste. When you connect, Perplexity opens a browser window to authorize with Zigpoll. If you're already logged into Zigpoll in that browser, authorization completes automatically; if not, sign in with your email and password, Google, or Shopify. Perplexity then stores a secure token, so you only do this once.
{% endhint %}

## Step 1: Open Connectors

1. In Perplexity, open your account menu and go to **Settings** (may appear as **All settings**).
2. Select **Connectors**.
3. Click **+ Custom connector**.

## Step 2: Add the Zigpoll connector

1. Choose **Remote** as the connector type.
2. Enter the details:
   * **Name:** `Zigpoll`
   * **MCP Server URL:** `https://mcp.zigpoll.com/mcp`
   * **Authentication:** **OAuth 2.0**
3. Acknowledge the third-party connector notice and click **Add**.

{% hint style="warning" %}
Don't choose **API Key** authentication or enter a key into a header field. `mcp.zigpoll.com` uses a browser-based OAuth login tied to your Zigpoll account and does not accept a static API-key or `Authorization: Bearer` header. Your login is exchanged for a secure token in the next step.
{% endhint %}

## Step 3: Authorize with Zigpoll

When you add the connector (or first use a Zigpoll tool), a browser window opens to authorize with Zigpoll. If you're already logged into Zigpoll, authorization completes automatically after a brief loading screen. Otherwise, sign in with your email and password, Google, or Shopify. Perplexity stays connected for future sessions.

## Step 4: Use it

Ask Perplexity to work with your survey data. Being explicit helps it pick the right tool, e.g.:

> "Use Zigpoll to list my accounts"

> "Use Zigpoll to summarize the responses from my NPS survey"

## Example prompts

* "List all my surveys and their response counts"
* "Where are my survey respondents located?"
* "Compare order values for each answer on my attribution question"
* "Create a new customer satisfaction survey"

For the full list of tools and more examples, see the [MCP overview](/integrations/mcp). For ideas on what to build, see [Ideas for Using Zigpoll MCP](/tutorials/zigpoll-mcp-use-cases).

## Troubleshooting

* **No "+ Custom connector" option** — custom connectors require a Pro, Max, or Enterprise plan. On Enterprise, an admin may need to enable **Allow members to add custom connectors** in the organization's Connectors settings.
* **Connector won't verify or no tools load** — confirm the URL is exactly `https://mcp.zigpoll.com/mcp` and that authentication is set to **OAuth 2.0**.
* **No authorization window appears** — trigger a Zigpoll tool in a thread to start the login, or remove and re-add the connector from **Settings → Connectors**.
* **Connected to the wrong Zigpoll account** — authorization uses whichever Zigpoll login is signed in to your browser. Log in as the correct user at [app.zigpoll.com](https://app.zigpoll.com), then remove and re-add the connector.
* **Authentication errors** — the connection authenticates with an API key labeled "MCP" that Zigpoll creates automatically. If it was revoked under **Integrations → API Keys**, remove and re-add the connector to issue a new one. A static API-key header is not supported; authentication must go through the browser login flow.
* **"This account's plan does not include API access"** — the Zigpoll account is on a plan without API access. Upgrade to **Premium** or higher.


# Shopify Sidekick

Ask Shopify Sidekick about your Zigpoll surveys, results, NPS, and customer insights

Ask Shopify Sidekick about your Zigpoll surveys right from your Shopify admin. Get response summaries, NPS scores, AI insights, and more — in plain English, without leaving Shopify.

## What is Sidekick?

Sidekick is Shopify's built-in AI assistant. With Zigpoll installed, Sidekick can read your survey data and answer questions about it directly in the Shopify admin — so you can check results without opening the Zigpoll dashboard.

## What You Can Do

Ask Sidekick to:

* Find and list your surveys and their response counts
* Summarize the responses to any survey
* Calculate NPS and satisfaction scores (promoters, passives, detractors)
* Surface AI-generated insights and themes from customer feedback
* Show response trends over time
* Break down where your respondents are located and what devices they use
* See which products customers bought based on how they answered
* Compare response and completion rates across surveys
* Get a marketing attribution report: which channels bring the most customers and revenue
* See who responded and how, with each respondent linked to their Shopify customer and order
* Look up everything a specific customer has said across your surveys

## Requirements

There's nothing to set up. As long as:

* The **Zigpoll Customer Surveys** app is installed on your store, and
* You have at least one survey with responses

Sidekick can answer questions about your survey data automatically. Your data is always scoped to your own store — Sidekick only ever sees your surveys.

{% hint style="info" %}
Sidekick reads your Zigpoll data securely using your Shopify session — you never need to enter an API key or connect anything.
{% endhint %}

## How to Use It

1. Open your **Shopify admin**.
2. Open **Sidekick** (the assistant in the top bar).
3. Ask a question about your surveys — for example, *"What Zigpoll surveys do I have?"*

Sidekick will pull the answer from Zigpoll and show it inline.

## Example Prompts

### Survey Overview

* "What Zigpoll surveys do I have?"
* "Which of my surveys has the most responses?"

### Results & Scores

* "Summarize the responses to my post-purchase survey"
* "What's the NPS on my customer satisfaction survey?"
* "Show me the answer breakdown for my attribution survey"

### Insights

* "What are customers telling us in my feedback survey?"
* "Give me the key insights from my NPS survey"

### Trends

* "How many survey responses did I get last month?"
* "Show me weekly response trends for my post-purchase survey"

### Audience

* "Where are my survey respondents located?"
* "What devices are people using to take my surveys?"

### Shopify

* "What products did customers who answered 'too expensive' buy?"

### Customers and Orders

* "Who responded to my post-purchase survey this week, and what did they say?"
* "Which customers said they found us on TikTok?"
* "How many respondents mentioned shipping in their feedback?"
* "Which of these respondents are real customer accounts?"
* "What has <jane@example.com> told us in our surveys?"
* "Show me the survey answers attached to order #1042"

### Attribution

* "Which marketing channel brought in the most revenue last quarter?"
* "How did my customers hear about us this month compared to last month?"

### Comparisons

* "Compare the response rates across all my surveys"
* "Do customers who chose TikTok also tend to give a high NPS?"

## What Sidekick Can Answer

You don't need to memorize anything — just ask in plain English. Behind the scenes, Sidekick uses these Zigpoll capabilities:

| Capability           | What it does                                                                                                                                                                                                      |
| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Search surveys       | Find and list your surveys with status and response counts                                                                                                                                                        |
| Response summary     | Per-question answer breakdown, including NPS and order revenue per answer                                                                                                                                         |
| NPS                  | Net Promoter Score and promoter/passive/detractor split for rating questions                                                                                                                                      |
| Insights             | AI-generated themes and takeaways from customer feedback                                                                                                                                                          |
| Response trends      | Response volume over time (day, week, or month)                                                                                                                                                                   |
| Correlate questions  | Cross-tabulate two questions — how answers to one break down by answers to the other                                                                                                                              |
| Locations            | Top countries, regions, and cities of respondents                                                                                                                                                                 |
| Devices              | Device, browser, and OS breakdown of respondents                                                                                                                                                                  |
| Purchased products   | Which products respondents bought, optionally broken down by answer                                                                                                                                               |
| Compare surveys      | Response and completion rates across surveys                                                                                                                                                                      |
| Attribution          | Responses, share, attributed revenue and average order value per channel from your "how did you hear about us" question, with the change versus the previous period                                               |
| Individual responses | One row per respondent with their answers, linked to their Shopify customer and order, order total, and lifetime orders and spend. Filter by a question and answer, by customer accounts only, or ask for a count |
| Customer lookup      | Everything one customer has said across your surveys, found by customer, email, or order                                                                                                                          |

{% hint style="info" %}
Respondent names, emails and customer or order links only appear when you ask about specific people or orders. Surveys set to anonymous mode never return them.
{% endhint %}

## Read-only for now

Sidekick can **read and analyze** your survey data, but it can't create or edit surveys yet. To build or change a survey, open the Zigpoll dashboard from your Shopify admin.

## Troubleshooting

**Sidekick says it can't access your Zigpoll data** — Make sure the Zigpoll Customer Surveys app is installed on the store you're in, and that you have at least one survey. Then start a new Sidekick chat and try again.

**Sidekick doesn't show survey results** — Newly installed apps can take a few minutes to become available in Sidekick. Wait a moment, start a fresh chat, and retry.

That's it.


# Webhooks

Receive survey responses at your own endpoint, signed and retried

### 🔑 How to Create A Zigpoll Webhook

* Log in to your Zigpoll dashboard.
* Go to Integrations → Scroll down to Webhooks.
* Create a new webhook by filling in the form.

Endpoints must be a public `https://` URL. You can add up to **20 webhooks per survey**.

Webhooks can also be managed programmatically via the [API](/web-api) (`GET`/`POST`/`DELETE /webhooks`). API access requires a **Premium** plan or higher, and the webhook endpoints require an **Owner, Admin, or Billing Admin** API key — keys belonging to Editor or Read only team members are rejected. Note that the signing secret is returned **only once**, in the response to the create call.

### 📬 When we send

Each webhook subscribes to one survey, and you choose when it fires:

| Delivery rule                                      | Fires                                                                                               |
| -------------------------------------------------- | --------------------------------------------------------------------------------------------------- |
| Send if the survey is partially or fully completed | On every submission, even if the respondent stops partway. Payload `type` is `submitted-responses`. |
| Send only if the survey is fully completed         | Only once the respondent reaches the end of the survey. Payload `type` is `completed-survey`.       |

Responses are briefly batched before we send, so a respondent who answers several questions in a row produces one delivery containing all of their answers rather than one per question.

### 📦 Payload

We POST valid JSON to your endpoint:

```javascript
{
  type: 'submitted-responses',   // or 'completed-survey'
  accountId: '',
  pollId: '',
  participantId: '',
  metadata: {},
  responses: {},
  submissionsComplete: false,    // did the respondent finish the survey?
  timestamp: 1754400000000,
  email: 'jane@example.com',     // first email found for this respondent, or null
  emails: ['jane@example.com']   // every email found, or []
}
```

`email` and `emails` are gathered from the respondent's answers, their participant metadata and the response metadata. Surveys in [anonymous mode](/polls/display-rules#anonymous-mode) always send `email: null` and `emails: []`.

### 🧾 Headers

| Header                   | Description                                                                                                                                                                |
| ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Content-Type`           | Always `application/json`.                                                                                                                                                 |
| `X-Zigpoll-Signature`    | HMAC signature of the request body — see below.                                                                                                                            |
| `X-Zigpoll-Delivery-Id`  | Unique id for this event. **Stays the same across retries** — use it to ignore duplicates.                                                                                 |
| `X-Zigpoll-Attempt`      | Which attempt this is, starting at `1`.                                                                                                                                    |
| `X-Zigpoll-Triggered-At` | When this attempt was sent.                                                                                                                                                |
| `X-Zigpoll-Secret`       | *(Legacy)* Your webhook's Secret Key, shown next to the endpoint in the dashboard. Kept for consumers built before signing existed — verify `X-Zigpoll-Signature` instead. |

### 🔐 Verifying the signature

Every delivery is signed with your account's **Signing Secret** (Integrations → Webhooks). Verifying it proves the request came from Zigpoll and hasn't been altered.

The header looks like `t=1754400000000,v1=5257a8...`, where `t` is the send time in milliseconds and `v1` is `HMAC-SHA256` of `"{t}.{raw request body}"`.

Verify against the **raw request body** — parsing and re-serializing the JSON can reorder keys and break the comparison.

```javascript
const crypto = require('crypto');

function verifyZigpollSignature(rawBody, header, signingSecret) {
  const parts = Object.fromEntries(
    String(header || '').split(',').map((kv) => kv.split('='))
  );
  if (!parts.t || !parts.v1) return false;

  // Reject anything older than 5 minutes to prevent replays.
  if (Math.abs(Date.now() - Number(parts.t)) > 5 * 60 * 1000) return false;

  const expected = crypto
    .createHmac('sha256', signingSecret)
    .update(`${parts.t}.${rawBody}`)
    .digest('hex');

  const a = Buffer.from(expected, 'hex');
  const b = Buffer.from(parts.v1, 'hex');
  return a.length === b.length && crypto.timingSafeEqual(a, b);
}
```

### 🔁 Retries

Respond with a `2xx` status within **10 seconds**. If your endpoint times out, refuses the connection, or returns a `5xx`, `429`, or `408`, we retry up to five more times:

**1 minute → 5 minutes → 30 minutes → 2 hours → 6 hours**

Any other `4xx` response is treated as a permanent rejection and is not retried. Deleting a webhook cancels its pending retries.

If your endpoint's hostname doesn't resolve at all (a DNS failure rather than a refused connection), we stop after **three** attempts spread over the first few minutes instead of running the full ladder.

Delivery is at-least-once: if your endpoint processes a request but answers too slowly, you may receive it again. Deduplicate on `X-Zigpoll-Delivery-Id`, which is identical across every attempt of the same event.

Once the last retry fails, we stop. **That response is not sent again** — the answers stay in your Zigpoll dashboard and remain available through exports and the API, but they will not arrive at your endpoint.

### 🚨 If your endpoint stops working

We'll email you when a webhook has stopped delivering entirely, so a broken endpoint doesn't go unnoticed while responses pile up.

**When it's sent.** An endpoint qualifies once it has gone a full day with no successful delivery *and* at least one delivery given up on — whether that was after the full retry ladder or immediately, as with a permanent `4xx`. The day-long wait means a brief outage that recovers on its own never triggers an email.

**How often.** Once when the problem is confirmed, then a reminder each week, up to three emails in total. A single successful delivery resets this — if the endpoint breaks again later, you'll be alerted again.

**Who receives it.** Everyone in **Notification Recipients** on your account's [Notifications](/notifications) settings, or the account owner if you haven't set that list.

Each email identifies the specific webhook, so you can act on it without opening the dashboard:

| Field           | What it tells you                                                                                            |
| --------------- | ------------------------------------------------------------------------------------------------------------ |
| Endpoint        | The full URL, exactly as configured.                                                                         |
| Survey          | Which survey feeds this webhook — plus the question, for webhooks fired from question logic.                 |
| Trigger         | The delivery rule or logic condition that fires it.                                                          |
| Configured in   | Your Webhooks settings, or the survey's **Settings → Workflows → Actions** tab for logic-triggered webhooks. |
| What went wrong | The status code or connection error from the last attempt.                                                   |
| Responses lost  | How many deliveries were given up on in the past week.                                                       |

**To stop the emails**, fix the endpoint or remove the webhook. Removing it also cancels any retries still queued.

Some common causes:

* **`404`** — the route no longer exists, or you're using a testing URL. n8n's `/webhook-test/` URLs only accept data while the workflow editor is open; activate the workflow and switch to its `/webhook/` production URL.
* **`401` or `403`** — your endpoint is rejecting our request. Zigpoll authenticates with the `X-Zigpoll-Signature` header, not a bearer token or API key.
* **`410`** — a hosted hook (Make, Zapier, and similar) has been deleted or expired. Create a new one and update the endpoint.
* **Timeouts** — your endpoint took longer than 10 seconds. Acknowledge the request with a `2xx` first, then do the slow work in the background.

### ⚡ Webhooks from survey logic

You can also trigger a webhook conditionally with the **Trigger webhook** action in question logic or survey action logic — for example, only when someone selects a particular answer or completes the survey.

These deliveries use the same payload, signature, retry behavior, and delivery id as the webhooks above. They do not include the `X-Zigpoll-Secret` header, because the URL is configured on the rule rather than as a saved endpoint — verify `X-Zigpoll-Signature` instead.


# Google Tag Manager

### To install Zigpoll via Google Tag Manager, follow the steps below:

1. **Log into Google Tag Manager** and select your container.
2. In the left-hand menu, click **"Tags"** > **"New"**.
3. Click **"Tag Configuration"** > choose **"Custom HTML"**.
4. Paste the Zigpoll embed script into the HTML field:

   ```html
   <script type='application/javascript'>
     ;(function () {
       window.Zigpoll = {
         accountId: '$YOUR_ACCOUNT_ID'
       };

       var script = document.createElement("script");
       script.type = "text/javascript";
       script.charset = "utf-8";
       script.src = "//cdn.zigpoll.com/static/js/main.js";
       script.async = true;

       document.head.appendChild(script);
     }());
   </script>
   ```
5. Under **Triggering**, choose **"All Pages"** (or a specific page trigger if you only want Zigpoll to run on certain pages).
6. Click **"Save"** and name your tag (e.g., `"Zigpoll Embed"`).
7. Click **"Submit"** in GTM to publish your changes.


# Wix

If you're looking to collect feedback, run surveys, or engage visitors directly on your Wix site, **Zigpoll** makes it easy. This guide walks you through installing the Zigpoll embed script using Wix’s built-in **Custom Code** feature—no coding required.

#### 🔧 Step 1: Copy Your Zigpoll Embed Script

First, head to your Zigpoll dashboard and:

1. Click Settings
2. Click **“Installation”**
3. Copy the JavaScript embed code Zigpoll provides (it will look something like this):

```html
<script type='application/javascript'>
  ;(function () {
    window.Zigpoll = {
      accountId: 'YOUR_ACCOUNT_ID'
    };

    var script = document.createElement("script");
    script.type = "text/javascript";
    script.charset = "utf-8";
    script.src = "//cdn.zigpoll.com/static/js/main.js";
    script.async = true;

    document.head.appendChild(script);
  }());
</script>
```

> Replace `YOUR_ACCOUNT_ID` with your actual account ID

***

#### 🌐 Step 2: Log In to Your Wix Dashboard

1. Go to your Wix site’s **Dashboard**.
2. In the left-hand menu, click on **Settings**.

***

#### 💻 Step 3: Add the Zigpoll Script to Your Site

1. Scroll down and find the **Custom Code** section under the **Advanced** tab.
2. Click **+ Add Custom Code**.
3. Paste your Zigpoll embed script into the field.
4. Under **Place Code in**, choose **Body - end** for most cases (Zigpoll loads asynchronously, so this is safe).
5. Choose whether you want the survey to appear on:
   * **All pages** (e.g. site-wide feedback)
   * Or a **specific page** (e.g. post-purchase survey)
6. Give it a name like "Zigpoll Script" and click **Apply**.

***

#### ✅ You’re Done!

Your Zigpoll survey will now appear on the selected pages of your Wix site. No need to modify page content or deal with complex integrations.

***

#### 💡 Pro Tip

Want to trigger the survey based on user behavior (like scroll, time on page, or exit intent)? You can configure these settings in the Zigpoll dashboard under **“Behavior”** without needing to update the code again.


# Squarespace

Want to gather feedback, run polls, or trigger a survey on your Squarespace site? **Zigpoll** makes it easy to embed beautiful, behavior-driven surveys without disrupting your design. In this quick guide, we’ll walk through how to install the Zigpoll script on your site using Squarespace’s built-in **Code Injection** settings.

***

#### 🔧 Step 1: Copy Your Zigpoll Embed Script

1. Go to your Zigpoll dashboard.
2. Click **“Installation”**
3. Copy the full JavaScript snippet. It looks like this:

```html
<script type='application/javascript'>
  ;(function () {
    window.Zigpoll = {
      accountId: 'YOUR_ACCOUNT_ID'
    };

    var script = document.createElement("script");
    script.type = "text/javascript";
    script.charset = "utf-8";
    script.src = "//cdn.zigpoll.com/static/js/main.js";
    script.async = true;

    document.head.appendChild(script);
  }());
</script>
```

> Be sure the `YOUR_ACCOUNT_ID` is set to your actual account ID.

***

#### 🌐 Step 2: Open Your Squarespace Settings

1. Log in to your Squarespace account.
2. Select the site you want to edit.
3. In the left sidebar, go to **Settings** → **Advanced** → **Code Injection**.

***

#### 💻 Step 3: Paste the Zigpoll Script

1. Under the **Footer** field (not Header), paste your Zigpoll embed script.
2. Click **Save** at the top-left corner.

> 📌 *Zigpoll loads asynchronously and doesn’t block your page, so placing it in the footer is safe and efficient.*

***

#### ✅ That’s It!

Zigpoll is now live on your Squarespace site. You’ll see your survey appear based on the display rules you’ve set—like time on page, scroll depth, or exit intent.

***

#### 💡 Optional: Page-Specific Installation

If you only want the Zigpoll survey to show on certain pages:

* Don’t use **Code Injection**.
* Instead, open a **Page**, click **Edit**, then:
  1. Add a **Code Block**.
  2. Paste the Zigpoll script inside.
  3. Click **Apply** and then **Save**.

This way, Zigpoll will only load on that page.


# Framer

Looking to collect feedback or run targeted surveys on your Framer site? With **Zigpoll**, you can embed fully customizable surveys in just a few clicks. In this guide, we’ll show you how to install the Zigpoll script using Framer’s **HTML Embed** block—no custom hosting or backend code required.

***

#### 🔧 Step 1: Copy Your Zigpoll Embed Script

1. Go to your Zigpoll dashboard.
2. Click **“Installation”**
3. Copy the JavaScript snippet:

```html
<script type='application/javascript'>
  ;(function () {
    window.Zigpoll = {
      accountId: 'YOUR_ACCOUNT_ID'
    };

    var script = document.createElement("script");
    script.type = "text/javascript";
    script.charset = "utf-8";
    script.src = "//cdn.zigpoll.com/static/js/main.js";
    script.async = true;

    document.head.appendChild(script);
  }());
</script>
```

> Replace `YOUR_ACCOUNT_ID` with your actual account ID

***

#### 🌐 Step 2: Open Your Framer Project

1. Go to Framer and open your project.
2. Navigate to the page where you want to embed the survey.

***

#### 💻 Step 3: Add an Embed Block

1. From the **Insert Menu (press `I`)**, search for **“Embed”**.
2. Drag the **Embed** block into your page.
3. Click the block to open the **Code Editor**.
4. Paste your Zigpoll embed script into the editor.
5. Click **Save**.

> 📌 *The embed block runs client-side scripts, so your Zigpoll widget will appear where the block is placed.*

***

#### ✅ That’s It!

Your Zigpoll survey is now live on your Framer site! It will trigger based on your chosen display behavior—like exit intent, delay, or scroll depth—set in the Zigpoll dashboard.

***

#### 💡 Optional Tips

* To trigger surveys **site-wide**, you can add the script on a **shared header/footer component** or duplicate the Embed block across pages.
* Want it invisible and triggered by behavior (not inline)? Add the embed script to a hidden frame and let Zigpoll’s settings handle visibility.


# Funnelish

Running sales funnels on **Funnelish**? Adding **Zigpoll** lets you collect feedback at every step of the funnel—from opt-in and sales pages to the order form and the post-purchase thank-you page. Ask shoppers how they found you, why they did (or didn't) buy, and how the checkout experience felt, all without touching your funnel's design.

Funnelish lets you add custom code either **funnel-wide** (across every step) or to a **single page**, so you can choose exactly where Zigpoll runs.

***

#### 🔧 Step 1: Get Your Zigpoll Embed Script

1. Go to your Zigpoll dashboard.
2. Select your survey and click **“Installation”**.
3. Copy the JavaScript embed code. It looks like this:

```html
<script type='application/javascript'>
  ;(function () {
    window.Zigpoll = {
      accountId: 'YOUR_ACCOUNT_ID'
    };

    var script = document.createElement("script");
    script.type = "text/javascript";
    script.charset = "utf-8";
    script.src = "//cdn.zigpoll.com/static/js/main.js";
    script.async = true;

    document.head.appendChild(script);
  }());
</script>
```

> Replace `YOUR_ACCOUNT_ID` with your actual account ID.

***

#### 🌐 Step 2: Choose Where Zigpoll Should Run

Funnelish gives you two ways to add the script. Pick the one that matches where you want your survey to appear:

* **Funnel-wide** — Zigpoll loads on **every step** of the funnel. Best for site-wide feedback, exit-intent surveys, or attribution questions you want available throughout.
* **Single page** — Zigpoll loads on **one specific step**. Best for a post-purchase survey on your thank-you page, or an exit-intent survey on a single sales page.

***

#### ✅ Option 1: Add Zigpoll Funnel-Wide

**Use this if you want your survey available across the entire funnel.**

1. Open your funnel in Funnelish and go to **Settings**.
2. Open the **Custom Codes** (Tracking Codes) section.
3. Click **Create a New Code**.
4. Give it a name like `Zigpoll`.
5. Paste your Zigpoll embed script into the code field.
6. Under **Code placement**, select **Append to page head**.
7. Turn the **Lazy Load** toggle **off** so the survey is ready as soon as the page loads and your display rules fire correctly.
8. Save the code, then click **Save Changes** in the funnel settings.

> 📌 The script is now injected into every step of your funnel.

***

#### ✅ Option 2: Add Zigpoll to a Single Page

**Use this if you only want the survey on one step—like the thank-you page.**

1. Open the step you want in the Funnelish **page editor**.
2. Click the **three-dots (More actions)** menu at the top of the editor.
3. Choose **Custom Code**.
4. Select the **Head HTML** tab and paste your Zigpoll embed script.
5. Save the page, then publish your funnel.

> 🛠 This loads Zigpoll only on that single step, giving you precise control over where the survey appears.

***

#### ✅ You're Done!

Zigpoll will now load on your Funnelish funnel—either across every step or just where you added it. You can control **when** and **how** the survey appears (time delay, scroll depth, exit intent, targeting, and more) directly from the **Zigpoll dashboard**, without editing your funnel again.

***

#### 🛒 Recommended: A Post-Purchase Survey on Your Thank-You Page

The thank-you / order confirmation step is the perfect place to learn from customers right after they buy:

* **Attribution** — “How did you hear about us?” to understand which channels drive sales. See the [Attribution Surveys](/tutorials/attribution-surveys) tutorial.
* **Checkout friction** — “How easy was it to complete your order?” to spot drop-off causes.
* **Upsell insight** — ask why shoppers did or didn't take the one-click offer.

Add the embed code to your thank-you step using **Option 2** above, then build the survey in Zigpoll.

***

#### 🙋 Optional: Pass Customer & Order Data

If you want to attach the buyer's details to their response—handy for post-purchase surveys—add a second script **below** the embed code with whatever data your page exposes:

```html
<script type="text/javascript">
  window.Zigpoll.user = {
    handle: "Jane Doe",
    id: "CUSTOMER_ID",
    metadata: {
      email: "jane@example.com",
      order_id: "ORDER_ID"
    }
  };
</script>
```

This lets you segment and filter responses by customer in your Zigpoll analytics. See [Participant Metadata](/embed/participant-metadata) for the full list of fields.

***

#### 💡 Pro Tips

* Use Zigpoll's **Preview Mode** to test display settings (delay, scroll, exit intent) before going live.
* Keep **Lazy Load** off on the Funnelish code so Zigpoll's own display rules control timing.
* Target surveys to specific audiences—returning visitors, mobile users, or particular regions—right from the Zigpoll dashboard.
* Need help? [Contact us](mailto:support@zigpoll.com)—paid plans include end-to-end installation support.


# Canva

Using **Canva** to build a beautiful website? You can still run fully customized surveys with **Zigpoll** by embedding your poll using Canva’s **Embed** app. Whether you're gathering feedback, capturing leads, or offering discounts—this quick guide shows you how to get your Zigpoll survey live on your Canva site in under 5 minutes.

***

#### 🔧 Step 1: Get Your Zigpoll Embed Code

1. Log in to your Zigpoll dashboard.
2. Click **“Installation”**
3. Choose the **iframe** embed option (Canva does not support raw JavaScript).
4. Copy the code snippet. It will look like:

```html
<script type='application/javascript'>
  ;(function () {
    window.Zigpoll = {
      accountId: 'YOUR_ACCOUNT_ID'
    };

    var script = document.createElement("script");
    script.type = "text/javascript";
    script.charset = "utf-8";
    script.src = "//cdn.zigpoll.com/static/js/main.js";
    script.async = true;

    document.head.appendChild(script);
  }());
</script>
```

> Make sure to replace `YOUR_ACCOUNT_ID` with your account ID

***

#### 🌐 Step 2: Open Your Canva Website Project

1. Go to Canva and open your website design.
2. In the left toolbar, click **“Apps”**.
3. Search for **“Embed”** and select it.

***

#### 💻 Step 3: Paste the Zigpoll Embed Code

1. In the Embed window, choose the **“Embed via code”** option.
2. Paste your Zigpoll `<iframe>` code.
3. Click **Embed**.
4. Resize and position the embedded frame where you'd like the survey to appear on your page.

> 🛑 **Note:** Canva only supports secure `https://` iframe embeds, which Zigpoll provides by default.

***

#### ✅ Done!

Your Zigpoll survey is now live and embedded in your Canva website. It will display directly in the page and record responses automatically to your dashboard.


# Wordpress

Want to run beautiful, customizable surveys on your WordPress site? With **Zigpoll**, you can capture customer feedback, offer discounts, or trigger polls based on behavior—no coding required. This guide covers two easy ways to integrate Zigpoll: using the **official WordPress plugin** or by pasting the embed script manually.

***

#### ✅ Option 1: Use the Official Zigpoll WordPress Plugin (Recommended)

For the easiest setup, install the **Zigpoll WordPress plugin** directly from your admin dashboard.

**🔗 Plugin Link:**

👉 Zigpoll WordPress Plugin on WordPress.org

**🔧 How to Install:**

1. In your WordPress Admin Dashboard, go to **Plugins → Add New**.
2. Search for **"Zigpoll"**.
3. Click **Install Now**, then **Activate**.
4. Once activated, go to **Settings → Zigpoll** in the sidebar.
5. Paste your **Zigpoll Account ID** (get it by going to Zigpoll **→** Settings).

> 📝 *The plugin handles everything: loading the embed script, assigning survey IDs, and injecting it on the pages you choose.*

***

#### 🛠 Option 2: Manually Add the Zigpoll Embed Script

If you prefer not to use a plugin, you can manually insert the Zigpoll embed script:

**Step 1: Copy Your Zigpoll Embed Code**

1. Open your Zigpoll dashboard.
2. Choose a survey and click **“Install”**.
3. Copy the provided JavaScript snippet:

```html
<script type='application/javascript'>
  ;(function () {
    window.Zigpoll = {
      accountId: 'YOUR_ACCOUNT_ID'
    };

    var script = document.createElement("script");
    script.type = "text/javascript";
    script.charset = "utf-8";
    script.src = "//cdn.zigpoll.com/static/js/main.js";
    script.async = true;

    document.head.appendChild(script);
  }());
</script>
```

**Step 2: Paste It into Your Site**

**Option A: Add to All Pages**

1. In your WordPress Admin Dashboard, go to **Appearance → Theme File Editor**.
2. Select the `footer.php` file.
3. Paste your Zigpoll script **just before the closing `</body>` tag**.
4. Click **Update File**.

**Option B: Add to a Specific Page**

1. Edit the page where you want the survey.
2. Switch to the **Code Editor** (or use a **Custom HTML block** if you're using Gutenberg).
3. Paste the Zigpoll script.
4. Save or update the page.

> ⚠️ *Only use the manual method if you’re comfortable editing theme files or working with HTML.*

***

#### ✅ You’re Done!

Zigpoll will now appear on your WordPress site—fully styled and behavior-driven. You can customize trigger settings (like exit intent or delay) directly from your Zigpoll dashboard without editing the code again.


# Linktree

📢 How to Create a Public Zigpoll Survey and Share It on Linktree

Looking for a quick way to gather feedback, run a poll, or collect emails from your Linktree visitors? With **Zigpoll**, you can create a public survey in minutes—then add it as a link on your Linktree profile to start collecting responses instantly.

Whether you're a content creator, business owner, or artist, this is a simple and powerful way to connect with your audience. Here’s how to do it:

***

#### 🔧 Step 1: Create a Public Zigpoll Survey

1. **Log in to your Zigpoll dashboard**.
2. Click **New Survey**.
3. Pick a template or build your questions from scratch, then select "Link only" in the next step.
4. Customize the design (colors, fonts, etc).
5. Make the survey visible.
6. Copy the public link.

It will look something like this:

```
https://survey.zigpoll.com/2vLaXDvDpaVJjmngT
```

You’ll use it in Linktree next.

{% hint style="info" %}
Pro tip: to use your own domain for the link, set up a custom survey domain.
{% endhint %}

{% content-ref url="/pages/Y4KWlFoXIXAwYXbQXf4z" %}
[Custom Survey Domains](/custom-survey-domains)
{% endcontent-ref %}

***

#### 🔗 Step 2: Add the Survey Link to Linktree

1. Log in to your Linktree Admin.
2. Click **“Add Link”**.
3. Paste your Zigpoll public survey URL into the **URL field**.
4. Give the link a title (e.g. “👋 Take Our Quick Survey!”).
5. Optionally, choose an icon or highlight it with a thumbnail.

That's it! Your survey is now live on your Linktree profile and ready to collect responses.

***

#### ✅ Why This Works

* **Frictionless**: No embed codes or plugins needed—just a link.
* **Mobile-friendly**: Zigpoll surveys look great on any screen size.
* **Trackable**: You can monitor completions and analytics in real-time.

This setup is perfect for:

* Gathering follower feedback
* Running product or content polls
* Collecting leads or email addresses
* Measuring interest in new ideas


# Webflow

#### 🔧 Step 1: Get Your Zigpoll Embed Script

1. Go to your Zigpoll dashboard.
2. Select your survey and click **“Installation”**
3. Copy the JavaScript embed code. It will look like:

```html
<script type='application/javascript'>
  ;(function () {
    window.Zigpoll = {
      accountId: 'YOUR_ACCOUNT_ID'
    };

    var script = document.createElement("script");
    script.type = "text/javascript";
    script.charset = "utf-8";
    script.src = "//cdn.zigpoll.com/static/js/main.js";
    script.async = true;

    document.head.appendChild(script);
  }());
</script>
```

> Replace `YOUR_ACCOUNT_ID` with your actual account ID

***

#### 🌐 Step 2: Log In to Webflow

1. Go to Webflow\.com and open your project.
2. You have two main options to add the Zigpoll script depending on where you want it to run:

***

#### ✅ Option 1: Add Zigpoll Site-Wide

**Use this if you want your survey to appear across your entire site.**

1. In Webflow, go to **Project Settings** → **Custom Code**.
2. Scroll to the **Footer Code** section.
3. Paste your Zigpoll script into the field.
4. Click **Save Changes**.
5. Publish your site.

> 📌 This injects Zigpoll into every page and works well for time-based or exit-intent polls.

***

#### ✅ Option 2: Add Zigpoll to a Specific Page

**Use this if you only want the survey on one page.**

1. Open your project in the **Webflow Designer**.
2. Go to the specific page you want the survey on.
3. Drag an **Embed** element onto the canvas.
4. Paste the Zigpoll `<script>` tag inside.
5. Save and publish.

> 🛠 This gives you more control over where the survey appears.

***

#### ✅ You're Done!

Zigpoll will now load on your Webflow site—either across all pages or just where you've embedded it. You can customize **when** and **how** it appears (e.g., scroll, time delay, exit intent) directly from the **Zigpoll dashboard**, without needing to update your code.

***

#### 💡 Pro Tips

* Use Zigpoll’s **preview mode** to test display settings.
* Trigger surveys only for returning visitors, mobile users, or specific regions.
* Combine Webflow forms with Zigpoll surveys for deeper feedback loops.




---

[Next Page](https://docs.zigpoll.com/llms-full.txt/1)

