Nancy Tours Costa Rica. .
Nancy has guided Costa Rica since 2010 with a simple model: she proposes a tour + tentative date, it runs when enough people sign up. Her previous site said "Book now" as if these were fixed events — they weren't. We rebuilt the site around her real model and shipped an admin that a 62-year-old can use from her phone.
A solo-guide operator. A site built for her.
- Client
- Nancy Tours Costa Rica
- Industry
- Guided tours · Costa Rica (7 provinces)
- Year
- 2026
- Scope
- Pivot to marketplace + non-tech admin + email infra + SEO + A11y
⚠ Technical metrics are real from launch. Lead/booking metrics fill in after the first month of use.
The old site said "Book now". That wasn't true.
- 01Nancy works on a "I propose, I confirm if enough show up" model — tours materialize when interest crosses a threshold. The previous site used "Book now" as if these were fixed events, leading to frustration when clients discovered the date was tentative.
- 02Nancy is 62, runs a 2015 laptop, has near-zero tech literacy. Any off-the-shelf admin (WordPress, Wix, etc.) would have trapped her — we needed something designed specifically for her.
- 03No Search Console, no schema, no pretty previews when sharing a tour link in WhatsApp. The entire catalog shared the same og:image (a generic logo), so when someone forwarded a tour, none of the real experience came through.
- 04Zero lead infrastructure: when someone actually expressed interest, there was no structured way to capture it, no way to see how many more were needed to confirm a tour, and no way to remind Nancy who she still hadn't contacted.
Costa Rica. All 7 provinces.








4 decisions that respect Nancy.
Interest marketplace, not catalog
Swapped "Book now" for "I'm interested" on every tour. Each outing has a minimum and maximum group size; the site shows a public progress bar ("4 of 6 confirmed") without exposing names. When the threshold is reached, Nancy clicks "✓ Confirm tour" and the public sees the firm date and a "Book" button. Like Kickstarter, but for tours.
Admin designed for Nancy specifically
18px body, 56-64px tap targets, plain Spanish labels ("How many people minimum to confirm" not "threshold"), preset pickers instead of free-form fields, branded prompts instead of native browser dialogs. 7-day session TTL + 2-hour idle lock — log in once a week without re-auth, but a forgotten open laptop stays protected.
Per-tour SSR for social previews + SEO
Every tour has its own og:title, og:image, og:description and Twitter card via Vercel Serverless Functions that hydrate the HTML before serving it. Schema.org TouristTrip + FAQPage + BreadcrumbList per tour. When Nancy shares a tour in WhatsApp, the real hero shows — not a generic logo.
Vanilla stack, zero lock-in
HTML + CSS + JS with no build step. Vercel Functions for SSR + Supabase for data + Resend for email + ImprovMX for inbound. Any developer who can edit an HTML file can maintain it. No framework, no webpack, no risk of "the engine this was built on no longer exists".
9 pieces in production.
- Public marketplace with dynamic, state-aware cards (Seeking · Confirmed · Postponed · Completed) and an interest modal with focus trap + accessible progress bars
- Admin console at /admin with login + tour editor with preset pickers + leads view with WhatsApp deep-links + settings + lists — designed and tested for a 62-year-old user
- Daily summary email at 7am CR via Postgres pg_cron + pg_net.http_post → Resend — Nancy receives each morning which tours are ready to confirm and which leads she hasn't contacted
- Per-tour SSR of og:title + og:image + og:description + Twitter card via Vercel Serverless Functions — pretty previews when sharing any tour in WhatsApp / Facebook / Slack
- Per-tour gallery + fullscreen lightbox (ESC, arrow keys, swipe, neighbor preload, focus trap) + share button with native navigator.share() + fallback to WhatsApp / Facebook / X / Copy
- Site-wide mobile pass (375-414px breakpoints) — hero h1 36→32px, horizontal-scrolling filter chips, 44×44 lightbox controls, WhatsApp FAB with reserved bottom padding
- A11y WCAG AA: interest modal with focus-trap + focus restore + role=alert errors, progress bars with aria-value, 44×44 tap targets, lightbox with keyboard nav
- Custom domain (nancytourscr.com) + complete email infra: Resend for outbound (DKIM/SPF/DMARC verified) + ImprovMX catch-all for inbound (hola@, info@, everything routes to Nancy's inbox)
- Google Business Profile setup + per-tour Schema.org + dynamic sitemap generated by a Serverless Function pulling from Supabase — ready for Search Console submission
“[TODO: 1-2 lines from Nancy after the first month — ideally with a concrete stat like "the first month already had 8 people interested in Chirripó".]”
Does your operation need the ?
If you run a business where the public site lies about how you actually work (variable prices, tentative dates, minimum group sizes, last-minute decisions), we'll audit it free in 48h and show you how the site can tell the truth without losing conversions.
