Skip to main content
Intempt
Coming soon

Cart popup timing test

Compares exit-intent, a 30 second delay and no popup at all on cart pages, scored on orders placed within 24 hours.

Authored by Sid Chaudhary

Founder & CEO at Intempt

Agentic workflow

Coming soon

1 step Blu runs end to end. It drafts a plan and nothing runs until you approve it.

  1. 1

    Set up the popup timing test

    Coming soon

    Blu builds a step

About this recipe

When to use it

A save-your-cart popup that fires too early feels pushy, and one that fires too late is already too late. This tests exit-intent against a timed delay against no popup at all, so the timing is measured, not guessed.

What it delivers

Runs a client-side experiment testing when to show the save-your-cart popup - exit-intent, a timed delay, or no popup at all.

How you prompt this

Describe the outcome in your own words and Blu Agent maps it to this recipe, or run it by name. It drafts a plan first and nothing runs until you approve it.

Tell Blu Agent what you want

“Compares exit-intent, a 30 second delay and no popup at all on cart pages, scored on orders placed within 24 hours.”

recipe.md preview

Built from the published catalog. Blu Agent's full step prompts load in your workspace when you run it.

Sign up to read the full recipe.md and run it with Blu Agent.

Sign up to see the full recipe

Inputs & outputs

What the recipe needs before it runs, and what it leaves in your workspace.

Inputs

  1. Nothing declared beyond an Intempt workspace. Blu asks for anything else it needs as it goes.

Outputs

    How the recipe runs

    Blu follows the steps in order and shows you each one before anything goes live.

    1. 01Set up the popup timing testCreate a CLIENT EXPERIMENT on /experiences titled "Cart Popup Timing". ═══ PATH 1: Top-level configuration ═══ Experience type: client_experiment Variants: - Control (34%): exit-intent popup (mouse leaves viewport) - Variant B (33%): 30-second delay popup after cart is idle - Variant C (33%): no popup (control baseline: measures intrinsic recovery rate) Targeting: - Pages: page URL contains "/cart" OR Cart created has occurred in the current session - Devices: desktop only (exit-intent requires mouse tracking; mobile doesn't have hover events) - Audience: visitors with at least one Cart created in the current session - Display frequency: once_per_session Primary metric: goal_completed_in_experience where experience_id = <this> (goal: Placed order within 24 hours of exposure) Secondary metrics: - Click on where target_id = "popup-save-cart" (popup engagement rate) - Click on where target_id = "popup-dismiss" (dismissal rate) - Email capture rate from popup (Submit on the popup form) - Placed order within 24 hours Guardrail: bounce rate (sessions ending immediately after popup display) must not increase >10% Schedule: 14 days ═══ PATH 2: Variant HTML content (Visual Editor) ═══ Variant: Control (exit-intent popup) HTML target selector: body (append fixed-position element on exit-intent trigger) Variant DOM (rendered when mouse leaves viewport top): <div class="cart-save-popup" data-variant="control" data-trigger="exit-intent" hidden> <div class="popup-overlay"></div> <div class="popup-content"> <button class="popup-close" id="popup-dismiss" aria-label="Close">×</button> <h2>Wait! Save your cart</h2> <p>We'll save your items and email you a reminder.</p> <form class="popup-email-form" id="popup-email-form"> <input type="email" name="email" placeholder="you@example.com" required /> <button type="submit" class="popup-cta" id="popup-save-cart">Save my cart</button> </form> </div> </div> Trigger logic: attach mouseleave listener to document.documentElement. When the cursor leaves the top edge of the viewport (e.target === document.documentElement && e.clientY <= 0), set the popup's hidden attribute to false and store a sessionStorage flag so it doesn't fire again in the same session. Variant: B (30-second delay popup) HTML target selector: body (append fixed-position element) Variant DOM: <div class="cart-save-popup" data-variant="b" data-trigger="delay-30s" hidden> <div class="popup-overlay"></div> <div class="popup-content"> <button class="popup-close" id="popup-dismiss" aria-label="Close">×</button> <h2>Still thinking it over?</h2> <p>Save your cart and we'll send you a reminder: no pressure.</p> <form class="popup-email-form" id="popup-email-form"> <input type="email" name="email" placeholder="you@example.com" required /> <button type="submit" class="popup-cta" id="popup-save-cart">Save my cart</button> </form> </div> </div> Trigger logic: when Cart created fires, start a 30-second timer. If no cart_updated, Click on within the cart context, or View page event occurs within that window, the popup shows. Reset the timer on any cart interaction so active shoppers aren't interrupted. Variant: C (no popup: baseline) No DOM changes: measures the intrinsic recovery rate without any popup intervention. This baseline is critical: without it you can't tell whether the popups CAUSE recovery or whether users would have returned anyway. The Visual Editor allows the user to refine the popup copy, styling, animation (slide-up vs. fade-in), and the email-capture handoff to the merchant's email tool. Taxonomy notes: - Cart created is canonical (fires when items are added). - target_id values "popup-save-cart" and "popup-dismiss" are preserved across Variants Control and B for consistent Click on aggregation. Variant C has neither (no popup rendered). - The "popup engagement rate" = Click on (target_id = "popup-save-cart") count / total exposures with that variant. - Variant C's baseline is essential and not optional. Skipping it makes the experiment unable to distinguish causal lift from return-anyway behavior. - For Variant B's "cart idle" detection, the timer resets on any cart-related interaction. The 30-second window is a starting point; tune based on your audience's typical cart-decision time. - Email capture from the popup feeds into your existing abandoned-cart email journey: this experiment tests whether the popup adds value above intrinsic return, not whether email recovery itself works.

    Install Intempt and run it

    1. 1

      Sign up

      Create a free Intempt workspace.

    2. 2

      Connect your data

      Add the sources this recipe reads from.

    3. 3

      Ask Blu

      Type /cart-abandonment-popup-timing in Blu once this recipe is live there.

    4. 4

      Review and approve

      Blu builds each step and waits for your OK before anything goes live.

    More recipes by Sid Chaudhary

    Got a play worth sharing?

    Publish it to the Intempt Collective Marketplace and earn when other teams run it.

    Submit a recipe