Why a waitlist?
A first launch often happens in front of an empty room. With a waitlist you know beforehand who is waiting, and on day one there are people ready to try it.
Someone is waiting on launch day
Every address on your list is confirmed. Your invitation goes to real people who want to see your product.
Your first fans bring the next ones
Everyone on the list gets a link of their own. Bring friends through it and you move up the line.
You decide who gets in and when
Invite ten people first, then the next fifty. Your app only lets in people who have an invitation.
On your page in five minutes
Pick what you build with. You try everything in test mode first and switch to live when it works.
- Create an account and add your product. It takes a minute.
- Copy the prompt from your dashboard into the chat of Lovable, Bolt, v0 or another AI builder. Your key is already in it.
- Sign up once yourself and check that the mail shows up in the dashboard. Then switch to the live key.
The flow: you paste the prompt into the chat of your AI builder, it builds the form into your page, someone signs up, and the entry shows up in your NearlyIn dashboard.
- Create an account and add your product. It takes a minute.
- Put the script into an embed or HTML block, where the form should appear.
- Publish the page. The confirmation mail goes out in your product's name.
<script src="https://nearlyin.com/embed.js" data-key="YOUR_PUBLIC_KEY" async></script>No site yet? Every product gets a ready-made waitlist page with a link of its own that you can share right away.
- Create an account and add your product. It takes a minute.
- Add the form as a React component.
- At sign-up, check and redeem the invitation code on your server.
The docs have ready examples for Clerk, Auth.js, Supabase Auth and Better Auth, plus the management API and signed webhooks. Docs
import { WaitlistForm } from "nearlyin";
export function Signup() {
return <WaitlistForm productKey="ni_pk_live_…" locale="en" />;
}import { verifyInvite, redeemInvite } from "nearlyin/server";
// When the link is opened: the code stays valid
const email = await verifyInvite(invite);
// When the account is created: exactly once
const invited = await redeemInvite(code);Can't I just prompt this myself?
Any AI builder makes you a form with a table behind it in a minute. For the mails to arrive on launch day and only invited people to get in, this is still missing.
| What a waitlist needs | Prompted yourself | With |
|---|---|---|
| A form and a list of addresses | Yes | Included |
| Confirmation by mail (double opt-in) | You build it | Included |
| Protection against bots and made-up addresses | You build it | Included |
| Mails that reach the inbox, with an unsubscribe link | You build it | Included |
| Places in line and referral links | You build it | Included |
| Invitations with a code your app checks | You build it | Included |
| A test mode in which no real mail goes out | You build it | Included |
| Export and deletion under the GDPR | You build it | Included |
Everything a first launch needs
You take care of your product. takes care of the waitlist.
Referral links
Everyone on the list gets a link of their own. Bring friends through it and you move up. Add a leaderboard if you like.
Invitations with a code
Every invitation carries a personal code. Your server redeems it at sign-up, and after that it is used up.
In your colours
Set logo, colour and texts in the dashboard. Mails go out in your product's name.
Test mode
With the test key, entries land in a list of their own and the mails in the dashboard. You run through everything without mailing anyone.
Invite at your pace
One by one, the next ones in line at once, or a few each day on their own.
Data in Frankfurt
Servers and database are in Frankfurt. We store the address and timestamps, no IP addresses and no tracking.
As a team
Bring in co-founders or helpers, also just to watch. A team can have several products.
Slack, API and webhooks
Every sign-up as a message in your Slack channel. For developers, a management API with OpenAPI and signed webhooks.
Questions
Does it work with my AI builder?
Yes, with any builder that can put a script or code into your page. That includes Lovable, Bolt, v0, Cursor, Replit and most others. You copy the prompt from your dashboard into the chat and the builder does the rest.
I can't code. Can I still use it?
Yes. You copy a prompt into your AI builder, or a script into Webflow, Framer or Carrd. No site yet? Your product gets a ready-made waitlist page with a link of its own.
Can I send the sign-ups to Google Sheets or my newsletter tool?
Yes. calls a webhook for every sign-up, and Zapier, Make or n8n pass it on from there, for example to Google Sheets, Airtable or your CRM. There is a guide for each of the three.
Do I need a backend of my own?
No. Form, mails, list and invitations run on . Only if your app has a login does your server briefly ask at sign-up whether the invitation code is valid.
What happens to my login?
It stays as it is. Your auth provider keeps creating the accounts, such as Clerk, Auth.js, Supabase Auth or Better Auth. only tells it whether someone is invited.
Where is the data?
Database and servers are in Frankfurt. Per entry we store the address, timestamps and hashes of the codes, no IP addresses. The privacy policy names the service that sends the mails.
Does the form look like my product?
Yes. You set colour, logo and texts in the dashboard, for the form and for the mails. The React component also takes colours and texts of your own.
How do I try it without mailing real people?
Every product has test keys. Entries made with them land in a list of their own, and you read the mails in the dashboard instead of an inbox.
Can I leave again?
Any time. Export the entries as CSV. When you delete a product, all its entries go with it.
has a waitlist, too.
Of course it runs on . Sign up; we invite people in small groups.