# Every way to add LaunchList to your site
> Eight ways to collect signups: hosted page, inline embed, your own form enhanced, plain HTML with no JavaScript, popup, SPA mount, widgets, and the REST API. Pick by what you already have.
Source: https://getlaunchlist.com/help/docs/integrations/overview
---
There are eight ways to get a signup into LaunchList. They all run the **same pipeline** once the
signup lands, so deduplication, referral credit, trust scoring, verification email, webhooks and
automations happen no matter which one you pick.
Choose by what you already have.
## Pick your method
| You have | Use | Code |
| -------------------------------------- | ------------------------------------------- | --------------- |
| No website yet | [Hosted page](#hosted-page) | None |
| A site builder that allows custom HTML | [Inline embed](#inline-embed) | 2 lines |
| A form you already designed | [Enhance your form](#enhance-your-own-form) | 1 attribute |
| A CMS that strips JavaScript | [Plain HTML](#plain-html-no-javascript) | 1 form tag |
| A button, and you want an overlay | [Popup](#popup) | 1 attribute |
| React, Vue or Svelte | [SPA mount](#spa-and-programmatic-mounting) | 1 function call |
| Social proof to show, not a form | [Widgets](#widgets) | 1 div |
| A backend, and full control | [REST API](/help/docs/api/contacts-create) | Your own |
Everything except the hosted page and the API uses the same loader, added **once** per site:
```html
```
> [!NOTE] One loader per page, not one per form
> The script tag goes in your `
` once. You can have as many forms, popups and widgets on the
> page as you like; they all share it.
## Hosted page
Every project gets a public launch page at a URL you choose, built in a visual editor. Nothing to
install and no site required.
Use it when you have no website yet, when you want a launch page faster than you could build one, or
as the destination for an ad campaign.
The page is server-rendered, so search engines receive real HTML from the moment you publish. On
Collect, Launch and Grow, a page on your own domain can be indexed; a page on a LaunchList address stays
live and shareable but asks search engines not to index it.
## Inline embed
The no-code default. A target element marks where the form goes; the loader fills it in.

```html
` as many times as you want on a page. Styling comes from your **Branding**
settings, not from CSS on your side.
Platform guides: [Carrd](/help/docs/integrations/carrd) ·
[Framer](/help/docs/integrations/framer) · [Webflow](/help/docs/integrations/webflow) ·
[WordPress](/help/docs/integrations/wordpress) · [Squarespace](/help/docs/integrations/squarespace) ·
[Shopify](/help/docs/integrations/shopify)
## Enhance your own form
Keep your markup, keep your CSS, keep your design system. Add one attribute and we take over the
behavior.
```html
```
You get submission, live format validation, a one-tap fix for email domain typos, inline error
messages, referral attribution and success routing without giving up a pixel of your own design.
If the loader script doesn't load, the form still posts to LaunchList and the signup is saved. With
an **inline message** as your success behavior, that fallback returns the visitor to your page
without the message.
Match each input's `name` to your form's field key (the dashboard shows you) so it fills that field
and validates; the identity field's name must match for the signup to attribute. Up to 20 extra
inputs are captured too, as **Input data** columns in your audience, with values truncated at 2,000
characters. Give each a plain `name` (letters, digits, spaces, `_` and `-`): dots and brackets are
dropped.
The warning our own rendered form shows when someone leaves the email field with an address that
looks wrong is the one thing this path does not carry. Everything the server enforces at submit is identical either way.
This is the right choice when the signup form is part of a designed page and a shadow-root embed
would look like a transplant.
## Plain HTML, no JavaScript
A native form posting straight to the capture endpoint. Zero JavaScript, zero dependencies.
```html
```
The browser posts it and our server redirects to your Status page or the URL you chose. It works
with JavaScript disabled, inside CMS templates that strip scripts, and anywhere a `
import { useEffect } from 'react';
export function Waitlist() {
useEffect(() => {
window.LaunchList?.mount('#waitlist', { form: 'frm_8Kd2Qm4Rp9' });
}, []);
return
;
}
```
Mount again whenever your framework recreates the target. `LaunchList.refresh()` rescans the page,
but it only finds targets carrying `data-launchlist-form`, so a bare `
` like the
one above needs another `mount()` call rather than a refresh.
Full guide: [React and single-page apps](/help/docs/integrations/react).
## Widgets
Not every embed is a form. Four widgets show live, aggregate numbers from your project, and no widget
ever exposes an email address, a phone number or any other contact detail:
- **Counter**: the live signup total
- **Leaderboard**: top referrers. Rows show the first name your form collected, or a masked identifier when it collected none.
- **Milestone**: progress toward a community goal
- **Countdown**: time until launch
```html
```
The look travels as `data-*` attributes, so the same widget can read differently on two sites with
no stored configuration.
There is also a standalone **changelog** embed, which puts your published updates on your own site.
That one matters after launch: it is what keeps the build-in-public feed alive once the hosted launch
page has done its job.
```html
```
## REST API
When you want full control, or the signup is happening on your server rather than in a browser,
post it directly.
```bash
curl https://api.getlaunchlist.com/v1/contacts \
-H "Authorization: Bearer llk_live_8xKq3Rp9Wm2Nz7Vt6yL1cG5dH0jA4sE8uNqB2fXk" \
-H "Content-Type: application/json" \
-d '{ "project": "prj_7Qk2mN4pR8", "email": "ada@lovelace.dev" }'
```
One call returns the referral code, the live queue position and the trust verdict, so you can show
someone their place in line without a second request.
Start with [authentication](/help/docs/api/authentication), then
[create a contact](/help/docs/api/contacts-create).
## Can I use more than one?
Yes, and most people do. A hosted page for the campaign, an inline embed on the marketing site, a
counter widget in the footer, and the API wiring signups into a CRM is a normal setup.
Deduplication is per project, so the same person arriving through three different channels is one
contact, not three.
## Common questions
### What is the easiest way to add a waitlist to my website?
The inline embed. Paste one div where the form should appear and one script tag in your head, and the form renders itself. It works on every site builder that allows custom HTML, including Carrd, Framer, WordPress, Squarespace and Webflow.
### Can I add a waitlist without a website?
Yes. Every project gets a hosted launch page at a public URL, so you can collect signups with no site of your own and no code at all.
### Does a LaunchList form work without JavaScript?
Yes. The no-JavaScript method is a plain HTML form that posts straight to our endpoint and relies on a server redirect for the result, so it works with JavaScript disabled and inside email clients and CMS templates that strip scripts.
### Can I keep my own form design and still use LaunchList?
Yes, with the enhance method. You keep your own markup and CSS, add one attribute, and we take over submission, validation, error display, referral attribution and success routing.