Skip to content

Waitlist and interest lists

Some templates collect a second kind of list besides the newsletter: people who want to be told when something opens up. They work like the newsletter and use the same Supabase project, in their own table, or the same Mailchimp audience.

Service: Supabase or Mailchimp stores the sign-ups; Resend sends the welcome email where there is one. Every template takes either (a site made earlier gets it with npx wptom update). If both are set, Mailchimp is used.

Template The list Form on Welcome email Default table
Aurora Waitlist Waitlist page and the home page’s closing section Yes (waitlist welcome) waitlist
Swell Beta testers Beta page Yes (beta welcome) waitlist
Tiny Town Interest in new homes Homes page Yes (interest email) interest
Bloom Workshop dates Workshops page No interest
Fold Workshop dates Events page No interest
Hush Special nights Bar page No interest
Lantern Workshop dates Workshops page No interest
Putty Class dates Classes page No interest
Razor Apprentices Apprentices page No interest
Tuck New sitters Join page No interest

The table name comes from WAITLIST_TABLE; set it only if you name the table differently.

The address is checked, lowercased and added to the table with a source (which form it came from). An address that is already there isn’t added twice, and the form says so. Where the template has a welcome email, it goes only to new addresses. Without JavaScript the visitor is sent to a thank-you page (Aurora: /waitlist/thanks, Swell: /beta/thanks) or back to the form’s page.

Sign-ups are kept in the running server’s memory and are lost when npm run dev stops. Welcome emails without a Resend key are printed in the terminal as [email] to someone@example.com: Subject. Nothing else is logged for interest lists, so check the form’s “joined” text.

With Mailchimp, skip to Mailchimp instead of Supabase.

Use your existing Supabase project (or create one: see Newsletter → Create a Supabase project). Open SQL Editor, paste the statement for your template and click Run.

Aurora and Swell:

create table public.waitlist (
email text primary key,
source text,
created_at timestamptz not null default now()
);
alter table public.waitlist enable row level security;

Tiny Town, Bloom, Fold, Hush, Lantern, Putty, Razor and Tuck:

create table public.interest (
email text primary key,
source text,
created_at timestamptz not null default now()
);
alter table public.interest enable row level security;

The site writes exactly these three columns. email must stay the primary key: that is how a second sign-up is ignored. Row level security stays on with no policies, so only your site’s secret key can read or write the list.

All templates except Aurora also have a newsletter: create the subscribers table from the Newsletter guide too.

Terminal window
SUPABASE_URL=https://abcdefgh.supabase.co
SUPABASE_SECRET_KEY=your-secret-key
WAITLIST_TABLE=interest
  • SUPABASE_URL and SUPABASE_SECRET_KEY: the same as for the newsletter (Project Settings → Data API for the URL, Project Settings → API Keys for a secret key).
  • WAITLIST_TABLE: the table’s name. The .env.example of each template already has the right default (waitlist or interest).

For the welcome emails in Aurora, Swell and Tiny Town, also set RESEND_API_KEY and EMAIL_FROM (see Contact form). Restart npm run dev.

  1. Open the page with the form (table above) and sign up with an address you can check.
  2. The form shows its “joined” text (Aurora and Swell without JavaScript: the thank-you page).
  3. In Supabase, Table Editor → waitlist (or interest): a new row with the email, the source and the time.
  4. Aurora, Swell, Tiny Town: the welcome email arrives (or the [email] line appears in the terminal).
  5. Sign up again with the same address: “already on the list”, no new row, no second email.
  1. In Vercel, Settings → Environment Variables: add SUPABASE_URL, SUPABASE_SECRET_KEY and WAITLIST_TABLE (plus RESEND_API_KEY and EMAIL_FROM for the welcome emails).
  2. Redeploy, sign up once on the live site and check the row.

Set the same three Mailchimp settings as for the newsletter (how to find them: Newsletter → Mailchimp instead of Supabase):

Terminal window
MAILCHIMP_API_KEY=0123456789abcdef0123456789abcdef-us21
MAILCHIMP_AUDIENCE_ID=a1b2c3d4e5
MAILCHIMP_DOUBLE_OPT_IN=false
  • The list and the newsletter go to the same audience. Each contact is tagged with the form’s source, so you can tell the waitlist or interest list apart from the newsletter (filter or segment by tag in Audience → All contacts).
  • An address already in the audience is left as it is, even if it joined through the other form: the form says “already on the list”, no new tag is added and no welcome email is sent. If you need the lists fully separate, use Supabase instead.
  • MAILCHIMP_DOUBLE_OPT_IN=true makes Mailchimp send its confirmation email first; the contact stays Pending until they confirm.

To try it, sign up on the form’s page and look for the address in Audience → All contacts, with its tag. Online: add the three settings in Vercel and redeploy.

  • The form’s labels and messages: in the content editor, on the page that shows the form, or under Interface texts (Aurora: the waitlist form; Swell: Beta sign-up form; Tiny Town: Register interest form).
  • The welcome email: Interface texts → Emails. See Emails.
What you see Why, and what to do
The “something went wrong” text Supabase refused the row: the log shows [waitlist] store failed with the reason. Usually the table doesn’t exist under the name in WAITLIST_TABLE, or the key isn’t a secret key
An error about on_conflict email isn’t the primary key. Recreate the table with the SQL above
Newsletter works, interest list fails They are two tables. Create the interest (or waitlist) table as well
Sign-ups vanish after a restart Neither Supabase nor Mailchimp is configured; the list was in memory
Mailchimp error … in the log See the Mailchimp rows in Newsletter → Troubleshooting
Someone on the newsletter can’t join the interest list With Mailchimp both lists share one audience, and an existing contact is left as it is. Add the tag by hand in Mailchimp, or use Supabase for separate lists