Skip to content

Features

Every WPTom template works before you set anything up. Forms answer, the chat explains how to connect it, search uses its own index and payment buttons say how to switch them on. Each feature turns on when you add its settings, one at a time, in any order.

Feature Templates Service Settings Guide
AI chat All Claude (Anthropic) ANTHROPIC_API_KEY, CHAT_MODEL AI chat
AI chat with OpenAI All OpenAI (Claude wins if both keys are set) OPENAI_API_KEY, CHAT_MODEL AI chat
Contact and quote forms All Resend RESEND_API_KEY, EMAIL_FROM Contact form
Newsletter sign-ups All except Aurora Supabase (+ Resend for the welcome email) SUPABASE_URL, SUPABASE_SECRET_KEY, SUBSCRIBERS_TABLE Newsletter
Newsletter in Mailchimp All with a newsletter or sign-up list (Mailchimp wins over Supabase) Mailchimp MAILCHIMP_API_KEY, MAILCHIMP_AUDIENCE_ID, MAILCHIMP_DOUBLE_OPT_IN Newsletter
Waitlist and interest lists Aurora, Swell, Tiny Town (waitlist); Bloom, Fold, Hush, Lantern, Putty, Razor, Tuck (interest lists) Supabase SUPABASE_URL, SUPABASE_SECRET_KEY, WAITLIST_TABLE Waitlist
Booking All Cal.com PUBLIC_CALCOM_LINK, PUBLIC_CALCOM_ORIGIN Booking
Payments All Stripe Checkout STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET Payments
Payments with Lemon Squeezy All (Stripe wins if both are set) Lemon Squeezy (merchant of record) LEMONSQUEEZY_API_KEY, LEMONSQUEEZY_STORE_ID, LEMONSQUEEZY_WEBHOOK_SECRET Payments
Search All Built in, or Algolia PUBLIC_ALGOLIA_APP_ID, PUBLIC_ALGOLIA_INDEX, PUBLIC_ALGOLIA_SEARCH_KEY, ALGOLIA_ADMIN_KEY Search
Analytics All Plausible, Umami, Google Analytics 4 PUBLIC_PLAUSIBLE_SCRIPT_ID, PUBLIC_UMAMI_WEBSITE_ID, UMAMI_ORIGIN, PUBLIC_GA_MEASUREMENT_ID Analytics
Analytics with PostHog All PostHog (cookieless) PUBLIC_POSTHOG_KEY, PUBLIC_POSTHOG_HOST Analytics
Maps Burin, Handy, Hush, Iris, Jab, Kelvin, Mint (drawn map); Chalk, Ember, Encore, Kerf, Toon (picture + live map); Blaze, Stride, Stroll (own map command) OpenStreetMap none Location map
Emails All Resend RESEND_API_KEY, EMAIL_FROM Emails
Photos from a CDN All Cloudinary PUBLIC_CLOUDINARY_CLOUD_NAME Photos from Cloudinary
Members-only posts All, on their blog, journal, news or stories posts Clerk PUBLIC_CLERK_PUBLISHABLE_KEY, CLERK_SECRET_KEY Members-only posts

Sites made before these features came get them with npx wptom update.

Your template’s .env.example lists exactly the settings it reads, each with a comment.

The pattern is the same for all of them.

  1. In your project folder, copy .env.example to .env:

    Terminal window
    cp .env.example .env

    On Windows (PowerShell): Copy-Item .env.example .env.

  2. Open .env in your editor and fill in only what you use. Leave the rest empty.

  3. Restart the dev server: Ctrl C, then npm run dev. Settings are read when the server starts, so a running server doesn’t see a change.

.env is in .gitignore: it never goes to GitHub, and it must not. Keys are secrets.

Each guide has a “Try it on your computer” section with what to click and what you should see. Most features also work in a reduced way with no keys, so you can check the page before you create any account:

Without its settings What happens
Emails (contact form, welcome emails, payment emails) Not sent. The terminal running npm run dev prints a line like [email] to you@example.com: Subject
Newsletter, waitlist and interest lists Sign-ups are kept in memory while npm run dev runs and are lost when it stops
AI chat The chat window says it isn’t connected yet
Booking The booking block says how to connect Cal.com (some templates show a preview calendar)
Payments Buttons bring the visitor back with a “payments aren’t set up yet” message
Search The built-in search works fully
Analytics Nothing is loaded
Photos from Cloudinary Photos are resized at build time and served by your site
Members-only posts The post shows its panel; the members page says the area isn’t open yet
  1. In Vercel, open your project → Settings → Environment Variables.
  2. Add each setting with the same name and value as in your .env. You can paste the whole .env content into the first field and Vercel splits it into variables.
  3. Redeploy: Deployments → the latest deployment → ⋯ → Redeploy, or push a commit. Settings take effect only in a new deployment. Settings that start with PUBLIC_ are written into the pages when the site is built, so they always need a new build.

Using the EmDash variant on Cloudflare? Add the same names as Worker variables and secrets instead: see EmDash.

You don’t need to touch the code to use any of this. If you want to change how a feature behaves, these are the files:

What Where
Server routes (forms, chat, checkout, webhooks) src/pages/api/
Members-only pages src/pages/members/, src/lib/members.ts
The emails src/emails/
What the chat knows src/lib/chat-knowledge.ts
Analytics routes src/pages/lumen/
The search index src/pages/search-index.json.ts
Which settings exist astro.config.mjs → env.schema

The logic itself comes from the @wptom/* packages in package.json (MIT licensed), which update with npx wptom update.