A high-converting WeWeb landing page combines a persuasive hero section, social proof, a benefit-focused features section, and a clear CTA connected to a form or Stripe payment. Use custom fonts, entrance animations, and mobile-optimized spacing to maximize conversions. This tutorial covers the full layout from hero to footer, form integration for lead capture, and SEO meta tag setup.
Designing a High-Converting Landing Page in WeWeb
Landing pages are distinct from dynamic, data-driven pages — their goal is conversion, not data display. A well-structured WeWeb landing page uses proven section patterns: a hero that communicates value immediately, a social proof band, a feature breakdown, testimonials, and a final CTA. This tutorial walks through building each of these sections from scratch in WeWeb's visual editor, connecting a lead capture form to Supabase (or any REST API endpoint), adding custom fonts and scroll-triggered animations to lift perceived quality, and finishing with SEO meta tags and Open Graph setup to make the page shareable and indexable.
Prerequisites
- A WeWeb Free plan or higher with a new or existing project
- Your brand colors, headline copy, and logo image ready to paste in
- Optional: a Supabase project or REST API endpoint for storing form submissions
- Optional: a custom domain connected (required for custom Open Graph previews)
Step-by-step guide
Set up typography and brand colors
Set up typography and brand colors
Before building sections, establish your design tokens so styling is consistent throughout. First, set your brand fonts: click the Libraries icon in the left navbar → Typography → + New Style. Create styles for Heading (H1), Subheading (H2), Body, and Caption — defining font family, weight, size, line-height, and color for each. To use a Google Font: Styling panel → Typography → Font dropdown → search by name (Google Fonts are available directly). For a custom uploaded font: go to the project dashboard → Fonts section → upload TTF or WOFF2 files → the font appears in the dropdown. Second, set brand colors: Libraries → Colors → + New Color → paste your hex values and name them (e.g., 'Primary Blue', 'Accent Green', 'Text Dark'). These named colors appear in all color pickers throughout the project. With Typography styles and Colors defined, applying your brand to any element is one click.
Expected result: Typography styles and brand colors are defined in Libraries and available across the entire project.
Build the hero section
Build the hero section
Click Add element (+) → Section → drag onto the canvas. In the Styling panel, set the section's minimum height to 100vh to fill the viewport. Set padding: top 80px, bottom 80px (or use relative units: clamp(40px, 8vh, 120px)). Inside the section, add a Flexbox Container with direction 'column', align-items 'center', and justify-content 'center'. Inside this container, add in order: (1) a small Badge element or Text element with a pre-headline (e.g., 'Now in beta'). (2) A Heading H1 — apply your Heading Typography style — with your main value proposition. Keep it under 10 words. (3) A Text element with your subheading/supporting copy (2–3 sentences maximum). (4) A Flexbox row container with two buttons: a primary CTA button (filled, brand color) and a secondary CTA (outlined). For a background image or gradient: in the Section's Styling panel → Background → choose Image or Gradient. For video backgrounds, add a Video element positioned as absolute behind the content container with z-index: -1.
Expected result: A full-viewport hero section with a headline, subheadline, and two CTA buttons is visible on the canvas.
Add a social proof band below the hero
Add a social proof band below the hero
Immediately below the hero, add a thin Section that functions as a 'logos band' or 'as seen in' section. This reduces visitor anxiety by showing recognizable client or media logos. Add the section → set background to a light gray (#f9fafb) → set padding: top 24px, bottom 24px. Inside, add a Flexbox Container with direction 'row', align-items 'center', justify-content 'center', flex-wrap 'wrap', and gap 32px. Add a Text element: 'Trusted by teams at' — style it in your Caption typography (small, muted). Then add Image elements for each logo. Set each logo image to: width auto, height 28px (or 32px), object-fit contain, and filter: grayscale(100%) opacity(60%) via the Custom CSS field so logos are unobtrusive. At Mobile breakpoint, increase the gap and reduce logo size so they wrap cleanly.
Expected result: A social proof band with logos or stats appears directly below the hero section, reassuring visitors before they scroll further.
Build the features or benefits section
Build the features or benefits section
Add a new Section → set padding: top 96px, bottom 96px. Inside, add a Flexbox Container (column, align center). Add a centered heading: 'Everything you need to [outcome]'. Below it, add a Flexbox Container with direction 'row', flex-wrap 'wrap', gap 24px, and justify-content 'center'. This container holds your feature cards. Add a Container as the first card. Set it to width 320px (or 30% with min-width 280px to handle wrapping), padding 32px, border-radius 12px, background white, and box-shadow (via Custom CSS: box-shadow: 0 1px 3px rgba(0,0,0,0.1)). Inside each card: an Icon element (or Image), a Heading H3 for the feature name, and a Text element for the description (2–3 sentences). Duplicate the card 2–5 more times and update each. At Mobile breakpoint, the flex-wrap causes cards to stack to single column automatically — just adjust the width binding to 100% at Mobile.
Expected result: A three to five card features section shows benefit-focused cards with icons, headings, and descriptions.
Add a lead capture form with backend submission
Add a lead capture form with backend submission
Add a Section for your lead capture area → set background to your primary brand color (this makes the form section stand out visually). Inside, add a Flexbox Container (column, align center). Add a heading: 'Start for free' or your CTA heading. Below, drag a Form Container element from Add element (+) → Form Elements. Inside the Form Container, add: an Input element (email type, placeholder 'Your email address'), and a Button element ('Get early access' or your CTA text). In the Form Container's Settings panel, configure validation: set the email input as Required and Email format. Now add a workflow to the form: select the Form Container → Workflows tab → On submit → Add action: Supabase → Database Insert → table: 'leads' → data: `{email: formData.email_input, created_at: new Date().toISOString()}`. Add a second action after success: Change variable value → 'formSubmitted' Boolean → true. Bind the form's display to `not(formSubmitted)` and add a thank-you message bound to `formSubmitted`. For REST API submission: use REST API Request → POST → your endpoint → JSON body `{email: formData.email_input}`.
1// Injection point: Supabase SQL editor (outside WeWeb)2// Run this in Supabase Dashboard → SQL editor to create the leads table34CREATE TABLE IF NOT EXISTS public.leads (5 id UUID DEFAULT gen_random_uuid() PRIMARY KEY,6 email TEXT NOT NULL UNIQUE,7 source TEXT DEFAULT 'landing_page',8 created_at TIMESTAMPTZ DEFAULT now()9);1011-- Allow anonymous inserts (landing page visitors are not logged in)12ALTER TABLE public.leads ENABLE ROW LEVEL SECURITY;1314CREATE POLICY "Anyone can submit their email"15 ON public.leads16 FOR INSERT17 WITH CHECK (true);1819-- Prevent anyone from reading the leads list via the frontend20CREATE POLICY "No public select"21 ON public.leads22 FOR SELECT23 USING (false);Expected result: The form captures email addresses and writes them to Supabase (or your API endpoint). After submission, the form is replaced by a thank-you message.
Add scroll-triggered entrance animations
Add scroll-triggered entrance animations
Entrance animations engage visitors as they scroll and give the page a polished feel. Select a features card or any element you want to animate → Styling panel → Animations tab → click + New Animation. Configure: Animation type (Fade In, Slide In Up are most effective for landing pages), Duration (400–600ms works well), Timing function (ease-out), Delay (0ms for the first element, then add 100ms increments for subsequent elements to create a stagger effect). In the Trigger section, select 'When element enters viewport' (also called 'Appear transition') so the animation fires as the user scrolls down, not on initial page load. For a staggered feature cards effect: select all three feature cards and apply the same animation settings with delays of 0ms, 100ms, and 200ms respectively. Do not overdo animations — use them on section headings and feature cards, not on every element.
Expected result: Elements animate into view as the user scrolls down the page, creating an engaging reveal effect.
Set SEO meta tags and Open Graph image
Set SEO meta tags and Open Graph image
Click on the landing page in the Pages panel to select it → Page settings panel (right sidebar) → SEO & Meta Tags section. Set: Title Tag (≤60 chars, include your primary keyword near the beginning, e.g., 'Acme — Automate Your Invoicing in Minutes'). Meta Description (≤155 chars — problem + solution + benefit, e.g., 'Stop chasing invoices. Acme automatically sends and tracks invoices so you get paid faster. Try free.'). For Open Graph (social media sharing previews): Open Graph Title (can match title tag or be more conversational), Open Graph Description (can match meta description), Open Graph Image — upload a 1200×630px image. This image appears when your link is shared on LinkedIn, Twitter, or Slack. To create the OG image: design a simple 1200×630px graphic in Figma or Canva showing your headline and product screenshot, export as PNG, upload in the OG Image field. Without an OG image, social shares show a generic placeholder — this dramatically reduces click-through rates from shared links.
Expected result: Your landing page has a unique title tag, meta description, and Open Graph image. When the URL is shared on social media, it shows an attractive preview card.
Complete working example
1<!-- Injection point: App Settings → Custom Code → Head section -->2<!-- Landing page polish: smooth scroll, gradient text, card hover effects -->34<style>5 /* Smooth scrolling for anchor links */6 html {7 scroll-behavior: smooth;8 }910 /* Gradient headline text */11 .gradient-heading {12 background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 50%, #ec4899 100%);13 -webkit-background-clip: text;14 -webkit-text-fill-color: transparent;15 background-clip: text;16 }1718 /* Feature card hover lift */19 .feature-card {20 transition: transform 0.2s ease, box-shadow 0.2s ease;21 cursor: default;22 }23 .feature-card:hover {24 transform: translateY(-4px);25 box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);26 }2728 /* CTA button pulse animation */29 .cta-primary {30 animation: pulse-glow 2.5s ease-in-out infinite;31 }32 @keyframes pulse-glow {33 0%, 100% { box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.4); }34 50% { box-shadow: 0 0 0 8px rgba(99, 102, 241, 0); }35 }3637 /* Logo grayscale in social proof band */38 .social-proof-logo {39 filter: grayscale(100%) opacity(55%);40 transition: filter 0.2s ease;41 }42 .social-proof-logo:hover {43 filter: grayscale(0%) opacity(100%);44 }4546 /* Mobile-first form input sizing */47 @media (max-width: 767px) {48 input[type="email"] {49 font-size: 16px; /* Prevents iOS auto-zoom on focus */50 }51 }52</style>Common mistakes
Why it's a problem: Setting font-size below 16px on mobile form inputs
How to avoid: iOS Safari automatically zooms in on any input with font-size < 16px, disrupting the layout and user experience. Set email and text inputs to minimum font-size: 16px on Mobile breakpoint via the Styling panel or Custom CSS. This is the most common cause of jarring zoom behavior on mobile landing pages.
Why it's a problem: Not adding an Open Graph image, causing ugly link previews on social media
How to avoid: Go to Page settings → SEO & Meta Tags → Open Graph Image → upload a 1200×630px PNG or JPG. Design this in Canva or Figma with your headline and a product visual. Without it, social shares show a broken or empty preview, which significantly reduces click-through rates when people share your landing page link.
Why it's a problem: Using pixel fixed widths on containers that break at non-standard screen sizes
How to avoid: Set container max-width to a fixed value (e.g., 1200px) but width to 100%. Add horizontal padding using clamp() or percentage values. This ensures the layout never overflows on small screens while maintaining a readable line length on large screens.
Why it's a problem: Putting the lead form in a section far down the page without a CTA button in the hero
How to avoid: Place a primary CTA button in the hero section that scrolls to or opens the form. Many visitors never scroll to the bottom. Add the scroll behavior by using a Navigate action that links to the form section's anchor, or simply place a second form in the hero section for above-the-fold capture.
Best practices
- Define Typography styles and brand Colors in Libraries before building any sections — consistency saves time
- Keep hero headline under 10 words and test multiple versions if possible — your headline is the single highest-impact element
- Use a minimum of 44px tap targets for all buttons at Mobile breakpoint — Apple's Human Interface Guidelines requirement
- Place one clear primary CTA in the hero section; secondary CTAs can appear further down the page
- Use the Form Container's built-in validation so the submit button is disabled until the email format is valid
- Add an explicit success state after form submission — replace the form with a thank-you message using a Boolean variable
- Compress all images to WebP format at 80% quality before uploading — uncompressed images are the most common landing page performance killer
- Set a favicon in Page settings so browser tabs and bookmarks show your brand icon
Still stuck?
Copy one of these prompts to get a personalized, step-by-step explanation.
I'm building a SaaS landing page in WeWeb. I need copy for: a hero headline (10 words max), a supporting subheadline (2-3 sentences), 3 feature cards (name + 2-sentence description each), and a lead capture form CTA button label. My product is [describe your product]. Target customer: [describe your audience]. Primary outcome they want: [describe the outcome]. Make the copy conversion-focused and specific.
In WeWeb, I'm building a lead capture section. I have a Form Container with an email Input and a Submit Button. I want: (1) the submit button disabled when the email input is empty or invalid, (2) on valid submit, insert the email to my Supabase 'leads' table, (3) after successful insert, show a thank-you message and hide the form. What bindings and workflow actions should I configure in WeWeb to achieve this?
Frequently asked questions
How do I add a video background to a WeWeb landing page hero section?
Add a Video element to the hero Section. In the Styling panel, set position to 'absolute', top/left/right/bottom to 0, width to 100%, height to 100%, and object-fit to 'cover'. Set z-index: -1 via Custom CSS so the video sits behind the content. In the Video Settings panel, enable Autoplay, Muted (required for autoplay to work in browsers), and Loop. Set the video source to an MP4 file uploaded to WeWeb's Assets or hosted on an external CDN. Keep the video file under 5MB for acceptable load times.
Can I A/B test different landing page variations in WeWeb?
WeWeb does not have built-in A/B testing. Workarounds: (1) create two separate pages (/landing-a and /landing-b) and split traffic at the DNS/CDN level using Cloudflare Workers or Vercel Edge Middleware, (2) install Google Optimize via the GTM plugin for client-side A/B testing, or (3) use a dedicated tool like VWO or Optimizely added via a script tag in App Settings → Custom Code → Head. Client-side A/B testing via GTM is the simplest approach for most WeWeb projects.
How do I make a WeWeb landing page load faster to improve conversions?
The most impactful steps: (1) compress all images to WebP at 80% quality before uploading, (2) avoid loading large collections on the landing page — landing pages should be mostly static, (3) remove unused plugins and extensions from the project, (4) use conditional rendering instead of CSS display:none for large hidden sections so they are not in the DOM, (5) host on Cloudflare Pages (via code export) instead of WeWeb Cloud for better CDN performance.
Do I need a backend to collect leads from a WeWeb landing page form?
Not necessarily. Options without a traditional backend: (1) use WeWeb's Zapier integration — on form submit, POST to a Zapier Catch Hook webhook that adds rows to Google Sheets, (2) use Make.com or n8n via a webhook, (3) use Airtable's native plugin to write directly to an Airtable base, (4) use Supabase free tier (no cost). For a quick no-setup option, a Zapier → Google Sheets workflow takes under 10 minutes and requires no backend configuration.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation