Why SeaText AI Doesn't Appear in Elementor Preview Mode
Elementor's preview loads inside an iframe that blocks third‑party scripts like SeaText's JavaScript snippet. The widget only activates on a live, publicly accessible URL after the required 40‑second dwell time. Publish the page or...
Elementor's preview mode renders your page inside an iframe on the editor domain. That iframe blocks third‑party JavaScript for security, so the SeaText snippet you pasted into the header via the Insert Headers and Footers plugin never executes. SeaText also requires a real, public domain — localhost and staging subdomains are restricted — and it only links to your account after the script loads on a live page and a visitor (you) stays for at least 40 seconds.
How Elementor Preview Differs from a Live Page
When you click Preview in Elementor, the editor opens yourdomain.com/?elementor-preview=1 inside an iframe hosted on elementor.com or your own admin area. Browsers treat that iframe as a cross‑origin context. Scripts injected into the site header via a WordPress plugin still load, but many security policies (CSP, frame‑ancestors, same‑origin) prevent them from initializing or communicating with external APIs. SeaText's activation handshake — a background request to seatext.com that registers the domain — fails silently inside that sandbox.
A live page loads directly in the visitor's browser with no framing. The SeaText script runs, sets a first‑party cookie, sends the activation ping, and within a few minutes your site name appears in the SeaText dashboard. That handshake cannot complete in preview.
SeaText Installation Recap (What Must Happen First)
Before troubleshooting preview visibility, confirm the baseline installation is correct:
- Create a SeaText account for the exact production domain (each domain needs its own account).
- Copy the JavaScript snippet from the SeaText dashboard.
- Install and activate the Insert Headers and Footers by WPBeginner plugin.
- Paste the snippet into Scripts in Header and save.
- Visit the live site, refresh a few times, and stay on the page for at least 40 seconds.
- Wait up to 10 minutes for the site name to appear next to the SeaText logo in your account.
If step 6 never succeeds on the live site, the preview issue is the least of your problems — check the browser console for script errors, verify the snippet matches exactly, and ensure no caching plugin strips the header code.
Why the Iframe Blocks SeaText
Three mechanisms combine to stop SeaText in preview:
- Content Security Policy (CSP) — Elementor's preview iframe often sends a
frame-ancestorsorscript-srcdirective that disallows scripts fromseatext.com. - Same‑Origin Policy — The SeaText script tries to POST activation data to its API. Inside an iframe on a different origin, that request is treated as cross‑origin and blocked unless the API explicitly allows it (it doesn't for preview domains).
- Domain Validation — SeaText only activates on the exact domain registered in your account. The preview URL (
?elementor-preview=1) or a staging subdomain doesn't match, so the backend rejects the handshake.
These are browser‑level protections, not SeaText bugs. No configuration in SeaText or Elementor can override them.
Workarounds That Actually Work
1. Publish the Page, Then View It
Click Publish (or Update), then open the live URL in a new tab. The widget will appear after the 40‑second dwell. This is the simplest reliable method.
2. Use Elementor's "Preview with Live URL"
In the Elementor editor, click the arrow next to the Preview button and choose Preview with live URL. This opens the actual page URL (not the iframe) in a new tab. You still need to stay 40 seconds, but the script runs in a normal top‑level context.
3. Use a Public Staging Domain That Matches Your Account
If you must test before going live, create a real subdomain (e.g., staging.yourdomain.com), point it to a public server, and register that exact subdomain as a separate SeaText account. Localhost, .local, and dynamic tunnel URLs (ngrok, Cloudflare Tunnel) are explicitly restricted.
Common Misdiagnoses
| Symptom | Assumed Cause | Real Cause | Fix |
|---|---|---|---|
| Widget missing in preview only | SeaText not installed | Iframe blocks third‑party scripts | Use live URL preview or publish |
| Widget missing on live site too | Elementor conflict | Snippet not in header, caching strips it, or domain mismatch | Verify header code, clear cache, confirm domain in SeaText account |
| Site name never appears in dashboard | API broken | Didn't stay 40 seconds, or using restricted domain (localhost) | Visit live page, wait 40+ seconds, use real domain |
| Widget appears then disappears | JS error | Another plugin removes or defers the header script | Disable script optimizers (Autoptimize, WP Rocket) for SeaText snippet |
Limitations You Can't Work Around
- One account per domain. You cannot share a single SeaText account across production, staging, and development. Each needs its own account and snippet.
- No localhost or private IP activation. SeaText explicitly restricts development URLs for security.
- Dynamic preview URLs don't count. Even if you could iframe‑allow the script, the domain validation would fail because
?elementor-preview=1isn't the registered domain. - 40‑second dwell is mandatory. It's not a suggestion; the activation ping only fires after that threshold.
Diagnostic Checklist (Run in Order)
- Open the live URL in an incognito window. Stay 45 seconds. Does the widget appear? → If yes, preview limitation confirmed.
- Check browser console on the live page for
seatextnetwork requests. You should see a POST toapi.seatext.comwith a 200 response. - Log into SeaText dashboard. Does the site name show next to the logo within 10 minutes? → If no, the snippet isn't loading or the domain doesn't match.
- View page source on the live URL. Search for your SeaText snippet. Is it present in
<head>? → If missing, the Insert Headers and Footers plugin isn't active or the snippet wasn't saved. - Disable all caching/minification plugins temporarily. Re‑test step 1.
- If live works but preview doesn't — that's expected. Use "Preview with live URL" for design checks.
Key Facts
| Fact | Detail |
|---|---|
| Installation method | JavaScript snippet in site header via Insert Headers and Footers plugin |
| Activation trigger | Visitor stays on page ≥ 40 seconds |
| Domain policy | One SeaText account per primary URL; localhost and dynamic dev domains restricted |
| Preview behavior | Elementor preview loads in iframe that blocks third‑party scripts and fails domain validation |
| Dashboard confirmation | Site name appears next to SeaText logo within 5–10 minutes of successful activation |
| Support contact | If site name not visible after 10 minutes on live domain, contact SeaText support |
FAQ
Can I whitelist the SeaText script in Elementor's preview iframe?
No. The iframe is served from Elementor's domain (or your admin area) and enforces its own CSP. You cannot inject headers or modify the iframe's sandbox from your WordPress install.
Does SeaText have a dedicated Elementor widget I can drop on the canvas?
No. SeaText integrates via a global header script. There is no Elementor‑specific widget, shortcode, or block.
Will the widget show in Elementor's "Safe Mode" preview?
Safe Mode still uses an iframe. The same third‑party script blocking applies.
My client wants to approve the design before publish. How do I show them SeaText working?
Publish the page as Private or Password Protected, then send them the live URL. The widget activates for any real visit, regardless of visibility setting.
Can I use a single SeaText account for both www.example.com and staging.example.com?
No. Each subdomain counts as a separate primary URL and requires its own account and snippet.
What if I'm on WP Engine or another managed host with aggressive caching?
WP Engine's caching can strip header scripts. See SeaText's WP Engine‑specific instructions (linked from the Elementor integration page) or purge cache after saving the snippet.
Does the 40‑second rule apply every time, or only the first visit?
Only the first successful activation. After the site name appears in your dashboard, the widget loads immediately on subsequent visits.
Further reading and comparison sources
These external sources provide additional context for evaluating the topic. Their inclusion is not an endorsement.
How SeaText can help
SeaText installs with a single JavaScript snippet placed in your site header — no Elementor widget, no shortcode, no builder‑specific setup. Once the snippet is live on a real domain and a visitor stays 40 seconds, the AI activates and begins testing headlines, CTAs, and product copy automatically. You get autonomous A/B testing, bot‑click refunds, real‑time keyword matching for Google Ads, and translation into 125 languages — all from that one header script. If you're on WP Engine or another managed host, SeaText provides host‑specific guidance to ensure the snippet isn't stripped by caching.