Build a Landing Page with AI: High-Converting Design from Scratch
Landing pages are the fastest path from "I have an idea" to "I'm getting signups." In this tutorial, you'll build a complete, professional landing page with AI tools — hero, features, social proof, and a working email capture form.
What You'll Build
A complete landing page: sticky nav, hero with email capture, features grid, social proof/testimonials, second CTA, and footer. Working email form via Formspree (free). Deployed to Vercel with HTTPS. Stack: HTML + CSS + vanilla JS. Time: 90 minutes.
Before You Write a Single Line: Define Your Offer
This is where most people skip and then wonder why their landing page doesn't convert. Before prompting AI, answer these four questions on paper:
- Who is this for? Be specific. "Developers" is wrong. "Non-technical founders building their first SaaS" is right.
- What is the single thing you're offering? One thing. Not three.
- What's the one action you want visitors to take? Sign up for waitlist? Book a call? Buy now?
- What's the strongest specific benefit? Not "saves time" — "deploy in 10 minutes, not 10 hours."
AI can write brilliant code for a structurally perfect landing page. The copy — the words that make people sign up — has to come from you. Do this work first.
Landing Page vs. Website: Key Difference
A landing page has no navigation menu (or minimal navigation that doesn't let people escape). Every element exists to move visitors toward one action. Remove everything that distracts from that action.
Step 1: Set Up the Project
portfolio/ ← Or create a new folder: my-product-landing/
├── index.html
├── css/
│ └── styles.css
├── js/
│ └── main.js
└── images/
└── hero-image.webp ← Optional: your product screenshot
Open in Cursor, initialize git (git init), same setup as the portfolio tutorial.
Step 2: Build the HTML Structure
"Build a landing page for [YOUR PRODUCT]. It helps [TARGET AUDIENCE] to [CORE BENEFIT]. Include these sections in order: (1) sticky nav with logo and one CTA button only — no other nav links, (2) hero: bold headline '[YOUR HEADLINE]', subheadline '[2 sentences max]', email input + submit button, and a product screenshot placeholder, (3) social proof bar: logos of 3-4 companies or '500+ teams trust [Product]'-style stats, (4) features: 3 cards with icon, title, benefit-focused description (not feature-focused), (5) testimonial: one large quote with photo placeholder, name, title, (6) final CTA: repeat headline, email capture again, urgency line, (7) minimal footer. Use semantic HTML5. No navigation links inside the page — visitors should only be able to take the email action."
Key HTML Pattern: The Email Capture Form
<!-- Hero email capture — the most important element on the page -->
<form class="email-form" action="https://formspree.io/f/YOUR_FORM_ID" method="POST">
<div class="email-input-group">
<input
type="email"
name="email"
placeholder="Enter your email address"
required
aria-label="Email address"
>
<button type="submit" class="btn-primary">
Get Early Access →
</button>
</div>
<p class="form-disclaimer">No spam. Unsubscribe anytime.</p>
</form>
Formspree setup: Go to formspree.io, create a free account, create a new form, and replace YOUR_FORM_ID with your actual form ID. Every submission lands in your email inbox — zero backend code required. Under the hood, this uses the Fetch API to send data to Formspree's servers.
Step 3: Style for Conversion
"Write css/styles.css for this landing page. Design goals: (1) dark background (#0A0E1A) with [YOUR ACCENT COLOR] as the primary action color, (2) hero takes full viewport height with centered content, (3) email input and button are on the same line on desktop, stacked on mobile, (4) the CTA button should be impossible to miss — large, high contrast, with a subtle pulse animation, (5) features grid: 3 columns desktop, 1 column mobile, (6) social proof logos are grayscale (opacity 0.4) so they don't compete with your headline, (7) the page should load fast — no external CSS libraries."
The Psychological Design Rules
These are the patterns that separate converting landing pages from ones that look good but don't work:
- One dominant CTA color: Use your accent color ONLY on CTA buttons. If you use it elsewhere, the buttons lose their pull.
- Headlines in the hero should be your largest text — larger than feels comfortable. Hierarchy is about contrast.
- Social proof near the CTA: People convert when they feel safe. Put testimonials or logos directly above or below the form, not buried below the fold.
- White space is conversion space: Cramped pages feel untrustworthy. Give elements room to breathe.
Step 4: Add Interactivity
"Write js/main.js with: (1) sticky nav that adds a background color on scroll (nav starts transparent in the hero, gets a solid background once you scroll past it), (2) smooth scroll for any anchor links, (3) form success state — after Formspree submission, hide the form and show a 'You're on the list! We'll be in touch.' message, (4) simple scroll animation — elements with class 'animate-on-scroll' fade in when they enter the viewport. Keep it under 60 lines, no libraries."
// js/main.js — Core patterns
// Sticky nav background on scroll
const nav = document.querySelector('.nav')
window.addEventListener('scroll', () => {
nav.classList.toggle('scrolled', window.scrollY > 80)
})
// Animate elements on scroll
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('visible')
}
})
}, { threshold: 0.1 })
document.querySelectorAll('.animate-on-scroll').forEach(el => observer.observe(el))
// Formspree success handling
document.querySelectorAll('.email-form').forEach(form => {
form.addEventListener('submit', async (e) => {
e.preventDefault()
const data = new FormData(form)
try {
const res = await fetch(form.action, {
method: 'POST',
body: data,
headers: { 'Accept': 'application/json' }
})
if (res.ok) {
form.innerHTML = '<p class="success-msg">🎉 You\'re on the list! We\'ll be in touch.</p>'
}
} catch (err) {
console.error('Form error:', err)
}
})
})
Step 5: Copy That Converts
AI can structure your landing page. The words are your job. Here's a framework for each section:
Hero Headline Formula
The best landing page headlines follow this pattern: [Specific Result] for [Specific Audience] without [The Pain They're Avoiding]
- "Ship your SaaS in a weekend, not a year — without hiring developers"
- "Replace your entire ops stack with one AI agent — no technical expertise required"
- "Build the app you've been imagining in 4 hours — using plain English"
"Write 5 landing page headline variants for [YOUR PRODUCT]. Target audience: [AUDIENCE]. Core benefit: [BENEFIT]. Pain avoided: [PAIN]. Format: [Result] for [Audience] without [Pain]. Make each one specific and concrete — no vague words like 'better,' 'faster,' 'easy.'"
Feature Descriptions: Benefits, Not Features
❌ Feature-focused (weak):
"Real-time database synchronization across all connected clients"
✅ Benefit-focused (converts):
"Everyone on your team sees the same data, instantly — no refresh, no conflicts,
no 'which version is current?' confusion"
Step 6: Test and Deploy
Mobile Check (Do This Before Deploying)
In Chrome: Right-click → Inspect → click the phone/tablet icon (responsive mode). Check at 375px (iPhone SE) and 768px (iPad). Common issues:
- Email input + button overflows on mobile → stack them vertically
- Hero headline too large → reduce font size in mobile breakpoint
- Feature cards too narrow → switch to 1-column on mobile
"My landing page looks broken at 375px mobile. The hero headline is too large and the email form overflows. Here's the CSS: [paste]. Fix the mobile styles — the form should stack vertically, headline should be 36px max on mobile."
Deploy to Vercel
git add .
git commit -m "Landing page complete"
git push origin main
# Connect repo to Vercel → auto-deploys on every push
See the portfolio tutorial for the full Vercel setup walkthrough — it's identical for static HTML sites.
What to Add Next
- Custom domain: Point a real domain at your deployment — learn how in our DNS guide
- Analytics: Add Plausible or Simple Analytics to see where visitors come from and how far they scroll before leaving
- A/B test your headline: Tools like Google Optimize let you test two headlines simultaneously — data beats gut feeling
- Email sequence: Connect Formspree to ConvertKit or Mailchimp to send a welcome sequence to new signups
- Live chat: Add Crisp or Tawk.to (free) — being able to answer questions in real time dramatically increases conversions for unknown products
What to Learn Next
Frequently Asked Questions
What makes a good landing page?
One clear goal (one CTA), a headline that states the specific benefit in plain language, social proof (testimonials, logos, or numbers), and a mobile-responsive design that loads fast. Remove navigation — it gives visitors escape routes from the one action you want them to take. Every element should either support the CTA or be removed.
Should I use React or plain HTML for a landing page?
Plain HTML/CSS/JS is almost always better. Faster load time (no framework overhead), no build process, simpler deployment, and better SEO crawlability. Use React only if you need complex interactive state or are integrating with an existing React application. For conversion rate, page speed matters — plain HTML wins.
How do I connect a form on my landing page to receive emails?
Use Formspree (free tier available) — add action="https://formspree.io/f/YOUR_ID" to your form tag and set method="POST". Submissions land in your email inbox with zero backend code. Alternatively, Netlify Forms (if hosting on Netlify) or EmailJS work the same way. No server required.
How long does it take to build a landing page with AI?
A basic landing page (hero, features, CTA) takes 45–90 minutes with AI tools. A polished, conversion-optimized page with custom design, animations, and working form integration takes 2–4 hours. Most of the time is spent on copy decisions and design iteration, not waiting for AI to generate code.