CodeIssuesPull RequestsActionsSecurityInsights
✨ AI
More
Settings

Full-stack migration to Vercel + SEO overhaul to outrank competitors #3720

Merged⚡ AI-generatedXLccantynz wants to mergeclaude/review-remaining-tasks-FORRMmainopened Mar 25, 20260/8 tasks
ccantynzcommented Mar 25, 2026

Originally written by @ccantynz-alt on GitHub.
Imported from https://github.com/ccantynz-alt/Hibiscus-to-airport/pull/27


Summary

Complete migration from Render to Vercel serverless + comprehensive SEO overhaul based on full audit of frontend, backend, competitive landscape, and UX.

Backend: Render → Vercel Serverless

  • api/index.py — FastAPI entry point for Vercel Python runtime
  • api/_shared/ — All backend modules ported (booking, admin, auth, utils, db, cockpit, agents)
  • api/_shared/db.py — Per-request connections with pool shim for serverless
  • Vercel Cron Job — Day-before booking reminders at 6 PM NZDT daily
  • Frontend configBACKEND_URL now empty string (same-origin API)

SEO: 47 Pages Now Have Unique Meta Tags (Was 3)

  • Every service page, suburb page, school page, and Matakana page has unique <title>, <meta description>, and canonical URL
  • react-snap prerendering — Static HTML at build time so Google can index all 50+ pages (was only indexing 5)
  • BreadcrumbList JSON-LD schema on all pages
  • LocalBusiness schema variants per suburb for local SEO
  • OG image created for social sharing (was 404)

New Pages

  • /pricing — Suburb price tables, comparison vs taxi/Uber, FAQ schema
  • /north-shore-airport-shuttle — 800+ word page targeting high-volume keyword gap

Competitive SEO Improvements

  • Footer SEO links — Internal links to all 12+ suburb pages + service pages
  • Homepage quick-quote widget — Above-fold entry to booking flow
  • Improved homepage title targeting "Hibiscus Coast Airport Shuttle"
  • Phone 021 743 321 added to Header (desktop + mobile icon) and Footer

Backend Security Fixes

  • 9 database indexes on frequently queried columns
  • All HTTP 500 errors now return generic message (no stack trace leaks)
  • Constant-time hmac.compare_digest for admin key comparison
  • Fixed bare except: clauses

New Features

  • Reviews table + API — POST /api/reviews for post-trip feedback, GET /api/reviews for public testimonials
  • Post-trip review collection endpoint ready for email integration

Competitive Analysis Summary

  • Hibiscus Shuttles (main competitor): 32 years, toll-free 0800, crawlable suburb pages
  • Your advantage: Online instant booking, private rides, transparent pricing, modern UX
  • Key gap fixed: Google only indexed 5/50 pages → react-snap fixes this
  • Keyword gaps filled: North Shore, pricing, suburb-specific terms

Env Vars Needed in Vercel

  • DATABASE_URL, STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET
  • MAILGUN_API_KEY, MAILGUN_DOMAIN, SENDER_EMAIL
  • TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, TWILIO_PHONE_NUMBER
  • GOOGLE_MAPS_API_KEY, JWT_SECRET_KEY, ADMIN_API_KEY
  • CRON_SECRET (for day-before reminders)
  • FRONTEND_URL=https://hibiscustoairport.co.nz

Post-Merge Actions

  • Update Stripe webhook URL to https://hibiscustoairport.co.nz/api/webhook/stripe
  • Claim/optimize Google Business Profile
  • Start collecting Google reviews
  • Consider www vs non-www canonical redirect

Test plan

  • Verify Vercel deployment builds successfully with react-snap
  • Test booking flow end-to-end (create booking → Stripe → confirmation)
  • Verify /api/cron/reminders endpoint responds with CRON_SECRET
  • Check all suburb pages render unique titles in browser tab
  • Confirm phone number visible in Header and Footer
  • Test /pricing page loads with correct price tables
  • Verify og-image.svg renders for social sharing
  • Test POST /api/reviews endpoint

https://claude.ai/code/session_01UDJiM4pxR2V5R82bSAiXzn

ccantynzcommented Mar 25, 2026

Originally written by @vercel[bot] on GitHub.


The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
hibiscus-to-airport Error Error Mar 25, 2026 10:46am

Request Review

Cross-repo impact

See what breaks downstream if this PR merges.

Analyze →
⮌ Merged

This pull request was merged into main.

c comment · e edit title · m merge · a approve · r request changes · ? shortcuts