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.
Which features, which templates
Section titled “Which features, which templates”| 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.
How every feature is switched on
Section titled “How every feature is switched on”The pattern is the same for all of them.
1. On your computer: .env
Section titled “1. On your computer: .env”-
In your project folder, copy
.env.exampleto.env:Terminal window cp .env.example .envOn Windows (PowerShell):
Copy-Item .env.example .env. -
Open
.envin your editor and fill in only what you use. Leave the rest empty. -
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.
2. Try it locally
Section titled “2. Try it locally”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 |
3. Online: the same names on Vercel
Section titled “3. Online: the same names on Vercel”- In Vercel, open your project → Settings → Environment Variables.
- Add each setting with the same name and value as in your
.env. You can paste the whole.envcontent into the first field and Vercel splits it into variables. - 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.
Where the code lives
Section titled “Where the code lives”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.