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.

Screenshot of a self-hosted waitlist/newsletter web app

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!