Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Popup and modal optimization for conversion. Covers exit-intent, slide-ins, banners, timing optimization, frequency capping, audience targeting, compliance, and A/B testing frameworks for lead capture, promotions, and announcements.
.claude/skills/borghei-popup-cro/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-10 | ✗→✓ | ▲ Improved | 192% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 157% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 381% | 0% |
| case-20 | ✗→✓ | ▲ Improved | 291% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 192% | 0% |
Production-grade popup optimization framework covering format selection, trigger engineering, audience targeting, frequency capping, copy design, compliance requirements, and structured A/B testing. Handles lead capture, promotional, announcement, and feedback popups across web and mobile.
Before designing the popup, confirm these inputs. If any is unknown or vague, ASK — do not assume:
Stop rule: ask only the 2-3 that most change the output. If the user says "just draft it," proceed and list your assumptions at the top of the strategy.
| Question | Why It Matters | |----------|---------------| | What is the popup purpose? (lead capture, promotion, announcement, feedback) | Determines format and trigger | | What existing popups are running? | Conflict resolution needed | | What traffic sources? (paid, organic, direct) | Targeting and trigger strategy | | New vs returning visitor split? | Personalization opportunity | | Mobile vs desktop traffic split? | Mobile compliance requirements | | Current popup performance? (if exists) | Baseline for optimization | | Any compliance requirements? (GDPR, CCPA) | Legal constraints on data capture |
| Format | Best For | Intrusiveness | Mobile Friendly | Conversion Rate | |--------|----------|--------------|-----------------|-----------------| | Center modal | High-value offers, exit intent | High | With adaptation | 3-10% | | Slide-in (corner) | Newsletter, content offers | Low | Yes | 1-5% | | Top bar | Announcements, promotions | Very low | Yes | 0.5-2% | | Bottom bar | Cookie consent, CTAs | Very low | Yes | 0.5-2% | | Full-screen overlay | Major promotions, welcome mats | Very high | No (Google penalizes) |2-8% | | Inline expansion | Content upgrades within articles | Very low | Yes | 2-7% | | Exit-intent modal | Final capture attempt | Medium | Desktop only | 2-5% |
What is the goal?
├── Lead capture (email)
│ ├── Blog/content page → Slide-in (scroll trigger) or inline expansion
│ ├── Landing page → Exit-intent modal
│ └── Homepage → Time-delayed center modal
├── Promotion/discount
│ ├── E-commerce → Center modal (entry or timed)
│ └── SaaS → Top bar with countdown
├── Announcement
│ ├── New feature → Top bar (sticky)
│ └── Event/webinar → Slide-in or center modal
└── Feedback/survey
└── Post-interaction → Slide-in (bottom corner)| Trigger | How It Works | Best For | Risk | |---------|-------------|----------|------| | Exit intent | Mouse moves toward browser close/back | Last-chance capture | Desktop only | | Time delay | Appears after N seconds | Low-commitment offers | Too early = annoying | | Scroll depth | Appears at N% scroll | Content-engaged visitors | Must calibrate to content length | | Page count | Appears after N page views | Multi-visit engagement | Requires cookie tracking | | Click trigger | User clicks a specific element | Lead magnets, CTAs | Requires obvious trigger element | | Inactivity | No interaction for N seconds | Re-engagement | Can feel intrusive |
| Trigger | Setting | Rationale | |---------|---------|-----------| | Time delay | 15-30 seconds | < 10s feels aggressive, > 60s misses visitors | | Scroll depth | 50-70% | User has consumed enough content to be engaged | | Page count | 2-3 pages | Visitor has shown interest beyond a single page | | Exit intent | Mouse leaves viewport | Last opportunity before they leave | | Click trigger | Prominent CTA button or text link | Explicit user intent |
Layer triggers for better targeting:
| Combination | When to Use | |------------|-------------| | Scroll 50% + Time 20s | Ensures both engagement and time on page | | Page count 3 + Exit intent | Only show to visitors who have browsed multiple pages and are leaving | | Click trigger + Email not captured | Only show form to non-subscribers |
| Segment | Popup Strategy | |---------|---------------| | New visitors (first visit) | Welcome offer, newsletter signup, content upgrade | | Returning visitors (2-5 visits) | Deeper offer, free trial, demo request | | Returning visitors (5+ visits) | Direct CTA, consultation offer | | Email subscribers | Never show email capture popup | | Existing customers | Feature announcements, upgrade offers only | | Paid traffic visitors | Message-matched offer, no generic popup | | Mobile visitors | Non-intrusive format only (slide-in or bottom bar) |
Always exclude these segments from popups:
| Rule | Setting | Rationale | |------|---------|-----------| | Max popups per session | 1 | Multiple popups per visit destroys trust | | Cooldown after dismissal | 7 days minimum | Respect the user's "no" | | Cooldown after close (X button) | 3-7 days | Less aggressive than dismissal | | Max popups per month | 3-4 | More than this and users feel harassed | | Post-conversion suppression | Permanent for that popup type | Never ask again once they converted |
If multiple popups compete for the same user in the same session, use this priority:
| Priority | Popup Type | Why | |----------|-----------|-----| | 1 | Cookie consent / legal | Required by law | | 2 | Exit intent (if triggered) | Last chance, highest intent signal | | 3 | Time-delayed / scroll-triggered | Planned engagement | | 4 | Announcement bar | Lowest priority, always available |
HEADLINE: What they get (benefit-focused, 6-10 words)
SUBHEADLINE: Why they should care (supporting detail, 1 sentence)
[FORM: Minimum fields]
[PRIMARY CTA: Action-oriented, 2-4 words]
[DECLINE TEXT: Respectful, neutral, 3-6 words]
[TRUST ELEMENT: Privacy or social proof, 1 line]Newsletter Signup:
Content Upgrade:
Exit Intent (E-commerce):
| Popup | Trigger | Offer | |-------|---------|-------| | Welcome discount | Entry (new visitors, 5-second delay) | 10-15% off first order | | Exit intent | Mouse exit on product/cart page | Higher discount or free shipping | | Cart abandonment | Return visit after cart abandonment | Reminder + incentive | | Post-purchase | Thank you page | Referral offer or cross-sell |
| Popup | Trigger | Offer | |-------|---------|-------| | Content upgrade | Scroll 50% on blog post | Related PDF, checklist, template | | Demo request | Pricing page exit intent | "Talk to sales" with calendar link | | Newsletter | Blog, 3rd page view | Weekly insights email | | Feature announcement | Login, existing users | New feature with CTA to try it |
| Popup | Trigger | Offer | |-------|---------|-------| | Newsletter | Scroll 60% on article | "Get articles like this weekly" | | Content gate | After 3 free articles | Subscription or email for access | | Social follow | Scroll bottom of article | Follow on social platforms |
Google penalizes mobile pages that show intrusive interstitials. Avoid:
| Format | Mobile Safe? | Notes | |--------|-------------|-------| | Bottom bar | Yes | Small, non-blocking | | Top bar | Yes | Small, dismissable | | Slide-in (small) | Yes | Corner, < 30% of screen | | Center modal (small) | Conditional | Only if easily dismissable and shown after engagement | | Full-screen overlay | No | Penalized by Google | | Exit intent | N/A | Not available on mobile |
If your site runs multiple popups, implement these rules:
| Test | Hypothesis | Metric | |------|-----------|--------| | Trigger timing (15s vs 30s vs scroll) | Scroll trigger captures more engaged users | Conversion rate + bounce rate | | Offer type (discount vs content) | Content offers attract higher-quality leads | Conversion rate + lead quality | | Copy variation (benefit vs urgency) | Benefit-focused converts better long-term | Conversion rate | | Format (modal vs slide-in) | Slide-in has lower bounce impact | Conversion rate + bounce rate | | Decline text (neutral vs shame-free) | Neutral decline text maintains trust | Brand sentiment + repeat visits |
| Metric | Formula | Benchmark | |--------|---------|-----------| | Popup conversion rate | Conversions / Impressions | 2-5% (good), 5-10% (excellent) | | Popup view rate | Impressions / Eligible page views | Depends on trigger settings | | Bounce rate impact | Bounce rate with popup - without | Should be < 5% increase | | Email quality score | Popup leads who engage / Total popup leads | > 30% open subsequent emails | | Revenue per popup lead | Revenue from popup leads / Total popup leads | Compare to other lead sources |
| Artifact | Format | Description | |----------|--------|-------------| | Popup Strategy Map | Type x trigger x audience x frequency table | Complete popup inventory with conflict rules | | Complete Copy Set | Per-popup copy | Headline, subheadline, CTA, decline text, trust element | | Mobile Adaptation Guide | Per-format recommendations | Mobile-safe formats, sizing, dismiss behavior | | Compliance Checklist | Per-regulation requirements | GDPR, CCPA, CAN-SPAM, cookie consent | | A/B Test Plan | Prioritized table | Hypotheses ranked by expected impact | | Multi-Popup Priority Map | Priority ranking | Conflict resolution rules for concurrent popups |
Audits existing popup configurations for compliance, frequency conflicts, targeting gaps, and mobile safety. Reads a JSON inventory of popups and flags issues against best practices.
bashpython scripts/popup_strategy_auditor.py popups.json --format text python scripts/popup_strategy_auditor.py popups.json --format json
| Flag | Type | Description | |------|------|-------------| | popups.json | positional | Path to JSON file with popup inventory and rules | | --format | optional | Output format: text (default) or json |
Calculates statistical significance for popup A/B tests. Takes impressions and conversions for control and variant, computes conversion rates, relative lift, confidence level, and recommends whether to ship, continue testing, or abandon.
bashpython scripts/popup_ab_test_calculator.py test.json --format text python scripts/popup_ab_test_calculator.py test.json --format json
| Flag | Type | Description | |------|------|-------------| | test.json | positional | Path to JSON file with A/B test data | | --format | optional | Output format: text (default) or json |
Estimates revenue impact of popup lead capture by modeling lead volume, conversion rates, and customer lifetime value. Compares popup-sourced leads against other channels.
bashpython scripts/popup_roi_estimator.py roi_data.json --format text python scripts/popup_roi_estimator.py roi_data.json --format json
| Flag | Type | Description | |------|------|-------------| | roi_data.json | positional | Path to JSON file with popup performance and revenue data | | --format | optional | Output format: text (default) or json |
| Problem | Likely Cause | Resolution | |---------|-------------|------------| | Popup conversion rate below 2% | Wrong trigger timing, weak offer, or poor copy | Test scroll-triggered (50-70%) vs time-delayed; use benefit-focused headline; add countdown timer (lifts to 14.4% avg per 2026 benchmarks) | | Bounce rate increases >5% after adding popup | Popup fires too early or covers too much screen on mobile | Increase time delay to 15-30s or switch to scroll trigger; use slide-in format instead of center modal | | Email list quality drops (low open rates from popup leads) | Generic offer attracts low-intent subscribers | Switch to content upgrade offers specific to the page; add qualification question | | Multiple popups fire in same session | No global popup state manager or priority system implemented | Implement session-level state tracking via localStorage; enforce one-popup-per-session rule with priority ranking | | Mobile popup triggers Google penalty | Full-screen overlay or popup covers content before engagement | Switch to bottom bar, slide-in (<30% screen), or inline expansion format; test with Google Mobile-Friendly Tool | | Exit-intent not working on mobile | Exit-intent relies on mouse movement which does not exist on mobile | Use scroll-up or inactivity trigger as mobile alternative; segment trigger rules by device type | | Cookie consent popup conflicts with marketing popup | No priority system; both fire simultaneously | Legal popups always take priority; queue marketing popup to fire only after consent is given |
In scope: Popup and modal format selection, trigger engineering, audience targeting, frequency capping, copy architecture, mobile-safe design, multi-popup conflict resolution, compliance requirements (GDPR, CCPA, CAN-SPAM, cookie consent), and structured A/B testing for lead capture, promotional, announcement, and feedback popups.
Out of scope: Form field-level optimization within popups (use form-cro), page-level conversion optimization around the popup (use page-cro), in-app onboarding modals and tooltips (use onboarding-cro), registration flows triggered by popups (use signup-flow-cro). Scripts operate on local data only -- no integrations with popup platforms (OptinMonster, Wisepops, etc.) or analytics tools.
Limitations: Conversion benchmarks are aggregate industry averages from 2025-2026 studies (Popupsmart 10K+ campaigns, Wisepops 1B+ displays) and vary significantly by industry, traffic source, and offer type. Exit-intent detection is desktop-only; mobile alternatives (scroll-up, inactivity) have different performance characteristics. Google intrusive interstitial penalties apply to mobile search traffic specifically -- direct/paid traffic is less affected.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 19,413 | 15,007 | -23% | 1 | 1 | 0% | 3,122 | 7,336 | +135% | 0 | 0 | — |
case-02 | fail→fail | 40,657 | 33,398 | -18% | 1 | 1 | 0% | 5,935 | 10,210 | +72% | 0 | 0 | — |
case-03 | fail→fail | 23,278 | 15,247 | -35% | 1 | 1 | 0% | 3,257 | 7,169 | +120% | 0 | 0 | — |
case-04 | pass→pass | 16,425 | 16,973 | +3% | 1 | 1 | 0% | 2,458 | 7,480 | +204% | 0 | 0 | — |
case-05 | pass→pass | 25,491 | 20,035 | -21% | 1 | 1 | 0% | 3,729 | 7,705 | +107% | 0 | 0 | — |
case-06 | pass→pass | 26,266 | 22,086 | -16% | 1 | 1 | 0% | 4,509 | 8,212 | +82% | 0 | 0 | — |
case-07 | pass→pass | 12,870 | 12,384 | -4% | 1 | 1 | 0% | 1,887 | 6,760 | +258% | 0 | 0 | — |
case-08 | pass→pass | 14,200 | 9,757 | -31% | 1 | 1 | 0% | 1,938 | 6,287 | +224% | 0 | 0 | — |
case-09 | pass→pass | 12,187 | 9,689 | -20% | 1 | 1 | 0% | 1,757 | 6,316 | +259% | 0 | 0 | — |
case-10 | fail→pass | 16,019 | 11,874 | -26% | 1 | 1 | 0% | 2,353 | 6,874 | +192% | 0 | 0 | — |
case-11 | fail→pass | 17,012 | 8,179 | -52% | 1 | 1 | 0% | 2,358 | 6,066 | +157% | 0 | 0 | — |
case-12 | pass→pass | 16,655 | 15,167 | -9% | 1 | 1 | 0% | 2,253 | 7,018 | +211% | 0 | 0 | — |
case-13 | pass→pass | 13,515 | 7,221 | -47% | 1 | 1 | 0% | 2,109 | 5,979 | +183% | 0 | 0 | — |
case-14 | fail→fail | 15,974 | 18,302 | +15% | 1 | 1 | 0% | 2,283 | 7,410 | +225% | 0 | 0 | — |
case-15 | fail→pass | 7,704 | 5,409 | -30% | 1 | 1 | 0% | 1,205 | 5,796 | +381% | 0 | 0 | — |
case-20 | fail→pass | 10,384 | 8,088 | -22% | 1 | 1 | 0% | 1,572 | 6,153 | +291% | 0 | 0 | — |
case-16 | fail→pass | 11,469 | 2,449 | -79% | 1 | 1 | 0% | 1,819 | 5,318 | +192% | 0 | 0 | — |
case-17 | fail→pass | 7,703 | 1,999 | -74% | 1 | 1 | 0% | 1,242 | 5,236 | +322% | 0 | 0 | — |
case-18 | pass→pass | 12,219 | 10,771 | -12% | 1 | 1 | 0% | 1,824 | 6,569 | +260% | 0 | 0 | — |
case-19 | pass→pass | 15,633 | 22,959 | +47% | 1 | 1 | 0% | 2,231 | 8,449 | +279% | 0 | 0 | — |
case-21 | pass→pass | 16,946 | 15,763 | -7% | 1 | 1 | 0% | 2,402 | 7,259 | +202% | 0 | 0 | — |
case-22 | pass→pass | 11,448 | 7,947 | -31% | 1 | 1 | 0% | 1,655 | 6,013 | +263% | 0 | 0 | — |
case-23 | pass→pass | 14,655 | 13,249 | -10% | 1 | 1 | 0% | 2,030 | 6,698 | +230% | 0 | 0 | — |
case-24 | pass→pass | 14,856 | 14,829 | -0% | 1 | 1 | 0% | 1,995 | 7,207 | +261% | 0 | 0 | — |
case-25 | pass→pass | 15,181 | 9,140 | -40% | 1 | 1 | 0% | 2,231 | 6,304 | +183% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 25 cases were attempted. The headline lift of +24 percentage points is the difference between those two pass rates over the 25 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.