Early Access module
Collect signups with the Early Access widget
Add an accessible waitlist or signup form to your site or product with a single script tag. No cookies, WCAG-minded, with an API and CSV export.
Live demo
The inline form below is rendered by the real /early-access.js using the test key demo_key_for_testing_12345678.
Loading the live formβ¦
Note: this demo uses a shared test key, so submissions go to a public Fluister demo project that you cannot see in your own dashboard. Want signups you can actually view and manage? Create a project and embed the widget with your own project key (data-project). No cookies are set.
Install
Paste this script just before the closing </body> tag. By default a floating button opens the form in a modal.
<script src="https://fluister.dev/early-access.js"
data-project="YOUR_PROJECT_KEY" defer></script>Inline in your page
Use data-mode="inline" with a data-target to render the form straight into a container (like the demo above).
<div id="signup"></div>
<script src="https://fluister.dev/early-access.js"
data-project="YOUR_PROJECT_KEY"
data-mode="inline"
data-target="#signup" defer></script>π‘ Only data-project is required. A default form is auto-created on first use.
Configuration
Customize the widget with data attributes.
| Attribute | Description |
|---|---|
data-project | Your project API key (required). |
data-mode | "modal" (default, floating button) or "inline". |
data-target | Inline only: CSS selector of the container to render the form into. |
data-form | Optional: a specific form id; otherwise the default form is used. |
data-color | Accent color (hex), default #5B5FC7. Text color is auto-picked for contrast. |
data-trigger-label | Modal only: trigger button text, default "Get early access". |
API & CSV export
Manage signups programmatically with your developer API key (Bearer token). Public signups use the project key via the X-API-Key header.
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/early-access/signup | Public signup (widget). Auth via X-API-Key. |
| GET | /api/v1/early-access | List signups (developer key). Filters: project_id, status, since, limit. |
| PATCH | /api/v1/early-access/[id] | Update status: new, contacted, invited, rejected, converted. |
| GET | /api/v1/early-access/export | CSV export of all signups (developer key). |
List signups
curl "https://fluister.dev/api/v1/early-access?project_id=YOUR_PROJECT_ID&status=new" \ -H "Authorization: Bearer YOUR_DEVELOPER_API_KEY"
Export to CSV
Download every signup as CSV (columns: email, name, company, message, status, source_url, created_at). You can also use the export button in the dashboard.
curl "https://fluister.dev/api/v1/early-access/export?project_id=YOUR_PROJECT_ID" \ -H "Authorization: Bearer YOUR_DEVELOPER_API_KEY" -o signups.csv
Accessibility & privacy
Accessibility (WCAG-minded)
- Every field has a visible label linked via label/htmlFor.
- Errors are linked with aria-describedby and announced (role="alert"/aria-live).
- Fully keyboard-usable; Escape closes the modal and focus returns to the trigger.
- The modal uses role="dialog", aria-modal, and a focus trap.
- Contrast β₯ 4.5:1 and touch targets of at least 44Γ44px; color is never the only cue.
- Respects prefers-reduced-motion and exposes loading state with aria-busy.
Privacy
- No cookies and no tracking β the widget works without a consent banner.
- IP addresses are stored hashed, never raw (same as feedback).
- A honeypot field blocks bots without a captcha; input is validated server-side.
- Duplicate signups return a success-ish response so an existing email is never revealed.