Copy one snippet. Paste it before </body>. You're done. No build step, no npm, no configuration.
<!-- Paste this right before </body> --> <div id="spynra-widget" data-project-id="YOUR_PROJECT_ID"> </div> <script src="https://spynra.com/widget.js"></script>
YOUR_PROJECT_ID with your actual ID.</body> tag on any page where you want the widget to appear.data-project-idThree things most people change right away — paste one attribute and you're done.
Pick a theme below, then add ?theme=dark (or light / brand) to the script URL in your snippet.
?theme=dark
Best for dark-background websites, tech/SaaS landing pages, or sites with a premium dark aesthetic. Dark background card with subtle shadow. Light text and icons for contrast. Works well on dark nav bars, footer sections, or full dark-mode sites.
?theme=light
Best for light-background business sites, blogs, or pages with a clean minimalist look. White/light card with soft shadow. Dark text and icons for contrast. Works well on content-heavy pages, above-the-fold sections, or white-background sites.
?theme=brand
Best when you want the widget to feel native to your brand colors. Transparent/adaptive background that blends with your site. Your brand's primary color drives the CTA button. Recommended for branded landing pages, product pages, or anywhere you want visual consistency.
<!-- Dark theme (default) — no change needed --> <div id="spynra-widget" data-project-id="YOUR_ID"></div> <script src="https://spynra.com/widget.js?theme=dark"></script> <!-- Light theme --> <script src="https://spynra.com/widget.js?theme=light"></script> <!-- Brand theme (indigo, inherits your bg color) --> <script src="https://spynra.com/widget.js?theme=brand"></script>
Add data-cta-text to your div. The button changes, nothing else.
<div id="spynra-widget" data-project-id="YOUR_ID" data-cta-text="Get Early Access"> </div> <script src="https://spynra.com/widget.js"></script>
Add data-require-name to make the name field appear right after email. Visitors will see "← Add your name" as a link — clicking it shows the name field. If you want it mandatory, enable it in your project Settings → Widget.
<div id="spynra-widget" data-project-id="YOUR_ID" data-require-name="true"> </div> <script src="https://spynra.com/widget.js"></script>
Doesn't matter what tool you use — just find where you can add custom HTML and paste the snippet.
Use the Custom Code section in Project Settings, or an Embed element on a specific page.
To embed only on one page: drag an Embed element to that page, paste the snippet, and publish.
The easiest method is a plugin like Insert Headers and Footers, or your theme's customizer.
For a specific page: add a Custom HTML block to the page, paste the snippet.
Use Code Injection in your site settings. Requires a Business plan or higher.
For one page only: open page settings → Advanced → paste into Page Header Code Injection.
Find the closing </body> tag and paste the snippet just before it.
<!-- Your page content --> <!-- Spynra waitlist widget --> <div id="spynra-widget" data-project-id="YOUR_ID"></div> <script src="https://spynra.com/widget.js"></script> </body> </html>
Framer supports custom code via an Embed component.
You can also use Framer's Custom Code section in project settings to add it site-wide.
All available attributes you can add to the widget div. Only use what you need.
<!-- Paste before </body>. Replace every YOUR_* value. --> <div id="spynra-widget" data-project-id="YOUR_PROJECT_ID" <!-- required --> data-theme="dark" <!-- dark | light | brand --> data-cta-text="Claim My Spot" <!-- button label --> data-require-name="false" <!-- show name step --> ></div> <script src="https://spynra.com/widget.js"></script>
| Attribute | Values | What it does |
|---|---|---|
data-project-id |
Your project ID | Which waitlist to send signups to. Required. |
data-theme |
dark (default), light, brand |
Visual style of the widget. Dark works on any dark background; Light for light backgrounds. |
data-cta-text |
Any text string | Changes the button label. Default is "Claim My Spot". |
data-require-name |
"true" or "false" |
Whether the name field is shown after email. Default false — name is optional. |
Placing the widget where it's immediately visible (no scrolling needed) significantly improves conversion. Don't put it in the footer.
A page that exists only to capture signups converts better than embedding in a full marketing page with other distractions.
One project ID works on as many pages as you want. Every signup goes to the same waitlist — no duplicate entries.
The widget automatically calls these endpoints. You don't need to call them yourself unless you're building a custom integration.
| Endpoint | Returns | When it's called |
|---|---|---|
GET/api/widget/info |
Weekly signup count, CTA text, name requirement | When the widget loads |
GET/api/widget/stats |
Visitor's waitlist position, referral count | After a visitor submits the form |
POST/api/waitlist/add |
Signup confirmation | When visitor submits their email |
POST/api/waitlist/add-with-referral |
Signup + referral attribution | When someone joins via a referral link |
{
"weeklyCount": 127, // people who joined this week (for social proof badge)
"aheadCount": 42, // how many are ahead of the visitor
"ctaText": "Claim My Spot", // custom button label, or null for default
"nameRequired": false // whether the name step is mandatory
}
The widget automatically shows a slide-up bar when visitors try to leave — if they scroll up toward the top of the page or move their mouse toward the browser chrome. They can dismiss it.
Fires when the visitor scrolls upward while near the top of the page — a natural signal they're leaving.
Fires when the cursor moves above the browser window — exactly when someone is about to close the tab or switch tabs.
Visitors can close it with × and it won't reappear for the rest of their session.
Don't test in your main browser — if you've already signed up for your own waitlist, your email will be rejected as a duplicate.
Submit the form and check your inbox for a confirmation email. Then check your Spynra dashboard — you should see the entry within seconds.
After signing up, you should see your position and a referral link. Copy it and open in a second browser — that should show a referral attribution in your dashboard.
If your project is in Draft mode, the widget won't render. In your dashboard, open the project and confirm it's set to Active.
data-project-id value matches exactly what's in your dashboard.Create your project, copy your embed snippet, and be live in 5 minutes.