Next.js SaaS Landing Page
Create a conversion-optimized SaaS Landing Page in Next.js demonstrating hero sections, feature grids, pricing comparison tables, FAQ accordions, and client-side contact actions.
The Problem
Create a conversion-optimized SaaS Landing Page in Next.js demonstrating hero sections, feature grids, pricing comparison tables, FAQ accordions, and client-side contact actions.
Real-World Use Case
Create a conversion-optimized SaaS Landing Page in Next.js demonstrating hero sections, feature grids, pricing comparison tables, FAQ accordions, and client-side contact actions.
Technology Stack
Familiarity with Next.js layouts
Prerequisite
Proficiency in Tailwind CSS styling
Prerequisite
Architecture & Design
Folder Structure
saas_landing/
├── app/
│ ├── layout.tsx
│ └── page.tsx
└── package.jsonStep-by-Step Implementation
Build Hero Section with clear H1 headline and CTA buttons.
### Step 1: Project Setup Initialize Next.js App Router project with Tailwind CSS.
import { useState } from 'react';
export default function SaaSLandingPage() {
const [annual, setAnnual] = useState(false);
return (
<div className="bg-slate-50 min-h-screen pb-20">
<header className="bg-white border-b border-slate-200 py-6 px-8 flex justify-between items-center max-w-6xl mx-auto rounded-b-3xl mb-12 shadow-xs">
<span className="font-extrabold text-xl text-blue-600">SaaSify AI</span>
<nav className="flex gap-6 text-xs font-semibold text-slate-600">
<a href="#features" className="hover:text-blue-600">Features</a>
<a href="#pricing" className="hover:text-blue-600">Pricing</a>
</nav>
<button className="px-5 py-2.5 bg-blue-600 hover:bg-blue-700 text-white font-bold rounded-xl text-xs shadow-xs transition">
Start Free
</button>
</header>
<main className="max-w-4xl mx-auto px-6 text-center space-y-20">
<section className="space-y-6 pt-10">
<h1 className="text-5xl font-extrabold text-slate-900 tracking-tight leading-tight">
Automate Your Workflows with AI Intelligence
</h1>
<p className="text-base text-slate-600 max-w-2xl mx-auto leading-relaxed">
Connect your favorite tools, eliminate manual tasks, and scale your business operations instantly with our intuitive visual builder.
</p>
<div className="flex justify-center gap-4 pt-4">
<button className="px-8 py-4 bg-blue-600 hover:bg-blue-700 text-white font-bold rounded-2xl text-sm shadow-md transition">
Get Started Free
</button>
<button className="px-8 py-4 bg-white hover:bg-slate-50 text-slate-700 border border-slate-200 font-bold rounded-2xl text-sm transition">
Watch Demo
</button>
</div>
</section>
<section id="pricing" className="bg-white p-10 rounded-3xl border border-slate-200 shadow-sm text-left">
<div className="flex justify-between items-center mb-8">
<div>
<h2 className="text-2xl font-bold text-slate-900">Simple, Transparent Pricing</h2>
<p className="text-xs text-slate-500">Choose the plan that fits your scale</p>
</div>
<div className="flex items-center gap-3 text-xs font-semibold bg-slate-100 p-1.5 rounded-xl">
<button onClick={() => setAnnual(false)} className={`px-4 py-2 rounded-lg ${!annual ? 'bg-white text-slate-900 shadow-xs' : 'text-slate-500'}`}>Monthly</button>
<button onClick={() => setAnnual(true)} className={`px-4 py-2 rounded-lg ${annual ? 'bg-white text-slate-900 shadow-xs' : 'text-slate-500'}`}>Annual (Save 20%)</button>
</div>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
<div className="p-6 bg-slate-50 rounded-2xl border border-slate-200 flex flex-col justify-between">
<div>
<h3 className="font-bold text-slate-900 mb-1">Starter Plan</h3>
<p className="text-xs text-slate-500 mb-6">For independent creators</p>
<p className="text-4xl font-extrabold text-slate-900 mb-6">$ {annual ? '24' : '29'}<span className="text-xs font-normal text-slate-500">/mo</span></p>
<ul className="space-y-3 text-xs text-slate-700 mb-8">
<li>✓ 1,000 tasks per month</li>
<li>✓ 5 active workflows</li>
<li>✓ Standard app integrations</li>
</ul>
</div>
<button className="w-full py-3 bg-white hover:bg-slate-100 text-slate-800 border border-slate-200 font-bold rounded-xl text-xs transition">
Choose Starter
</button>
</div>
<div className="p-6 bg-blue-600 text-white rounded-2xl flex flex-col justify-between shadow-md">
<div>
<div className="flex justify-between items-center mb-1">
<h3 className="font-bold text-lg">Pro Scaling</h3>
<span className="bg-blue-500 text-white text-[10px] uppercase font-bold px-2 py-0.5 rounded-full">Popular</span>
</div>
<p className="text-xs text-blue-100 mb-6">For growing businesses</p>
<p className="text-4xl font-extrabold mb-6">$ {annual ? '79' : '99'}<span className="text-xs font-normal text-blue-200">/mo</span></p>
<ul className="space-y-3 text-xs text-blue-100 mb-8">
<li>✓ 10,000 tasks per month</li>
<li>✓ Unlimited active workflows</li>
<li>✓ Priority webhook execution</li>
</ul>
</div>
<button className="w-full py-3 bg-white hover:bg-blue-50 text-blue-700 font-bold rounded-xl text-xs transition shadow-xs">
Choose Pro
</button>
</div>
</div>
</section>
</main>
</div>
);
}Code Explanation
Implementation step
Build Feature Grid highlighting value propositions.
### Step 2: Component Structure Modularize sections into separate UI blocks.
import { useState } from 'react';
export default function SaaSLandingPage() {
const [annual, setAnnual] = useState(false);
return (
<div className="bg-slate-50 min-h-screen pb-20">
<header className="bg-white border-b border-slate-200 py-6 px-8 flex justify-between items-center max-w-6xl mx-auto rounded-b-3xl mb-12 shadow-xs">
<span className="font-extrabold text-xl text-blue-600">SaaSify AI</span>
<nav className="flex gap-6 text-xs font-semibold text-slate-600">
<a href="#features" className="hover:text-blue-600">Features</a>
<a href="#pricing" className="hover:text-blue-600">Pricing</a>
</nav>
<button className="px-5 py-2.5 bg-blue-600 hover:bg-blue-700 text-white font-bold rounded-xl text-xs shadow-xs transition">
Start Free
</button>
</header>
<main className="max-w-4xl mx-auto px-6 text-center space-y-20">
<section className="space-y-6 pt-10">
<h1 className="text-5xl font-extrabold text-slate-900 tracking-tight leading-tight">
Automate Your Workflows with AI Intelligence
</h1>
<p className="text-base text-slate-600 max-w-2xl mx-auto leading-relaxed">
Connect your favorite tools, eliminate manual tasks, and scale your business operations instantly with our intuitive visual builder.
</p>
<div className="flex justify-center gap-4 pt-4">
<button className="px-8 py-4 bg-blue-600 hover:bg-blue-700 text-white font-bold rounded-2xl text-sm shadow-md transition">
Get Started Free
</button>
<button className="px-8 py-4 bg-white hover:bg-slate-50 text-slate-700 border border-slate-200 font-bold rounded-2xl text-sm transition">
Watch Demo
</button>
</div>
</section>
<section id="pricing" className="bg-white p-10 rounded-3xl border border-slate-200 shadow-sm text-left">
<div className="flex justify-between items-center mb-8">
<div>
<h2 className="text-2xl font-bold text-slate-900">Simple, Transparent Pricing</h2>
<p className="text-xs text-slate-500">Choose the plan that fits your scale</p>
</div>
<div className="flex items-center gap-3 text-xs font-semibold bg-slate-100 p-1.5 rounded-xl">
<button onClick={() => setAnnual(false)} className={`px-4 py-2 rounded-lg ${!annual ? 'bg-white text-slate-900 shadow-xs' : 'text-slate-500'}`}>Monthly</button>
<button onClick={() => setAnnual(true)} className={`px-4 py-2 rounded-lg ${annual ? 'bg-white text-slate-900 shadow-xs' : 'text-slate-500'}`}>Annual (Save 20%)</button>
</div>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
<div className="p-6 bg-slate-50 rounded-2xl border border-slate-200 flex flex-col justify-between">
<div>
<h3 className="font-bold text-slate-900 mb-1">Starter Plan</h3>
<p className="text-xs text-slate-500 mb-6">For independent creators</p>
<p className="text-4xl font-extrabold text-slate-900 mb-6">$ {annual ? '24' : '29'}<span className="text-xs font-normal text-slate-500">/mo</span></p>
<ul className="space-y-3 text-xs text-slate-700 mb-8">
<li>✓ 1,000 tasks per month</li>
<li>✓ 5 active workflows</li>
<li>✓ Standard app integrations</li>
</ul>
</div>
<button className="w-full py-3 bg-white hover:bg-slate-100 text-slate-800 border border-slate-200 font-bold rounded-xl text-xs transition">
Choose Starter
</button>
</div>
<div className="p-6 bg-blue-600 text-white rounded-2xl flex flex-col justify-between shadow-md">
<div>
<div className="flex justify-between items-center mb-1">
<h3 className="font-bold text-lg">Pro Scaling</h3>
<span className="bg-blue-500 text-white text-[10px] uppercase font-bold px-2 py-0.5 rounded-full">Popular</span>
</div>
<p className="text-xs text-blue-100 mb-6">For growing businesses</p>
<p className="text-4xl font-extrabold mb-6">$ {annual ? '79' : '99'}<span className="text-xs font-normal text-blue-200">/mo</span></p>
<ul className="space-y-3 text-xs text-blue-100 mb-8">
<li>✓ 10,000 tasks per month</li>
<li>✓ Unlimited active workflows</li>
<li>✓ Priority webhook execution</li>
</ul>
</div>
<button className="w-full py-3 bg-white hover:bg-blue-50 text-blue-700 font-bold rounded-xl text-xs transition shadow-xs">
Choose Pro
</button>
</div>
</div>
</section>
</main>
</div>
);
}Code Explanation
Implementation step
Build Pricing Section with monthly/annual toggle state.
### Step 3: Interactive Features Add pricing toggle state and accordion interaction.
import { useState } from 'react';
export default function SaaSLandingPage() {
const [annual, setAnnual] = useState(false);
return (
<div className="bg-slate-50 min-h-screen pb-20">
<header className="bg-white border-b border-slate-200 py-6 px-8 flex justify-between items-center max-w-6xl mx-auto rounded-b-3xl mb-12 shadow-xs">
<span className="font-extrabold text-xl text-blue-600">SaaSify AI</span>
<nav className="flex gap-6 text-xs font-semibold text-slate-600">
<a href="#features" className="hover:text-blue-600">Features</a>
<a href="#pricing" className="hover:text-blue-600">Pricing</a>
</nav>
<button className="px-5 py-2.5 bg-blue-600 hover:bg-blue-700 text-white font-bold rounded-xl text-xs shadow-xs transition">
Start Free
</button>
</header>
<main className="max-w-4xl mx-auto px-6 text-center space-y-20">
<section className="space-y-6 pt-10">
<h1 className="text-5xl font-extrabold text-slate-900 tracking-tight leading-tight">
Automate Your Workflows with AI Intelligence
</h1>
<p className="text-base text-slate-600 max-w-2xl mx-auto leading-relaxed">
Connect your favorite tools, eliminate manual tasks, and scale your business operations instantly with our intuitive visual builder.
</p>
<div className="flex justify-center gap-4 pt-4">
<button className="px-8 py-4 bg-blue-600 hover:bg-blue-700 text-white font-bold rounded-2xl text-sm shadow-md transition">
Get Started Free
</button>
<button className="px-8 py-4 bg-white hover:bg-slate-50 text-slate-700 border border-slate-200 font-bold rounded-2xl text-sm transition">
Watch Demo
</button>
</div>
</section>
<section id="pricing" className="bg-white p-10 rounded-3xl border border-slate-200 shadow-sm text-left">
<div className="flex justify-between items-center mb-8">
<div>
<h2 className="text-2xl font-bold text-slate-900">Simple, Transparent Pricing</h2>
<p className="text-xs text-slate-500">Choose the plan that fits your scale</p>
</div>
<div className="flex items-center gap-3 text-xs font-semibold bg-slate-100 p-1.5 rounded-xl">
<button onClick={() => setAnnual(false)} className={`px-4 py-2 rounded-lg ${!annual ? 'bg-white text-slate-900 shadow-xs' : 'text-slate-500'}`}>Monthly</button>
<button onClick={() => setAnnual(true)} className={`px-4 py-2 rounded-lg ${annual ? 'bg-white text-slate-900 shadow-xs' : 'text-slate-500'}`}>Annual (Save 20%)</button>
</div>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
<div className="p-6 bg-slate-50 rounded-2xl border border-slate-200 flex flex-col justify-between">
<div>
<h3 className="font-bold text-slate-900 mb-1">Starter Plan</h3>
<p className="text-xs text-slate-500 mb-6">For independent creators</p>
<p className="text-4xl font-extrabold text-slate-900 mb-6">$ {annual ? '24' : '29'}<span className="text-xs font-normal text-slate-500">/mo</span></p>
<ul className="space-y-3 text-xs text-slate-700 mb-8">
<li>✓ 1,000 tasks per month</li>
<li>✓ 5 active workflows</li>
<li>✓ Standard app integrations</li>
</ul>
</div>
<button className="w-full py-3 bg-white hover:bg-slate-100 text-slate-800 border border-slate-200 font-bold rounded-xl text-xs transition">
Choose Starter
</button>
</div>
<div className="p-6 bg-blue-600 text-white rounded-2xl flex flex-col justify-between shadow-md">
<div>
<div className="flex justify-between items-center mb-1">
<h3 className="font-bold text-lg">Pro Scaling</h3>
<span className="bg-blue-500 text-white text-[10px] uppercase font-bold px-2 py-0.5 rounded-full">Popular</span>
</div>
<p className="text-xs text-blue-100 mb-6">For growing businesses</p>
<p className="text-4xl font-extrabold mb-6">$ {annual ? '79' : '99'}<span className="text-xs font-normal text-blue-200">/mo</span></p>
<ul className="space-y-3 text-xs text-blue-100 mb-8">
<li>✓ 10,000 tasks per month</li>
<li>✓ Unlimited active workflows</li>
<li>✓ Priority webhook execution</li>
</ul>
</div>
<button className="w-full py-3 bg-white hover:bg-blue-50 text-blue-700 font-bold rounded-xl text-xs transition shadow-xs">
Choose Pro
</button>
</div>
</div>
</section>
</main>
</div>
);
}Code Explanation
Implementation step
Build FAQ Section with expandable accordions.
### Step 4: SEO Optimization Configure Open Graph social share metadata.
import { useState } from 'react';
export default function SaaSLandingPage() {
const [annual, setAnnual] = useState(false);
return (
<div className="bg-slate-50 min-h-screen pb-20">
<header className="bg-white border-b border-slate-200 py-6 px-8 flex justify-between items-center max-w-6xl mx-auto rounded-b-3xl mb-12 shadow-xs">
<span className="font-extrabold text-xl text-blue-600">SaaSify AI</span>
<nav className="flex gap-6 text-xs font-semibold text-slate-600">
<a href="#features" className="hover:text-blue-600">Features</a>
<a href="#pricing" className="hover:text-blue-600">Pricing</a>
</nav>
<button className="px-5 py-2.5 bg-blue-600 hover:bg-blue-700 text-white font-bold rounded-xl text-xs shadow-xs transition">
Start Free
</button>
</header>
<main className="max-w-4xl mx-auto px-6 text-center space-y-20">
<section className="space-y-6 pt-10">
<h1 className="text-5xl font-extrabold text-slate-900 tracking-tight leading-tight">
Automate Your Workflows with AI Intelligence
</h1>
<p className="text-base text-slate-600 max-w-2xl mx-auto leading-relaxed">
Connect your favorite tools, eliminate manual tasks, and scale your business operations instantly with our intuitive visual builder.
</p>
<div className="flex justify-center gap-4 pt-4">
<button className="px-8 py-4 bg-blue-600 hover:bg-blue-700 text-white font-bold rounded-2xl text-sm shadow-md transition">
Get Started Free
</button>
<button className="px-8 py-4 bg-white hover:bg-slate-50 text-slate-700 border border-slate-200 font-bold rounded-2xl text-sm transition">
Watch Demo
</button>
</div>
</section>
<section id="pricing" className="bg-white p-10 rounded-3xl border border-slate-200 shadow-sm text-left">
<div className="flex justify-between items-center mb-8">
<div>
<h2 className="text-2xl font-bold text-slate-900">Simple, Transparent Pricing</h2>
<p className="text-xs text-slate-500">Choose the plan that fits your scale</p>
</div>
<div className="flex items-center gap-3 text-xs font-semibold bg-slate-100 p-1.5 rounded-xl">
<button onClick={() => setAnnual(false)} className={`px-4 py-2 rounded-lg ${!annual ? 'bg-white text-slate-900 shadow-xs' : 'text-slate-500'}`}>Monthly</button>
<button onClick={() => setAnnual(true)} className={`px-4 py-2 rounded-lg ${annual ? 'bg-white text-slate-900 shadow-xs' : 'text-slate-500'}`}>Annual (Save 20%)</button>
</div>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
<div className="p-6 bg-slate-50 rounded-2xl border border-slate-200 flex flex-col justify-between">
<div>
<h3 className="font-bold text-slate-900 mb-1">Starter Plan</h3>
<p className="text-xs text-slate-500 mb-6">For independent creators</p>
<p className="text-4xl font-extrabold text-slate-900 mb-6">$ {annual ? '24' : '29'}<span className="text-xs font-normal text-slate-500">/mo</span></p>
<ul className="space-y-3 text-xs text-slate-700 mb-8">
<li>✓ 1,000 tasks per month</li>
<li>✓ 5 active workflows</li>
<li>✓ Standard app integrations</li>
</ul>
</div>
<button className="w-full py-3 bg-white hover:bg-slate-100 text-slate-800 border border-slate-200 font-bold rounded-xl text-xs transition">
Choose Starter
</button>
</div>
<div className="p-6 bg-blue-600 text-white rounded-2xl flex flex-col justify-between shadow-md">
<div>
<div className="flex justify-between items-center mb-1">
<h3 className="font-bold text-lg">Pro Scaling</h3>
<span className="bg-blue-500 text-white text-[10px] uppercase font-bold px-2 py-0.5 rounded-full">Popular</span>
</div>
<p className="text-xs text-blue-100 mb-6">For growing businesses</p>
<p className="text-4xl font-extrabold mb-6">$ {annual ? '79' : '99'}<span className="text-xs font-normal text-blue-200">/mo</span></p>
<ul className="space-y-3 text-xs text-blue-100 mb-8">
<li>✓ 10,000 tasks per month</li>
<li>✓ Unlimited active workflows</li>
<li>✓ Priority webhook execution</li>
</ul>
</div>
<button className="w-full py-3 bg-white hover:bg-blue-50 text-blue-700 font-bold rounded-xl text-xs transition shadow-xs">
Choose Pro
</button>
</div>
</div>
</section>
</main>
</div>
);
}Code Explanation
Implementation step
Optimize images using next/image component.
### Step 4: SEO Optimization Configure Open Graph social share metadata.
import { useState } from 'react';
export default function SaaSLandingPage() {
const [annual, setAnnual] = useState(false);
return (
<div className="bg-slate-50 min-h-screen pb-20">
<header className="bg-white border-b border-slate-200 py-6 px-8 flex justify-between items-center max-w-6xl mx-auto rounded-b-3xl mb-12 shadow-xs">
<span className="font-extrabold text-xl text-blue-600">SaaSify AI</span>
<nav className="flex gap-6 text-xs font-semibold text-slate-600">
<a href="#features" className="hover:text-blue-600">Features</a>
<a href="#pricing" className="hover:text-blue-600">Pricing</a>
</nav>
<button className="px-5 py-2.5 bg-blue-600 hover:bg-blue-700 text-white font-bold rounded-xl text-xs shadow-xs transition">
Start Free
</button>
</header>
<main className="max-w-4xl mx-auto px-6 text-center space-y-20">
<section className="space-y-6 pt-10">
<h1 className="text-5xl font-extrabold text-slate-900 tracking-tight leading-tight">
Automate Your Workflows with AI Intelligence
</h1>
<p className="text-base text-slate-600 max-w-2xl mx-auto leading-relaxed">
Connect your favorite tools, eliminate manual tasks, and scale your business operations instantly with our intuitive visual builder.
</p>
<div className="flex justify-center gap-4 pt-4">
<button className="px-8 py-4 bg-blue-600 hover:bg-blue-700 text-white font-bold rounded-2xl text-sm shadow-md transition">
Get Started Free
</button>
<button className="px-8 py-4 bg-white hover:bg-slate-50 text-slate-700 border border-slate-200 font-bold rounded-2xl text-sm transition">
Watch Demo
</button>
</div>
</section>
<section id="pricing" className="bg-white p-10 rounded-3xl border border-slate-200 shadow-sm text-left">
<div className="flex justify-between items-center mb-8">
<div>
<h2 className="text-2xl font-bold text-slate-900">Simple, Transparent Pricing</h2>
<p className="text-xs text-slate-500">Choose the plan that fits your scale</p>
</div>
<div className="flex items-center gap-3 text-xs font-semibold bg-slate-100 p-1.5 rounded-xl">
<button onClick={() => setAnnual(false)} className={`px-4 py-2 rounded-lg ${!annual ? 'bg-white text-slate-900 shadow-xs' : 'text-slate-500'}`}>Monthly</button>
<button onClick={() => setAnnual(true)} className={`px-4 py-2 rounded-lg ${annual ? 'bg-white text-slate-900 shadow-xs' : 'text-slate-500'}`}>Annual (Save 20%)</button>
</div>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
<div className="p-6 bg-slate-50 rounded-2xl border border-slate-200 flex flex-col justify-between">
<div>
<h3 className="font-bold text-slate-900 mb-1">Starter Plan</h3>
<p className="text-xs text-slate-500 mb-6">For independent creators</p>
<p className="text-4xl font-extrabold text-slate-900 mb-6">$ {annual ? '24' : '29'}<span className="text-xs font-normal text-slate-500">/mo</span></p>
<ul className="space-y-3 text-xs text-slate-700 mb-8">
<li>✓ 1,000 tasks per month</li>
<li>✓ 5 active workflows</li>
<li>✓ Standard app integrations</li>
</ul>
</div>
<button className="w-full py-3 bg-white hover:bg-slate-100 text-slate-800 border border-slate-200 font-bold rounded-xl text-xs transition">
Choose Starter
</button>
</div>
<div className="p-6 bg-blue-600 text-white rounded-2xl flex flex-col justify-between shadow-md">
<div>
<div className="flex justify-between items-center mb-1">
<h3 className="font-bold text-lg">Pro Scaling</h3>
<span className="bg-blue-500 text-white text-[10px] uppercase font-bold px-2 py-0.5 rounded-full">Popular</span>
</div>
<p className="text-xs text-blue-100 mb-6">For growing businesses</p>
<p className="text-4xl font-extrabold mb-6">$ {annual ? '79' : '99'}<span className="text-xs font-normal text-blue-200">/mo</span></p>
<ul className="space-y-3 text-xs text-blue-100 mb-8">
<li>✓ 10,000 tasks per month</li>
<li>✓ Unlimited active workflows</li>
<li>✓ Priority webhook execution</li>
</ul>
</div>
<button className="w-full py-3 bg-white hover:bg-blue-50 text-blue-700 font-bold rounded-xl text-xs transition shadow-xs">
Choose Pro
</button>
</div>
</div>
</section>
</main>
</div>
);
}Code Explanation
Implementation step
Common Errors
Use flex-wrap containers.
Security & Performance
Test pricing toggle to verify monthly and annual price adjustments.
Check responsive layout on mobile screen dimensions.
Add testimonial slider.
Integrate interactive ROI calculator modal.
Interview Questions
Q: Is this landing page SEO friendly?
A: Yes, it uses semantic HTML5 tags and clean Next.js server rendering.