A beautiful, secure waitlist landing page for Amber personal finance app, built with Next.js 15, TypeScript, and Tailwind CSS.
π Live Site: ambermoney.co
- π¨ Modern Design - Clean, responsive design with custom Gambarino serif font
- π Enterprise Security - Cloudflare Turnstile CAPTCHA, honeypot fields, server-side validation
- π Built-in Analytics - Vercel Analytics integration for conversion tracking
- π Optimized Performance - Next.js 15 with image optimization and font loading
- π± Mobile-First - Responsive design that works on all devices
- π― Conversion Focused - Dedicated thank you page with social links
- Framework: Next.js 15 (App Router)
- Language: TypeScript
- Styling: Tailwind CSS
- UI Components: shadcn/ui
- Security: Cloudflare Turnstile
- Form Handling: Formspark
- Analytics: Vercel Analytics
- Deployment: Vercel
- Node.js 18+ and pnpm
- Cloudflare account (for Turnstile)
- Formspark account (for form handling)
git clone <your-repo-url>
cd amber-landing-page
pnpm install
Create .env.local
in the project root:
# Required - Your form handler
FORMSPARK_FORM_ID=your_formspark_form_id
# Required - Cloudflare Turnstile keys
TURNSTILE_SITE_KEY=your_turnstile_site_key
TURNSTILE_SECRET_KEY=your_turnstile_secret_key
- Go to Cloudflare Dashboard
- Navigate to "Turnstile" β "Add Site"
- Enter your domains:
localhost
(for development)ambermoney.co
(production)
- Choose "Invisible" widget type
- Copy Site Key and Secret Key to
.env.local
- Create account at formspark.io
- Create a new form
- Copy Form ID to
.env.local
- Configure email notifications in dashboard
pnpm dev
Open http://localhost:3000 to see the landing page.
-
Add Domain in Vercel:
- Go to your Vercel project dashboard
- Navigate to Settings β Domains
- Add both
ambermoney.co
andwww.ambermoney.co
-
Configure DNS at Your Registrar:
# For apex domain (ambermoney.co) Type: A Name: @ (or leave blank) Value: 76.76.19.19 TTL: 300 (or Auto) # For www subdomain Type: CNAME Name: www Value: cname.vercel-dns.com TTL: 300 (or Auto)
-
Update Cloudflare Turnstile:
- Go to Cloudflare Dashboard β Turnstile
- Edit your existing widget or create a new one
- Add these domains to the hostname list:
localhost
(for development)ambermoney.co
(covers www.ambermoney.co automatically)*.vercel.app
(for preview deployments)
-
SSL Certificate:
- Vercel automatically provisions SSL certificates
- Your site will be accessible at
https://ambermoney.co
- Certificate renewal is handled automatically
After DNS propagation (can take up to 48 hours):
- β
https://ambermoney.co
should load your site - β
https://www.ambermoney.co
should redirect to apex domain - β Form submissions should work with Turnstile
- β SSL certificate should be valid and auto-renewing
- β Cloudflare Turnstile - Invisible CAPTCHA protection
- β Honeypot Fields - Hidden spam traps
- β Server-side Validation - Email format and required fields
- β Rate Limiting - Built into Formspark
- β CSRF Protection - Via Turnstile tokens
- β Input Sanitization - Automatic with Formspark
- Real-time visitor tracking
- Page views and unique visitors
- Referral sources and conversion rates
- 50,000 events/month on free tier
-
Push to GitHub:
git add . git commit -m "Initial commit" git push origin main
-
Import to Vercel:
- Go to vercel.com
- Import your GitHub repository
- Add environment variables:
FORMSPARK_FORM_ID
TURNSTILE_SITE_KEY
TURNSTILE_SECRET_KEY
-
Set Up Custom Domain:
-
In Vercel project settings β Domains
-
Add
ambermoney.co
andwww.ambermoney.co
-
Configure DNS records at your domain registrar:
# For apex domain (ambermoney.co) Type: A Name: @ Value: 76.76.19.19 # For www subdomain Type: CNAME Name: www Value: cname.vercel-dns.com
-
-
Update Turnstile Domain:
- Add production domain to Cloudflare Turnstile settings:
ambermoney.co
(this covers www.ambermoney.co automatically)
- Add production domain to Cloudflare Turnstile settings:
The app can be deployed to any platform that supports Next.js:
- Netlify
- Railway
- DigitalOcean App Platform
- Primary:
#FEB204
(Amber) - Background:
#1C1917
(Dark stone) - Text:
#FEFEFD
(Off-white) - Secondary:
stone-400/500/600
(Grays)
- Brand: Gambarino (serif) - loaded from
/public/fonts/
- Body: Inter (sans-serif) - loaded via Google Fonts
Update social media links in src/app/thank-you/page.tsx
:
// Lines 47-66 - Currently set to:
<a href="https://twitter.com/ambermoney_co" ...>
<a href="https://linkedin.com/company/ambermoney" ...>
// Update these to your actual social media handles
src/
βββ app/
β βββ api/waitlist/ # Secure form submission endpoint
β βββ thank-you/ # Post-submission thank you page
β βββ globals.css # Global styles and custom fonts
β βββ layout.tsx # Root layout with analytics
β βββ page.tsx # Main landing page
βββ components/ui/ # Reusable UI components
β βββ button.tsx
β βββ input.tsx
β βββ card.tsx
β βββ notification.tsx # Toast notifications
βββ lib/
βββ utils.ts # Utility functions
Form not submitting:
- Check browser console for errors
- Verify environment variables are set
- Ensure Turnstile script loads
Turnstile not loading:
- Verify domain is added to Cloudflare settings
- Check site key is correct
- Disable ad blockers for testing
Analytics not working:
- Ensure deployed on Vercel
- Wait 24 hours for data to appear
- Check Vercel dashboard
- Next.js - React framework
- Tailwind CSS - Utility-first CSS
- shadcn/ui - UI component library
- Cloudflare Turnstile - Privacy-first CAPTCHA
- Formspark - Form backend service
- Vercel - Deployment and analytics
Built with β€οΈ for the Amber personal finance app.