How to create and host your own waitlist or newsletter app
Introducing a product or a service comes with a basic requirement - obtaining interested users. How do you seize that first sign of interest and retain your audience? The common waitlist or newsletter signup apps can help with that. Ideally, you would want full control over the system, having access to user’s info and communicating with them without restrictions, yet the app must be easy to deploy and maintain.
This is exactly the space that waitlist.onl
hopes to occupy. The waitlist/newsletter demo app (and the two repos for deploying the fully functional versions) is a practical, open-source tool created for developers but can also be used by people with little coding or deployment background. Most people often require a simple waitlist or a basic newsletter system. The program avoids extra features or vendor lock-in (the emailing is one such potential lock-in but can be overcome easily). There are no complicated dashboards — just the lightweight core features and a beautiful user-facing UI.
The open-source project was created using:
a) Vanilla JS and Node.js
b) React/Next.js
The app uses Supabase for PostgreSQL database. It handles admin authentication, user sign-ups, and scheduling of sending reminders via the “Resend” API. We will next look at how all of these parts connect.
Core Functionality - What It Does
From the user perspective, interaction is intentionally limited. Users go to a clear landing page. They enter an email. Then they receive confirmation in the UI along with their sign-up rank. The process is straightforward. When the launch date nears or passes, an email arrives—reminding them about what they signed up for. That is the main user process.
The waitlist/newsletter admins enter via the /login
page. An admin logs in securely with credentials managed through Supabase Auth (separate from the waitlist process). The admin is taken to a dashboard where they can define or change the launch date, see a list of sign-ups, and download that list as a CSV for external use. The admin can also trigger manual email broadcasts (for quick updates or pre-launch deals) that bypass the automated schedule. Note that in automatic mode, the text hardcoded in const defaultText
will be sent out post-launch rather than the dashboard text. Your dashboard text is used only for manual sends. The automatic reminder will be sent only if you have not toggled reminder_sent
to TRUE in the dashboard.
Architectural Choices & Tech Stack Deep Dive
The tech stack behind waitlist.onl
uses vanilla JS & Node.js with Express (waitlist-node-js
) or React/Next.js for the waitlist-next-js
version.
Supabase and Resend power the backend. Supabase is not just a hosted PostgreSQL database—it’s a full backend-as-a-service platform. Its authentication system secures admin logins, while direct Postgres access lets us use extras like pg_cron
for scheduling and pg_net
for HTTP requests from the database, which is vital for automated reminders. “Resend” provides a modern API for transactional emails. This tech stack offers both power and flexibility without much configuration overhead.
As mentioned earlier, the app uses a pg_cron
connection for sending an automated reminder once after the launch date, even though the cron job runs every 15 minutes. This scheduling logic is embedded in the database from the first admin login, avoiding the complexities of server-side schedulers like node-cron
in serverless environments. When the admin sets up the system via /api/admin/validate
, SQL commands enable pg_cron
and pg_net
, and schedule a recurring job. This job then utilizes pg_net
's http_request
function to securely call an API endpoint (GET /api/admin/waitlist-reminders
) on the Node.js server (\app\api\waitlist-reminders
in Next.js), passing a secret token for verification. It also differentiates between manual and automated email sends by using boolean flags (forceSend
and updateReminderSent
) to modify the behavior of the Supabase waitlist
table.
Setup & Configuration - Getting Started
After the architectural overview, here’s how to get everything up and running. The setup involves connecting your app to the external Supabase and Resend services via environment variables. First, clone the repository and run npm install
. Then, create a .env
file in the project’s root that contains your sensitive information: your Supabase project URL, anon key, the DATABASE_URL
connection string, your Resend API key, and the verified sender email (the one set up with Supabase). Also, set the ADMIN_ALLOWED_EMAIL
to match the user account you created (in Supabase Authentication) to ensure that only the designated admin can access the backend controls. Initially, RESEND_SENDER_EMAIL
will end with @resend.dev
until you map your own domain.
Finally, generate a strong, unique CRON_AUTH_TOKEN
to secure the callback endpoint used by pg_cron
. Getting these details correct in the .env
file (.env.local
or via your hosting provider’s settings) is essential—without them, the application won’t function or communicate with its key dependencies.
Lightweight Telemetry - Why and How?
(Optional, can be easily turned off) Transparency is key. The built-in telemetry is used to monitor usage patterns and errors in real time—tracking sign-up numbers to gauge interest and logging exceptions to help fix bugs proactively, thereby improving the tool. No personal data or emails are sent; it only collects minimal data such as event types (e.g. signup or error), host domain, sign-up counts/latency, and error details if any occur.
Telemetry is entirely optional and privacy-conscious. It’s turned off by default if RESEND_SENDER_EMAIL
ends with @resend.dev
(common during initial setup) or if the request originates from localhost
. You can disable it completely by setting the ALLOW_TELEMETRY
environment variable to FALSE
.
Next Steps
In short, waitlist.onl
offers a balance between simplicity and power for developers who want a self-managed list system. There are several potential improvements, including:
• Adding basic email templates (with optional Markdown support)
• Sending a confirmation email to users after sign-up
• Including an unsubscribe option for compliance and ease of use
• Incorporating a simple analytics view in the admin panel to track sign-up trends
• Etc.
The core architecture is already a strong foundation. If you’re looking for a solution to manage your waitlist or set up a simple newsletter system using robust, open-source tools, waitlist.onl
is a practical and flexible option. Don’t hesitate to check out the repositories and contribute your code to the project!