
[title] Theme (Shopify)
[path] Campaign types/

Theme campaigns allow you to A/B test between your store’s default theme and any other theme available in your Shopify store. This can be useful for testing a new theme or improvements made to a duplicated version of your main theme.

## How it works

1. **Creating the campaign** – You select one or more **variation themes** from your available Shopify themes. For experiments, the default (currently published) theme is always used as the control.
2. **Activating the campaign** – Once activated, Personizely automatically redirects visitors to a **Shopify theme preview link** for the assigned variation theme.
3. **Redirection**
   - The redirect occurs immediately as the visitor lands on your site to avoid any visual flash or inconsistency.
   - Query parameters like `preview_theme_id` are automatically removed from the URL after redirection to make the experience seamless and transparent to the visitor.
4. **No flicker experience** – To ensure a seamless redirect and eliminate flicker, the Personizely script should be loaded in **synchronous mode** (non-async), allowing it to run as early as possible.

## Configuration

For each variation, you can select the theme assigned to it. A theme can be assigned only once per campaign.

## Requirements

- The variation themes must exist in your Shopify account.
- The Personizely script must be installed synchronously for the redirect to occur instantly.

:::hint{type="info"}
This campaign type is only available for Shopify users now.
:::


[title] 
[path] Campaigns  /


[title] How to read and use the reports
[path] Campaigns  /Analytics/

This guide explains how Personizely reports campaign performance and A/B experiments. It focuses on what the main metrics mean, how they’re computed, and how to interpret statistical outputs like confidence and “winner” suggestions.

### What we track at a high level

- Exposure and reach for each experience:
  - Original (Control)
  - Each Variation (personalized or experimental)
- Goal activity attributed to the campaign exposure (e.g., purchases, sign‑ups, custom events)
- Monetary outcomes when available:
  - **Revenue** (total attributed order value or equivalent)
  - **Profit (if enabled)**, with an option to include shipping in profit-based views

Attribution model

- Last-touch attribution: when a visitor completes a goal, it’s attributed to the most recent eligible campaign exposure for that visitor.

Results can be viewed by **Goal** (primary or any enabled goal).

### Key metrics (definitions and formulas)

- **Views:** total recorded exposures of an experience. A single visitor can generate multiple views across pages or sessions (e.g., page reloads, returning visits). Views help you understand total exposure volume.
- **Reach:** unique visitors who saw an experience at least once. Reach is the primary denominator for comparisons and is what CVR, Revenue/visitor, and Profit/visitor are based on.
- **Goals hit:** number of attributed goal events (e.g., purchases, sign-ups). This counts events, not necessarily unique people.
- **Revenue:** total revenue attributed to the experience (sum of attributed order values or equivalent).
- **Profit (if enabled):** total profit attributed. The UI can optionally include shipping within profit when comparing “profit per visitor.”

Derived metrics used in comparisons

- Goal Conversion Rate (CVR): Goals hit / Reach × 100
- Revenue per visitor: Revenue / Reach
- Profit per visitor: (Profit \[+ Shipping, if you enable the UI toggle]) / Reach

Notes

- Monetary fields reflect the total of attributed goal events within your selected filters.
- In most A/B tests, each visitor is counted in one experience’s reach; in some personalization flows, a visitor may legitimately appear in multiple experiences over time.

### Experiments vs. Personalization views

- Experiment (A/B) report
  - One row for Original (control) and one for each Variation
  - Columns include Views, Reach, Goals hit, Revenue (and Profit if enabled), and comparison metrics (CVR, Revenue/visitor, or Profit/visitor)
- Personalization report
  - Splits results into “Personalized” vs. “Control” segments, with totals for each

### Statistical methodology (how significance and intervals are calculated)

The default and only methodology currently used in the UI is frequentist. Bayesian analysis is not available yet; it will be configurable in the future.

- **What we compare**
  - Conversion-level comparisons (CVR): compares proportions between control and a variation
  - Revenue/visitor and Profit/visitor comparisons: compares average monetary outcome per visitor between control and a variation
- **Frequentist methods (used today)**
  - CVR significance: two-sample proportion test (z-approximation). Inputs are visitors reached and goals hit for control vs. variation.
  - Revenue/visitor and Profit/visitor significance: two-sample test on means (normal/Welch’s approximation). Inputs are visitors reached and total revenue or total profit for control vs. variation.
  - Confidence intervals (CIs): per experience, a 95% CI is shown for the chosen metric (CVR, Revenue/visitor, or Profit/visitor). The box-plot visual shows the point estimate and CI band; overlap with control’s CI is shaded.
- Significance threshold
  - By default, a 95% threshold is used to indicate strong evidence of a difference.

### Improvement and “winner” logic

- Improvement (%): relative lift vs. control for the selected comparison metric.
  - Improvement = (Variation − Control) / Control × 100
- Winner suggestion: when viewing “All time” for the primary goal, the UI may suggest deploying a variation if it shows positive improvement and meets or exceeds the 95% significance threshold.

### Reading the experiment table

- **Views & Reach:** exposure volume (raw and unique)
- **Goals hit:** total number of attributed goal events
- **Revenue and Profit (if enabled):** totals attributed to the experience
- **Compare metric (selectable):**
  - **Goal CVR&#x20;**— emphasizes goal frequency per visitor
  - **Revenue per visitor** — emphasizes average revenue per visitor
  - **Profit per visitor** — emphasizes average profit per visitor
- **Confidence:&#x20;**&#x74;he statistical significance (percentage) that the variation differs from the control
- **Confidence interval:** 95% range where the true metric is likely to lie for the chosen metric
- **Improvement:** relative lift vs. control for the selected compare metric

Tip: Switch the compare metric to match your primary objective (e.g., CVR for sign-ups; Revenue/visitor for revenue optimization).

### Historical trends

When you select a date range, charts group data into consistent time buckets (hour/day/month depending on range) in your chosen timezone and keep periods with no activity visible for continuity. This helps you see when performance changed and whether effects are stable over time.

### Profit analytics (Shopify only)

Profit metrics are available for Shopify stores when Profit Analytics is enabled for your account. Here is how profit is sourced and calculated:

- Data source: Shopify orders imported through the Shopify integration.
- Calculation: For each order, Profit = Subtotal (pre-shipping) − Cost of Goods Sold (COGS).
  - Subtotal is taken from the Shopify order subtotal (before shipping), in your store currency.
  - COGS is derived from Shopify Inventory unit costs for each purchased variant; if any line item lacks a unit cost or isn’t managed by Shopify inventory, profit for that order is not computed.
- Shipping: Shipping value is captured separately. In profit-based reports, you can optionally include shipping in “Profit per visitor” via a toggle in the UI.
- Availability: Profit appears only for Shopify stores and only when the Profit Analytics feature is enabled. If disabled or not applicable, profit columns and profit-based comparisons will be hidden.

### Practical examples

- CVR example: If a variation has Reach = 780 and Goals hit = 62, its CVR is 62 / 780 × 100 ≈ 7.95%.
- Revenue per visitor example: If the same variation has attributed Revenue = 14,500, then Revenue/visitor = 14,500 / 780 ≈ 18.59.
- Improvement vs. control: If control CVR is 6.0%, then improvement = (7.95 − 6.0) / 6.0 × 100 ≈ +32.5%.

### Best practices

- Define a primary goal and stick to it when judging experiments.
- Decide in advance on a minimum sample size or runtime before acting on results.
- Use Revenue/visitor when revenue is the primary objective; use CVR when the goal count is the focus.

### Glossary

- **Original (Control):** the baseline experience.
- **Variation:** an alternative experience used in personalization or A/B testing.
- **Reach:** unique visitors who saw an experience.
- **Goal:** an action you track (purchase, sign-up, custom event).
- **CVR (Goal Conversion Rate):** goals hit divided by reach.
- **Revenue per visitor:** revenue attributed divided by reach.
- **Profit per visitor:** profit attributed divided by reach.
- **Significance (Confidence):** how likely it is that a difference vs. control is not due to random chance.
- **Confidence Interval:** a range likely to contain the true metric value (95% by default).

### FAQ

- Why can Views be much higher than Reach? Are **Views** or **Reach** more important?
  - A single visitor can view the same campaign multiple times across pages and sessions (e.g., page reloads, returning visits), which increases Views. Reach counts each visitor only once. Views are helpful for understanding total exposure, but Reach is the primary metric used for comparisons (CVR, Revenue/visitor, Profit/visitor).
- Why does a variation with fewer views sometimes win?
  - Because comparisons are normalized per visitor (CVR, Revenue/visitor, or Profit/visitor), not by raw view counts.
- Can I include shipping in profit per visitor?
  - Yes. If profit analytics are enabled, you can toggle shipping to be included in profit-based comparisons in the UI.

[title] Widget display options
[path] Widgets/


[title] Close triggers
[path] Widgets/Widget display options/

Close triggers control when should the widget automatically be closed. The trigger is not going to fire if any kind of interaction like a click or focus has happened already with the widget.


[title] Position
[path] Widgets/Widget elements/Untitled/

Position determines how an element is placed within the layout, with options for static, relative, and absolute. Selecting relative or absolute reveals additional controls for top, right, bottom, and left offsets.

## Position options

- Static - keeps the element in the normal document flow.
- Relative - positions the element in the normal flow, but allows offsets.
  - Top, right, bottom, left - set offset values (auto, fixed, or relative).
- Absolute - removes the element from the normal positioning and positions it relative to its nearest positioned ancestor.
  - Top, right, bottom, left - set offset values (auto, fixed, or relative).

## Usage

1. Select the element to be styled.
2. Select the Style section in the right sidebar.
3. Expand the Position tab.
4. Choose static, relative, or absolute.
5. Adjust top, right, bottom, or left offsets if applicable.

## Notes

If you edit the element while the widget builder is set to mobile view, those changes will apply only to the mobile layout and will not affect the default (desktop) layout.

[title] Widgets
[path] /


[title] Experiments (A/B tests)
[path] Campaigns  /Campaign categories/

A/B test campaigns allow you to A/B test various changes on your site by defining variations that should be tested against a control version.

### Variations

Each experiment campaign in  has an original variation by default, which acts as a control group. Visitors who see this variation won't see any changes, but a view is going to be recorded.

Then you can add multiple variations to a campaign and assign each of them a percentage share. The sum of all shares will always be 100.&#x20;

### Sticky variations&#x20;

 stores the selected variation in local storage, ensuring that the same variation is shown consistently across different pages and visitor sessions.

### Target

Setting up the campaign target allows restricting which visitors are going to see the experiment. You can specify a single target.

Setting up a target that involves advanced filters like geo-location, visitor history, and other server-side filters might cause the campaign to show a cloak on top of elements that could change (making them invisible), to prevent flicker.

### Traffic allocation

The traffic allocation option allows only exposing a subset of visitors to a campaign. This is helpful for high-traffic websites that don't want to run the campaign to all visitors at once, or when a test run is needed to make sure everything runs smoothly before exposing the whole audience to the campaign.

### Goals

Setting up goals for your campaign allows you to track the performance of the campaign. You can set up multiple goals. A campaign requires at least one goal, and one of the goals can be set us a favorite, which will make it selected by default in this campaign's report/analytics.

Once a visitor sees one of the variations of a campaign, the campaign is going to be assigned a view. Then, if this visitor reaches one of the goals specified in the campaign settings, the campaign is going to be assigned a conversion. This breakdown can be seen on the campaign's report page.

Depending on the type of campaign, you can apply changes to each created variation. See more about these changes in the **Campaign types** section.

[title] Content (via visual editor)
[path] Campaign types/

Content campaigns allow you to apply changes to existing pages on your website by dynamically replacing the content with versions created using the &#xNAN;**&#x20;Campaign Builder**.

## How it works

1. **Choose the pages** – Each campaign can target multiple pages. You can configure these using specific page rules or a catch-all pattern. For each variation, a **change set** is created per page.
2. **Create the variations** – Create the variations.
3. **Use the Campaign Builder** to define the changes for each variation. You can edit:
   - Text and copy
   - Images and videos
   - Call-to-actions and links
   - Iframes
   - Styles, font sizes, colors, etc.
   - Custom CSS and JavaScript
4. **Activating the campaign** – When a campaign is active, the  script injects the variation content as soon as the page loads. This replacement happens immediately and invisibly to the visitor.
5. **No flicker experience** – To ensure changes are applied instantly and avoid any visual flicker, we recommend using the Personizely snippet in **synchronous mode** (non-async).

## Configuration

### Pages

The pages the campaign should run on. Pages are a separate entity that can be reused across campaigns. A campaign can run across multiple pages to make the messaging consistent.

Here is what defines a page:

**Name -&#x20;**&#x41; distinctive name for your page, so you can later easily understand which page is which. Good examples would be **Pricing, Product page, Homepage**

**Page type -&#x20;**&#x41;s mentioned above, every page can be configured to actually include a single page or multiple pages. This works best for dynamic pages that are different by having a lot in common like product or collection pages.

1. **Single page -&#x20;**&#x57;hen using the single page type, you only have to specify the page that you want to personalize by specifying the whole URL in the *Page URL* field.
2. **Advanced -&#x20;**&#x57;hen using the advanced page type, you can make the page actually match more pages on your website. This would be done by specifying the rules that a page should satisfy in order to match.&#x20;
3. **All pages** - Acts as a placeholder in case you want the campaign to run on all pages. Usually useful when you need to adjust elements present on all site pages, like navigation bars, footers, etc.

Besides specifying the rules, you should also specify the editor URL where the website editing will take place.

Editing the variation opens up the Campaign Builder, where you can make visual changes to the pages configured in the campaign. Each change will be saved as a region based on the changed element's selector.

Besides changing elements, it's also possible to adjust variation CSS and JS to run custom code.

## Requirements

Make sure your  script is loaded synchronously on all target pages for a no-flicker experience.


[title] URL split
[path] Campaign types/

URL Split campaigns allow you to direct visitors to one or more fully independent pages on your website by redirecting visitors to alternative URLs.

This method is ideal when each variation is a standalone landing page or an entire multi-page funnel.

## How it works

1. **Creating the campaign** – You define one or more Pages where Personizely will run and the variation URLs where the visitors should be redirected.
2. **Activating the campaign** – When the campaign is live, Personizely redirects visitors to their assigned variation URL before the page finishes loading, making the experience seamless.
3. **Redirection behavior**
   - Visitors falling into a variation are redirected immediately to the corresponding variation URL.
   - The redirect is designed to occur early enough to prevent flicker or visual disruption.
4. **Multi-page support** – A single URL Split campaign can include **multiple original URLs**, allowing you to redirect to entire page funnels. Each variation can define a matching URL for every page in the funnel.
5. **Advanced settings per page**
   - **Replace original URL** – Each variation URL can be configured to **replace the visible URL**, so the visitor sees the original path in their address bar even after redirection.
   - **Preserve query parameters** – You can choose to **pass through query strings** from the original URL to the variation URL. This is useful for preserving tracking and analytics data.
6. **No flicker experience** – To ensure redirections happen instantly, we recommend loading the Personizely script in **synchronous mode** (non-async).

## Configuration

### Pages

A URL split campaign can be configured to run on one or multiple pages. Only pages that are of the "single page" type can be used for this campaign type. When using more than one page, you will have to configure the alternate URL for these extra pages for each variation as well

For each variation-page pair, you have to set the alternative URL. Besides the URL, there are 2 more options you can set:

1. **Replace original URL** – Each variation URL can be configured to **replace the visible URL**, so the visitor sees the original path in their address bar even after redirection.
2. **Preserve query parameters** – You can choose to **pass through query strings** from the original URL to the variation URL. This is useful for preserving tracking and analytics data.

## Requirements

- All variation URLs must exist and be publicly accessible.
- The @ script must be installed synchronously on all pages involved in the campaign.


[title] Analytics breakdowns
[path] Campaigns  /Analytics/

Breakdowns let you split your A/B experiment and personalization campaign results by a visitor dimension so you can see how each variation performs across segments. For example, break down by device to compare conversion rates on Mobile versus Desktop, or by channel to see which traffic sources drive the most value.

### How to use breakdowns

Open a campaign report and look for the **Break down by** dropdown in the report settings. Select a dimension to split the results table into one section per segment value (e.g., one section for Mobile, one for Desktop). Select **None** to return to the default single-table view.

When a breakdown is active, the experiment progress section is hidden because per-segment sample sizes are smaller and the overall progress indicator would be misleading.

Breakdowns can be combined with filters. For example, you can filter to a specific date range and then break down by country to see how each country performed during that period.

### Available dimensions

- **Device** — splits results by the device type recorded on the campaign event: Desktop, Mobile, or Tablet.
- **Country** — splits results by the visitor's country, resolved from their IP address when the event was recorded. Country codes are displayed as full names (e.g., "United States" instead of "US").
- **Channel** — classifies each visitor's traffic source into a marketing channel based on their UTM parameters (source, medium, and campaign). See the channel classification section below for details.
- **Referrer** — splits results by the referring domain extracted from the campaign event's referrer URL. Only the hostname is shown (e.g., "google.com" rather than the full URL).

### Reading the breakdown table

When a dimension is selected, the report table splits into labeled sections — one for each segment value (e.g., one section for "Desktop", one for "Mobile"). Each section shows its own variation rows with independent confidence, improvement, and confidence interval calculations.

A summary row at the top aggregates the results across all segments so you can still see the overall picture.

### Segment limits

To keep the table readable, breakdowns are limited to the **top 10 segments** by total views. If there are more than 10 segments, the remaining segments are aggregated into an **Others** bucket. This is most relevant for the Country and Channel dimensions, which can produce many distinct values.

### Channel classification

The Channel dimension classifies visitors into marketing channels following a simplified version of GA4's default channel grouping rules. Classification is based on the visitor's UTM source, UTM medium, and UTM campaign — the values stored on the visitor record from their first arrival.

Channels are evaluated in priority order. The first matching rule wins.

| Channel          | Rule                                                                                   |
| ---------------- | -------------------------------------------------------------------------------------- |
| Direct           | Source is empty, "(direct)", or "direct" AND medium is empty, "(none)", or "(not set)" |
| Cross-network    | Campaign name contains "cross-network"                                                 |
| Paid Shopping    | Medium indicates paid AND (source is a shopping platform OR campaign contains "shop")  |
| Paid Search      | Medium indicates paid AND source is a search engine                                    |
| Paid Social      | Medium indicates paid AND source is a social network                                   |
| Paid Video       | Medium indicates paid AND source is a video platform                                   |
| Display          | Medium is one of: display, banner, expandable, interstitial, cpm                       |
| Paid Other       | Medium indicates paid (catch-all for paid traffic not matching the above)              |
| Organic Shopping | Source is a shopping platform OR campaign contains "shop"                              |
| Organic Social   | Source is a social network OR medium is one of: social, social-media, social\_media    |
| Organic Video    | Source is a video platform OR medium is "video"                                        |
| Organic Search   | Source is a search engine OR medium is "organic"                                       |
| Email            | Source or medium contains "email"                                                      |
| Affiliates       | Medium is "affiliate"                                                                  |
| Referral         | Medium is "referral"                                                                   |
| SMS              | Source or medium is "sms"                                                              |
| Audio            | Medium is "audio"                                                                      |
| Push             | Medium contains "push" or "notification"                                               |
| Unassigned       | Everything else                                                                        |

**Paid medium detection:** A medium is considered paid if it contains "cp" (covers cpc, cpv, cpm, cpa), equals "ppc" or "retargeting", or starts with "paid".

**Recognized sources:**

- Search engines: Google, Bing, Yahoo, DuckDuckGo, Baidu, Yandex, Ecosia, Ask, AOL, Naver, Sogou
- Social networks: Facebook, Instagram, Twitter/X, LinkedIn, Pinterest, TikTok, Snapchat, Reddit, Tumblr, Quora, Threads
- Video platforms: YouTube, Vimeo, Dailymotion, Twitch
- Shopping platforms: Shopify, Amazon, eBay, Etsy, Alibaba, Walmart

Source matching is case-insensitive and uses substring matching (e.g., "google" matches "google.com", "google/organic", etc.).

### FAQ

- **Do breakdowns affect statistical calculations?**
  Yes. Confidence, improvement, and confidence intervals are computed per segment. Each segment's control is compared only to the same segment's variations, not to the overall control.
- **Can I use breakdowns with product breakdowns?**
  No. When a dimension is selected, per-product breakdowns are not shown. Remove the breakdown to see product-level data.
- **Why is the experiment progress hidden during breakdowns?**
  The progress indicator and winner detection are based on overall traffic and significance thresholds. Per-segment sample sizes are typically smaller and may not meet the required thresholds individually. To avoid confusion, progress is hidden when a breakdown is active.
- **Why do I see "(not set)" as a segment?**
  This appears when visitors do not have a value for the selected dimension. For example, "(not set)" in a Channel breakdown means the visitor had no UTM parameters and did not match the Direct channel rules, or the referrer was empty for a Referrer breakdown.
- **Do filters and breakdowns interact?**
  Yes. Filters are applied first, then the filtered data is split by the selected dimension. For example, if you filter to "Device = Mobile" and break down by Country, you will see country segments for mobile traffic only.
- **Why does the Channel breakdown show "Unassigned"?**
  Visitors whose UTM parameters do not match any of the recognized channel rules are grouped into the Unassigned channel. This typically happens when custom or non-standard UTM values are used.
- **Is the "Others" bucket a single segment?**
  Yes. When more than 10 segments exist, segments ranked 11th and beyond by total views are merged into a single Others row. The Others row's statistics are the sum of all the merged segments.

[title] 
[path] /


[title] Product
[path] Widgets/Widget elements/Element types/

The product element is designed to create cross-sell and upsell opportunities within widgets. It allows showcasing specific products dynamically or manually, enhancing sales potential and product discovery on e-commerce platforms.

## Settings

**Source**
Defines how products are selected for display:

- *Manual* – manually choose products.
- *Rules* – select a rule set set to dynamically display products based on predefined conditions.
- *Cart items* – display the items currently in the visitor's cart.
- *Recommended products* – display system-recommended products based on cart content or the current page product (Shopify only).

**Rule set**
Appears when *Rules* is selected as the source. Allows selection of a specific rule set.

**Reference**
Defines the reference product for dynamic product selection:

- *Items in cart* – use the products in the cart as the reference.
- *Just added an item* – use the item just added to the cart as reference (works only for cart add trigger).
- *Current page product* – use product from the current page as the reference (works for product pages only).

**Intent** (only for *Recommended products*)
Specifies the recommendation logic:

- *Related* – shows products similar to the reference product(s).
- *Complementary* – shows products that complement the reference product(s).

**Products nr.**
Sets the number of products to display.

**Exclude  in-cart**
Toggles the exclusion of products already in the cart (available for *Rules* source).

**Exclude sold out**
Toggles the exclusion of out-of-stock products (available for *Rules* source).

**Shuffle**
Randomizes the order of displayed products.

**Swiper**
Enables a swiper/slider view to browse multiple products in the widget.

**Properties**
Allows adding custom product properties or attributes for additional product details.

## Notes

- The available settings adjust dynamically based on the *Source* selection.
- *Recommended products* include additional *Reference* and *Intent* options that allow fine-tuning of the recommendation logic.
- When *Rules* is selected, additional options like *Rule set*, *Excl. in-cart*, and *Excl. sold out,* become available.

## Interaction

**CTA - Cart action**

This setting allows configuring what action will be executed upon the product card's call-to-action click. The available options are:

- Add - will add the product to the cart
- Replace - will replace the just-added product (used for true upsell experiences and only available for Shopify)
- Go to product - will redirect the visitor to the product's page
- Buy now&#x20;

The product element is interactive and runs actions upon the cart action execution. For details on interaction settings, see the [interactions article](docId\:GiKD86hGqVR22q7p4hUL2).

[title] Style
[path] Widgets/Widget elements/

There are multiple styling options that control visual appearance, ranging from backgrounds to borders. Each style type has its own specifics. Most of the differences are about the properties they modify, but the approach to applying them remains similar across elements.

[title] Style
[path] Widgets/Widget elements/Untitled/

Style covers the main ways to modify elements visually using standard CSS properties. It focuses on background, border, border radius, shadow, opacity, and scale.

## Style and configuration options

- Background - apply colors, images, or gradients.
- Border - define border style, width, and color.
- Border radius - round corners for a softer look.
- Shadow - add a box shadow for visual depth.
- Opacity - control the transparency of the element.
- Scale - adjust the size using transform scaling.

## Usage

1. Select the element to be styled.
2. Select the style section in the right sidebar
3. Customize the background, border, border radius, shadow, opacity, or scale.

## Notes

If you edit the element while the widget builder is set to mobile view, those changes will apply only to the mobile layout and will not affect the default (desktop) layout.

[title] 
[path] Widgets/Widget elements/


[title] Send webhook
[path] Widgets/Widget elements/Interaction/Automations/

This action sends an HTTP webhook request to the given URL.

## Options

**URL** - This should be a valid URL reachable through the internet.

## Webhook payload structure

The webhook's payload is a JSON object containing information about the event and the visitor.

```typescript
{
  "event": string, // - click/submit,
  "widget": {
    "id": number,
    "name": string,
    "type": string,
  },
  "visitor": {
    "firstName": string,
    "lastName": string,
    "email": string,
    "companyName": string,
    "companyTitle": string,
    "phone": string,
    "address": string,
    "marketingConsent": boolean,
    "privacyContent": boolean,
    "bio": string,
    "referrer": string,
    "firstVisitPage": string,
    "utmSource": string,
    "utmCampaign": string,
    "utmContent": string,
    "utmTerm": string,
    "utmMedium": string,
    "country": string,
    "city": string,
    "region": string,  
    "postalCode": string,
    "customFieldValues": {
      number: string
    }
  }
}
```






[title] Query string
[path] Targets/

Target visitors based on specific query strings present in the URL. Query strings are the portion of a URL where data is passed to a web application and/or back-end database. By targeting specific query strings, you can cater unique content or offers to segments of your audience based on their interactions, online search, or the source of their visit.

### Options

1. **Query string -** the query string parameter to target (e.g., "utm\_campaign", "ref", "q", etc.).
2. **Condition**
   - **Is -** Matches the exact value of the query string.
   - **Is Not -** The query string doesn’t match the specified value.
   - **Contains -** The query string contains a specific substring.
   - **Does Not Contain -** The query string doesn’t have the specified substring.
   - **Is Empty -** The query string is present but has no value.
   - **Is Not Empty -** The query string has a value.
3. **Value -** the value to compare against the query string value based on the condition.

### Use cases

1. **Personalization campaign -** Display customized pages to visitors, by synergizing email or marketing campaigns with personalized website experience.
2. **Special offers -** Have a partnership with another brand or influencer? Offer exclusive content or deals to visitors coming through a unique referral link with a specific query string.
3. **Search intent** - Detect your visitors' intent by the queries they are using to search your website.
4. **Survey responses -** If you're directing users to your site post-survey completion, use query strings to provide customized thank-you messages or offers.

### How to use

1. Navigate to the "Targets" section within the Personizely dashboard.
2. Click on "Create target" and name it.
3. Choose 'Add Filter' and select 'Query String'.
4. Input the desired query string parameter.
5. Select the appropriate condition from the dropdown.
6. Depending on the condition, enter the expected value or leave it blank to be dynamic.
7. Save the changes. Your Target is now ready to be used within your Widgets and Campaigns.


[title] Personalizations
[path] Campaigns  /Campaign categories/

Personalization campaigns allow you to show different versions of your site to different visitors based on defined [Targets](docId\:w8HMXSMdf8C__dC_ZP3RY).

### Variations

For personalization campaigns, every variation is defined by a target. You can select an existing target or create a new one, and it will be assigned a variation automatically. Each variation inherits the target name by default.

Variations can be reordered by precedence, so if there's any overlap in your targets, the visitors will see the first-come variation.

Editing the variation opens up the Campaign Builder, where you can make visual changes to the pages configured in the campaign. Each change will be saved as a region based on the changed element's selector.

Besides changing elements, it's also possible to adjust variation CSS and JS to run custom code.

### Control group

The control group option in a personalization campaign allows you to split the traffic up between the personalized variation and a control group that would see the unchanged content. This would allow you to understand the impact that your campaign is having on your website conversion. To track this, you would have to set up at least one goal for the campaign.

Depending on the type of campaign, you can apply changes to each created variation. See more about these changes in the **Campaign types** section.

### Traffic allocation

The traffic allocation option allows only exposing a subset of visitors to a campaign. This is helpful for high-traffic websites that don't want to run the campaign to all visitors at once, or when a test run is needed to make sure everything runs smoothly before exposing the whole audience to the campaign.

### Goals

Setting up goals for your campaign allows you to track the performance of the campaign. You can set up multiple goals. A campaign requires at least one goal, and one of the goals can be set us a favorite, which will make it selected by default in this campaign's report/analytics.

Once a visitor sees one of the variations of a campaign, the campaign is going to be assigned a view. Then, if this visitor reaches one of the goals specified in the campaign settings, the campaign is going to be assigned a conversion. This breakdown can be seen on the campaign's report page.


[title] 
[path] /


[title] 
[path] Campaigns  /


[title] Product price (Shopify)
[path] Campaign types/

Product price campaigns allow you to test or personalize the prices of your Shopify products across different visitor groups. You define price adjustment rules per variation, and Personizely automatically shows the correct price to each visitor based on their assigned group.

## Price adjustment strategies

Personizely uses two different strategies to apply price changes, depending on your Shopify plan.

### Cart Transform

Available on **Shopify Plus** and **Development** stores. Prices are adjusted dynamically using Shopify Cart Transform Functions — no product duplication is involved. The original product is always used, and price rules are applied at the cart and checkout level. To learn how it works in detail, see [Cart Transform](docId:7R4pqvu6musjTwI9Xjz15).

### Product Clone

Available on **all other Shopify plans**. Personizely creates unlisted duplicate products in your Shopify store — one clone per variation per product. Visitors assigned to a variation are transparently redirected to the clone with the adjusted price. To learn how it works and what to configure before launching, see [Duplicate products (clones)](docId\:F_2JV7V90cHnWyDH4LlrV).

## How the strategy is selected

The strategy is selected automatically based on your Shopify subscription. Cart Transform is always preferred when available. If your plan does not support Shopify Functions, the Product Clone strategy will be used.

You do not need to configure anything — Personizely will apply the correct approach when you create the campaign.

## Common configuration

Regardless of which strategy is used, the campaign setup works the same way:

- You select the products to include in the campaign.
- For each variation, you define price adjustment rules at the product or variant level.
- Rules can set a fixed price, increase, or decrease the original price by a fixed amount or percentage.
- Rounding options are available for increase and decrease rules.

For a full reference on rules, actions, and rounding behavior, see [Price adjustment rules](docId\:MbAMxjk2QdeqXE92iL3uL).

For strategy-specific details, see [Cart transform](docId\:Rq4tIMRQgfgM1J69WWmli) and [Duplicate products (clones)](docId\:F_2JV7V90cHnWyDH4LlrV).

[title] Cart transform
[path] Campaign types/Product price (Shopify)/Strategies/

Product price campaigns on Shopify Plus and Development stores use Shopify Cart Transform Functions to apply price adjustments. No product duplication is involved — the original products are always used.

## How it works

**Creating the campaign** — You define the variations and their price adjustment rules in Personizely.

**Activating the campaign** — Once activated, the Shopify Cart Transform Function is registered and begins applying the configured rules to your store.

**Price adjustments:**

- **Storefront** — Prices are adjusted using our client-side script. Using predefined CSS selectors, the script locates and replaces the elements displaying the product price and compare-at price. See [Price CSS selectors](docId:0HvSlwDNDftvTyXCcs0wz) for configuration details.
- **Cart and checkout** — Prices are modified through the Shopify Cart Transform Function, ensuring price consistency according to the campaign rules. The transformation rules are stored in product metafields, which are read by the function when the product is added to the cart.

Each variation's changes are applied sitewide to visitors assigned to that group.

## Configuration

For a full reference on setting price adjustment rules — actions, values, rounding options, and examples — see [Price adjustment rules](docId\:MbAMxjk2QdeqXE92iL3uL).

## Preview

To verify how price transformations appear on the storefront, use the **Preview** button on any variation. A URL will be generated that opens the campaign preview on your store. Make sure all changes are saved before opening the preview link.

In preview mode, prices transformed by the script are highlighted with a red outline. Cart transformations will not apply in preview unless the campaign is running or scheduled.

## Market-specific campaigns

If you need different pricing rules for different markets, create separate campaigns per market and use a target with a Market filter. If the price rules are the same across all markets, a single campaign is sufficient.

## Notes

- Price transformation rules are applied in the following order: variant-specific rule → product-level rule → original price.
- Subscription product prices cannot be adjusted.
- If a product or variant does not have a compare-at price but a rule is set for it, it will not be displayed on the storefront.
- Before launching, go through the [QA Checklist](docId\:XqW2GtK2cwDwaddslFMfs) to verify everything is configured correctly.

## Requirements

- Your store must be on the **Shopify Plus** or **Development** plan (Shopify Functions are not available on other plans).
- Bundle products cannot be used in price campaigns. Both bundle functionality and price testing rely on Cart Transform Functions, and Shopify only permits one transform per line item.

For an overview of both strategies and how the strategy is selected, see [Product price (Shopify)](docId\:F-HZyVG5wdCdrRsgDv965).

[title] Duplicate products (clones)
[path] Campaign types/Product price (Shopify)/Strategies/

## How it works

When this strategy is used, Personizely creates an unlisted duplicate of each product included in the campaign. Each variation gets its own clone with the adjusted prices applied. Visitors assigned to a variation will see the clone's price on the product page and will add the clone to their cart — the substitution happens transparently.

The original product remains unchanged throughout the campaign.

**Clone lifecycle:**

- **When the campaign is created** — clones are created in Archived status and are not visible externally.
- **When the campaign is activated** — clones are made visible (unlisted) so the campaign can run.
- **When a new variation is added to a running campaign** — a clone is created and made visible immediately.
- **When the campaign is paused or stopped** — clones are archived. They are not deleted, so the campaign can be resumed without re-creating them.
- **When the campaign is deleted** — clones are permanently deleted from your Shopify store.

## Analytics and attribution

In Personizely, all analytics and revenue attribution are based on the original product. Purchases made through a clone are attributed to the original product and to the variation the visitor was assigned to.

However, in your Shopify admin (Orders, Reports), purchases will appear under the clone product, not the original. If you have questions about how this affects your Shopify reporting, please reach out to our support team.

## Things to configure before launching

Because clones are full product duplicates in Shopify, there are a few areas where you may need to make adjustments to ensure everything works as expected.

### Inventory

Clones have their own inventory tracking, separate from the original. How this affects your store depends on how you manage inventory.

**If you use Shopify to track inventory**, we recommend doing the following before activating the campaign:

1. Set the inventory quantity for all clone products to zero — either through Shopify's bulk editor or by opening each clone product directly.
2. Enable **Continue selling when out of stock** for all variants of the clones.

Once an item in your store goes out of stock, remember to reset this back to **Stop selling when out of stock**.

If you have inventory that turns over quickly, consider using a SKU sync app so that inventory stays in sync between the original and the clone.

**If you use a third-party app to track inventory:**

- Apps that track by **SKU** should not be affected — SKUs are copied to the clones automatically.
- Apps that track by **product ID or variant ID** may need to be configured to include the clone products. Please contact our support team if you need help.

### Shipping profiles

This is only relevant if you use custom shipping profiles in Shopify. If you only use the default General shipping profile, you can skip this.

If any of the products included in the campaign are part of a custom shipping profile, you will need to add the clone products to the same profile. Otherwise, incorrect shipping rates may be applied at checkout for visitors in the experiment.

To do this, go to **Settings → Shipping and Delivery** in your Shopify admin, open the relevant custom profile, click **Manage Products**, and add the clone products.

### Discount codes

This is only relevant if you have discount codes that apply to specific products or collections. Store-wide discounts are not affected.

If you have product-specific or collection-specific discount codes that should apply to the clones, you will need to add the clone products to those discounts manually. Otherwise, visitors in the experiment may not receive the discount at checkout.

### Search apps

If you use a third-party search app (such as Searchanise or Boost Commerce), it may index and display clone products in search results. To prevent this, configure the app to exclude products tagged with **ply\_campaign\_** from search results. All clone products are tagged with this prefix followed by the campaign ID.

### Ratings and reviews apps

Most ratings and reviews apps support product grouping, which allows multiple products to share the same reviews. We recommend setting this up so that clone products display the same reviews as the original. Otherwise, clones will appear with no reviews, which may affect the experiment results.

Common apps and their grouping documentation:

- **Stamped** — product groups feature
- **Loox** — group product reviews together
- **Okendo** — creating groups
- **Judge.me** — share reviews across product groups
- **Junip** — product groups / bundle family

### Subscription apps

If you use a subscription management app (such as Skio, Recharge, or similar), you may need to configure it to recognize the clone products. Please contact our support team if you are running a price campaign on subscription products and need help with the setup.

### Bundle and volume discount apps

If you use a bundle or volume discount app, you will need to configure the same discount rules for the clone products. This ensures that visitors in the experiment see consistent pricing across bundles and volume tiers.

***

For an overview of both strategies and how the strategy is selected, see [Product price (Shopify)](docId\:F-HZyVG5wdCdrRsgDv965). To configure price adjustment rules for your variations, see [Price adjustment rules](docId\:MbAMxjk2QdeqXE92iL3uL). Before going live, go through the [QA Checklist](docId\:XqW2GtK2cwDwaddslFMfs) to verify everything is set up correctly.

[title] Price CSS selectors
[path] Campaign types/Product price (Shopify)/

For the product campaign strategy to correctly display adjusted prices on the storefront, you need to configure CSS selectors that tell the Personizely script where to find and replace the price elements in your theme. This is done in **Settings → Campaigns**.

## Selector types

- **Root selector** — Defines the container element that wraps the price elements. Must have a `data-product-id` attribute on the element in your theme.
- **Price selector** — Targets the element displaying the product price.
- **Compare at price selector** — Targets the element displaying the compare-at price.
- **Savings selector** — Targets elements displaying the savings amount (difference between price and compare-at price).
- **Savings percentage selector** — Targets elements displaying the percentage saved.

## Important notes

:::hint{type="info"}
- Price elements should not contain child elements — the script replaces their `innerText` or `innerHTML`, which removes all existing content inside them.
- Root selectors must match elements that have a `data-product-id` attribute. This attribute needs to be added manually to your theme's Liquid files.
- If price adjustments should apply to specific variants, the root element must also include a `data-variant-id` attribute.
- On collection pages and other product list views, Personizely will display the cheapest adjusted price for the product.
:::

## Adding `data-product-id` to your theme

Using the Dawn theme as an example: in `snippets/product-card.liquid`, the top-level product card element looks like this:

```html
<div class="card-wrapper product-card-wrapper underline-links-hover">
```

To add the required attribute, modify it as follows:

```html
<div class="card-wrapper product-card-wrapper underline-links-hover" data-product-id="{{ card_product.id }}">
```

With this in place, the root selector for this element would be `.product-card-wrapper`.

## Predefined selectors

To simplify setup, predefined selectors are available for the following Shopify themes:

Dawn, Crave, Publisher, Ride, Origin, Studio, Refresh, Sense, Colorblock, Trade, Craft, Spotlight, Taste.

If your store uses one of these themes, click **Detect from theme** in **Settings → Campaigns** to automatically fill in the correct selectors. You will still need to add the `data-product-id` attribute manually.

## Validating selectors

Click **Validate** in **Settings → Campaigns** to check that all selectors are correctly configured. The validation will:

- Report an error if a selector cannot be found in your theme files.
- Report an error if root selector elements are missing the `data-product-id` attribute.
- Show a button next to each error that opens the specific Liquid file where the fix needs to be applied.

## Example

An example of how a product element might look in a storefront:

```html
<div class="product-card-wrapper" data-product-id="2000400050000">
    <div class="title">Small Convertible Flex Bag</div>
    <div class="price__regular">
        <div class="price-item--regular">$95</div>
    </div>
    <div class="price__sale">
        <div class="price-item--sale">$95</div>
        <div class="price-item--regular">$115</div>
    </div>
    <div class="savings">
        <div>
            Save <span class="savings-value">$20</span>
            (<span class="savings-percentage">17%</span>)
        </div>
    </div>
</div>
```

For this structure, the correct selectors would be:

- **Root** — `.product-card-wrapper`
- **Price** — `.price__regular .price-item--regular`, `.price__sale .price-item--sale`
- **Compare at price** — `.price__sale .price-item--regular`
- **Savings** — `.savings .savings-value`
- **Savings percentage** — `.savings .savings-percentage`

***

For an overview of how storefront price adjustments work, see [Cart transform](docId\:Rq4tIMRQgfgM1J69WWmli).

[title] 
[path] Campaign types/Product price (Shopify)/


[title] Shipping (Shopify)
[path] Campaign types/

Shipping campaigns allow you to test and personalize shipping rates in your Shopify store. You can modify shipping method names, prices, descriptions, and conditions, then measure how these changes affect conversion rates and revenue.

There are two campaign modes:

- **Shipping Experiment** - A/B test different shipping configurations against the original rates to find the best-performing setup.
- **Shipping Personalization** - Show different shipping options to specific visitor segments based on targeting rules.

## How it works

1. **Selecting shipping profiles** - Choose which Shopify shipping profiles and zones to include in the campaign. Each zone represents a geographic region with its own set of shipping methods.
2. **Selecting shipping rates** - Pick the specific shipping methods you want to test within the selected zones. Only methods with fixed prices can be modified; carrier-calculated rates cannot be changed.
3. **Configuring variations** - Adjust shipping method names, prices, descriptions, and conditions for each variation. For experiments, the control group sees the original shipping rates while other variations see the modified rates.
4. **Activating the campaign** - Once activated, Personizely registers a carrier service with Shopify that serves the modified shipping rates at checkout. The original shipping methods are temporarily deactivated and replaced by rates defined in your campaign.
5. **Deactivating the campaign** - When the campaign is deactivated (manually or by disconnecting the Shopify integration), the original shipping methods are restored automatically.

## Configuration

### Shipping profiles and zones

In the first step of the wizard, you see all your Shopify shipping profiles with their zones. Each profile shows:

- **Profile name** - e.g., "General shipping rates"
- **Number of products** covered by the profile
- **Origin locations** the profile ships from
- **Zones** - geographic regions with the countries they include

Select the zones you want to include in the campaign. You can select zones from multiple profiles.

### Shipping rates

After selecting zones, a table displays all available shipping methods for each zone. Each method shows:

- **Name** - the shipping method name as it appears at checkout
- **Conditions** - weight or price-based conditions, if any (e.g., "When cart weight is 5-10 kg")
- **Price** - the current shipping rate price, or "Carrier calculated" for third-party rates

Select the methods you want to test. Carrier-calculated methods are shown for reference but cannot be modified.

### Variations

For experiments, the first variation is the **control** - visitors in this group see the original shipping rates. Additional variations contain the modified shipping configuration.

For each variation, you can edit shipping methods within the selected profiles and zones. When editing a shipping method, you can adjust:

- **Name** - the method name displayed at checkout (max 25 characters)
- **Description** - additional text shown below the method name (max 50 characters)
- **Price** - the shipping cost. Setting it to 0 displays as "Free"
- **Conditions** - optional rules that determine when the method is available:
  - **Based on order price** - set a minimum and/or maximum cart total
  - **Based on cart weight** - set a minimum and/or maximum cart weight in kilograms

You can also add entirely new shipping rates to a variation that do not exist in the original configuration.

### Traffic allocation

- **Traffic percentage** - control what share of visitors enters the campaign (default 100%)
- **Variation split** - for experiments, distribute traffic between control and variation groups
- **Control group** - for personalizations, define what percentage of the target audience sees the original rates (default 25%)

## Examples

### Basic example

Suppose your Shopify store has the following shipping methods for the "United States" zone:

| Method            | Conditions | Price  |
| ----------------- | ---------- | ------ |
| Standard Shipping | -          | $7.99  |
| Express Shipping  | -          | $14.99 |

You create a shipping experiment with one variation where you change the prices:

| Method            | Conditions | Price |
| ----------------- | ---------- | ----- |
| Standard Shipping | -          | $4.99 |
| Express Shipping  | -          | $9.99 |

When a visitor from the US reaches checkout:

- **Control group** - sees the original rates: Standard Shipping at $7.99 and Express Shipping at $14.99.
- **Variation group** - sees the modified rates: Standard Shipping at $4.99 and Express Shipping at $9.99.

### Free shipping threshold

You can use conditions to offer free shipping above a certain cart total. Starting with:

| Method            | Conditions | Price |
| ----------------- | ---------- | ----- |
| Standard Shipping | -          | $5.99 |

In the variation, you replace it with two methods:

| Method                 | Conditions                          | Price |
| ---------------------- | ----------------------------------- | ----- |
| Standard Shipping      | Order price is not greater than $50 | $5.99 |
| Free Standard Shipping | Order price is at least $50         | Free  |

When a visitor in the **variation group** reaches checkout:

- **Cart total $30** - sees "Standard Shipping" at $5.99.
- **Cart total $75** - sees "Free Standard Shipping" at $0.00 (displayed as "Free").

Visitors in the **control group** always see the original "Standard Shipping" at $5.99 regardless of cart total.

### Weight-based conditions

You can set up different prices based on cart weight. For example, in your variation:

| Method          | Conditions                           | Price  |
| --------------- | ------------------------------------ | ------ |
| Light Parcel    | Cart weight is not greater than 5 kg | $3.99  |
| Standard Parcel | Cart weight is 5-20 kg               | $8.99  |
| Heavy Parcel    | Cart weight is at least 20 kg        | $15.99 |

When a visitor in the variation group has a cart weighing 12 kg, they see "Standard Parcel" at $8.99. A cart weighing 2 kg shows "Light Parcel" at $3.99.

### Multiple zones

If your campaign includes multiple zones (e.g., "United States" and "Europe"), each zone is evaluated independently. A visitor shipping to Germany only sees rates from the "Europe" zone, while a visitor shipping to New York only sees rates from the "United States" zone. You can configure completely different rate structures for each zone within the same campaign.

## Cart progress widget

The **Cart Progress** element can be added to any Personizely widget (popup, bar, embedded element, etc.) to motivate customers to spend more in order to qualify for free shipping.

### Linking to a shipping campaign

The Cart Progress element has a **Source** setting with two options:

- **Custom** - manually enter the free shipping threshold amount.
- **Shipping Campaign** - automatically pull the threshold from your active shipping campaign. If your campaign defines a free shipping rate with a condition like "Order price is at least $50", the widget automatically uses $50 as the threshold.

This keeps the widget in sync with your shipping campaign - when you change the free shipping threshold in the campaign, the widget updates automatically.

## Updating shipping text on the storefront

Shipping campaigns modify rates at checkout, but your storefront may also display shipping-related text in other places - for example, promotional banners like "Free shipping on orders over $50" or shipping info blocks on product pages.

To keep these consistent with your campaign variations, use the **Edit in builder** button available in the campaign editor. This opens the visual builder where you can select and replace any text on your storefront pages. For example, if your variation offers free shipping above $75 instead of $50, you can update the banner text to match.

Each variation can have its own set of storefront text changes, so the control group sees the original text while variation visitors see the updated messaging.

## Important warnings

**Deactivate the campaign before uninstalling the app.** When you uninstall the Personizely app from Shopify (or disconnect the Shopify integration), the system attempts to restore original shipping methods automatically. However, to ensure that all original methods are fully restored, we strongly recommend manually deactivating the shipping campaign first and verifying that the original rates have reappeared in your Shopify shipping settings before disconnecting.

**Only one active campaign at a time.** You cannot run multiple shipping campaigns simultaneously. If you already have an active shipping experiment or personalization, you must deactivate it before creating a new one.

**Test with a real checkout.** Since shipping rates are served dynamically by Personizely at checkout, the only way to verify the campaign is working correctly is to go through the actual checkout flow. Preview mode does not apply to shipping campaigns.

## Limitations

- Only **one** shipping campaign (experiment or personalization) can be active at a time.
- Carrier-calculated shipping methods cannot be modified.
- Shipping campaigns require the **Shopify** integration to be connected.

***

**Updated:** February 2025

[title] Landing trigger
[path] Widgets/Widget display options/Triggers/

This trigger fires right away when the visitor lands on the page.


[title] Exit trigger
[path] Widgets/Widget display options/Triggers/

This trigger shows when Personizely detects that the visitor might be intending to leave the page. It works differently on mobile and desktop.

### Desktop settings

On desktop, it tracks when the visitor moves his cursor towards the top edge of the page.

**Sensitivity** - the distance from the top edge in pixels where the cursor should reach in order for the trigger to fire.

### Mobile settings

On mobile, there are three fallback options that can help detect when does the visitor intends to leave the page.

**Mobile fallback**

- **Back button** - if checked it will detect when the visitor presses the back button. Note that some browsers are blocking this behavior so we cannot guarantee a 100% firing rate.
- **Focus loss** - if checked it will detect when the website tab loses focus (i.e. another tab is opened, or the address bar is focused)
- **Scroll** - if checked will fire when the visitor scrolls past 50% percent of the page and then scrolls back up, which usually points out to the visitors wanting to see the address bar.

If you uncheck all of these options, then the trigger won't fire on mobile devices.

### Conditions

**Max scroll reached** - this condition will check whether the maximum scroll percent during this pageview is higher or lower than the given value in percent.
**Time spent** - this condition will check whether the time in seconds spent on the current page is more or less than the given value in seconds.


[title] Proceeding to checkout trigger
[path] Widgets/Widget display options/Triggers/

This trigger will fire once the visitor tries to proceed to checkout. It listens to the cart form submit action and to the clicks on the /checkout and /cart/\:productId/\:quantity links. It will prevent the browser from redirecting to the /checkout page and will show the widget up. Once the widget is closed, the checkout procedure will be resumed and the visitor will be redirected to the checkout page.

### Conditions

**Max scroll reached** - this condition will check whether the maximum scroll percent during this pageview is higher or lower than the given value in percent.
**Time spent** - this condition will check whether the time in seconds spent on the current page is more or less than the given value in seconds.

:::hint{type="info"}
This trigger is only available for Shopify and Wix users.
:::


[title] Inactivity trigger
[path] Widgets/Widget display options/Triggers/

This trigger fires after a specific amount of time have passed since the visitor was inactive on the page, or the tab was not active for a specific amount of time.

### Settings

&#x20;**Timeout** - the amount of time in seconds the visitor was inactive on the page.

&#x20;**Change title** - whether you want to change the tab title if the tab is not the currently opened one. Also, display additional parameters.

&#x20;**Flash title** - text for changing the tab title.

&#x20;**Blink title tab** - whether you want the tab title to blink between the original and the flash title.

### Conditions

**Max scroll reached** - this condition will check whether the maximum scroll percent during this pageview is higher or lower than the given value in percent.

**Time spent** - this condition will check whether the time in seconds spent on the current page is more or less than the given value in seconds.


[title] Size
[path] Widgets/Widget elements/Untitled/

Size covers the main ways to define element dimensions using standard CSS values such as fixed, relative, viewport-based, or auto.&#x20;

## Size options

- Width - set a fixed, relative, view, or auto width
- Height - set a fixed, relative, view, or auto height
- Min width - ensure a minimum horizontal dimension
- Min height - ensure a minimum vertical dimension
- Max width - prevent excessive horizontal expansion
- Max height - prevent excessive vertical expansion

## Usage

1. Select the element to be resized.
2. Select the Style section in the right sidebar.
3. Expand the Size tab.
4. Customize width, height, or any min/max properties as needed.

## Notes

If you edit the element while the widget builder is set to mobile view, those changes will apply only to the mobile layout and will not affect the default (desktop) layout.

[title] Order history
[path] Targets/

Targets visitors based on their previous purchase history. This filter allows for advanced segmentation based on how often and what kind of purchases they've made.

### Options

- **Condition**
  - **At least**
  - **Exactly**
  - **Less&#x20;**
- **Count&#x20;**- the number of orders that should have occurred to meet the criteria.
- **Value/items condition&#x20;**
  - **Of any value -** No restriction on the total value of the orders.
  - **With value of at least -** Orders must sum up to a minimum specified value.
  - **With value of less -** Orders must sum up to less than a specified value.
  - **Containing any of the specific items -** Visitors have ordered specific items from your catalog.
- **Order items** (if the "containing any of the specific items" value condition is selected)**&#x20;- t**he product tems that were part of the filtered orders.
- **Time interval/date condition&#x20;**(optional)
  - **In the last -** The number of days in the past during which the interactions should have occurred.
  - **On or after -** A specific date from which the interactions must have occurred.
  - **Before -** A specific date before which the interactions must have occurred.
- **Time interval/date -&#x20;**&#x4E;umber of days or a specific date.

### Use cases

1. **Loyal customer rewards -** Target customers who have placed multiple orders over time with special loyalty rewards or exclusive offers.
2. **Product-specific offers -** Create widgets for customers who have purchased certain items, suggesting complementary products or accessories.
3. **High-value customer segmentation -** Target customers who have spent a significant amount with your business for premium offers.

### Specifics

The historical cutoff point for this filter is the moment the app was installed, and it cannot infer older data. For Shopify, though, Personizely will be able to filter based on historical data if the customer is logged into their account on the store website.

:::hint{type="info"}
This target is only available for Shopify & Wix users now.
:::


[title] UTM Parameters
[path] Targets/

Target visitors based on specific UTM parameters in the URL. UTM (Urchin Tracking Module) parameters are custom text strings appended to URLs to track source, medium, campaign name, term, and content for analytics purposes. By targeting these parameters, you can deliver specific content or offers to visitors arriving from different marketing channels or campaigns.

### Options

The UTM Parameters filter can include several UTM conditions. In case multiple UTM conditions are selected - the filter will match visitors for whom all of the conditions match.

1. **UTM Parameter -** the parameter to be targeted (e.g., "utm\_source", "utm\_medium", "utm\_campaign", "utm\_term", "utm\_content").
2. **Condition**
   - **Is -** The UTM parameter matches the exact value provided.
   - **Is Not -** The UTM parameter doesn’t match the specified value.
   - **Contains -** The UTM parameter has a value that contains the specific substring.
   - **Does Not Contain -** The UTM parameter’s value doesn’t have the specified substring.
   - **Is Empty -** The UTM parameter is present in the URL but doesn't have a value.
   - **Is Not Empty -** The UTM parameter exists in the URL and has a value.
3. **Value -** the value to compare against the UTM parameter value based on the condition.

### Use Cases

1. **Source-specific offers -** Tailor offers or content to visitors coming from specific sources by targeting the "utm\_source" parameter (e.g., display exclusive content for users coming from Facebook or a newsletter).
2. **Ad targeting** - Double down on the offers inside your ads by promoting matching offers when visitors land on your website.
3. **Personalization campaign -** Display customized pages to visitors, using email or marketing campaigns for a personalized website experience, by targeting users with a specific "utm\_campaign" value.
4. **Content variation -** If you're promoting different pieces of content through various channels, use the "utm\_content" parameter to differentiate and engage users based on the content they interact with.
5. **Keyword engagement -** Using the "utm\_term" parameter, engage visitors who arrived through specific keywords or search terms.

### How to Use

1. Access the "Targets" section within the Personizely dashboard.
2. Click "Create target" and name it.
3. Opt for 'Add Filter' and choose 'UTM Parameters'.
4. From the dropdown, select the desired UTM parameter.
5. Choose the appropriate condition. (Multiple UTM Parameters can be selected)
6. Input the value or substring you wish to target in the "Value Input".
7. Save the changes. Your Target is now set to be used in your Widgets and Campaigns.


[title] Widget history
[path] Targets/

Target visitors based on their past interactions with various widgets on your site. This targeting is based on whether they have viewed, submitted a form within, or clicked through a widget.

### **Options**

- **Event**
  - **Viewed -** The visitor has viewed a widget.
  - **Submitted -** The visitor has submitted a form within a widget.
  - **Clicked -&#x20;**&#x54;he visitor has clicked on a button, images, product the widget.
- **Condition**
  1. **At least**
  2. **Less**
- **Count -** the number of times the interaction should have occurred to meet the condition.
- **Widget** (optional) - the specific widget to narrow the filtering down to.
- **Time frame** (optional)
  - **In the last -** The number of days in the past during which the interactions should have occurred.
  - **On or after -** A specific date from which the interactions must have occurred.
  - **Before -** A specific date before which the interactions must have occurred.
  - **During this session -** Interactions that have occurred in the visitor's current browsing session.
- **Time interval/date -&#x20;**&#x6E;umber of days or a specific date.

### **Use cases**

1. **Engagement follow-up -** Target visitors who have viewed a particular widget several times but haven’t interacted, offering them assistance or incentives.
2. **Re-engage past interactors -** Reach out to visitors who clicked on a widget before a certain date, perhaps with updates or new offers.
3. **Session-specific targeting -** Engage visitors who have interacted with a widget during their current session, capitalizing on their immediate interest.

### **How to use**

1. Navigate to the 'Targets' section within the Personizely dashboard.
2. Click "Create target" and name it.
3. Choose 'Add Filter' and select 'Widget History'.
4. First, pick the interaction type (Viewed, Submitted, or Clicked).
5. Choose the frequency condition (At least or Less) and specify the numerical value.
6. Optionally, select a specific widget from the dropdown menu for focused targeting.
7. If needed, define the time frame for the interaction, either by days or specific dates, or choose 'During this session' for immediate session-based targeting.
8. Save the filter settings. The Target is now ready to be used in your Widgets and Campaigns.


[title] Fields
[path] Targets/

Target visitors based on standard fields or user-created custom field values. This powerful tool is ideal for personalizing the experience and ensuring that your messages are relevant to each individual visitor.

### Options

The fields filter can include several field conditions. In case multiple field conditions are selected - the filter will match visitors for whom all of the conditions match.

1. **Field -** a default or a user-created custom field.
2. **Condition**
   - **Is -** The field value must exactly match the specified value.
   - **Is not -** The field value does not match the specified value.
   - **Is empty -** The field value is empty.
   - **Is not empty -** The field has any value.
   - **Contains -** The field contains the specified value (only available for text fields).
   - **Does not contain -**  The field value does not contain the specified value (only available for text fields).
   - **Is checked -** The field value is true (only available for checkbox fields).
   - **Is not checked -** The field value is false (only available for checkbox fields).
   - **Is higher than -** The field value is higher than the provided value (only available for numeric fields).
   - **Is lower than -** The field value is lower than the provided value (only available for numeric fields).
3. **Value -** the value to compare against the field value based on the condition.

### Use Cases

1. **Exclusive offers -** Utilize custom field data like "preferred product category" for tailored promotions.
2. **Age-specific offers -** By using the Birthdate Field, display widgets for 18+ customers
3. **Birthday exclusives -&#x20;**&#x42;y using the Birthdate Field, display exclusive offers on the customer's birthday or proximity of it.
4. **Interest-specific personalization** - Personalize the website based on the answers provided via forms and surveys.

### How to Use

1. Go to the "Targets" section in your Personizely dashboard.
2. Click "Create target" and name it.
3. Select 'Add Filter' and choose 'Fields'.
4. Pick a field to target.
5. Select the appropriate condition for your filter.
6. Type or select the value that the field should be evaluated against.
7. Save the filter. It is now ready to be used in your widgets & campaigns.


[title] Layout
[path] Widgets/Widget elements/Untitled/

Layout controls how child elements or content are arranged, including direction, alignment, justification, wrapping, and gap. It ensures consistent spacing and alignment across different devices.

## Layout options

- **Direction** – sets the main axis of the layout. Determines how child elements are placed inside the parent:
  - *Horizontal* – elements are arranged left to right (`flex-direction: row`).
  - *Vertical* – elements are arranged top to bottom (`flex-direction: column`).
  - *Reverse* – elements are arranged in the opposite order of the selected direction.
    &#x20;For technical details, see the [MDN article on flex-direction](https://developer.mozilla.org/en-US/docs/Web/CSS/flex-direction).
- **Justify** – defines how child elements are distributed along the main axis:
  - *Start* – items are packed at the beginning of the container.
  - *Center* – items are centered along the main axis.
  - *End* – items are packed at the end of the container.
  - *Space between* – items are evenly distributed with equal space between them.
  - *Space around* – items are evenly distributed with space before, between, and after each item.
    &#x20;See the [MDN article on justify-content](https://developer.mozilla.org/en-US/docs/Web/CSS/justify-content) for more.
- **Align** – controls how elements are aligned along the cross axis (perpendicular to the main axis):
  - *Start* – items align to the start of the cross axis.
  - *Center* – items align to the center of the cross axis.
  - *End* – items align to the end of the cross axis.
  - *Stretch* – items stretch to fill the available space along the cross axis.
    &#x20;Learn more in the [MDN article on align-items](https://developer.mozilla.org/en-US/docs/Web/CSS/align-items).
- **Wrap** – determines whether items should stay on a single line or wrap onto multiple lines if space is limited:
  - *No wrap* – all items stay on a single line.
  - *Wrap* – items wrap onto multiple lines as needed.
    &#x20;See the [MDN article on flex-wrap](https://developer.mozilla.org/en-US/docs/Web/CSS/flex-wrap).
- **Gap** – defines spacing between child elements. Controls both horizontal and vertical spacing, equivalent to the CSS `gap` property.
  &#x20;Details can be found in the [MDN article on gap](https://developer.mozilla.org/en-US/docs/Web/CSS/gap).

## Usage

1. Select the element to be styled.
2. Select the Style section in the right sidebar.
3. Expand the Layout tab.
4. Configure direction, justify, align, wrap, and gap as needed.

## Notes

- Child elements or nested containers can have their own layout configuration and do not inherit the parent’s layout properties by default.
- If you edit the element while the widget builder is set to mobile view, those changes will apply only to the mobile layout and will not affect the default (desktop) layout.


[title] Analytics filters
[path] Campaigns  /Analytics/

Filters let you narrow down your widget and campaign reports to a specific segment of traffic, location, acquisition source, or goal criteria. You can combine multiple filters to isolate exactly the data you need.

Most filters are available on the **Advanced Analytics** plan. Visitor type and device filters are available on all plans.

### How to use filters

Click the **Filter** button above any report table or chart. Select a filter from the list, choose an operator, and enter or select a value. Active filters appear as pills above the report. Click the **x** on a pill to remove it.

You can stack multiple filters; they are combined with AND logic, meaning all conditions must be true for a record to be included.

### How filters are structured

Filters are organized into four groups based on what part of the data they operate on:

- **Traffic filters** apply to the widget or campaign event itself — the record created when a visitor sees, clicks, or converts on a widget or campaign. Properties like device type, browser, and operating system are captured at the moment the event is recorded.
- **Location filters** also apply to the widget or campaign event. The visitor's country, region, and city are resolved from their IP address when the event is recorded.
- **Acquisition filters** apply to the visitor record. UTM parameters, referrer, and first visit page are stored once when the visitor first arrives on your site and remain constant across all of that visitor's events.
- **Goal filters** apply to the goal event (e.g., a purchase, add-to-cart, or custom event). These filters narrow down which goal events are counted and summed in revenue-related metrics. They do not affect view, click, submit, or conversion counts on widgets and campaigns.

### Traffic filters

These filters operate on properties captured on each widget or campaign event.

- **Visitor type** — segment by new or returning visitors. A visitor is considered "returning" if their first visit timestamp is earlier than the current session, meaning they have visited your site before. This is determined by comparing the visitor's first-seen date to the event timestamp.
- **Device** — filter by the device type that was used during the event: Desktop, Mobile, or Tablet. You can select multiple values.

### Location filters

These filters operate on the geographic properties recorded on each widget or campaign event, resolved from the visitor's IP address at the time the event occurred.

- **Country** — filter by one or more countries. Uses the two-letter ISO country code (e.g., US, DE, FR).
- **Region** — filter by one or more regions (states, provinces, or administrative divisions) within countries.
- **City** — filter by one or more cities.

### Acquisition filters

These filters operate on properties stored on the visitor record. They reflect how the visitor originally arrived at your site, not how they arrived for a specific event. All acquisition filters require the **Advanced Analytics** plan.

All acquisition filters (except Referrer and First visit page) support the following string operators: contains, equals, starts with, does not contain, does not equal, and is empty.

- **UTM Source** — filter by the `utm_source` parameter captured on the visitor (e.g., google, facebook).
- **UTM Medium** — filter by the `utm_medium` parameter (e.g., cpc, email).
- **UTM Campaign** — filter by the `utm_campaign` parameter (e.g., summer\_sale).
- **UTM Content** — filter by the `utm_content` parameter (e.g., banner\_1).
- **UTM Term** — filter by the `utm_term` parameter (e.g., running shoes).
- **Referrer** — filter by the referring domain or URL stored on the visitor record (e.g., google.com). Supports the same string operators as UTM filters.
- **First visit page** — filter by the landing page path stored on the visitor record (e.g., /products/my-product). This is the first page the visitor saw when they arrived on your site. Supports the same string operators as UTM filters.

### Goal filters

These filters operate on the goal event record — the event created when a visitor completes a tracked action such as a purchase, add-to-cart, checkout start, or custom goal. Goal filters affect which goal events are included when calculating revenue-related metrics (goals hit, revenue, extra value, profit). They do not affect widget or campaign event counts like views, clicks, submits, or conversions.

- **Goal products** — filter goal events by specific products mentioned in the event metadata. For purchase and checkout-start events, product IDs are extracted from the order line items. For add-to-cart events, the product ID is extracted directly from the event metadata. Only available when your platform integration supports product data (e.g., Shopify, Wix, Shoplazza). Select one or more products to see only goals that involve those products.
- **Goal revenue** — filter goal events by their monetary value (the `value` field on the goal event). Supports operators: greater than, less than, equals, and between. Enter values in your store currency. For example, "greater than 10" will exclude any goal event worth $10 or less.
- **Z-score threshold** — exclude statistical outlier orders from revenue metrics. Enter a numeric threshold (e.g., 3) and any goal event whose revenue z-score meets or exceeds that value will be excluded from the report. Events that do not yet have a z-score assigned are always included. This filter only affects revenue-related aggregations (revenue, extra value, profit); goal counts and conversion rates are not affected.

### Understanding the z-score filter

A z-score measures how many standard deviations an individual goal event's revenue is from the average revenue for that event type. For example, if the average purchase is $50 with a standard deviation of $20, a $200 purchase has a z-score of 7.5 — it is 7.5 standard deviations above the mean.

Setting a z-score threshold of 3 tells the report to exclude any goal event with a z-score of 3 or higher, removing unusually large (or small) orders that can skew your revenue metrics.

How z-scores are calculated:

- Z-scores are scoped by event type. Purchases are compared to other purchases, add-to-cart events to other add-to-cart events, and so on. A $500 purchase and a $500 add-to-cart will have different z-scores because they are measured against different distributions.
- The z-score is calculated asynchronously after a goal event with a value is created. The formula is: z-score = (event value - mean) / standard deviation, where the mean and standard deviation are computed across all events of the same type in your store.
- A minimum of 750 events of a given type is required before z-scores are assigned. Until that threshold is reached, events have no z-score and are always included in reports regardless of the filter setting. This ensures the statistical distribution is meaningful before outlier detection begins.
- The filter does not remove events from the report entirely. It excludes them only from the goal event JOIN, so widget and campaign event counts (views, clicks, conversions) remain unchanged. Only the aggregated goal metrics (goals hit, revenue, extra value, profit) are affected.

Choosing a threshold:

- **3** is a common starting point. In a normal distribution, roughly 0.3% of values fall beyond 3 standard deviations, so this excludes only extreme outliers.
- **2** is more aggressive and will exclude more orders (roughly 4.6% of values in a normal distribution).
- **4** or higher is more permissive and will only exclude the most extreme cases.

### FAQ

- **Do filters affect the "winner" suggestion in experiments?**
  Yes. Statistical comparisons and winner logic use the filtered data set, so adding filters can change significance results.
- **Can I save a filter combination?**
  Not yet. Filters are applied per session. When you share a report URL, active filters are encoded in the URL so the recipient sees the same view.
- **Why is a filter grayed out?**
  Filters marked with a plan badge require the Advanced Analytics feature. Upgrade your plan to unlock them.
- **What happens if I combine Goal revenue and Z-score threshold filters?**
  Both conditions apply. For example, "Goal revenue greater than $10" combined with "Z-score threshold less than 3" will show only goal events with revenue above $10 that are also not statistical outliers.
- **Do acquisition filters reflect the current visit or the first visit?**
  Acquisition filters (UTM parameters, referrer, first visit page) are based on the visitor record, which stores the values from the visitor's first arrival. They do not change if the visitor returns via a different source later.
- **Why does the z-score filter show no effect on my data?**
  If your store has fewer than 750 events of a given type (e.g., fewer than 750 purchases), z-scores have not been assigned yet and all events are included. Once the threshold is reached, z-scores are calculated for new events automatically.
- **Does the z-score filter affect conversion counts?**
  No. Conversion counts (the `converted` flag on widget events) are pre-computed and independent of the goal event JOIN. The z-score filter only affects goal-related aggregations: goals hit, revenue, extra value, and profit.

[title] QA Checklist
[path] Campaign types/Product price (Shopify)/

Use this checklist to verify that your product price campaign is correctly set up before launching.

## Preliminary setup

- The Personizely snippet is enabled in the Extensions settings of your store's theme.
- All storefront selectors are configured — see [Price CSS selectors](docId:0HvSlwDNDftvTyXCcs0wz).
- Prices are visibly adjusted in Preview mode. When a price element is correctly detected, it will be highlighted with a red outline.

We recommend contacting our support team for a final review before going live.

## Price adjustments

- Verify that prices have changed correctly according to the defined rules.
- Ensure no other product information has been altered unintentionally.
- Check that product ratings and reviews match the live site.
- Validate that other media (images, videos, text) remain unchanged.
- On the product page, switch between variants to confirm that the price updates correctly.
- Check price and compare-at-price adjustments on the following pages:
  - Homepage
  - Collection pages
  - Search bar and search results
  - Product page
  - Recommended products (e.g. "You May Also Like", "Recently Viewed")
  - Upsells in cart
  - Product quiz
  - Landing pages

## Cart and checkout

- Verify price calculations at all stages: mini-cart, cart page, and checkout page.
- Increase the quantity of the test product to two or more and confirm the price remains correct.
- If your store has custom bundle pricing logic, ensure it functions as expected.
- Test the **Buy with ShopPay** button and confirm prices are displayed correctly. Note: express checkout buttons on collection and product pages may not support price testing.
- Add products from different variation groups and confirm that the correct prices appear at checkout.

## Placing a test order

- Confirm that the cart contains the correct products and variants for the campaign variation.
- Complete a test checkout and verify that the correct prices are shown on the checkout page.

***

For strategy-specific details, see [Cart transform](docId\:Rq4tIMRQgfgM1J69WWmli) or [Duplicate products (clones)](docId\:F_2JV7V90cHnWyDH4LlrV).

[title] Full-stack
[path] Campaign types/

Full-stack A/B campaigns allow using Personizely's JS API to run custom changes right within your code.

## Configuration

Editing each variation opens up a view where you can enable or disable features and define parameter values that will later be used on the frontend.

## Usage

To run the full-stack campaign in your code,  exposes the following functions.

`ply.runCampaign(id)`&#x20;

This method runs a campaign and returns the campaign `variation` instance if not on control, and null if the user falls into the control group (make sure the campaign you are running is of a full-stack type)

`id` - the campaign ID (you can find it in the address bar when editing the campaign)

`variation.getFeature(key)`

Returns the `feature` instance within the variation.

`key` - the `feature` key as specified when creating it



`feature.isEnabled()`

Returns `true` or `false` depending on whether the `feature` is enabled for the current `variation`.



`feature.getParameter(key)`

Returns the `value` of the parameter of the `feature` within the current `variation`.

`key` - the key of the parameter as specified when defining the variation

### Example

```javascript
const variation = ply.runCampaign(1); // 1 is the campaign id
if (variation) {
  const cartFeature = variation.getFeature('cart'); // is the feature id/key
  if (cartFeature.isEnabled()) {
      const message = cartFeature.getParameterValue('message'); // message is the feature parameter
      this.notification.querySelector('.cart-notification__heading').childNodes[1].textContent = message;
  }
}
```


[title] Timeframe
[path] Widgets/Widget display options/Rules/

Using this rule, users can configure widgets to be shown only during a specific timeframe.

This is useful when your website has last hours deals popup widget or any other type of promotion widget.

This rule also allows the configuration of the timezone. If configured - the widget will only show up in the timeframe in the given timezone


[title] Add to cart trigger
[path] Widgets/Widget display options/Triggers/

This trigger fires up when the visitor adds a product to the cart. It listens to the product form submit event. If the store theme redirects the visitor to the cart page when the product is being added to the cart, then Personizely will try to prevent the redirect to show the widget and will resume the default behavior once the widget is closed.

### Conditions

**Max scroll reached** - this condition will check whether the maximum scroll percent during this pageview is higher or lower than the given value in percent.
**Time spent** - this condition will check whether the time in seconds spent on the current page is more or less than the given value in seconds.

:::hint{type="info"}
This trigger is only available for Shopify and Wix users.
:::


[title] Divider
[path] Widgets/Widget elements/Element types/

The divider is a basic element for creating clear separations between different sections or content. It is used to enhance the visual structure and readability of the widget's layout.

****


[title] Hover trigger
[path] Widgets/Widget display options/Triggers/

This trigger will fire once the visitor hovers the cursor over one of the elements specified in the selector settings.

### Settings

**CSS Selectors** - The list of CSS selectors of the elements that when hovered onto should fire the trigger. To learn more about CSS selectors consult [this MDN article](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors).

### Conditions

**Max scroll reached** - this condition will check whether the maximum scroll percent during this pageview is higher or lower than the given value in percent.
**Time spent** - this condition will check whether the time in seconds spent on the current page is more or less than the given value in seconds.

:::hint{type="info"}
**Note:&#x20;**&#x54;his trigger does not work on mobile devices.
:::


[title] Callout widgets
[path] Widgets/Untitled/

Callouts are small widgets that can appear in any corner of the browser window. They have a fixed position and are always visible as the visitor scrolls.

## What's specific to callout widgets?

### Positioning

The bar widgets can be positioned in 4 ways:

- **Top left**
- **Top right**
- **Bottom right**
- **Bottom left**

****


[title] Spacer
[path] Widgets/Widget elements/Element types/

The spacer is a basic element for creating space between different sections or content or elements. It is used to enhance the visual structure and readability of the widget's layout.




[title] Execute JavaScript code
[path] Widgets/Widget elements/Interaction/Automations/

This action executes a JavaScript code on the website.

## Options

**Code** - This should be a valid JavaScript code.

:::hint{type="info"}
Make sure that you don't have eval disabled using [Content-Security-Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy) to use this action.
:::




[title] Time trigger
[path] Widgets/Widget display options/Triggers/

This trigger fires after a specific amount of time have passed since the visitor landed on the current page.

### Settings

**Delay** - the amount of time in seconds spent by the visitor on the page since landing on it.

### Conditions

**Max scroll reached** - this condition will check whether the maximum scroll percent during this pageview is higher or lower than the given value in percent.


[title] Scroll
[path] Widgets/Widget display options/Close triggers/

This trigger fires once the visitor scroll past a certain percent of the page.

### Settings

**Scroll percent** - the percent of the page scroll. Allowed values are 1 to 100.


[title] Triggers
[path] Widgets/Widget display options/

The trigger is the event that makes the widget show up. You can add multiple triggers to a single widget, but the widget will only show up once the first one of them happens.

Every trigger checks for the widget rules to be satisfied before firing up. If the widget rules were not satisfied at the first occurrence of the trigger, the widget still has the change to be shown later if the rules are going to be satisfied when and if the event happens again.


[title] Days of week
[path] Widgets/Widget display options/Rules/

Using this rule, users can configure widgets to be shown only on specific days of the week. For example, only on Fridays, when special offers are active on their websites. Also, users can configure a timezone, for checking the current day of the week, of the visitor. For example, if the timezone is set to +2:00 GMT and in this timezone right now is Friday 22:00, and the widget is set to be shown only on Friday, the visitor from timezone +6:00 GMT will not see it, because in his timezone right is Saturday 2:00 at the morning.&#x20;


[title] Scroll trigger
[path] Widgets/Widget display options/Triggers/

This trigger fires once the visitor scrolls past a certain percentage of the page.

### Settings

**Scroll percent** - the percent of the page scroll. Allowed values are 1 to 100.

### Condition

**Time spent** - this condition will check whether the time in seconds spent on the current page is more or less than the given value in seconds.




[title] Click
[path] Widgets/Widget display options/Triggers/

This trigger will fire once the visitor clicks on one of the elements specified in the selector settings.

### Settings

**CSS Selectors** - The list of CSS selectors of the elements that when clicked should fire the trigger. To learn more about CSS selectors consult [this MDN article](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors).

### Conditions

**Max scroll reached** - this condition will check whether the maximum scroll percent during this pageview is higher or lower than the given value in percent.
**Time spent** - this condition will check whether the time in seconds spent on the current page is more or less than the given value in seconds.



[title] Subdomains
[path] Widgets/Widget display options/Rules/

The subdomains rule allows you to restrict the subdomains on which you want the widget to show up. You can choose whether you want to specify the subdomains where the widget should show up or the ones where it should not. This comes in very handy if you have different parts of your business on different subdomains. For example:

www\.site.com - Your main site
blog.site.com - Your blog
shop.site.com - Your storefront&#x20;

So if you want a widget to only show up on your blog you should specify the **blog&#x20;**&#x73;ubdomain in the rules set.

Note that you should only include the subdomain itself (blog), without the primary domain part (.site.com).


[title] Track widget conversion
[path] Widgets/Widget elements/Interaction/Automations/

This action marks the element activation event which can be a click, submit, timer end, or cart progress amount reached event as a widget conversion. This allows Personizely to calculate the conversion rate of the widget only for the elements you really need to for.


[title] Frequency
[path] Widgets/Widget display options/Rules/

The frequency rule is one of the most important rules because it helps you control how often the widget shows up never to disturb your visitors too much.

This rule has two outcomes you can set up:

**Stop** - telling when the widget stops showing for a visitor. The visitor will never see the widget anymore after this.
**Pause** - telling how much time the widget should wait until it shows up again for a visitor.

Both outcomes can be set up to depend on a number of events:

**Close** - Once the widget is closed use the close button, the backdrop click (if available), or using an element like a button, a form, etc.
**Convert** - Once the widget has converted. This even happens when a form or button that has a "Track widget conversion" automation action assigned to it was clicked.
**View** - Once the widget was viewed a certain amount of times.
**Minimize** - Once the widget was minimized to a teaser. This only works if the widget has an active teaser that is set up to show up once the widget is closed, triggering a minimize event rather than a close one.


[title] Spacing
[path] Widgets/Widget elements/Untitled/

Spacing focuses on the amount of room elements have inside and around them, using margin and padding to create visual separation or grouping.

## Spacing options

- Padding - adds space inside an element, between the content and its boundary
- Margin - adds space outside an element, pushing it away from adjacent elements

## Usage

1. Select the element to be styled.
2. Select the Style section in the right sidebar.
3. Expand the Spacing tab.
4. Adjust padding and margin as needed.

## Notes

If you edit the element while the widget builder is set to mobile view, those changes will apply only to the mobile layout and will not affect the default (desktop) layout.


[title] Widget elements
[path] Widgets/Widget elements/

Work in progress.


[title] Widget types
[path] Widgets/

There are 4 types of widgets in Personizely. Every widget has its own specifics. Most of the differences are about how they show up and how they look, while the inner content is pretty much the same.


[title] Action
[path] Widgets/Widget elements/Interaction/

Action defines what happens when a visitor clicks an interactive element such as a button or image. It allows you to set a direct response or create logic-based flows using conditions.

## Action&#x20;

- **No action** - the element does nothing when clicked.
- **Close widget** - closes or hides the widget.
- **Go to step** - navigates to a specific step within a multi-step widget.
- **Open URL** - opens a specified link in the same tab or a new tab. An \<a> (anchor) element will be used when rendered, permitting opening the link in a new tab. If open in new tab option is selected - the widget will be closed in the current tab automatically.

**Conditional actions** let you set up different actions based on field conditions


[title] Automations
[path] Widgets/Widget elements/Interaction/

The widget elements that the visitor can interact with can have automation actions set up for them. These allow executing certain actions directly on the website or on the Personizely side.

These are the elements that can have automation actions set up for them:

1. Buttons
2. Images
3. Forms
4. Subscribe forms
5. Messenger widgets
6. Timer
7. Cart progress

There are a few built-in actions while more automation options appear once you integrate with other 3rd party tools.


[title] Goals
[path] Widgets/Widget display options/

Goals help track widgets' performance. If your widget's purpose is to push visitors to purchase, submit a form, or visit a certain page, it might make sense to set up a goal for it in order to see the widget's impact on these marketing lifecycle events.

In order for the goal tracking to work, you should have a "Track widget conversion" action on the button or the form element that you have inside the widget. If everything is set up correctly, once the visitor who has converted on a widget reaches the goal, a goal attribution is going to be performed, which you will be able to see in the widget's stats.

## Attribute on view

You can configure the widget to attribute goals even if the widget was only viewed and no conversion happened inside it. This helps greatly in case of experiments with widgets that have no interactive elements like buttons or forms.

To learn more about how to set up a goal, please go to [Goals](docId\:dtHhF1eHGFz5mtHCejNC0).


[title] Container
[path] Widgets/Widget elements/Element types/

A container is a structural wrapper for grouping, organizing, and styling sets of elements under a common parent. It can also be nested inside other containers for more complex layouts. It provides control over layout, spacing, and appearance without altering the content itself.

## Notes

- Overusing nested containers can complicate layouts — use them only when necessary.
- If you edit the container while the widget builder is set to mobile view, those changes will apply only to the mobile layout and will not affect the default (desktop) layout.


[title] Button
[path] Widgets/Widget elements/Element types/

The button element allows creating interactive call-to-action elements to redirect visitors, or perform actions within a widget, like closing or page change.

The label can be edited directly inside the button/option.

## Interaction

The button element can be interactive and run actions upon click. For details on interaction settings, see the [ interactions article](docId\:GiKD86hGqVR22q7p4hUL2).

[title] Timer
[path] Widgets/Widget elements/Element types/

The timer element is a dynamic countdown timer that can be used within widgets, creating urgency or highlighting time-limited offers. It helps encourage immediate action by visitors.

## Settings

**Deadline**
Defines when the countdown ends:

- *Interval* – specific interval from the first time the widget is viewed.
- *Date* – a specific calendar date in the future.

**Units**
Labels of the units used in timer cards:

- Days
- Hours
- Minutes
- Seconds

## Interaction

The timer element can be interactive and run actions upon expiration. For details on interaction settings, see the [interactions article](docId\:GiKD86hGqVR22q7p4hUL2).

[title] Social
[path] Widgets/Widget elements/Element types/

The social button element is a helper element allowing you to quickly add social buttons with links to your brand's social presence.

### Settings

**Buttons**
Offers a selection of icon buttons for major social and media platforms, including Instagram, TikTok, Facebook, Pinterest, Twitter, LinkedIn, Medium, Slack, Product Hunt, VK, YouTube, Twitch, Discord, and Telegram.




[title] Image
[path] Widgets/Widget elements/Element types/

The image element allows embedding images (including GIFs) into a widget, providing a simple way to incorporate visual content. It enhances the widget’s appearance and supports the graphical communication of offers or messages.

## Settings options

**Image URL**
A field to add the direct URL of the image to display. Includes an upload button, allowing upload of proprietary images, as well as using images from Unsplash, Giphy, and Pexels. Max upload size is 2 MB.

The image element can be interactive/clickable and run actions upon click. For details on interaction settings, see the [interactions article](docId\:GiKD86hGqVR22q7p4hUL2).

[title] Headline
[path] Widgets/Widget elements/Element types/

The headline element allows adding headlines and titles. It has a text editing toolbar giving access to formatting options like font weight, font style, color, background, alignment, font family, font size, and more.

The text element also has a Placeholder formatting option, allowing insertion of dynamic personalization values inside text.

[title] Video
[path] Widgets/Widget elements/Element types/

The video element allows embedding a video player into the widget, providing a dynamic and engaging user experience. This feature is suitable for showcasing product videos, tutorials, or any promotional content directly on your website.

### Settings

**Video**

URL - The URL to the video source. Supported URLs/formats: YouTube, Vimeo, Dailymotion, and raw mp4/webm links.

**Autoplay**
Enable or disable automatic playback when the widget is viewed.

**Controls**
Display or hide the video player controls.


[title] Last page view
[path] Targets/

Enables targeted engagement based on a visitor’s most recent page view on your website. This filter is particularly useful for tailoring experiences and messages based on the latest point of a visitor's journey.

### Options

- **View Condition**
  - **was**&#x20;
  - **was not**&#x20;
- **Time Frame**
  - **In the last** - Focuses on visitors whose last page view occurred within a defined number of recent days.
  - **On or after** - Targets visitors whose most recent page view happened on or after a specified date.
  - **Before** - Aims at visitors whose last page view was before a certain date.

### Use cases

- **Time-sensitive re-engagement** - For visitors whose last interaction with your site was a few days ago, as indicated by the 'was' condition set to a specific time frame, create widgets that reignite their interest, perhaps by highlighting what’s new since their last visit.
- **Seasonal or event-based targeting** - For visitors whose last visit coincides with a past season or event (using 'in the last' or 'before' conditions), create tailored content that reflects or builds upon that season or event, enhancing their connection to the experience.
- **Lapsed user re-activation -&#x20;**&#x54;arget visitors who haven’t been to your site for an extended period (using the 'was' condition with a longer time frame) with re-engagement strategies like special welcome back offers or updates on major changes.

### How to use

- Go to the 'Targets' section in your Personizely dashboard.
- Choose 'Add Filter' and select 'Last Page View'.
- Begin by selecting the appropriate condition: was or was not.
- Define the time frame for identifying the last page view, using options like 'In the last', 'On or after', or 'Before'.
- Save the filter settings. The Target is now prepared for use in your Widgets and Campaigns.


[title] First visit
[path] Targets/

Targeted engagement based on a visitor's initial session on your website. This filter is particularly effective for creating a customized experience for first-time visitors, taking into account the entire scope of their first session.

### Options

- **First visit condition**
  - **was** - Targets visitors whose first session occurred under specific conditions.
  - **was not** - Excludes visitors whose first session does not meet the specified conditions.
  - **is now** - Targets visitors currently in their first session on the site.
- **Time frame**
  - **In the last** - Focuses on visitors whose first visit occurred within the specified number of days.
  - **On or after** - Targets visitors whose first visit started on or after a specified date.
  - **Before** - Aims at visitors whose first visit was before a specified date.

### Use cases

- **Welcoming new visitors** - Perfect for offering welcome messages or introductory guides to those in their first session or who recently had their first session.
- **Re-engaging past first-time visitors** - Tailor content for visitors whose first visit was some time ago, offering updates or re-engagement incentives.
- **Custom onboarding experiences -&#x20;**&#x43;reate a tailored onboarding flow for first-time visitors. For example, if their first visit was in the last week, guide them through key features or products on your site.
- **Event-driven engagement** - For visitors whose first visit coincides with a special event or sale period, present relevant event information or exclusive deals.

### How to use

1. Go to the 'Targets' section in your Personizely dashboard.
2. Choose 'Add Filter' and select 'First Visit'.
3. Start by selecting the appropriate first visit condition - was, was not, or is now.
4. Set the time frame for determining the first visit, choosing from 'In the last', 'On or after', or 'Before' and specify the date.
5. Save the filter settings. The Target is now ready to be used in your Widgets and Campaigns.


[title] Visit history
[path] Targets/

Target visitors by their overall session count, offering a broad perspective of user engagement across multiple visits rather than detailed page-by-page interactions.

### Options

- **Visit count**
  - **At least**
  - **Less**
- **Count** - Defines the threshold number of visits to align with the selected frequency condition.
- **Time frame&#x20;**(optional)
  - **In the last** - Targets recent visitor activity within a defined number of days.
  - **On or after** -  Focuses on visitors' interactions starting from a specified date.
  - **Before** - Targets visitor engagement before a specified date.

### Use cases

- **Rewarding Frequent Visitors** - Offer exclusive content or special promotions to frequent site visitors, encouraging continued engagement.
- **Re-engaging Less Active Visitors** - Target visitors with fewer visits, potentially through welcome-back offers or reminders of new features.
- **Time-Bound Engagement** - Engage with visitors who have interacted with your site during specific time frames, such as during a promotional period or after a major update.

### How to use

1. Go to the 'Targets' section in your Personizely dashboard.
2. Choose 'Add Filter' and select 'Visit History'.
3. Start by selecting the visit frequency condition and specifying the number of visits
4. Optionally, define the time frame for the visit count, if applicable. Choose from 'In the last', 'On or after',  or 'Before' and specify the date.
5. Save the filter settings. The Target is now ready to be used in your Widgets and Campaigns.


[title] Page view history
[path] Targets/

Target visitors based on their page viewing patterns on your website. This filter is crucial for understanding visitor engagement and customizing their browsing experience.

### Options

- **View frequency**
  - **At least**
  - **Less**
- **Count** - The number of pages viewed to match the selected frequency condition.
- **Pages&#x20;**(optional) - Allows for targeting based on specific URLs visited by the visitor
- **Time duration&#x20;**(optional) - This setting considers the duration spent on pages, measured in seconds.
- **Time frame&#x20;**(optional) - Establishes the timeframe for the page views.
  - **In the last** - The number of days in the past during which the last page view should have occurred.
  - **On or after** - A specific date from which the page view must have occurred.
  - **Before** - A specific date before the page view must have occurred.
  - **During this session** -  Page views that have occurred in the visitor's current browsing session.

### Use cases

- **Engagement tracking** - Identify visitors who have shown high engagement by viewing several pages, and offer them personalized offers.
- **Low engagement interventions** - For visitors with fewer page views, deploy targeted messages or offers to encourage further engagement.
- **Content-specific targeting** - Use the "Pages" option to target visitors based on their interest in specific content or product categories.

### How to use

1. Go to the 'Targets' section in your Personizely dashboard.
2. Choose 'Add Filter' and select 'Page View History'.
3. Start by selecting the viewing frequency condition and specifying the number of pages.
4. Optionally, add URL paths for specific page targeting.
5. If using time duration, enter the number of seconds and choose more or less.
6. Set the time frame for the page view count, if applicable.
7. Save the filter settings. The Target is now ready to be used in your Widgets and Campaigns.


[title] Targets
[path] /

Targets help you define subsets of you visitors and are used to make sure your campaigns and widgets only show up to the visitors you need them too.

Targets are build out of groups of filters. You can choose the logical operator between groups: AND/OR as well as the grouping operator inside the group: ANY/ALL.

[title] Cart progress
[path] Widgets/Widget elements/Element types/

Tailored for e-commerce to visually represent a customer’s progress towards achieving a specific cart threshold. It aims to incentivize additional purchases by demonstrating how close the customer is to an incentive, like free shipping.

## Components

The element functions through three distinct components or steps, each representing a stage in the customer's shopping journey:

- **Initial -** Displays an opening message to engage the customer.
- **Progress -** When the customer has something in the cart but hasn't reached the threshold yet
- **Final -** When the visitor has reached the threshold

## Settings

- **Amount -&#x20;**&#x54;he monetary threshold in the site's default currency. The amount will be converted automatically for multi-market stores.

## Interactions

The cart progress element can be interactive and run automation upon reaching the threshold. For details on interaction settings, see the [interactions article](docId\:qxtTmtdU5YOn_SheZB9Sm).


[title] First page view
[path] Targets/

Targets visitors during their first page view on your site, focusing on the initial page interaction, unlike the session-wide scope of the First Visit filter. This distinct targeting method is essential for engagements tailored to the very start of a visitor's journey on your website.

### Options

- **First page view condition**
  - **was**&#x20;
  - **was not**&#x20;
  - **is now** - Targets visitors who have just landed on your site and it's their first page view
- **Time frame**
  - **In the last** - Focuses on visitors whose first-page view occurred within the specified number of recent days.
  - **On or after** - Targets visitors whose first page view happened on or after a specific date.
  - **Before** - Aims at visitors whose first page view was before a specific date.

### Use cases

- **Initial Engagement** - Ideal for engaging with visitors at the moment of their first interaction with your site, offering a tailored welcome or introductory content.
- **Historical First Interaction** - Useful for segmenting visitors based on when they first engaged with your site, tailoring subsequent interactions to their initial experience.
- **Differentiating first-time browsers** - Distinguish between visitors who are in their first session and those who are viewing a new page for the first time, tailoring experiences to their unique journey stage.

### How to use

- Go to the 'Targets' section in your Personizely dashboard.
- Choose 'Add Filter' and select 'First Page View'.
- Begin by selecting the appropriate condition - was, was not, or is now.
- Specify the time frame for identifying the first-page view, either by days ('In the last') or by specific dates ('On or after', 'Before').
- Save your settings. The filter is now ready to be used in your campaigns and widgets for tailored visitor experiences.


[title] Rules
[path] Widgets/Widget display options/

Rules are the set of conditions that control whether the widget should show up or not at the moment the trigger is fired. The rules are being checked at the exact moment the trigger happens and if at least one rule's conditions are not satisfied the widget won't show up. It will still have a chance to show up again if the trigger event fires again.


[title] Price adjustment rules
[path] Campaign types/Product price (Shopify)/

This page explains how to configure price adjustment rules in a product price campaign. The rule editor is the same regardless of which strategy is used — [Cart transform](docId\:Rq4tIMRQgfgM1J69WWmli) or [Duplicate products (clones)](docId\:F_2JV7V90cHnWyDH4LlrV).

## Variations table

The variation editor displays a table with the following columns:

**Original — baseline prices**

- **Price** — The original product or variant price.
- **Compare at price** — The original compare-at price, if set.

**Variation — adjusted prices**

- **Price** — The cell where a price rule is applied.
- **Compare at Price** — The cell where a compare-at price rule is applied.

**Product rows:**

- If a product has only **one variant**, a single row is shown.
- If a product has **multiple variants**, the table shows a collapsed product row with the price range. Individual variant rows can be expanded using the chevron icon next to the product name.

## Setting a rule

Click any cell in the variation column to open the rule editor. A rule consists of three parts:

### Action

- **Set** — Assigns a fixed price, ignoring the original.
- **Increase** — Adds to the original price.
- **Decrease** — Subtracts from the original price.

### Value

The amount to set, add, or subtract. Can be specified as a **fixed amount** (in the store's default currency) or as a **percentage** relative to the original price.

### Rounding

Rounding applies only to **Increase** and **Decrease** rules. It is not available for **Set**, since the price is already fixed.

| Option                    | Description                                                                                                                             |
| ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| **Don't round**           | Keeps the exact calculated result.                                                                                                      |
| **Round**                 | Rounds to the nearest whole number.                                                                                                     |
| **Round with .99**        | Rounds to the nearest whole number, then subtracts $0.01.                                                                               |
| **Round upward**          | Rounds up to the next whole number (ceiling). If the result is already a whole number, it stays unchanged.                              |
| **Round upward with .99** | Rounds up to the next whole number, then subtracts $0.01. If the result is already a whole number, adds $0.99 instead (see note below). |

## Rounding examples

Original price: **$49.99**, rule: **Decrease by 15%** → calculated result: **$42.4915**

| Rounding option       | Result |
| --------------------- | ------ |
| Don't round           | $42.49 |
| Round                 | $42.00 |
| Round with .99        | $41.99 |
| Round upward          | $43.00 |
| Round upward with .99 | $42.99 |

Original price: **$50.00**, rule: **Decrease by 10%** → calculated result: **$45.00** (whole number)

| Rounding option       | Result |
| --------------------- | ------ |
| Don't round           | $45.00 |
| Round                 | $45.00 |
| Round with .99        | $44.99 |
| Round upward          | $45.00 |
| Round upward with .99 | $45.99 |

**Note on Round upward with .99 and whole numbers:** When the calculated price lands exactly on a whole number (e.g. $45.00), this option adds $0.99 rather than subtracting $0.01. This results in $45.99 instead of $44.99. If you want the lower .99 price in this case, use **Round with .99** instead.

## Product-level vs variant-level rules

A rule can be set at the product level or for a specific variant.

- A **product-level rule** applies to all variants of the product.
- A **variant-level rule** overrides the product-level rule for that specific variant.

This is useful when most variants share the same adjustment but one or two need a different price.

## Adding and removing products

Below the table, a product selector allows adding products to the campaign. Adding a product to one variation automatically adds it to all other variations as well.

Each product can only appear once per campaign. If a product is part of multiple active campaigns, only the first active campaign will apply its rules.

For an overview of product price campaigns and strategy selection, see [Product price (Shopify)](docId\:F-HZyVG5wdCdrRsgDv965).

[title] Product pages with tags
[path] Widgets/Widget display options/Rules/

This rule allows restricting the pages where the widget shows up to the pages of the products that have some specific tags.

:::hint{type="info"}
This trigger is only available for Shopify users now.
:::


[title] Product pages
[path] Widgets/Widget display options/Rules/

This rule allows restricting the pages where the widget shows up to the pages of specific products.

:::hint{type="info"}
This trigger is only available for Shopify and Wix users now.
:::




[title] Pages
[path] Widgets/Widget display options/Rules/

The pages rule allows restricting the pages on which the widget should show up. You can choose whether you want to specify the pages where the widget should show up or the ones where it should not.&#x20;

The pages should include just the URL path, without the `https://` part and domain.

**Correct examples:**

`/products` ✅
`/contact-us` ✅
`/` ✅

**Bad examples:**

`/www.site.com` ⛔️&#x20;
`www.site.com` ⛔️
`https://site.com/product` ⛔️
`site.com` ⛔️

To show a widget on the homepage, just use `/`&#x20;

You can also use wildcards inside the paths to specify multiple pages based on their structure. There are two types of wildcards:

**Singe wildcard - it matches any symbol except for a slash&#x20;**`/`**. It is used in the following way:**

`/products/*/*` - in case the URL you want to target is `/products/shoes/leather-trainers`

**Double wildcard - it matches any symbol. It is used in the following way:**

`/en**` - this will work for any URL starting with `/en` like `/en/`, `/en/products`, or `/en/products/shoes`






[title] Change field value
[path] Widgets/Widget elements/Interaction/Automations/

This action changes a given field value of the current visitor. The value is being changed instantly and then being sent to the server. All of the default and custom fields are available to be changed and the options are going to appear based on the type of field you select to change the value for.


[title] Embedded widgets
[path] Widgets/Untitled/

Embeds are the widgets that are embedded directly in your site's content, making them blend in and look like they are an organic part of the website.

## Embedding widgets into your website

There are two ways you can embed widgets in your website and both require you to insert a little piece of code in order to tell Personizely where you want the widget to appear.

### Embeddable code

When selecting this option, you will be provided with an HTML code which you'll have to put inside your website. The widget will show up in the exact same place. Note that the page where you place the embed has to have the Personizely code installed and running on it.

### Placeholder

You can place your embedded widget inside any of the placeholders you created. To learn more about placeholders go to [Placeholders](docId\:CHJhhnOOr-VxLqf4b7dzA).

## What's specific to callout widgets?

### No close button

Embeds can not be closed as they are parts of the website.

### No show-up animation

Embeds are automatically showing up using a short fade transition.

### No teaser step

Embeds don't have the possibility for a teaser step to be set up.

### Width

Embed allow selecting between whether its element should full 100% of their parent or whether the content of the widget is limited to a certain width.&#x20;



:::hint{type="info"}
The widget will only show up once on a page, even if you insert the embeddable code twice.
:::


[title] Send alert
[path] Widgets/Widget elements/Interaction/Automations/

This action sends an HTTP webhook request to the given URL.

## Options

**Subject** - The subject of the email alert. It will have `Personizely:` prepended when sent.

**Emails** - The list of email addresses that should receive the alert.

**Only include the fields from the form** - If left unchecked, the alert will also include any other fields present on the visitor profile besides the fields from the current form/element.



The email will be sent from **Personizely** \<alerts\@personizely.net>.






[title] 
[path] Widgets/


[title] Form
[path] Widgets/Widget elements/Element types/

The form element is designed for collecting user data through a wide range of fields, supporting both standard and custom inputs. It allows flexible data gathering for subscriptions, lead capture, and other purposes.

## Settings

**Fields**
Manage the fields included in the form. Standard fields (e.g., first name, email, phone) and custom fields can be added, edited, or removed. Custom fields enable collecting data specific to your needs. The order of the fields can be changed using drag and drop.

**Filled fields**
Controls how fields that already have data (prefilled) are handled:

- *Show empty* – displays only empty fields to the user.
- *Show prefilled* – shows all fields, even if they are prefilled with known user data.
- *Hide* – hides fields that already have data, streamlining the form to avoid redundant input.

## Interaction

The form element is interactive and runs actions upon submission. For details on interaction settings, see the [interactions article](docId\:qxtTmtdU5YOn_SheZB9Sm).

[title] Coupon
[path] Widgets/Widget elements/Element types/

The Coupon element is designed to display discount codes within a widget, allowing users to promote special offers or discounts in a clear and actionable way.

This is an interactive element that copies the coupon code to the clipboard upon click.

## Settings

**Discount**
The specific discount code to be used (e.g., SALE2024).

**Message**
The message that is shown when the coupon is clicked. By default, this is set to “COPIED!”, but it can be customized.

**Auto apply&#x20;**(Shopify only)&#x20;
Enables automatic application of the discount code at checkout without requiring the user to manually enter it or click the coupon.

**Time limit&#x20;**(Visible when Auto apply is enabled)&#x20;
Allows setting a time-based restriction for how long the coupon remains active, configurable in minutes, hours, or days.


[title] Text
[path] Widgets/Widget elements/Element types/

The text element allows adding body text. It has a text editing toolbar giving access to formatting options like font weight, font style, color, background, alignment, font family, font size, and more.

The text element also has a Placeholder formatting option, allowing insertion of dynamic personalization values inside text.

[title] Widget experiments and A/B testing
[path] Widgets/

In Personizely, you can create A/B tests and multivariate tests. These allow you to create different versions of a widget and track which one of them performs better.

You can create up to five variations of a widget and give each of them a specific share. The A/B test distribution is being done using JavaScript's `Math.random()` function.

When creating an experiment, you can select the primary metric that you want to track. This is going to be the default metric selected in the experiment report.

You can also enable a control group. Visitors who fall into the control group won't see the widget but a view is going to be attributed if at least one of the triggers from the other variations has fired, so if your variation has a Time trigger set to 15 seconds, the control group view will only be attributed once 15 seconds pass, even if the visitor is in the control group.

When the control group is enabled, the Goal Conversion Rate (Goal CVR) for this group is calculated based on Reach rather than Conversions.

Note that having multiple variations with different triggers, as well as a control group, can skew the number of views, so you might need more traffic/views to get any sensible results for your experiments.

## Things that are specific to each variation

### Steps and design

All the visual and interactivity settings of the widget are variation-specific and will only affect the variation you are currently editing. This allows for creating totally different versions of the widget, both visually and conceptually.

### Triggers

You can use a different set of triggers for each variation to test which triggers perform better for your widgets.

### Hide triggers

You can choose different close triggers for each variation to test which close triggers perform better for your widgets.

[title] Overview
[path] /

This is the Personizely product documentation. All of the product specifics with technical details are described here. Please note that this directory does not contain any tutorials but succinct documentation of all the existing features and the way they work and can be configured.


[title] Template (Shopify)
[path] Campaign types/

Theme campaigns allow you to assign different theme templates to each variation in your store’s theme. This can be useful for implementing completely new layouts of your pages, which are built natively in your Shopify theme.

## How it works

1. **Creating the campaign** – First, select the original template that will trigger the campaign, and then select one or more **variation templates** from your available Shopify theme's templates for the selected type - Home, Product, Collection, Blog, Page. You can later select more original trigger templates within a single campaign.
2. **Activating the campaign** – Once activated, Personizely automatically redirects visitors to a **Shopify template link** for the assigned variation template.
3. **Redirection**
   - The redirect occurs immediately as the visitor lands on your site to avoid any visual flash or inconsistency.
   - Query parameters like `view` are automatically removed from the URL after redirection to make the experience seamless and transparent to the visitor.
4. **No flicker experience** – To ensure a seamless redirect and eliminate flicker, the Personizely script should be loaded in **synchronous mode** (non-async), allowing it to run as early as possible.

## Configuration

For each variation, you can select the template assigned to it. You can also create new templates right from the template submenu. This would clone the original template, which you can later edit in your Shopify theme editor.

You can assign multiple template types within a single campaign.

## Requirements

- The variation templates must exist in your active Shopify theme.
- The Personizely script must be installed synchronously for the redirect to occur instantly.

:::hint{type="warning"}
The campaign changes are linked to the active theme. Once you switch the theme, the campaign will not run, and you'll have to recreate it.
:::




[title] Target
[path] Widgets/Widget display options/Rules/

This rule is one of the most powerful ones and allows you to set up who sees your widget. You can select multiple targets and choose whether the visitor should be or not match any or all of them in order for the widget to show up.

For more information about targets please go to [Targets](docId\:w8HMXSMdf8C__dC_ZP3RY).


[title] Bar widgets
[path] Widgets/Untitled/

Bars are the widgets that appear at the top or bottom of the browser window and take the full width of the page. They have a fixed position and are always visible as the visitor scrolls.

## What's specific to bar widgets?

### Positioning

The bar widgets can be positioned in 3 ways:

**Over** - The widget is going to be positioned at the top of the window, while also pushing all of the content down by its own height.
**Top** - The widget is going to be positioned at the top of the window while covering the page content.
**Bottom** - The widget is going to be positioned at the bottom of the window.


[title] Popup widgets
[path] Widgets/Untitled/

Popups are the widgets that appear in the middle and cover all of the site's content. They prove to be one of the most effective ones, while also being the most intrusive ones too.

## What's specific to popup widgets?

### Backdrop

The popup widget is the only one that has a backdrop. The backdrop is the layer that covers the website and is located between the popup and the site's body itself. The backdrop has the following settings:

**Color** - The color of the backdrop
**Opacity** - How opaque should the backdrop be, the more opaque, the less website content is going to be visible
**Blur** - How much blur should be applied to the site content
**Action** - The action which should be performed if the visitor clicks on the backdrop. Can be set to close the popup or to do nothing.




[title] Show widget
[path] Widgets/Widget elements/Interaction/Automations/

This action allows showing a different Personizely widget. It doesn't matter what triggers does the widget that is set up to show has - it will show it anyway.

## Options

**Widget** - The widget that needs to show up once this action is executed

**Suppress rules** - Whether to ignore any rules set up on the widget to be shown up. If this is not checked then the widget might not show up if some of the rules set up for it are not satisfied.


[title] Time
[path] Widgets/Widget display options/Close triggers/

This trigger fires after a specific amount of time have passed since the widget showed up.

### Settings

**Delay** - the amount of time in seconds since the widget showed up.


[title] Widget steps
[path] Widgets/

# Steps

Every widget in Personizely can have multiple steps by default. This feature can be used to set up form success steps, display coupons upon form submission, or create multi-step forms and surveys. You can add as many steps as you need, by creating ones from scratch or by cloning existing ones. Please note that the widget width is the same across steps, so if you resize one of the widget's steps horizontally, it's going to affect all steps. To switch between steps you have to set up elements like **Button**, **Form**, **Subscribe**, **Image** or Timer to **Change step** as their primary action.

The widgets step is being remembered across page views, so if the visitor switches to a different step, using an element that doesn't have a **Track widget conversion** automation action, the widget will open for him at the same step that he left on. This allows progressively collecting form data from your visitors.

# Teaser step

Popups, callout, and bar widgets have the option to enable a teaser step for them. This step allows showing a little teaser element before the widget trigger fires or after the widget is closed (minimized). Teasers come in 2 shapes:

### **Tab teaser**

The tab appears in a corner of the screen and looks like a tab. It only has a single text element that can be edited to reflect the offer.

### Box teaser

The box can be placed on any edge of the screen and is more like a Personizely widget as you can add multiple elements unto it, like image, text, and HTML code.

## Teaser display options

The teaser can be set up to show up in 2 situations:

### Before trigger

If this option is selected the trigger will appear before the widget trigger is fired. The teaser can be triggered in a few different ways itself:

- Time - after a given delay since the page load
- Scroll - after the visitor scrolls past a certain percent of the page

### After closed

If this option is selected the teaser will show up once the visitor closes the widget using the close button, the backdrop, or an element with a close action as the primary one.

****




[title] Survey
[path] Widgets/Widget elements/Element types/

The survey element allows collecting user responses directly within the widget by linking buttons to answers for a specific field. It’s used for gathering feedback, preferences, building quizzes, or collecting other targeted input from visitors.

## Settings

**Field**
A mandatory field that the survey will use to save the data. Custom fields can be created by clicking the "+" button next to the select input.

When a text field is selected, it is possible to add arbitrary values, whereas when a field with predefined options is used, the options will be hardcoded.

The options can be reordered using drag and drop.&#x20;

The labels can be edited directly inside the button/option.

## Interaction

The survey element is interactive and runs actions upon click or submission. For details on interaction settings, see the [interactions article](docId\:GiKD86hGqVR22q7p4hUL2).

[title] HTML Code
[path] Widgets/Widget elements/Element types/

The HTML Code element enables the integration of custom HTML, allowing for significant customization within widgets. This feature is particularly useful for adding unique design elements, specialized functionalities, or embedding external HTML-based content.

The HTML will be sanitized in the visual editor while the raw HTML will be used on the live site.

## Settings

**HTML**
The HTML code to display.


[title] Map
[path] Widgets/Widget elements/Element types/

The map element allows embedding a map into a widget. It is typically used to display locations or provide geographical context within a widget.

### Settings

**Map URL**
The URL of the location you want presented on the map. Only Google Maps is supported. Example format: *https\://www\.google.com/maps/place/East+Palo+Alto,+CA*




[title] Dashboard
[path] /

The dashboard presents you with an overview of all of the important metrics within Personizely. These metrcis are:

### Campaign views

The number of times your personalization campaigns have been viewed in the given period. The control variation views are also counted here.

### Widget views

The number of times your widgets have been viewed in the given period.

### Widget reach

The number of unique visitors that have seen your widgets in the given period.

### Widget conversions

The number of times a visitor has converted on a widget. The widget has to have an element with a *Track widget conversion* action in order for the conversion event to be registered and displayed here.

### Earned

The total value earned by Personizely. This includes both the widgets and the campaign attributed earnings. If the visitor sees a campaign or converts on a widget and then proceeds to hit a goal, within the attribution window period, the value of that goal is going to be attributed to them and it will add up to show this metric in the dashboard.

### New contacts

The total number of new contacts generated by forms inside Personizely widgets.

## Filtering

The metrics can be filtered by date. There are four timeframes:

1. Day - the metrics for the last 24 hours
2. Last week - the metrics for the last week
3. Last month - the metrics for the last month
4. Overall - the metrics for all time


[title] Account
[path] /

Personizely accounts are the primary entity that owns everything in Personizely. An account can own multiple users and multiple websites.&#x20;

The following account settings are available:

- Email - used to send all the important account communication
- Name - the company/account owner name

## Users

In Personizely an account can have multiple users. There are 2 user roles:

- User - has the ability to manage everything inside the websites, like the Widgets, Campaigns, and Targets. But has no access to the website and account Settings.
- Admin - has full privileges

## Website

For every website where you want to use Personizely, you create a new Website which is a sandboxed workspace with its own settings, widgets, and campaigns. To be able to create multiple websites in a single account you have to be on a special billing plan.

## Account termination

You can terminate your account and all of your data is going to be removed, without a way to revert it back. Any of your active subscriptions will be canceled.

## GDPR

You can review and accept the GDPR agreement by signing it with your name. This will mean your acceptance of Personizely's GDRP policy.


[title] Settings
[path] /

All the settings are referring only to the website you have currently selected.&#x20;

## Domain

The website domain is only used for reference and is not affecting any functionality. It is also used to prefill some fields in widgets and campaigns configuration so it is better to have the domain here exactly as it shows up in the address bar when you have your website open.

## Currency

The currency is used to display your revenue stats in the currency used by your site/store. Also, it is going to be used to preview Cart progress and Product elements in widgets.

## Cookie lifetime

Cookie lifetime defines the amount of time the cookies created by personizely are going to be kept into your visitors' browser. Cookies are used to track visitor activity and campaign/widget interaction history. Please refer to your country/region regulation in order to select the correct value for your site.

## Personizely branding

Whether to show a small "Powered by Personizely" piece inside Personizely widgets.


[title] Referrer
[path] Targets/

Target visitors based on the external source or web page that directed them to your website. It allows for a comprehensive understanding of traffic sources, ensuring personalized experiences for visitors coming from specific platforms, sites, or campaigns. Referrer data persists across sessions, capturing the visitor's initial entry source.

### Options

1. **Condition**
   - **is -** Targets visitors coming from the specified referrer.
   - **is not -** Excludes visitors coming from the specified referrer.
   - **contain -** Targets visitors whose referrer URL includes the specified value.
   - **does not contain -** Targets visitors whose referrer URL doesn’t include the given value.
   - **is empty -** Targets visitors who arrive without a referrer (direct visits).
   - **is not empty -** Targets visitors who have a referrer (dynamic).
2. **Value**   &#x20;\- the referrer URL or substring to match the selected condition.

### Use cases

1. **Social Media Campaigns -** Identify visitors coming from a particular social media platform or campaign.
2. **Partner Websites -** Engage users referred from partner sites differently, offering them exclusive deals or content to reinforce partnership benefits.
3. **Direct Traffic Engagement -** Using the "is empty" condition, you can specifically target users who directly visit your website without any external referral, suggesting a pre-existing awareness or loyalty.

### How to Use

1. Navigate to the 'Targets' section within the Personizely dashboard.
2. Click "Create target" and name it.
3. Choose 'Add Filter' and select 'Referrer'.
4. Begin by selecting a referrer condition.
5. After condition selection, input the specific referrer URL or string.
6. Save the filter settings. The Target is now ready to be used in your Widgets and Campaigns.


[title] Entry page
[path] Targets/

Target visitors based on the first page they visit on your website, during their initial session. The entry page data is stored by Personizely and is available across all sessions. Customizing interactions based on the entry page can help better identify user intent.

### Options

1. **Condition**
   - **Is -** The entry page URL  matches the specified string.
   - **Is not -** The entry page URL doesn't match the specified string.
   - **Contains -** The entry page URL includes the specified string.
   - **Does not contain -**  The entry page URL doesn't include the specified string.
   - **Is empty -** There is no entry page URL
   - **Is not empty -** Any entry page URL is detected.
2. **Value -** the path value according to the selected condition. Only specify the path part starting with `/`.

### Use Cases

1. **Welcome campaigns -&#x20;**&#x54;rigger a welcome message or special offer when a user lands on your homepage or a specific promotional page.
2. **Category interest -** If the first page a visitor lands on is a product category, use the Contains condition to show more products from that category or provide specific offers.
3. **Exclusive campaigns -&#x20;**&#x42;y running email or ad campaigns, display exclusive or promotional offers.&#x20;

### How to Use

1. Go to the Targets section within the Personizely dashboard.
2. Click "Create target" and name it.
3. Click 'Add Filter' and select 'Entry Page'.
4. Choose the relevant condition to match your visitors' entry page.
5. Input the specific value or string to compare against the entry page URL.
6. Save the filter. You can now use it in your widgets & campaigns.


[title] Customer
[path] Targets/

Specific to Shopify integration and allows for targeted interactions based on a Shopify customer's account status and associated tags. This filter enables Personizely users to engage Shopify customers in a more segmented manner, delivering personalized experiences based on their profile tags within Shopify.

### **Options**

1. **Condition**
   - **Has an account -** Targets all Shopify customers who have an account.
   - **Has an account with tags -** Targets Shopify customers who have an account and one or more tags.
2. **Tag condition** (Only appears if "**Has an account with tags**" is selected):
   - **Any of -** Customer has at least one of the specified tags.
   - **None of -** Customer has none of the specified tags.
   - **All of -** Customer has all of the specified tags.
3. **Tags -&#x20;**&#x74;he tags list if the filter condition is "Has an account with tags".

### **Use Cases**

1. **VIP Engagement -** If you have a "VIP" tag for certain customers in Shopify, use the "Any of" condition to offer special promotions or exclusive previews to these high-value customers.
2. **New Customer Onboarding -** If new customers are tagged as "New" in Shopify, use this filter with the "Any of" condition to present a welcome series or special discounts to improve first-time customer experience.
3. **Product Interest Segmentation -** If you tag customers based on the types of products they buy (e.g., "Electronics", "Clothing"), use the "Any of" condition to show related products or offers.
4. **Subscription Status -** If you tag customers based on their subscription status (e.g., "Subscriber", or "Non-Subscriber"), you could use the "All of" condition to tailor campaigns specifically towards either group.

### **How to Use**

1. Navigate to the 'Targets' section in the Personizely dashboard.
2. Click "Create target" and name it.
3. Choose 'Add Filter' and select 'Customer Tags'.
4. Choose between "Has an account" or "Has an account with tags".
5. If the latter is selected, another dropdown will appear. Choose between "Any of", "None of", and "All of".
6. Manually input the relevant tags in the blank field.
7. Confirm and save your filter settings. Now you can use this target for your widgets and campaigns.

### **Notes**

- Tags are case-sensitive, so make sure to enter them exactly as they appear in Shopify.

:::hint{type="info"}
This target is only available for Shopify users now.
:::


[title] Browser
[path] Targets/

Target visitors based on the web browser they use to access your site. Recognizing the type and version of the browser is key for tailoring experiences, ensuring content compatibility, and capitalizing on browser-specific functionalities.

### **Options**

Users can make a selection from a dropdown menu, which lists a variety of popular web browsers, including but not limited to Chrome, Firefox, Safari, Edge, Internet Explorer, Opera, and others.

### **Use Cases**

1. **Browser-specific customizations -** Deliver tailored experiences, such as promoting a Chrome extension solely to Chrome users or guiding Edge users towards features optimized for their browsers.
2. **Strategic promotions** - If partnering with a specific browser brand or promoting browser-specific products/services, use the filter to target ads, banners, or promotions to users of that specific browser.
3. **Personalized recommendations** - For websites offering tools or plugins, offer browser-specific recommendations. For instance, present browser themes or add-ons that are compatible with the user's current browser.

### **How to Use**

1. Navigate to the 'Targets' section of the Personizely dashboard.
2. Click "Create target" and name it.
3. Choose 'Add Filter' and then select 'Browser' from the available options.
4. From the dropdown, pick the browser(s) you wish to target
5. Confirm your choice, and save the filter. Now it can be used in your widgets & campaigns.

### **Notes**

- Due to the diverse nature of how different browsers interpret and display web content, the "Browser" filter becomes indispensable for creating experiences that resonate with every user.


[title] Cart value
[path] Targets/

Target visitors based on the total monetary value of items present in their shopping cart. By gauging the cart's value, you can employ nuanced strategies to encourage finalization of the purchase, upsell, or provide relevant incentives.

### **Options**

1. **Condition**
   - **At least -** Targets visitors whose cart value meets or exceeds a specified amount.
   - **Less -** Targets visitors whose cart value is under the designated amount.
2. **Value -&#x20;**&#x74;he monetary amount to compare against the cart value based on the condition. The value here is configured in the store's base currency but will be converted accordingly based on the currency selected by the site visitors.

### **Use cases**

1. **Threshold offers -** When a visitor's cart value is just below a free shipping threshold (e.g., $50), use the "At Least" condition to offer an incentive to add more items and achieve free shipping.
2. **Personalized upselling -** If a visitor's cart value reaches a premium tier, use the "At Least" condition to show them exclusive or premium products that align with their apparent spending preferences.
3. **Budget shoppers -** Identify visitors using the "Less" condition who have lower cart values and offer them deals, discounts, or product recommendations that suit a tighter budget.

### **How to use**

1. Access the 'Targets' section within the Personizely dashboard.
2. Click "Create target" and name it.
3. Select 'Add Filter' and select 'Cart Value'.
4. Start by picking a condition — either "At Least" or "Less".
5. Post-condition selection, input the desired monetary amount as the threshold.
6. Confirm the settings and save the filter. The Target is now ready to be used in your Widgets.

:::hint{type="info"}
This target is only available for Shopify & Wix users now.
:::


[title] Targets
[path] Public API/


[title] Get per-variation results for a widget experiment
[path] Public API/Widgets/

{
  "id": "MHPcD8zwbqbmJn-Frr9fU",
  "type": "api-oas-v2",
  "data": {
    "method": "GET",
    "url": "/v1/widgets/{id}/experiments/{experimentId}/results",
    "servers": [],
    "name": "Get per-variation results for a widget experiment",
    "description": "",
    "contentType": "application/json",
    "request": {
      "pathParameters": [
        {
          "kind": "required",
          "name": "id",
          "type": "string",
          "description": "",
          "pattern": "\\d+"
        },
        {
          "kind": "required",
          "name": "experimentId",
          "type": "string",
          "description": "",
          "pattern": "\\d+"
        }
      ],
      "headerParameters": [],
      "queryParameters": [
        {
          "kind": "optional",
          "name": "websiteId",
          "type": "string",
          "description": "",
          "default": null,
          "pattern": "\\d+"
        },
        {
          "kind": "optional",
          "name": "goal",
          "type": "string",
          "description": "<p>Goal id (defaults to the widget primary goal)</p>",
          "default": null,
          "pattern": "\\d+"
        },
        {
          "kind": "optional",
          "name": "compareMetric",
          "type": "string<Choice>",
          "description": "<p>Metric used for significance + improvement. Defaults to the experiment's primaryMetric (mapped to its rate equivalent). Allowed: conversionRate, completionRate, goalConversionRate, valuePerVisitor, profitPerVisitor, extraValuePerVisitor.</p>",
          "default": null,
          "format": "Choice",
          "enum": [
            "conversionRate",
            "completionRate",
            "goalConversionRate",
            "valuePerVisitor",
            "profitPerVisitor",
            "extraValuePerVisitor"
          ]
        },
        {
          "kind": "optional",
          "name": "filters",
          "type": "object",
          "description": "<p>Report filters as a map. Use as ?filters[fieldName]=value (or ?filters[fieldName][]=v1&#x26;filters[fieldName][]=v2 for arrays).</p>",
          "schema": [
            {
              "name": "dateFrom",
              "kind": "optional",
              "type": "string<date-time>",
              "description": "",
              "format": "date-time"
            },
            {
              "name": "dateTo",
              "kind": "optional",
              "type": "string<date-time>",
              "description": "",
              "format": "date-time"
            },
            {
              "name": "device",
              "kind": "optional",
              "type": "array",
              "description": "",
              "example": "",
              "itemType": "string",
              "customType": "string[]",
              "itemExample": "",
              "itemDefault": ""
            },
            {
              "name": "browser",
              "kind": "optional",
              "type": "array",
              "description": "",
              "example": "",
              "itemType": "string",
              "customType": "string[]",
              "itemExample": "",
              "itemDefault": ""
            },
            {
              "name": "os",
              "kind": "optional",
              "type": "array",
              "description": "",
              "example": "",
              "itemType": "string",
              "customType": "string[]",
              "itemExample": "",
              "itemDefault": ""
            },
            {
              "name": "country",
              "kind": "optional",
              "type": "array",
              "description": "",
              "example": "",
              "itemType": "string",
              "customType": "string[]",
              "itemExample": "",
              "itemDefault": ""
            },
            {
              "name": "region",
              "kind": "optional",
              "type": "array",
              "description": "",
              "example": "",
              "itemType": "string",
              "customType": "string[]",
              "itemExample": "",
              "itemDefault": ""
            },
            {
              "name": "city",
              "kind": "optional",
              "type": "array",
              "description": "",
              "example": "",
              "itemType": "string",
              "customType": "string[]",
              "itemExample": "",
              "itemDefault": ""
            },
            {
              "name": "utmSource",
              "kind": "optional",
              "type": "string",
              "description": ""
            },
            {
              "name": "utmMedium",
              "kind": "optional",
              "type": "string",
              "description": ""
            },
            {
              "name": "utmCampaign",
              "kind": "optional",
              "type": "string",
              "description": ""
            },
            {
              "name": "utmContent",
              "kind": "optional",
              "type": "string",
              "description": ""
            },
            {
              "name": "utmTerm",
              "kind": "optional",
              "type": "string",
              "description": ""
            },
            {
              "name": "referrer",
              "kind": "optional",
              "type": "string",
              "description": ""
            },
            {
              "name": "firstVisitPage",
              "kind": "optional",
              "type": "string",
              "description": ""
            },
            {
              "name": "visitorType",
              "kind": "optional",
              "type": "string<new | returning>",
              "description": "",
              "enum": [
                "new",
                "returning"
              ]
            },
            {
              "name": "goalValue",
              "kind": "optional",
              "type": "number",
              "description": ""
            },
            {
              "name": "zScore",
              "kind": "optional",
              "type": "number",
              "description": ""
            }
          ]
        }
      ],
      "bodyDataParameters": [],
      "formDataParameters": [],
      "oAuthParameters": [
        {
          "id": "bearer",
          "name": "bearer",
          "kind": "optional",
          "type": "http",
          "scheme": "bearer"
        }
      ],
      "cookieParameters": []
    },
    "responses": [
      {
        "statusCode": "200",
        "description": "Returned when successful",
        "jsonExample": "",
        "isExpanded": true
      },
      {
        "statusCode": "404",
        "description": "Widget or experiment not found",
        "jsonExample": "",
        "isExpanded": true
      }
    ],
    "hasXCodeSamples": false
  },
  "children": [
    {
      "text": ""
    }
  ]
}
[title] Campaigns
[path] Public API/


[title] Location
[path] Targets/

Target visitors based on their geographical location. This information is inferred from the IP address of the visitors and matched against a constantly updated GeoIP database.

### Options

The location filter allows targeting visitors based on their geolocation. The filter will match visitors who match at least one of the selected locations. There are several levels of granularity available:

1. **Country**
2. **Region/State**
3. **City**
4. **Postal code -** these can be added by providing the raw value and selecting the "Add as postal code" option. They can also be mass-imported using a CSV file.

### Use Cases

1. **Localized promotions -** Use the location filter to show promotions or deals that are specific to a certain geographic region. This is useful for retail chains with different offers in different locales.
2. **Legal compliance -** For businesses operating in multiple countries, use the location filter to display content that aligns with local laws and regulations, such as age restrictions or legal disclaimers.
3. **Shipping information -** Tailor shipping details and costs based on the visitor's geographic location.
4. **Seasonal or event-based campaigns -** During local or national holidays or events, use the Location filter to present related products, offers, or content. For example, showing winter clothing to visitors from colder regions.
5. **Local business hours -&#x20;**&#x44;isplay customer service or store hours based on the visitor's local time zone, enhancing the overall user experience and expectations.
6. **Exclusivity by geography -** Some products or services may only be available in certain locations. Use this filter to show or hide these based on the visitor's location.

### **How to Use**

1. Go to the 'Targeting' section in the Personizely dashboard.
2. Click "Create target" and name it.
3. Select 'Add Filter' and choose 'Location'.
4. Specify the geographical location(s): Country, Region/State, or City name.
5. Save the filter. It's now ready to be applied in the widgets & campaigns.

### **Notes**

- The accuracy of location-based targeting depends on the IP address data.&#x20;
  Some users may use VPNs or other tools that can alter perceived location.


[title] Device
[path] Targets/

Target visitors based on the type of device they are accessing the site from. By understanding the device type, you ensure a consistent and tailored user experience.

### **Options**

You can select a device type from a dropdown menu. The list includes options such as Desktop, Laptop, Tablet, Mobile, and other devices.

### **Use Cases**

1. **Optimized content delivery -** Create widgets that are tailored for the screen size and capabilities of a specific device, ensuring optimal readability and user interaction.
2. **Product recommendations -** For e-commerce platforms, the device filter can assist in suggesting device-compatible or related products. For instance, smartphone users might receive recommendations for mobile accessories, while desktop users see computer peripherals.

### **How to Use**

1. Go to the 'Targets' section in the Personizely dashboard.
2. Click "Create target" and name it.
3. Opt for 'Add Filter' and select 'Device' from the dropdown.
4. From the ensuing dropdown menu, choose the device type(s) you aim to target
5. Finalize your selection and save the filter. It's now ready to be used in your widgets & campaigns.

### **Notes**

- Leveraging the "Device" filter is crucial in an era of diverse screen sizes and device capabilities. Misaligned content can significantly impact user satisfaction and conversion rates.


[title] Visitor's time
[path] Targets/

Target visitors based on the current time in their respective time zones. Recognizing the local time of the visitor can be instrumental in delivering timely content, aligning with their daily routines, and optimizing engagement.

### **Options**

A time range, based on a 24-hour cycle. This value is compared to the time on your site's visitors' device.

### **Use Cases**

1. **Timely promotions -** Launch time-sensitive offers or flash sales. For instance, a 'Happy Hour' promotion could be set to display between 16:00 and 18:00 in the visitor's local time.
2. **Scheduled announcements -** If there's an upcoming product launch or webinar, use the filter to show reminders or countdowns at appropriate times, like in the evening when users might be more available.
3. **Time-optimized surveys or feedback -** If aiming to gather feedback or conduct surveys, display these during times when users are likely to be more receptive, such as late afternoon or early evening.

### **How to Use**

1. Navigate to the 'Targets' section of the Personizely dashboard.
2. Click "Create target" and name it.
3. Choose 'Add Filter' and then select 'Visitor's Time' from the dropdown.
4. Define the desired time range by setting the start (X) and end (Y) hours based on a 24-hour cycle.
5. Confirm and save your time range. The Target is now set and ready to be used in widgets or campaigns.


[title] Selector
[path] Targets/

The selector filter allows targeting based on elements present on your website pages. This filter uses CSS Selectors to identify and target specific HTML elements, providing a highly customizable way to engage visitors based on the content on your site.

### **Options**

1. **CSS selector -&#x20;**&#x74;he CSS Selector that identifies the element(s) you wish to target.
2. **Condition**:
   - **Contains -** Element's content includes the specified value.
   - **Is** - Element's content exactly matches the specified value.
   - **Is Not -** Element's content does not match the specified value.
   - **Does not contain -** Element's content does not include the specified value.
   - **Is empty -&#x20;**&#x45;lement is empty or void of content.
   - **Is not empty -** Element contains some form of content.
   - **Is higher than -** The numerical content of the element is greater than the specified value.
   - **Is lower than -** The numerical content of the element is less than the specified value.
3. **Value -&#x20;**&#x74;he value to compare against the targeted element's content.

For *\<meta>* elements, the *content* attribute is parsed. For *\<input>* and *\<select>* elements, the *value* is parsed, and for all other elements, the *text* content is parsed.

### **Use Cases**

1. **Dynamic content changes -** Use the "Contains" condition to target elements that include specific text, and personalize content accordingly.
2. **User preference adaptation -** If your site has options to "like" or "save" items, you could use the "Is not empty" condition to identify users who have interacted with these features and show them personalized recommendations.
3. **Cart engagement -** For users with an eCommerce platform, you might use selectors to target the cart counter element. Using the "Is higher than" condition, you can launch campaigns that encourage checkout or offer discounts to users who have items in their cart.

### **How to Use**

1. Go to the 'Targets' section within the Personizely dashboard.
2. Click "Create target" and name it.
3. Choose 'Add Filter' and select 'Selector'.
4. Input the CSS Selector in the corresponding field.
5. Choose the condition that aligns with your targeting goals.
6. Based on the condition selected, input the value to compare against the selected HTML element.
7. Confirm and save your filter settings. You can now use this target in your widgets.


[title] Cart size
[path] Targets/

Target visitors based on the number of items in their shopping cart. By assessing the size of the cart, widgets can be tailored to promote bundle deals, suggest related products, or offer specific discounts, ensuring a more personalized shopping experience for the visitor.

### **Options**

This filter provides the following conditions for targeting:

1. **Condition**
   - **At Least** -  Targets visitors with a cart size that meets or exceeds a specified number of items.
   - **Less** -  Targets visitors with a cart size below the designated number of items.
   - Specify the number of items post-condition selection.
2. **Cart size** - the number of items in the cart counted based on the "Count method" option.
3. **Count method**
   - **Total** - Refers to the total number of items in the cart, counting multiples of the same item separately.
   - **Distinct** - Counts only unique items in the cart, regardless of quantity.

### **Use cases**

1. **Bundle deals** - Offer bundle deals to visitors with specific cart sizes.
2. **Bulk buying** -  For visitors with larger total cart sizes, provide bulk buying discounts or special offers.
3. **Recommendations** -  For visitors with fewer items (using the "Less" condition and "Distinct" item type), recommend complementary products to round out their purchase.
4. **Encourage add-ons** -  If a visitor's total cart size is below a certain threshold, suggest add-ons or essential items to increase their cart size.
5. **Enforce quantity** - If you need a minimum number of products for an order to be placed.

### **How to use**

1. Navigate to the 'Targets' section in the Personizely dashboard.
2. Click "Create target" and name it.
3. Choose 'Add Filter' and select 'Cart Size'.
4. Choose your desired condition — either "At Least" or "Less".
5. Input the desired number of items as the threshold.
6. Decide between "Total" or "Distinct" items.
7. Confirm and save your filter settings.

:::hint{type="info"}
This target is only available for Shopify & Wix users now.
:::


[title] Cart items
[path] Targets/

Target visitors based on the items present in their shopping cart. Recognizing the specific items or combination of items a visitor has in their cart allows for deeper personalization strategies, enhancing the chance for conversion, upselling opportunities, and creating a tailored shopping experience.

### **Options**

1. **Condition**
   - **All of -** Targets visitors who have all of the specified products in their cart.
   - **None of -** Targets visitors who do not have any of the specified products in their cart.
   - **Any of -** Targets visitors who have at least one of the specified products in their cart.
2. **Products -** a list of products that should be present in the cart or not based on the selected condition.

### **Use cases**

1. **Product bundle recommendations -** If a visitor has "Product A" in their cart and the campaign targets those with "Any of" condition for "Product A", recommend "Product B" which pairs well with it.
2. **Exclusivity offers  -** For visitors with high-end products in their cart (selected via the dropdown), present them with exclusive offers or complementary products.
3. **Avoid redundancy -** Using the "None of" condition, ensure that visitors who already have a promotional item in their cart aren't shown the same promotion again.
4. **Mixed product promotions -** If aiming for a promotion that requires a combination of products (e.g., a shirt and trousers), use the "All of" condition to identify visitors with both items and offer a combo deal.

### **How to use**

1. Navigate to the 'Targets' section of the Personizely dashboard.
2. Click "Create target" and name it.
3. Choose 'Add Filter' and then select 'Cart Items'.
4. Begin with the condition selection—choose from "All of", "None of", or "Any of".
5. Based on the chosen condition, pick relevant products from the dropdown menu.
6. Confirm and save the filter. You can now use the new target in your widgets.



:::hint{type="info"}
This target is only available for Shopify & Wix users now.
:::


[title] Weather
[path] Targets/

Target visitors based on the weather in their geographical location. The location information is inferred from the IP address of the visitors and matched against a constantly updated GeoIP database, which is then used to look up the weather in the given area.

Available weather conditions are:

- Condition
- Temperature
- Temperature feeling
- Wind speed
- Humidity
- Precipitation
- Cloud cover
- UV Index
- Pressure


[title] GoKwik/Shopify goal tracking
[path] Settings/Untitled/

Due to the fact that Shopify is not consistently sending orders/paid events via webhooks for GoKwik orders, there are issues with accurate tracking of purchases in Personizely.

In order to mitigate that, you can create a custom pixel that subscribes to GoKwik pixel events and relays them to Personizely.

Here are the steps you need to take:

### Create the goals in Personizely

Go to Settings -> Goals and create a custom event goal. Specify a name, for example: GoKwik purchase. Here are the available events for GoKwik:

- gk\_purchase - the purchase event
- gk\_checkout\_start - the checkout initiation event

Once created, use these goals in your widgets and campaigns to track performance.


[title] Parsers (Data Parsing Engine)
[path] Settings/

The data parsing engine is a tool that allows you to automatically parse data from various sources into Personizely's [website data](docId\:aIXVbJMiSMHQkIXv5pXUh) object or visitor's profile in Personizely. Every parser can parse a single value to one of the possible destinations.

Every parser has a destination (and destination key) and a source (and a source key).

### Source

The source defines where should the data be parsed from, there are 5 sources:

1. Browser Local Storage - takes the value from the visitor's browser local storage and is the equivalent of calling `localStorage.getItem(key)`
2. URL Query String - takes the value from the visitor's URL address. Example: https\://site.com?name=Jim, where *Jim* can be parsed by using *name* as the source key.
3. Cookies - takes the value from the visitor's cookies where the cookie name is the source key.
4. CSS Selector - parses the inner text from an element from the page where the source key is a valid CSS selector used to find that element. Is the equivalent of calling `document.querySelector(key).innerText`.
5. JS Variable - parses the value from a JS variable that should be available in the global context where the source key is the variable name (can also use don notation for accessing deeper nested values).

### Destination

The destination defines where the parsed data should be saved. There are 2 destinations:

1. Data - [website data](docId\:aIXVbJMiSMHQkIXv5pXUh) - this data only lives for the duration of a session and should generally include information about the current session or website.
2. Visitor - the visitor's profile - this data is saved into the visitor's profile inside the Personizely database and is persistent between sessions.




[title] Branding
[path] Settings/

The branding settings allow you to set your brand defaults in order to make it easier to design widgets that match your brand. The empty widget templates and all of the elements that you drag on drop on the widget will be on-brand by default.

### Primary color

This color will be used for buttons and for the teaser background color.

### Secondary color

This color will be used for the secondary buttons.

### Background color

This color will be used as the default one for your widgets and new columns/sections.

### Text color

This color will be used as the default for all text elements (like text, headline, and cart progress).

### Text font

This font is going to be used as the default one for all text elements (like text, headline, and cart progress).

### Buttons font

This font is going to be used as the default for all buttons and for the teaser.



:::hint{type="info"}
These settings will not affect any existing widgets.&#x20;
:::


[title] Goals
[path] Settings/

Goals help track Personizely's overall performance and ROI on your website. If your marketing goal is to push visitors to purchase, submit a form, or visit a certain page - it might make sense to set up a goal for it in order to see Personizely's impact on these marketing lifecycle events.

Goals represent events happening on your website and can be of three types:

1. Pageview
2. Click
3. Custom

### Pageview

This event represents a specific page being viewed by a website visitor. The goal will be automatically registered once the pageview event happens. The goals of this type have the following properties:

1. Page - the page path (without the domain name or https\://)
2. Value - the value attributed to this goal. This value will be attributed to any widgets or campaigns that the visitor interacted with or viewed within the attribution period.

### Click

This event represents a click on a specific element inside your website's page. The goal will be automatically registered once the click happens. The goals of this type have the following properties:

1. CSS Selector - the CSS selector of the element that should trigger the goal attribution event. Please refer to [this article](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors) to learn how to find out the selector of the desired element.
2. Value - the value attributed to this goal. This value will be attributed to any widgets or campaigns that the visitor interacted with or viewed within the attribution period.

### Custom

This event can be triggered using our [JS API](docId\:g9CXYw_quWfrTCHrMhAl8). It can be any event happening on your website. The goals of this type have the following properties:

1. Default value - the default value attributed to this goal (if no value is passed when using the SDK). This value will be attributed to any widgets or campaigns that the visitor interacted with or viewed within the attribution period.

## The attribution period

The attribution period is of 7 days. This means that if a visitor hits a goal, the value of this goal and a goal hit will be attributed to every personalization campaign that the visitor has seen and to every widget that this visitor converted on during this period if the widget or campaign has the respective goal being tracked in its settings.


[title] Google Analytics 4 and GTM
[path] Settings/Untitled/

The GA4 integration works by automatically sending events to GA4.

The following events are sent:

**For widgets:**
`widget_view` - for widget views

`widget_click` - for widget clicks

`widget_submit` - for widget submits

With the following parameters:

`{ widget_id, widget_name, variation_id, variation_name, experiment_id, control }`

**For campaigns:**
`campaign_view` - for campaign views

With the following parameters:

`{ campaign_name, control, variation_id, variation_name }`

## Google Tag Manager

If your Google Analytics tag is configured via GTM, you'll need to make additional adjustments to make sure the events are relayed to Google Analytics.

### Create a trigger

Go to your Container.

1. Go to Triggers
2. Click New
3. In the form
   1. Name the trigger, for example, "Personizely event"
   2. Event name - `(widget|campaign)_.*`
   3. Check the "Use regex matching" checkbox
4. Set the "This trigger fires on" to "All Custom Events"
5. Save

## Create an event tag

1. Go to Tags
2. Click New
3. Tag Configuration
   1. Select Tag type - "Google Analytics: GA4 Event"
   2. In the form:
      1. Measurement ID - the ID of your measurement, which looks like "G-XXXXXXXX"
      2. Event name - \{\{Event}}
   3. Events Parameters

:::Paragraph{indent="3"}
Add the following parameter-value pairs:
:::

:::Paragraph{listStyleType="decimal" indent="4"}
**widget\_id** - **\{\{Widget ID}}** (create a new variable with the variable name **Widget ID** and Data Layer Variable Name - **widget\_id**)
:::

:::Paragraph{listStyleType="decimal" listStart="2" indent="4"}
**widget\_name** - **\{\{Widget Name}}** (create a new variable with the variable name **Widget Name** and Data Layer Variable Name - **widget\_name**)
:::

:::Paragraph{listStyleType="decimal" listStart="3" indent="4"}
**experiment\_id** - **\{\{Experiment ID}}** (create a new variable with the variable name **Experiment ID** and Data Layer Variable Name - **experiment\_id**)
:::

:::Paragraph{listStyleType="decimal" listStart="4" indent="4"}
**control** - **\{\{Control}}** (create a new variable with the variable name Control and Data Layer Variable Name - control)
:::

:::Paragraph{listStyleType="decimal" listStart="5" indent="4"}
**campaign\_name** - **\{\{Campaign Name}}** (create a new variable with the variable name **Campaign Name** and Data Layer Variable Name - **campaign\_name**)
:::

:::Paragraph{listStyleType="decimal" listStart="6" indent="4"}
**variation\_id** - **\{\{Variation ID}}** (create a new variable with the variable name Variation ID and Data Layer Variable Name - **variation\_id**)
:::

:::Paragraph{listStyleType="decimal" listStart="7" indent="4"}
**variation\_name** - **\{\{Variation Name}}** (create a new variable with the variable name **Variation Name** and Data Layer Variation Name - **variation\_name**)
:::

:::Paragraph{indent="3"}
For each parameter, create a new Data Layer Variable:
:::

:::Paragraph{listStyleType="disc" indent="3"}
Start typing "\{\{" in the value field
:::

:::Paragraph{listStyleType="disc" listStart="2" indent="3"}
Select New variable at the end
:::

:::Paragraph{listStyleType="disc" listStart="3" indent="3"}
Select the type to be "Data Layer Variable", and then specify the respective name and Data Layer Variable Name (see the part between parentheses for each parameter).
:::

:::Paragraph{listStyleType="decimal" listStart="4" indent="2"}
Triggering
:::

:::Paragraph{listStyleType="decimal" indent="3"}
Select the trigger you have created in the first step (Personizely event).
:::

4. Save

:::hint{type="warning"}
The `campaign_id` parameter was dropped because it conflicts with **GA4**'s own `campaign_id`, which refers to the *UTM Campaign ID*. Please rely on `campaign_name`.
:::

### Submit

Now you can submit your container, and Personizely events will be automatically relayed to Google Analytics. The same method can be used to send Personizely events to any other tags you have in GTM.

:::hint{type="info"}
⚠️ **Important**
Before Personizely can send events to Google Analytics, you must enable the integration in the Personizely Dashboard.
Go to **Settings → Integrations**, then click **Enable** next to Google Analytics.
Once enabled, events will be automatically sent to Google Analytics.
:::


[title] Placeholders
[path] /

In Personizely's widget's text and personalizations, you can use dynamic text content to make the content even more relevant.

There are 4 types of placeholders now:

- Visitor properties
- Query string parameters
- Javascript variables
- Dateime placeholders

The placeholders have the following format:
`{type.property or 'fallback text'}`

The **properties** are going to be described below, while the **fallback text** stands for the text in case the property value is null.

# Visitor properties

You can use placeholders to show visitors' properties right in the text of your widgets or personalized regions. Here's the list of the placeholders:

- firstName
- lastName
- phone
- email
- bio
- companyName
- companyTitle



This placeholder has the following format:
`{visitor.property or 'fallback'}` - with fallback
`{visitor.property}` - without fallback

For custom fields use the following format:
`{visitor.customField[id] or 'fallback'}` - with fallback
`{visitor.customField[id]}` - without fallback

Where id is the numeric id of the custom field which you can find in Settings -> Custom Fields

**Examples:**
`{visitor.firstName}` - for showing the visitor's first name
`{visitor.customField[1]} `- for showing the value of the custom field with id 1

# Geo data

You can use placeholders to show geo data values right in the text of your widgets or personalized regions. Here's the list of the placeholders:

- country (country code)
- countryName
- region
- city

This placeholder has the following format:
`{geo.property or 'fallback'}` - with fallback
`{geo.property}` - without fallback

**Examples:**
`{geo.countryName or 'your area'} `- for showing visitor country or fallback to 'your area' in case it couldn't be detected

# Querystring parameters

You can extract text from the url query string parameters to show them in the personalization text. This works really great with ads where you can place the keyword inside the query string.

This placeholder has the following format:
`{query.parameter or 'fallback'}` - with fallback
`{query.parameter}` - without fallback

**Examples:**
`{query.utm_term or 'no term'}` - would show the value of the ?utm\_term query string. So if the URL is [https://site.com/?utm\_term=SEO](https://site.com/?utm_term=SEO), it will evaluate to **SEO**
`{query.ref}` - would show the value of the ?ref query string. So if the URL is [https://site.com/?ref=Friend](https://site.com/?ref=Friend), it will evaluate to **Friend**

# Data parameters

You can include data from [website data](docId\:aIXVbJMiSMHQkIXv5pXUh) using placeholders.

This placeholder has the following format:
`{data.key or 'fallback'}` - with fallback
`{data.key}` - without fallback

**Examples:**
`{data.cartSize or '0'}` - would show the value of the cartSize value from your website data object.

# Date/time placeholders

You can use placeholders to show the current date, time, and other date/time-related properties right in the text of your widgets or personalized regions. Here's the list of the placeholders:

- date - the current date in the user string format
- hour - current hour, e.g. 17
- minute - current minute, e.g. 45
- day - current day, e.g. 31
- month - current month, e.g. 1
- year - current year, e.g. 2019
- dayOfWeek - current day of the week, e.g. Tuesday
- timeOfDay - the current time of the day, one of morning, afternoon, evening, night
- season - current season, one of winter, spring, summer, autumn

This placeholder has the following format:
`{datetime.property}`

**Examples:**
`{datetime.date}` - would show the current date in a user string format
`{datetime.dayOfWeek}` - would show the current day of the week, e.g. Tuesday

# Javascript variables

If there is something that you can expose as JS variables, you could is it in the personalizations too

This placeholder has the following format:
`{variable.variableName or 'fallback'}` - with fallback
`{variable.variableName}` - without fallback

**Examples:**
`{variable.document.title}` - would show the current tab's title


[title] Get widget analytics results
[path] Public API/Widgets/

{
  "id": "Uf4SEsrXZCzi5hR8HelKB",
  "type": "api-oas-v2",
  "data": {
    "method": "GET",
    "url": "/v1/widgets/{id}/results",
    "servers": [],
    "name": "Get widget analytics results",
    "description": "",
    "contentType": "application/json",
    "request": {
      "pathParameters": [
        {
          "kind": "required",
          "name": "id",
          "type": "string",
          "description": "",
          "pattern": "\\d+"
        }
      ],
      "headerParameters": [],
      "queryParameters": [
        {
          "kind": "optional",
          "name": "websiteId",
          "type": "string",
          "description": "",
          "default": null,
          "pattern": "\\d+"
        },
        {
          "kind": "optional",
          "name": "goal",
          "type": "string",
          "description": "",
          "default": null,
          "pattern": "\\d+"
        },
        {
          "kind": "optional",
          "name": "filters",
          "type": "object",
          "description": "<p>Report filters as a map. Use as ?filters[fieldName]=value (or ?filters[fieldName][]=v1&#x26;filters[fieldName][]=v2 for arrays).</p>",
          "schema": [
            {
              "name": "dateFrom",
              "kind": "optional",
              "type": "string<date-time>",
              "description": "",
              "format": "date-time"
            },
            {
              "name": "dateTo",
              "kind": "optional",
              "type": "string<date-time>",
              "description": "",
              "format": "date-time"
            },
            {
              "name": "device",
              "kind": "optional",
              "type": "array",
              "description": "",
              "example": "",
              "itemType": "string",
              "customType": "string[]",
              "itemExample": "",
              "itemDefault": ""
            },
            {
              "name": "browser",
              "kind": "optional",
              "type": "array",
              "description": "",
              "example": "",
              "itemType": "string",
              "customType": "string[]",
              "itemExample": "",
              "itemDefault": ""
            },
            {
              "name": "os",
              "kind": "optional",
              "type": "array",
              "description": "",
              "example": "",
              "itemType": "string",
              "customType": "string[]",
              "itemExample": "",
              "itemDefault": ""
            },
            {
              "name": "country",
              "kind": "optional",
              "type": "array",
              "description": "",
              "example": "",
              "itemType": "string",
              "customType": "string[]",
              "itemExample": "",
              "itemDefault": ""
            },
            {
              "name": "region",
              "kind": "optional",
              "type": "array",
              "description": "",
              "example": "",
              "itemType": "string",
              "customType": "string[]",
              "itemExample": "",
              "itemDefault": ""
            },
            {
              "name": "city",
              "kind": "optional",
              "type": "array",
              "description": "",
              "example": "",
              "itemType": "string",
              "customType": "string[]",
              "itemExample": "",
              "itemDefault": ""
            },
            {
              "name": "utmSource",
              "kind": "optional",
              "type": "string",
              "description": ""
            },
            {
              "name": "utmMedium",
              "kind": "optional",
              "type": "string",
              "description": ""
            },
            {
              "name": "utmCampaign",
              "kind": "optional",
              "type": "string",
              "description": ""
            },
            {
              "name": "utmContent",
              "kind": "optional",
              "type": "string",
              "description": ""
            },
            {
              "name": "utmTerm",
              "kind": "optional",
              "type": "string",
              "description": ""
            },
            {
              "name": "referrer",
              "kind": "optional",
              "type": "string",
              "description": ""
            },
            {
              "name": "firstVisitPage",
              "kind": "optional",
              "type": "string",
              "description": ""
            },
            {
              "name": "visitorType",
              "kind": "optional",
              "type": "string<new | returning>",
              "description": "",
              "enum": [
                "new",
                "returning"
              ]
            },
            {
              "name": "goalValue",
              "kind": "optional",
              "type": "number",
              "description": ""
            },
            {
              "name": "zScore",
              "kind": "optional",
              "type": "number",
              "description": ""
            }
          ]
        }
      ],
      "bodyDataParameters": [],
      "formDataParameters": [],
      "oAuthParameters": [
        {
          "id": "bearer",
          "name": "bearer",
          "kind": "optional",
          "type": "http",
          "scheme": "bearer"
        }
      ],
      "cookieParameters": []
    },
    "responses": [
      {
        "statusCode": "200",
        "description": "Returned when successful",
        "jsonExample": "",
        "isExpanded": true
      },
      {
        "statusCode": "404",
        "description": "Widget not found",
        "jsonExample": "",
        "isExpanded": true
      }
    ],
    "hasXCodeSamples": false
  },
  "children": [
    {
      "text": ""
    }
  ]
}
[title] List the websites in the authenticated account
[path] Public API/Websites/

{
  "id": "WsTxRAIs87Ob394qf-5rQ",
  "type": "api-oas-v2",
  "data": {
    "method": "GET",
    "url": "/v1/websites",
    "servers": [],
    "name": "List the websites in the authenticated account",
    "description": "",
    "contentType": "application/json",
    "request": {
      "pathParameters": [],
      "headerParameters": [
        {
          "name": "accept",
          "type": "string",
          "kind": "optional",
          "description": "Generated from available response content types",
          "enum": [
            "application/json"
          ],
          "default": "application/json"
        }
      ],
      "queryParameters": [],
      "bodyDataParameters": [],
      "formDataParameters": [],
      "oAuthParameters": [
        {
          "id": "bearer",
          "name": "bearer",
          "kind": "optional",
          "type": "http",
          "scheme": "bearer"
        }
      ],
      "cookieParameters": []
    },
    "responses": [
      {
        "statusCode": "200",
        "description": "Returned when successful",
        "jsonExample": "",
        "isExpanded": true,
        "schema": [
          {
            "kind": "optional",
            "type": "array",
            "description": "",
            "customType": "Website[]",
            "schema": [
              {
                "name": "id",
                "kind": "optional",
                "type": "integer",
                "description": ""
              },
              {
                "name": "domain",
                "kind": "required",
                "type": "string",
                "description": "",
                "pattern": "((?=[a-z0-9-]{1,63}\\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,63}"
              }
            ],
            "modelRef": "#/components/schemas/Website",
            "isExpanded": true
          }
        ]
      }
    ],
    "hasXCodeSamples": false
  },
  "children": [
    {
      "text": ""
    }
  ]
}
[title] Widgets
[path] Public API/


[title] Stop a campaign (sets active=false)
[path] Public API/Campaigns/

{
  "id": "_l82wDoiFPTu9CSMLkZQ8",
  "type": "api-oas-v2",
  "data": {
    "method": "POST",
    "url": "/v1/campaigns/{id}/stop",
    "servers": [],
    "name": "Stop a campaign (sets active=false)",
    "description": "",
    "contentType": "application/json",
    "request": {
      "pathParameters": [
        {
          "kind": "required",
          "name": "id",
          "type": "string",
          "description": "",
          "pattern": "\\d+"
        }
      ],
      "headerParameters": [
        {
          "name": "accept",
          "type": "string",
          "kind": "optional",
          "description": "Generated from available response content types",
          "enum": [
            "application/json"
          ],
          "default": "application/json"
        }
      ],
      "queryParameters": [
        {
          "kind": "optional",
          "name": "websiteId",
          "type": "string",
          "description": "",
          "default": null,
          "pattern": "\\d+"
        }
      ],
      "bodyDataParameters": [],
      "formDataParameters": [],
      "oAuthParameters": [
        {
          "id": "bearer",
          "name": "bearer",
          "kind": "optional",
          "type": "http",
          "scheme": "bearer"
        }
      ],
      "cookieParameters": []
    },
    "responses": [
      {
        "statusCode": "200",
        "description": "Campaign stopped",
        "jsonExample": "",
        "isExpanded": true,
        "schema": [
          {
            "kind": "optional",
            "type": "object",
            "description": "",
            "customType": "Campaign",
            "schema": [
              {
                "name": "id",
                "kind": "optional",
                "type": "integer",
                "description": ""
              },
              {
                "name": "name",
                "kind": "required",
                "type": "string",
                "description": "",
                "minLength": 1,
                "maxLength": 255
              },
              {
                "name": "description",
                "kind": "optional",
                "type": "string",
                "description": "",
                "maxLength": 2048
              },
              {
                "name": "type",
                "kind": "optional",
                "type": "string",
                "description": "",
                "default": "personalization"
              },
              {
                "name": "goalsReached",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "views",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "value",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "createDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "updateDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "startDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "endDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "active",
                "kind": "optional",
                "type": "boolean",
                "description": "",
                "default": false
              },
              {
                "name": "controlShare",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 5,
                "minimum": 0,
                "maximum": 100
              },
              {
                "name": "trafficAllocation",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 10,
                "minimum": 0,
                "maximum": 100
              },
              {
                "name": "targetId",
                "kind": "optional",
                "type": "integer",
                "description": ""
              },
              {
                "name": "targetMode",
                "kind": "optional",
                "type": "string",
                "description": "",
                "default": "live"
              },
              {
                "name": "primaryGoalId",
                "kind": "optional",
                "type": "integer",
                "description": ""
              },
              {
                "name": "significanceLevel",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 90,
                "enum": [
                  "80",
                  "90",
                  "95",
                  "100"
                ]
              },
              {
                "name": "methodology",
                "kind": "optional",
                "type": "string<bayesian | frequentist>",
                "description": "",
                "default": "frequentist",
                "enum": [
                  "bayesian",
                  "frequentist"
                ]
              },
              {
                "name": "power",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 80,
                "minimum": 60,
                "maximum": 99
              },
              {
                "name": "mde",
                "kind": "optional",
                "type": "number<float>",
                "description": "",
                "default": 20,
                "format": "float",
                "minimum": 1,
                "maximum": 100
              }
            ],
            "modelRef": "#/components/schemas/Campaign",
            "isExpanded": true
          }
        ]
      },
      {
        "statusCode": "403",
        "description": "Token does not have write scope",
        "jsonExample": "",
        "isExpanded": true
      },
      {
        "statusCode": "404",
        "description": "Campaign not found",
        "jsonExample": "",
        "isExpanded": true
      }
    ],
    "hasXCodeSamples": false
  },
  "children": [
    {
      "text": ""
    }
  ]
}
[title] List widgets
[path] Public API/Widgets/

{
  "id": "pWqsTHHNUmDszjhBoT3FY",
  "type": "api-oas-v2",
  "data": {
    "method": "GET",
    "url": "/v1/widgets",
    "servers": [],
    "name": "List widgets",
    "description": "",
    "contentType": "application/json",
    "request": {
      "pathParameters": [],
      "headerParameters": [
        {
          "name": "accept",
          "type": "string",
          "kind": "optional",
          "description": "Generated from available response content types",
          "enum": [
            "application/json"
          ],
          "default": "application/json"
        }
      ],
      "queryParameters": [
        {
          "kind": "optional",
          "name": "websiteId",
          "type": "string",
          "description": "",
          "default": null,
          "pattern": "\\d+"
        },
        {
          "kind": "optional",
          "name": "offset",
          "type": "integer",
          "description": "Offset from which to start listing",
          "default": 0,
          "minimum": 0
        },
        {
          "kind": "required",
          "name": "limit",
          "type": "integer",
          "description": "<p>How many results to return (1-500)</p>",
          "default": 100,
          "minimum": 1,
          "maximum": 500
        },
        {
          "kind": "optional",
          "name": "active",
          "type": "string<Choice>",
          "description": "Filter by active status",
          "default": null,
          "format": "Choice",
          "enum": [
            "true",
            "false"
          ]
        },
        {
          "kind": "optional",
          "name": "type",
          "type": "string<Choice>",
          "description": "Filter by widget type",
          "default": null,
          "format": "Choice",
          "enum": [
            "popup",
            "callout",
            "bar",
            "embedded"
          ]
        }
      ],
      "bodyDataParameters": [],
      "formDataParameters": [],
      "oAuthParameters": [
        {
          "id": "bearer",
          "name": "bearer",
          "kind": "optional",
          "type": "http",
          "scheme": "bearer"
        }
      ],
      "cookieParameters": []
    },
    "responses": [
      {
        "statusCode": "200",
        "description": "Returned when successful",
        "jsonExample": "",
        "isExpanded": true,
        "schema": [
          {
            "kind": "optional",
            "type": "array",
            "description": "",
            "customType": "Widget[]",
            "schema": [
              {
                "name": "id",
                "kind": "optional",
                "type": "integer",
                "description": ""
              },
              {
                "name": "name",
                "kind": "required",
                "type": "string",
                "description": "",
                "minLength": 1,
                "maxLength": 255
              },
              {
                "name": "clicks",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "views",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "conversions",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "goalsReached",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "value",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "extraValue",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "submits",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "completions",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "contacts",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "createDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "updateDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "active",
                "kind": "optional",
                "type": "boolean",
                "description": "",
                "default": false
              },
              {
                "name": "type",
                "kind": "required",
                "type": "string",
                "description": ""
              },
              {
                "name": "startDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "endDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "primaryGoalId",
                "kind": "optional",
                "type": "integer",
                "description": ""
              }
            ],
            "modelRef": "#/components/schemas/Widget",
            "isExpanded": true
          }
        ]
      }
    ],
    "hasXCodeSamples": false
  },
  "children": [
    {
      "text": ""
    }
  ]
}
[title] Personizely Public API
[path] /


[title] List goals
[path] Public API/Goals/

{
  "id": "eeyvCWVC7jWM72Ti9fPIO",
  "type": "api-oas-v2",
  "data": {
    "method": "GET",
    "url": "/v1/goals",
    "servers": [],
    "name": "List goals",
    "description": "",
    "contentType": "application/json",
    "request": {
      "pathParameters": [],
      "headerParameters": [
        {
          "name": "accept",
          "type": "string",
          "kind": "optional",
          "description": "Generated from available response content types",
          "enum": [
            "application/json"
          ],
          "default": "application/json"
        }
      ],
      "queryParameters": [
        {
          "kind": "optional",
          "name": "websiteId",
          "type": "string",
          "description": "",
          "default": null,
          "pattern": "\\d+"
        },
        {
          "kind": "optional",
          "name": "offset",
          "type": "integer",
          "description": "Offset from which to start listing",
          "default": 0,
          "minimum": 0
        },
        {
          "kind": "required",
          "name": "limit",
          "type": "integer",
          "description": "<p>How many results to return (1-1000)</p>",
          "default": 500,
          "minimum": 1,
          "maximum": 1000
        }
      ],
      "bodyDataParameters": [],
      "formDataParameters": [],
      "oAuthParameters": [
        {
          "id": "bearer",
          "name": "bearer",
          "kind": "optional",
          "type": "http",
          "scheme": "bearer"
        }
      ],
      "cookieParameters": []
    },
    "responses": [
      {
        "statusCode": "200",
        "description": "Returned when successful",
        "jsonExample": "",
        "isExpanded": true,
        "schema": [
          {
            "kind": "optional",
            "type": "array",
            "description": "",
            "customType": "Goal[]",
            "schema": [
              {
                "name": "id",
                "kind": "optional",
                "type": "integer",
                "description": ""
              },
              {
                "name": "name",
                "kind": "required",
                "type": "string",
                "description": "",
                "minLength": 1,
                "maxLength": 255
              },
              {
                "name": "system",
                "kind": "optional",
                "type": "boolean",
                "description": "",
                "default": false
              },
              {
                "name": "action",
                "kind": "optional",
                "type": "string",
                "description": ""
              },
              {
                "name": "default",
                "kind": "optional",
                "type": "boolean",
                "description": "",
                "default": false
              },
              {
                "name": "value",
                "kind": "optional",
                "type": "integer",
                "description": ""
              }
            ],
            "modelRef": "#/components/schemas/Goal",
            "isExpanded": true
          }
        ]
      }
    ],
    "hasXCodeSamples": false
  },
  "children": [
    {
      "text": ""
    }
  ]
}
[title] Start a campaign (sets active=true)
[path] Public API/Campaigns/

{
  "id": "2sYkhC1y9H3AlCKQcmrAY",
  "type": "api-oas-v2",
  "data": {
    "method": "POST",
    "url": "/v1/campaigns/{id}/start",
    "servers": [],
    "name": "Start a campaign (sets active=true)",
    "description": "",
    "contentType": "application/json",
    "request": {
      "pathParameters": [
        {
          "kind": "required",
          "name": "id",
          "type": "string",
          "description": "",
          "pattern": "\\d+"
        }
      ],
      "headerParameters": [
        {
          "name": "accept",
          "type": "string",
          "kind": "optional",
          "description": "Generated from available response content types",
          "enum": [
            "application/json"
          ],
          "default": "application/json"
        }
      ],
      "queryParameters": [
        {
          "kind": "optional",
          "name": "websiteId",
          "type": "string",
          "description": "",
          "default": null,
          "pattern": "\\d+"
        }
      ],
      "bodyDataParameters": [],
      "formDataParameters": [],
      "oAuthParameters": [
        {
          "id": "bearer",
          "name": "bearer",
          "kind": "optional",
          "type": "http",
          "scheme": "bearer"
        }
      ],
      "cookieParameters": []
    },
    "responses": [
      {
        "statusCode": "200",
        "description": "Campaign started",
        "jsonExample": "",
        "isExpanded": true,
        "schema": [
          {
            "kind": "optional",
            "type": "object",
            "description": "",
            "customType": "Campaign",
            "schema": [
              {
                "name": "id",
                "kind": "optional",
                "type": "integer",
                "description": ""
              },
              {
                "name": "name",
                "kind": "required",
                "type": "string",
                "description": "",
                "minLength": 1,
                "maxLength": 255
              },
              {
                "name": "description",
                "kind": "optional",
                "type": "string",
                "description": "",
                "maxLength": 2048
              },
              {
                "name": "type",
                "kind": "optional",
                "type": "string",
                "description": "",
                "default": "personalization"
              },
              {
                "name": "goalsReached",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "views",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "value",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "createDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "updateDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "startDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "endDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "active",
                "kind": "optional",
                "type": "boolean",
                "description": "",
                "default": false
              },
              {
                "name": "controlShare",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 5,
                "minimum": 0,
                "maximum": 100
              },
              {
                "name": "trafficAllocation",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 10,
                "minimum": 0,
                "maximum": 100
              },
              {
                "name": "targetId",
                "kind": "optional",
                "type": "integer",
                "description": ""
              },
              {
                "name": "targetMode",
                "kind": "optional",
                "type": "string",
                "description": "",
                "default": "live"
              },
              {
                "name": "primaryGoalId",
                "kind": "optional",
                "type": "integer",
                "description": ""
              },
              {
                "name": "significanceLevel",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 90,
                "enum": [
                  "80",
                  "90",
                  "95",
                  "100"
                ]
              },
              {
                "name": "methodology",
                "kind": "optional",
                "type": "string<bayesian | frequentist>",
                "description": "",
                "default": "frequentist",
                "enum": [
                  "bayesian",
                  "frequentist"
                ]
              },
              {
                "name": "power",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 80,
                "minimum": 60,
                "maximum": 99
              },
              {
                "name": "mde",
                "kind": "optional",
                "type": "number<float>",
                "description": "",
                "default": 20,
                "format": "float",
                "minimum": 1,
                "maximum": 100
              }
            ],
            "modelRef": "#/components/schemas/Campaign",
            "isExpanded": true
          }
        ]
      },
      {
        "statusCode": "403",
        "description": "Token does not have write scope",
        "jsonExample": "",
        "isExpanded": true
      },
      {
        "statusCode": "404",
        "description": "Campaign not found",
        "jsonExample": "",
        "isExpanded": true
      }
    ],
    "hasXCodeSamples": false
  },
  "children": [
    {
      "text": ""
    }
  ]
}
[title] Get campaign analytics results
[path] Public API/Campaigns/

{
  "id": "PD1CeEULx3pp0CMsGwRXX",
  "type": "api-oas-v2",
  "data": {
    "method": "GET",
    "url": "/v1/campaigns/{id}/results",
    "servers": [],
    "name": "Get campaign analytics results",
    "description": "",
    "contentType": "application/json",
    "request": {
      "pathParameters": [
        {
          "kind": "required",
          "name": "id",
          "type": "string",
          "description": "",
          "pattern": "\\d+"
        }
      ],
      "headerParameters": [],
      "queryParameters": [
        {
          "kind": "optional",
          "name": "websiteId",
          "type": "string",
          "description": "",
          "default": null,
          "pattern": "\\d+"
        },
        {
          "kind": "optional",
          "name": "goal",
          "type": "string",
          "description": "<p>Goal id (defaults to the campaign primary goal)</p>",
          "default": null,
          "pattern": "\\d+"
        },
        {
          "kind": "optional",
          "name": "dimension",
          "type": "string<Choice>",
          "description": "Break results down by dimension",
          "default": null,
          "format": "Choice",
          "enum": [
            "device",
            "country",
            "channel",
            "referrer"
          ]
        },
        {
          "kind": "required",
          "name": "compareMetric",
          "type": "string<Choice>",
          "description": "<p>Metric used for significance + improvement. Allowed: goalConversionRate, valuePerVisitor, profitPerVisitor.</p>",
          "default": "goalConversionRate",
          "format": "Choice",
          "enum": [
            "goalConversionRate",
            "valuePerVisitor",
            "profitPerVisitor"
          ]
        },
        {
          "kind": "optional",
          "name": "filters",
          "type": "object",
          "description": "<p>Report filters as a map. Use as ?filters[fieldName]=value (or ?filters[fieldName][]=v1&#x26;filters[fieldName][]=v2 for arrays).</p>",
          "schema": [
            {
              "name": "dateFrom",
              "kind": "optional",
              "type": "string<date-time>",
              "description": "",
              "format": "date-time"
            },
            {
              "name": "dateTo",
              "kind": "optional",
              "type": "string<date-time>",
              "description": "",
              "format": "date-time"
            },
            {
              "name": "device",
              "kind": "optional",
              "type": "array",
              "description": "",
              "example": "",
              "itemType": "string",
              "customType": "string[]",
              "itemExample": "",
              "itemDefault": ""
            },
            {
              "name": "browser",
              "kind": "optional",
              "type": "array",
              "description": "",
              "example": "",
              "itemType": "string",
              "customType": "string[]",
              "itemExample": "",
              "itemDefault": ""
            },
            {
              "name": "os",
              "kind": "optional",
              "type": "array",
              "description": "",
              "example": "",
              "itemType": "string",
              "customType": "string[]",
              "itemExample": "",
              "itemDefault": ""
            },
            {
              "name": "country",
              "kind": "optional",
              "type": "array",
              "description": "",
              "example": "",
              "itemType": "string",
              "customType": "string[]",
              "itemExample": "",
              "itemDefault": ""
            },
            {
              "name": "region",
              "kind": "optional",
              "type": "array",
              "description": "",
              "example": "",
              "itemType": "string",
              "customType": "string[]",
              "itemExample": "",
              "itemDefault": ""
            },
            {
              "name": "city",
              "kind": "optional",
              "type": "array",
              "description": "",
              "example": "",
              "itemType": "string",
              "customType": "string[]",
              "itemExample": "",
              "itemDefault": ""
            },
            {
              "name": "utmSource",
              "kind": "optional",
              "type": "string",
              "description": ""
            },
            {
              "name": "utmMedium",
              "kind": "optional",
              "type": "string",
              "description": ""
            },
            {
              "name": "utmCampaign",
              "kind": "optional",
              "type": "string",
              "description": ""
            },
            {
              "name": "utmContent",
              "kind": "optional",
              "type": "string",
              "description": ""
            },
            {
              "name": "utmTerm",
              "kind": "optional",
              "type": "string",
              "description": ""
            },
            {
              "name": "referrer",
              "kind": "optional",
              "type": "string",
              "description": ""
            },
            {
              "name": "firstVisitPage",
              "kind": "optional",
              "type": "string",
              "description": ""
            },
            {
              "name": "visitorType",
              "kind": "optional",
              "type": "string<new | returning>",
              "description": "",
              "enum": [
                "new",
                "returning"
              ]
            },
            {
              "name": "goalValue",
              "kind": "optional",
              "type": "number",
              "description": ""
            },
            {
              "name": "zScore",
              "kind": "optional",
              "type": "number",
              "description": ""
            }
          ]
        }
      ],
      "bodyDataParameters": [],
      "formDataParameters": [],
      "oAuthParameters": [
        {
          "id": "bearer",
          "name": "bearer",
          "kind": "optional",
          "type": "http",
          "scheme": "bearer"
        }
      ],
      "cookieParameters": []
    },
    "responses": [
      {
        "statusCode": "200",
        "description": "Returned when successful",
        "jsonExample": "",
        "isExpanded": true
      },
      {
        "statusCode": "404",
        "description": "Campaign not found",
        "jsonExample": "",
        "isExpanded": true
      }
    ],
    "hasXCodeSamples": false
  },
  "children": [
    {
      "text": ""
    }
  ]
}
[title] Start a widget (sets active=true)
[path] Public API/Widgets/

{
  "id": "FpBChxbZiCYyxhzfmTSNZ",
  "type": "api-oas-v2",
  "data": {
    "method": "POST",
    "url": "/v1/widgets/{id}/start",
    "servers": [],
    "name": "Start a widget (sets active=true)",
    "description": "",
    "contentType": "application/json",
    "request": {
      "pathParameters": [
        {
          "kind": "required",
          "name": "id",
          "type": "string",
          "description": "",
          "pattern": "\\d+"
        }
      ],
      "headerParameters": [
        {
          "name": "accept",
          "type": "string",
          "kind": "optional",
          "description": "Generated from available response content types",
          "enum": [
            "application/json"
          ],
          "default": "application/json"
        }
      ],
      "queryParameters": [
        {
          "kind": "optional",
          "name": "websiteId",
          "type": "string",
          "description": "",
          "default": null,
          "pattern": "\\d+"
        }
      ],
      "bodyDataParameters": [],
      "formDataParameters": [],
      "oAuthParameters": [
        {
          "id": "bearer",
          "name": "bearer",
          "kind": "optional",
          "type": "http",
          "scheme": "bearer"
        }
      ],
      "cookieParameters": []
    },
    "responses": [
      {
        "statusCode": "200",
        "description": "Widget started",
        "jsonExample": "",
        "isExpanded": true,
        "schema": [
          {
            "kind": "optional",
            "type": "object",
            "description": "",
            "customType": "Widget",
            "schema": [
              {
                "name": "id",
                "kind": "optional",
                "type": "integer",
                "description": ""
              },
              {
                "name": "name",
                "kind": "required",
                "type": "string",
                "description": "",
                "minLength": 1,
                "maxLength": 255
              },
              {
                "name": "clicks",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "views",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "conversions",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "goalsReached",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "value",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "extraValue",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "submits",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "completions",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "contacts",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "createDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "updateDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "active",
                "kind": "optional",
                "type": "boolean",
                "description": "",
                "default": false
              },
              {
                "name": "type",
                "kind": "required",
                "type": "string",
                "description": ""
              },
              {
                "name": "startDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "endDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "primaryGoalId",
                "kind": "optional",
                "type": "integer",
                "description": ""
              }
            ],
            "modelRef": "#/components/schemas/Widget",
            "isExpanded": true
          }
        ]
      },
      {
        "statusCode": "403",
        "description": "Token does not have write scope",
        "jsonExample": "",
        "isExpanded": true
      },
      {
        "statusCode": "404",
        "description": "Widget not found",
        "jsonExample": "",
        "isExpanded": true
      }
    ],
    "hasXCodeSamples": false
  },
  "children": [
    {
      "text": ""
    }
  ]
}
[title] Stop a widget (sets active=false)
[path] Public API/Widgets/

{
  "id": "F4u13ciSyM2TRSvdaqhuq",
  "type": "api-oas-v2",
  "data": {
    "method": "POST",
    "url": "/v1/widgets/{id}/stop",
    "servers": [],
    "name": "Stop a widget (sets active=false)",
    "description": "",
    "contentType": "application/json",
    "request": {
      "pathParameters": [
        {
          "kind": "required",
          "name": "id",
          "type": "string",
          "description": "",
          "pattern": "\\d+"
        }
      ],
      "headerParameters": [
        {
          "name": "accept",
          "type": "string",
          "kind": "optional",
          "description": "Generated from available response content types",
          "enum": [
            "application/json"
          ],
          "default": "application/json"
        }
      ],
      "queryParameters": [
        {
          "kind": "optional",
          "name": "websiteId",
          "type": "string",
          "description": "",
          "default": null,
          "pattern": "\\d+"
        }
      ],
      "bodyDataParameters": [],
      "formDataParameters": [],
      "oAuthParameters": [
        {
          "id": "bearer",
          "name": "bearer",
          "kind": "optional",
          "type": "http",
          "scheme": "bearer"
        }
      ],
      "cookieParameters": []
    },
    "responses": [
      {
        "statusCode": "200",
        "description": "Widget stopped",
        "jsonExample": "",
        "isExpanded": true,
        "schema": [
          {
            "kind": "optional",
            "type": "object",
            "description": "",
            "customType": "Widget",
            "schema": [
              {
                "name": "id",
                "kind": "optional",
                "type": "integer",
                "description": ""
              },
              {
                "name": "name",
                "kind": "required",
                "type": "string",
                "description": "",
                "minLength": 1,
                "maxLength": 255
              },
              {
                "name": "clicks",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "views",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "conversions",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "goalsReached",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "value",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "extraValue",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "submits",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "completions",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "contacts",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "createDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "updateDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "active",
                "kind": "optional",
                "type": "boolean",
                "description": "",
                "default": false
              },
              {
                "name": "type",
                "kind": "required",
                "type": "string",
                "description": ""
              },
              {
                "name": "startDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "endDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "primaryGoalId",
                "kind": "optional",
                "type": "integer",
                "description": ""
              }
            ],
            "modelRef": "#/components/schemas/Widget",
            "isExpanded": true
          }
        ]
      },
      {
        "statusCode": "403",
        "description": "Token does not have write scope",
        "jsonExample": "",
        "isExpanded": true
      },
      {
        "statusCode": "404",
        "description": "Widget not found",
        "jsonExample": "",
        "isExpanded": true
      }
    ],
    "hasXCodeSamples": false
  },
  "children": [
    {
      "text": ""
    }
  ]
}
[title] List targets
[path] Public API/Targets/

{
  "id": "-z8IN-8-OoWXQ1Tj_A5sN",
  "type": "api-oas-v2",
  "data": {
    "method": "GET",
    "url": "/v1/targets",
    "servers": [],
    "name": "List targets",
    "description": "",
    "contentType": "application/json",
    "request": {
      "pathParameters": [],
      "headerParameters": [
        {
          "name": "accept",
          "type": "string",
          "kind": "optional",
          "description": "Generated from available response content types",
          "enum": [
            "application/json"
          ],
          "default": "application/json"
        }
      ],
      "queryParameters": [
        {
          "kind": "optional",
          "name": "websiteId",
          "type": "string",
          "description": "",
          "default": null,
          "pattern": "\\d+"
        },
        {
          "kind": "optional",
          "name": "offset",
          "type": "integer",
          "description": "Offset from which to start listing",
          "default": 0,
          "minimum": 0
        },
        {
          "kind": "required",
          "name": "limit",
          "type": "integer",
          "description": "<p>How many results to return (1-1000)</p>",
          "default": 500,
          "minimum": 1,
          "maximum": 1000
        }
      ],
      "bodyDataParameters": [],
      "formDataParameters": [],
      "oAuthParameters": [
        {
          "id": "bearer",
          "name": "bearer",
          "kind": "optional",
          "type": "http",
          "scheme": "bearer"
        }
      ],
      "cookieParameters": []
    },
    "responses": [
      {
        "statusCode": "200",
        "description": "Returned when successful",
        "jsonExample": "",
        "isExpanded": true,
        "schema": [
          {
            "kind": "optional",
            "type": "array",
            "description": "",
            "customType": "Target[]",
            "schema": [
              {
                "name": "id",
                "kind": "optional",
                "type": "integer",
                "description": ""
              },
              {
                "name": "name",
                "kind": "required",
                "type": "string",
                "description": "",
                "minLength": 1,
                "maxLength": 255
              },
              {
                "name": "createDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "updateDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              }
            ],
            "modelRef": "#/components/schemas/Target",
            "isExpanded": true
          }
        ]
      }
    ],
    "hasXCodeSamples": false
  },
  "children": [
    {
      "text": ""
    }
  ]
}
[title] Get a single target
[path] Public API/Targets/

{
  "id": "SU5AiBRr1nhVdxa-u_5y_",
  "type": "api-oas-v2",
  "data": {
    "method": "GET",
    "url": "/v1/targets/{id}",
    "servers": [],
    "name": "Get a single target",
    "description": "",
    "contentType": "application/json",
    "request": {
      "pathParameters": [
        {
          "kind": "required",
          "name": "id",
          "type": "string",
          "description": "",
          "pattern": "\\d+"
        }
      ],
      "headerParameters": [
        {
          "name": "accept",
          "type": "string",
          "kind": "optional",
          "description": "Generated from available response content types",
          "enum": [
            "application/json"
          ],
          "default": "application/json"
        }
      ],
      "queryParameters": [
        {
          "kind": "optional",
          "name": "websiteId",
          "type": "string",
          "description": "",
          "default": null,
          "pattern": "\\d+"
        }
      ],
      "bodyDataParameters": [],
      "formDataParameters": [],
      "oAuthParameters": [
        {
          "id": "bearer",
          "name": "bearer",
          "kind": "optional",
          "type": "http",
          "scheme": "bearer"
        }
      ],
      "cookieParameters": []
    },
    "responses": [
      {
        "statusCode": "200",
        "description": "Returned when successful",
        "jsonExample": "",
        "isExpanded": true,
        "schema": [
          {
            "kind": "optional",
            "type": "object",
            "description": "",
            "customType": "Target",
            "schema": [
              {
                "name": "id",
                "kind": "optional",
                "type": "integer",
                "description": ""
              },
              {
                "name": "name",
                "kind": "required",
                "type": "string",
                "description": "",
                "minLength": 1,
                "maxLength": 255
              },
              {
                "name": "createDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "updateDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              }
            ],
            "modelRef": "#/components/schemas/Target",
            "isExpanded": true
          }
        ]
      },
      {
        "statusCode": "404",
        "description": "Target not found",
        "jsonExample": "",
        "isExpanded": true
      }
    ],
    "hasXCodeSamples": false
  },
  "children": [
    {
      "text": ""
    }
  ]
}
[title] Get a single goal
[path] Public API/Goals/

{
  "id": "uJgeskqXSIHq4Qb9jLg_6",
  "type": "api-oas-v2",
  "data": {
    "method": "GET",
    "url": "/v1/goals/{id}",
    "servers": [],
    "name": "Get a single goal",
    "description": "",
    "contentType": "application/json",
    "request": {
      "pathParameters": [
        {
          "kind": "required",
          "name": "id",
          "type": "string",
          "description": "",
          "pattern": "\\d+"
        }
      ],
      "headerParameters": [
        {
          "name": "accept",
          "type": "string",
          "kind": "optional",
          "description": "Generated from available response content types",
          "enum": [
            "application/json"
          ],
          "default": "application/json"
        }
      ],
      "queryParameters": [
        {
          "kind": "optional",
          "name": "websiteId",
          "type": "string",
          "description": "",
          "default": null,
          "pattern": "\\d+"
        }
      ],
      "bodyDataParameters": [],
      "formDataParameters": [],
      "oAuthParameters": [
        {
          "id": "bearer",
          "name": "bearer",
          "kind": "optional",
          "type": "http",
          "scheme": "bearer"
        }
      ],
      "cookieParameters": []
    },
    "responses": [
      {
        "statusCode": "200",
        "description": "Returned when successful",
        "jsonExample": "",
        "isExpanded": true,
        "schema": [
          {
            "kind": "optional",
            "type": "object",
            "description": "",
            "customType": "Goal",
            "schema": [
              {
                "name": "id",
                "kind": "optional",
                "type": "integer",
                "description": ""
              },
              {
                "name": "name",
                "kind": "required",
                "type": "string",
                "description": "",
                "minLength": 1,
                "maxLength": 255
              },
              {
                "name": "system",
                "kind": "optional",
                "type": "boolean",
                "description": "",
                "default": false
              },
              {
                "name": "action",
                "kind": "optional",
                "type": "string",
                "description": ""
              },
              {
                "name": "default",
                "kind": "optional",
                "type": "boolean",
                "description": "",
                "default": false
              },
              {
                "name": "value",
                "kind": "optional",
                "type": "integer",
                "description": ""
              }
            ],
            "modelRef": "#/components/schemas/Goal",
            "isExpanded": true
          }
        ]
      },
      {
        "statusCode": "404",
        "description": "Goal not found",
        "jsonExample": "",
        "isExpanded": true
      }
    ],
    "hasXCodeSamples": false
  },
  "children": [
    {
      "text": ""
    }
  ]
}
[title] Websites
[path] Public API/


[title] Get a single campaign
[path] Public API/Campaigns/

{
  "id": "t19GrSJHzQqQG4wt1yFKN",
  "type": "api-oas-v2",
  "data": {
    "method": "GET",
    "url": "/v1/campaigns/{id}",
    "servers": [],
    "name": "Get a single campaign",
    "description": "",
    "contentType": "application/json",
    "request": {
      "pathParameters": [
        {
          "kind": "required",
          "name": "id",
          "type": "string",
          "description": "",
          "pattern": "\\d+"
        }
      ],
      "headerParameters": [
        {
          "name": "accept",
          "type": "string",
          "kind": "optional",
          "description": "Generated from available response content types",
          "enum": [
            "application/json"
          ],
          "default": "application/json"
        }
      ],
      "queryParameters": [
        {
          "kind": "optional",
          "name": "websiteId",
          "type": "string",
          "description": "",
          "default": null,
          "pattern": "\\d+"
        }
      ],
      "bodyDataParameters": [],
      "formDataParameters": [],
      "oAuthParameters": [
        {
          "id": "bearer",
          "name": "bearer",
          "kind": "optional",
          "type": "http",
          "scheme": "bearer"
        }
      ],
      "cookieParameters": []
    },
    "responses": [
      {
        "statusCode": "200",
        "description": "Returned when successful",
        "jsonExample": "",
        "isExpanded": true,
        "schema": [
          {
            "kind": "optional",
            "type": "object",
            "description": "",
            "customType": "CampaignDetail",
            "schema": [
              {
                "name": "id",
                "kind": "optional",
                "type": "integer",
                "description": ""
              },
              {
                "name": "name",
                "kind": "required",
                "type": "string",
                "description": "",
                "minLength": 1,
                "maxLength": 255
              },
              {
                "name": "description",
                "kind": "optional",
                "type": "string",
                "description": "",
                "maxLength": 2048
              },
              {
                "name": "type",
                "kind": "optional",
                "type": "string",
                "description": "",
                "default": "personalization"
              },
              {
                "name": "goalsReached",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "views",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "value",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "createDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "updateDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "startDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "endDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "active",
                "kind": "optional",
                "type": "boolean",
                "description": "",
                "default": false
              },
              {
                "name": "controlShare",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 5,
                "minimum": 0,
                "maximum": 100
              },
              {
                "name": "trafficAllocation",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 10,
                "minimum": 0,
                "maximum": 100
              },
              {
                "name": "targetId",
                "kind": "optional",
                "type": "integer",
                "description": ""
              },
              {
                "name": "targetMode",
                "kind": "optional",
                "type": "string",
                "description": "",
                "default": "live"
              },
              {
                "name": "variations",
                "kind": "optional",
                "type": "array",
                "description": "",
                "modelRef": "#/components/schemas/CampaignVariation",
                "customType": "CampaignVariation[]",
                "schema": [
                  {
                    "name": "id",
                    "kind": "optional",
                    "type": "integer",
                    "description": ""
                  },
                  {
                    "name": "name",
                    "kind": "optional",
                    "type": "string",
                    "description": ""
                  },
                  {
                    "name": "share",
                    "kind": "optional",
                    "type": "integer",
                    "description": "",
                    "minimum": 0,
                    "maximum": 100
                  },
                  {
                    "name": "targetId",
                    "kind": "optional",
                    "type": "integer",
                    "description": ""
                  },
                  {
                    "name": "order",
                    "kind": "optional",
                    "type": "integer",
                    "description": ""
                  }
                ]
              },
              {
                "name": "primaryGoalId",
                "kind": "optional",
                "type": "integer",
                "description": ""
              },
              {
                "name": "significanceLevel",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 90,
                "enum": [
                  "80",
                  "90",
                  "95",
                  "100"
                ]
              },
              {
                "name": "methodology",
                "kind": "optional",
                "type": "string<bayesian | frequentist>",
                "description": "",
                "default": "frequentist",
                "enum": [
                  "bayesian",
                  "frequentist"
                ]
              },
              {
                "name": "power",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 80,
                "minimum": 60,
                "maximum": 99
              },
              {
                "name": "mde",
                "kind": "optional",
                "type": "number<float>",
                "description": "",
                "default": 20,
                "format": "float",
                "minimum": 1,
                "maximum": 100
              }
            ],
            "modelRef": "#/components/schemas/CampaignDetail",
            "isExpanded": true
          }
        ]
      },
      {
        "statusCode": "404",
        "description": "Campaign not found",
        "jsonExample": "",
        "isExpanded": true
      }
    ],
    "hasXCodeSamples": false
  },
  "children": [
    {
      "text": ""
    }
  ]
}
[title] OS
[path] Targets/

Targeting visitors based on the operating system they are using. This information is inferred from from visitors user agent string. The operating system can provide insights into device types, user behaviors, and preferences.

### **Options**

Users can choose an operating system from a dropdown menu. The list includes various OS options such as Windows, macOS, Linux, Android, iOS, and others.

### **Use Cases**

1. **Optimized widgets and pop-ups -&#x20;**&#x53;ome visual elements might look or function differently across operating systems. The OS filter allows you to serve optimized widgets or pop-ups that are tailored to the aesthetic and functionality of a specific OS.
2. **Tailored recommendations -&#x20;**&#x46;or e-commerce platforms selling tech products or software, the OS filter can help in suggesting products that are compatible with the visitor's operating system. For instance, recommending Mac-compatible accessories to macOS users.

### **How to Use**

1. Navigate to the 'Targets' section in the Personizely dashboard.
2. Click "Create target" and name it.
3. Click on 'Add Filter' and select 'OS' from the available options.
4. From the dropdown menu, choose the desired operating system(s) you wish to target or exclude.
5. Confirm your selection and save the filter. It's now ready to be used in your widgets & campaigns.


[title] Website data
[path] /

Website data is an ephemeral store that can hold data you might need to use for targetting and personalization for the duration of a visitor's session. Examples of such data can be:

1. Cart size/value
2. Site category
3. Article name
4. Any other data which relates to the site rather than to a customer

Website data can be set in several ways:

1. Using the `ply.setData` [client SDK](docId\:g9CXYw_quWfrTCHrMhAl8) method
2. By using the [data parser engine](docId\:jnnibmarMLnCnTvhER4Df)
3. By setting the `window.plyData` object

How to set the website data using the `plyData` variable:

```javascript
window.plyData = {
    cartSize: 10,
    cartValue: 150
}
```


[title] Integrations
[path] Settings/

Integrations allow you to plug in other tools into Personizely in order to expand its functionality or establish continuous data sync. Some integrations require connecting an API key, others redirect you to the vendor's page where you have to give access to Personizely to the scopes it requires. There are a few types of integrations:

1. Email and CRM
2. Platform
3. Messenger
4. SMS
5. Email validation
6. Analytics

### Platform

The platform integrations allow you to integrate Personizely with your site platform. This kind of integration gives you the possibility to use various platform features from within Personizely.

### Email and CRM

These kinds of integrations allow you to sync contacts collected via Personizely forms to your Email marketing system of CRM. Some integrations allow mapping the fields and the custom fields from Personizely with the respective ones in your system. Some integrations also have perpetual data sync so the data is always fresh in Personizely.

### Messenger

These kinds of integrations allow you to include a messenger checkbox widget inside your Personizely widgets. Once you enable it you will see a messenger element that you can drag and drop onto your widget, in widget builder. Please note that for this to work you will also need to have the respective integration code installed on your website.

### SMS

These kinds of integrations allow you to sync the phone numbers collected via the Personizely forms to your SMS messaging service. Make sure that your SMS Provider's plan supports API access before connecting to Personizely.

### Email validation

These kinds of integrations allow Personizely to validate the email addresses that are being typed into Personizely forms with much more accuracy, in order to prevent users from using bad email addresses.

### Analytics

These kinds of integrations allow Personizely to send analytics data and events to your analytics tools.


[title] Locale
[path] Targets/

Target visitors based on their set locale preferences. Derived from browser or system settings, the locale signifies the user's preferred language combined with regional settings like date format, number system, and currency.

### **Options**

A dropdown menu lets you choose from an extensive list of available locales. Each option corresponds to specific language-regional combinations&#x20;

### **Use Cases**

1. **Content localization -** Create widgets & campaigns tailored to the visitor's locale, ensuring that both language and regional nuances align with their preferences.
2. **Promotions -** Offer locale-specific promotions or deals, capitalizing on regional events or holidays.

### **How to Use**

1. Head to the 'Targets' section in the Personizely dashboard.
2. Click "Create target" and name it.
3. Select 'Add Filter' and pick 'Locale' from the options.
4. From the dropdown menu, choose the desired locale(s) you aim to target or exclude.
5. Once selected, save the filter. It's now ready to be used in your widgets & campaigns.

### **Notes**

- Locale-based targeting hinges on the accuracy of the visitor's browser or system settings. Content delivery might be misaligned if a user operates with a non-native locale preference.




[title] Custom fields
[path] Settings/

Custom fields are custom visitor properties that can be used to collect or set additional information onto a visitor's profile.

There are 7 types of custom fields:

### Text

A simple one-line text field.

### Textarea

A multi-line text field.

### Email

An email text field. This will have the type set to email in HTML and will only allow email format values.

### Number

A numeric text field.&#x20;

### Checkbox

A checkbox field that can have just two possible values - true and false.

### Radio

A radio input list, that can have multiple options out of which only one can be selected.

### Select

A select dropdown that can have multiple options out of which only one can be selected.

:::hint{type="info"}
You cannot change a field type after it was created.
:::


[title] Placeholders
[path] Settings/

Placeholders are used to place embedded widgets inside your site's content. Every placeholder provides an HTML snippet which you have to place inside your website's code/content. All the placeholders are available for selection inside embedded widgets settings. Once the placeholder is selected and the widget is activated is should appear on your site inside the snippet referenced previously.


[title] MCP Server
[path] /

Personizely exposes its public API to AI assistants via the [Model Context Protocol](https://modelcontextprotocol.io). Connect ChatGPT, Claude, Cursor, or any MCP-compatible client to your Personizely account and ask questions in natural language: "How is my homepage popup performing this month?", "Stop campaign #12", "Compare the goal conversion rate of variation A and B over the last 14 days".

## Endpoint

```yaml
https://mcp.personizely.net
```

OAuth 2.1 with PKCE. Each user signs in to their own Personizely account; tokens are scoped to the account they pick during consent.

The server supports the [Streamable HTTP transport](https://modelcontextprotocol.io/specification/2025-03-26/basic/transports#streamable-http) and Dynamic Client Registration (RFC 7591) — most MCP clients can connect just by pointing at the URL above.

## Permissions

Only Personizely **admins and owners** can authorize an MCP client. The OAuth consent screen will reject the request if your role is `member`. Ask your account admin to either authorize the client themselves or grant you admin access first.

## Connecting

### Claude Desktop / Claude Code

In your MCP settings, add:

```json
{
  "mcpServers": {
    "personizely": {
      "url": "https://mcp.personizely.net"
    }
  }
}
```

Restart the client. The first call will pop up a browser window asking you to sign in to Personizely and pick which account to grant access to.

### ChatGPT

Settings → **Connectors** → **Add connector** → enter:

- **Name:** Personizely
- **URL:** `https://mcp.personizely.net`

ChatGPT will discover OAuth automatically and walk you through the sign-in flow.

### Cursor

Settings → **MCP** → **Add new MCP server** → paste `https://mcp.personizely.net`.

### Other clients

Any MCP client that supports OAuth 2.1 with Dynamic Client Registration. Point it at the URL above; the rest is auto-discovered.

## What you can do

The server exposes 16 tools across 5 areas. The assistant chooses which tool to call based on what you ask — you don't need to know the names. The list below is a reference if you want to know what's possible.

### Websites

If your account has more than one website, every other tool needs a `websiteId`. The assistant will list your websites and ask which one you mean.

| Tool            | What it does                            |
| --------------- | --------------------------------------- |
| `list_websites` | Lists every website under your account. |

### Campaigns

Campaigns are personalization or A/B-test rules that run alongside your site's normal content (theme overrides, shipping rules, full-page experiments, etc.).

| Tool                   | What it does                                                                                                                                                                                                                                                                                                                                                         |
| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `list_campaigns`       | List campaigns. Filter by `active` and `type` (`personalization`, `themeExperiment`, `productPersonalization`, …).                                                                                                                                                                                                                                                   |
| `get_campaign`         | Full details for a single campaign, including its variations.                                                                                                                                                                                                                                                                                                        |
| `start_campaign`       | Activate a campaign.                                                                                                                                                                                                                                                                                                                                                 |
| `stop_campaign`        | Deactivate a campaign.                                                                                                                                                                                                                                                                                                                                               |
| `get_campaign_results` | Per-variation analytics: views, reach, goal conversions, revenue per visitor, statistical significance, sample-size progress. Optional `dimension` (`device` / `country` / `channel` / `referrer`) for breakdowns. Optional `compareMetric` (`goalConversionRate` / `valuePerVisitor` / `profitPerVisitor`) controls which metric drives significance + improvement. |

### Widgets

Widgets are popups, callouts, bars, and embedded blocks that render on your site.

| Tool                            | What it does                                                                                                                                                                                                                                               |
| ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `list_widgets`                  | List widgets. Filter by `active` and `type` (`popup`, `callout`, `bar`, `embedded`).                                                                                                                                                                       |
| `get_widget`                    | Full details for a single widget, including its variations and any running experiments.                                                                                                                                                                    |
| `start_widget`                  | Activate a widget.                                                                                                                                                                                                                                         |
| `stop_widget`                   | Deactivate a widget.                                                                                                                                                                                                                                       |
| `get_widget_results`            | Aggregate analytics for a widget — views, conversions, completions, goal conversions, revenue.                                                                                                                                                             |
| `get_widget_experiment_results` | Per-variation analytics for a specific widget experiment. Same shape as `get_campaign_results`. Available `compareMetric` values: `conversionRate`, `completionRate`, `goalConversionRate`, `valuePerVisitor`, `profitPerVisitor`, `extraValuePerVisitor`. |

The control variation in widget experiments represents visitors who weren't shown the widget — comparisons measure the lift the widget produces over no widget. `goalConversionRate` measures conversion into goals defined on the widget (Purchase, etc.); `conversionRate` measures interaction inside the widget itself (form submit, CTA click).

### Goals

Goals are the conversion events you track on your site (purchases, signups, custom events).

| Tool         | What it does                             |
| ------------ | ---------------------------------------- |
| `list_goals` | List the goals configured for a website. |
| `get_goal`   | Details for a single goal.               |

### Targets

Targets are audience segments (e.g. "returning visitors from US on mobile") used by campaigns and widgets.

| Tool           | What it does                                        |
| -------------- | --------------------------------------------------- |
| `list_targets` | List the audience targets configured for a website. |
| `get_target`   | Details for a single target.                        |

## Filters available on results endpoints

Both `get_campaign_results` and `get_widget_results` (and the experiment variant) accept a `filters` object scoping the analytics to a slice of traffic:

- `dateFrom` / `dateTo` — ISO 8601 timestamps
- `device` / `browser` / `os` — arrays of values
- `country` / `region` / `city` — arrays of values
- `utmSource` / `utmMedium` / `utmCampaign` / `utmContent` / `utmTerm`
- `referrer`
- `visitorType` — `new` or `returning`

Example: "How did campaign 5 perform last week on mobile in the US?" — the assistant translates this into `get_campaign_results` with the appropriate filters.

## Scopes

The server requests two OAuth scopes:

- `read` — read campaigns, widgets, goals, targets, and analytics.
- `write` — start/stop campaigns and widgets.

You'll see both on the consent screen. If you only want a read-only assistant, the MCP client can request only `read`; write tools then 403 if the assistant tries to call them.

## Troubleshooting

- **"This MCP server doesn't implement OAuth"** — almost always a CORS or discovery issue on the client side. The server exposes `/.well-known/oauth-protected-resource` and a `WWW-Authenticate` challenge on unauthenticated requests; if your client fetches them but rejects the response, it's likely a transport issue specific to that client. Try a different MCP client to confirm.
- **"compareMetric not available for experiments with a control group"** — `conversionRate` and `completionRate` measure interaction inside the widget, which a control visitor never sees. They're rejected when the experiment has a control share. Use `goalConversionRate` or one of the per-visitor revenue metrics instead.
- **Tokens stop working after a long idle** — refresh tokens are long-lived, but if the connected app has been disconnected from your account (Settings → Connected apps), you'll need to re-authorize.

## Disconnecting

Settings → **Connected apps** in your Personizely dashboard lists every MCP client (and any OAuth integration) that has access to your account. Click **Disconnect** to immediately revoke all tokens for that client.

[title] Cookie
[path] Targets/

Target visitors based on specific cookies stored in their browsers. This becomes a powerful tool for refining campaigns & widgets based on a user's prior interactions with the website, as evidenced by the presence, absence, or value of certain cookies.

### Options

1. **Cookie name -&#x20;**&#x74;he cookie name as it's represented in browser cookies.
2. **Condition**
   - **Is -** Value matches the specified value.
   - **Is not -** Value does not match the specified value.
   - **Contains -** The cookie contains a specific value or string.
   - **Does not contain -** The cookie doesn't contain a specific value or string.
   - **Is empty -** Specified cookie but no set value.
   - **Is not empty** - Targets visitors with a specified cookie and any value.
   - **Is higher than** - The cookie value is higher than the specified numerical value.
   - **Is lower than -** The cookie value is lower than the specified numerical value.
3. **Value** - the value to compare against the cookie value based on the condition.

### Use Cases

1. **Exclusive Content -** Target visitors who have a membership cookie with exclusive content or offers.
2. **Returning Visitors -** For visitors who have a cookie indicating previous visits but no purchases, present them with a limited-time offer to encourage conversions.
3. **Special Offers -** For visitors with a loyalty cookie indicating a certain number of visits or purchases, provide special offers or discounts.
4. **Exclusive Access -&#x20;**&#x44;isplay or hide special offers exclusively to customers who are logged in.

### How to Use

1. Navigate to the 'Targets' section in the Personizely dashboard.
2. Click on "Create target" and name it.
3. Choose 'Add Filter' and select 'Cookie'.
4. Specify the Cookie ID or name in the provided input field.
5. Choose the desired value condition from the list.
6. Input the corresponding value, if applicable.
7. Confirm and save your filter settings.

### Notes

- Pairing the "Cookie" filter with "Cart Value" or "Cart Size" offers powerful insights, enabling tailored retargeting based on both past and present shopping behavior.
- Using the "Cookie" filter alongside "Location" or "Visitor's Time" can optimize content display based on previous interactions and current real-time context.


[title] ShipRocket/Shopify goal tracking
[path] Settings/Untitled/

Due to the fact that Shopify is not consistently sending orders/paid events via webhooks for ShipRocket orders, there are issues with accurate tracking of purchases in Personizely.

In order to mitigate that, you can create a custom pixel that subscribes to ShipRocket pixel events and relays them to Personizely.

Here are the steps you need to take:

### Create the goals in Personizely

Go to Settings -> Goals and create a custom event goal. Specify a name, for example: ShipRocket purchase. Here are the available events for ShipRocket:

- sr\_purchase - the purchase event
- sr\_checkout\_start - the checkout initiation event

Once created, use these goals in your widgets and campaigns to track performance.


[title] JS API
[path] /

Personizely exposes some JavaScript methods to give you more flexibility in using it.

# Identify API

`ply.identifyVisitor(data)`

This method returns a Promise.

**data** - *object*, containing information about the visitor and custom fields values. The object can have the following properties:

**email** - *string*, a valid email address
**firstName** - *string*, visitor's first name
**lastName** - *string*, visitor's last name
**phone** - *string*, visitor's phone number
**companyName** - *string*, visitor's company name
**companyTitle**- *string*, visitor's company title
**marketingConsent**- *boolean*, visitor's marketing consent status
**privacyConsent**- *boolean*, visitor's privacy consent status
**address** - *string*, visitor's address
**bio** - *string*, visitor's bio
**customFieldValues** - *object*, visitor's custom field's values

The **custom field values** object is an object where the keys are the custom fields id's which can be found on the Settings page and the values are the values of the respective fields for the current visitor.

For radio and select field types you need to make sure that the choice options are valid ones, so if you have a field named "Gender" with 2 options: Male, Female, you won't be able to save a different value than one of those two values.
The checkbox type fields should receive a boolean value.
The number type fields should receive a numeric value.

Example:

```javascript
ply.identifyVisitor({
  "email": "john@example.com",
  "firstName": "John",
  "lastName": "Doe",
  "phone": "+1665599555",
  "companyName": "Personizely",
  "companyTitle": "CEO",
  "marketingConsent": true,
  "privacyConsent": true,
  "address": "5th Avenue",
  "bio": "My bio",
  "customFieldValues": {
     "1": "Male"
   }
})
```

# Goal Tracking API

`ply.trackGoal(eventName, value)`

This method is used to track custom goals.

**eventName** - *string*, the name of the event (this should be the name of an existing goal in your Personizely website settings).&#x20;
**value** - *number*, goal value in the currency of your website

For example, to track a **purchase** worth **$100** on your site, you can use the following code on your thank-you page:
`ply.trackGoal('Purchase', 100)`

# Custom Event Tracking API

`ply.trackEvent(eventName, value)`

This method is used to track custom events.

**eventName** - *string*, the name of the event (this can be any arbitrary event name or the name of an existing goal in your Personizely).&#x20;
**value** - *number*, event value in the currency of your website (optional)

For example, to track an **add to cart** event worth **$29** on your site, you can use the following code when a visitor adds a product to the cart:
`ply.trackEvent('Add to cart', 29)`

# Widgets API

`ply.showWidget(id, suppressRules, stepId)`

This method is used to show up any widget regardless of the triggers it has assigned to it.

**id** - *integer*, the id of the widget
**suppressRules** - (optional) *boolean*, whether to suppress the widget rules
**stepId** - (optional) *int*, the id of the step to open the widget on. Use this if you need to skip a step or reopen the widget on a specific step.

# Campaigns API

`ply.runCampaign(id)`

This method is used to run a campaign manually.

**id** - *integer*, the id of the campaign

Returns - the displayed `variation` or null/undefined if the user falls into the control group.

For full-stack campaigns, you can retrieve the enabled features with:

`variation.getFeature(featureKey)`

**featureKey** - *string*, the key of the feature as defined when the feature is created

Returns the `feature`

To get a parameter of a feature, use this:

`feature.getParameterValue(key)`

**key** - *string*, the key of the parameter

Example:

:::BlockQuote
const variation = ply.runCampaign(3000000)
if (variation) \{
&#x20; const cartFeature = variation.getFeature('cart')
&#x20; if (cartFeature.isEnabled()) \{
&#x20;    const message = cartFeature.getParameterValue('message')
&#x20;    alert(message)
&#x20; }
} else \{
&#x20; // Control
}
:::

# Website Data API

This method is used to set website data. The method can be called in two ways:

**1st way**:

`ply.setData(data)`

**data** - *object,&#x20;*&#x61;n object containing key-value data pairs, the values will be merged with the existing data object.

**2nd way:**

`ply.setData(key, value)`

**key** - *string*, the name of the key to be written to the data object.&#x20;
**value** - *mixed,&#x20;*&#x74;he value, can be *string, boolean, number, null*

For example, to add cart details to your website data, you can use:
`ply.setData('cartSize', 5)` to set a single value or:

`ply.setData({cartSize: 5, cartValue: 99})` to set multiple values at once.

## Managing a situation where Personizely is not yet loaded

Personizely has a dataLayer-like solution to call the JS API even if the script is not yet loaded. To do that, use the following example:

```javascript
  window.plyLayer = window.plyLayer || []
  window.plyLayer.push(['trackEvent', 'purchase', 100])])
```


[title] List campaigns
[path] Public API/Campaigns/

{
  "id": "guALw-2rPW9tpm4nuvOY3",
  "type": "api-oas-v2",
  "data": {
    "method": "GET",
    "url": "/v1/campaigns",
    "servers": [],
    "name": "List campaigns",
    "description": "",
    "contentType": "application/json",
    "request": {
      "pathParameters": [],
      "headerParameters": [
        {
          "name": "accept",
          "type": "string",
          "kind": "optional",
          "description": "Generated from available response content types",
          "enum": [
            "application/json"
          ],
          "default": "application/json"
        }
      ],
      "queryParameters": [
        {
          "kind": "optional",
          "name": "websiteId",
          "type": "string",
          "description": "<p>Website id (optional if account has only one website)</p>",
          "default": null,
          "pattern": "\\d+"
        },
        {
          "kind": "optional",
          "name": "offset",
          "type": "integer",
          "description": "Offset from which to start listing",
          "default": 0,
          "minimum": 0
        },
        {
          "kind": "required",
          "name": "limit",
          "type": "integer",
          "description": "<p>How many results to return (1-500)</p>",
          "default": 100,
          "minimum": 1,
          "maximum": 500
        },
        {
          "kind": "optional",
          "name": "active",
          "type": "string<Choice>",
          "description": "Filter by active status",
          "default": null,
          "format": "Choice",
          "enum": [
            "true",
            "false"
          ]
        },
        {
          "kind": "optional",
          "name": "type",
          "type": "string<Choice>",
          "description": "Filter by campaign type",
          "default": null,
          "format": "Choice",
          "enum": [
            "personalization",
            "themePersonalization",
            "productPersonalization",
            "shippingPersonalization",
            "urlSplitPersonalization",
            "fullStackPersonalization",
            "templatePersonalization",
            "experiment",
            "themeExperiment",
            "productExperiment",
            "shippingExperiment",
            "urlSplitExperiment",
            "fullStackExperiment",
            "templateExperiment"
          ]
        }
      ],
      "bodyDataParameters": [],
      "formDataParameters": [],
      "oAuthParameters": [
        {
          "id": "bearer",
          "name": "bearer",
          "kind": "optional",
          "type": "http",
          "scheme": "bearer"
        }
      ],
      "cookieParameters": []
    },
    "responses": [
      {
        "statusCode": "200",
        "description": "Returned when successful",
        "jsonExample": "",
        "isExpanded": true,
        "schema": [
          {
            "kind": "optional",
            "type": "array",
            "description": "",
            "customType": "Campaign[]",
            "schema": [
              {
                "name": "id",
                "kind": "optional",
                "type": "integer",
                "description": ""
              },
              {
                "name": "name",
                "kind": "required",
                "type": "string",
                "description": "",
                "minLength": 1,
                "maxLength": 255
              },
              {
                "name": "description",
                "kind": "optional",
                "type": "string",
                "description": "",
                "maxLength": 2048
              },
              {
                "name": "type",
                "kind": "optional",
                "type": "string",
                "description": "",
                "default": "personalization"
              },
              {
                "name": "goalsReached",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "views",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "value",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "createDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "updateDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "startDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "endDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "active",
                "kind": "optional",
                "type": "boolean",
                "description": "",
                "default": false
              },
              {
                "name": "controlShare",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 5,
                "minimum": 0,
                "maximum": 100
              },
              {
                "name": "trafficAllocation",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 10,
                "minimum": 0,
                "maximum": 100
              },
              {
                "name": "targetId",
                "kind": "optional",
                "type": "integer",
                "description": ""
              },
              {
                "name": "targetMode",
                "kind": "optional",
                "type": "string",
                "description": "",
                "default": "live"
              },
              {
                "name": "primaryGoalId",
                "kind": "optional",
                "type": "integer",
                "description": ""
              },
              {
                "name": "significanceLevel",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 90,
                "enum": [
                  "80",
                  "90",
                  "95",
                  "100"
                ]
              },
              {
                "name": "methodology",
                "kind": "optional",
                "type": "string<bayesian | frequentist>",
                "description": "",
                "default": "frequentist",
                "enum": [
                  "bayesian",
                  "frequentist"
                ]
              },
              {
                "name": "power",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 80,
                "minimum": 60,
                "maximum": 99
              },
              {
                "name": "mde",
                "kind": "optional",
                "type": "number<float>",
                "description": "",
                "default": 20,
                "format": "float",
                "minimum": 1,
                "maximum": 100
              }
            ],
            "modelRef": "#/components/schemas/Campaign",
            "isExpanded": true
          }
        ]
      }
    ],
    "hasXCodeSamples": false
  },
  "children": [
    {
      "text": ""
    }
  ]
}
[title] Get a single widget (includes variations and experiments)
[path] Public API/Widgets/

{
  "id": "BA7DM3HUWRpuYWVl40H7k",
  "type": "api-oas-v2",
  "data": {
    "method": "GET",
    "url": "/v1/widgets/{id}",
    "servers": [],
    "name": "Get a single widget (includes variations and experiments)",
    "description": "",
    "contentType": "application/json",
    "request": {
      "pathParameters": [
        {
          "kind": "required",
          "name": "id",
          "type": "string",
          "description": "",
          "pattern": "\\d+"
        }
      ],
      "headerParameters": [
        {
          "name": "accept",
          "type": "string",
          "kind": "optional",
          "description": "Generated from available response content types",
          "enum": [
            "application/json"
          ],
          "default": "application/json"
        }
      ],
      "queryParameters": [
        {
          "kind": "optional",
          "name": "websiteId",
          "type": "string",
          "description": "",
          "default": null,
          "pattern": "\\d+"
        }
      ],
      "bodyDataParameters": [],
      "formDataParameters": [],
      "oAuthParameters": [
        {
          "id": "bearer",
          "name": "bearer",
          "kind": "optional",
          "type": "http",
          "scheme": "bearer"
        }
      ],
      "cookieParameters": []
    },
    "responses": [
      {
        "statusCode": "200",
        "description": "Returned when successful",
        "jsonExample": "",
        "isExpanded": true,
        "schema": [
          {
            "kind": "optional",
            "type": "object",
            "description": "",
            "customType": "WidgetDetail",
            "schema": [
              {
                "name": "variations",
                "kind": "optional",
                "type": "array",
                "description": "<p>Variations that belong to an experiment are surfaced under WidgetExperiment::$variations\nso callers don't have to filter by experimentId themselves.</p>",
                "modelRef": "#/components/schemas/WidgetVariation",
                "customType": "WidgetVariation[]",
                "schema": [
                  {
                    "name": "id",
                    "kind": "optional",
                    "type": "integer",
                    "description": ""
                  },
                  {
                    "name": "share",
                    "kind": "optional",
                    "type": "integer",
                    "description": "",
                    "default": 100
                  },
                  {
                    "name": "name",
                    "kind": "optional",
                    "type": "string",
                    "description": ""
                  }
                ]
              },
              {
                "name": "id",
                "kind": "optional",
                "type": "integer",
                "description": ""
              },
              {
                "name": "name",
                "kind": "required",
                "type": "string",
                "description": "",
                "minLength": 1,
                "maxLength": 255
              },
              {
                "name": "clicks",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "views",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "conversions",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "goalsReached",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "value",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "extraValue",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "submits",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "completions",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "contacts",
                "kind": "optional",
                "type": "integer",
                "description": "",
                "default": 0
              },
              {
                "name": "createDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "updateDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "active",
                "kind": "optional",
                "type": "boolean",
                "description": "",
                "default": false
              },
              {
                "name": "type",
                "kind": "required",
                "type": "string",
                "description": ""
              },
              {
                "name": "startDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "endDate",
                "kind": "optional",
                "type": "string<date-time>",
                "description": "",
                "format": "date-time"
              },
              {
                "name": "experiments",
                "kind": "optional",
                "type": "array",
                "description": "",
                "modelRef": "#/components/schemas/WidgetExperiment",
                "customType": "WidgetExperiment[]",
                "schema": [
                  {
                    "name": "variations",
                    "kind": "optional",
                    "type": "array",
                    "description": "",
                    "modelRef": "#/components/schemas/WidgetVariation",
                    "customType": "WidgetVariation[]",
                    "schema": [
                      {
                        "name": "id",
                        "kind": "optional",
                        "type": "integer",
                        "description": ""
                      },
                      {
                        "name": "share",
                        "kind": "optional",
                        "type": "integer",
                        "description": "",
                        "default": 100
                      },
                      {
                        "name": "name",
                        "kind": "optional",
                        "type": "string",
                        "description": ""
                      }
                    ]
                  },
                  {
                    "name": "id",
                    "kind": "optional",
                    "type": "integer",
                    "description": ""
                  },
                  {
                    "name": "name",
                    "kind": "optional",
                    "type": "string",
                    "description": ""
                  },
                  {
                    "name": "primaryMetric",
                    "kind": "optional",
                    "type": "string",
                    "description": ""
                  },
                  {
                    "name": "createDate",
                    "kind": "optional",
                    "type": "string<date-time>",
                    "description": "",
                    "format": "date-time"
                  },
                  {
                    "name": "updateDate",
                    "kind": "optional",
                    "type": "string<date-time>",
                    "description": "",
                    "format": "date-time"
                  },
                  {
                    "name": "startDate",
                    "kind": "optional",
                    "type": "string<date-time>",
                    "description": "",
                    "format": "date-time"
                  },
                  {
                    "name": "endDate",
                    "kind": "optional",
                    "type": "string<date-time>",
                    "description": "",
                    "format": "date-time"
                  },
                  {
                    "name": "controlShare",
                    "kind": "optional",
                    "type": "integer",
                    "description": ""
                  },
                  {
                    "name": "active",
                    "kind": "optional",
                    "type": "boolean",
                    "description": "",
                    "default": false
                  }
                ]
              },
              {
                "name": "primaryGoalId",
                "kind": "optional",
                "type": "integer",
                "description": ""
              }
            ],
            "modelRef": "#/components/schemas/WidgetDetail",
            "isExpanded": true
          }
        ]
      },
      {
        "statusCode": "404",
        "description": "Widget not found",
        "jsonExample": "",
        "isExpanded": true
      }
    ],
    "hasXCodeSamples": false
  },
  "children": [
    {
      "text": ""
    }
  ]
}
[title] Goals
[path] Public API/

