010
AI ready Refreshed

SaaS Landing Page Template

£29 View live demo or the whole Vault, £79.20

Includes the original v1 design as a separate download.

A four-page SaaS site set in a big serif on flat tomato, moss and ink bands, where every product view is a live HTML window collaged over a colour slab and a real photograph. Visitors drag shifts on a rota and watch the wage bill recount. Worked example: rota software for cafes.

ScrollTriggerDraggableFlip Lenis advanced
15 more details
draggablekeyboard-manipulationtouch-dragcount-updata-vizrange-inputlive-previewflip-filterform-validationfocus-managementview-transitionsscroll-revealstaggerprogressive-enhancement 5 colour palettes
Colour

Updated

About this template

A landing page and three supporting pages for a software product, built on an editorial look the SaaS shelf rarely uses: a sturdy serif in sentence case, full-width flat bands of tomato, moss and ink, and photographs of the people who use the product. Every view of the product is a designed HTML window, not a screenshot, set over a colour slab and one photograph, so the page sells both the software and the working day it changes.

Read the full template overview

The hero carries a live rota. Visitors drag a shift from one person to another, by mouse, touch or keyboard; the wage cost, the share of forecast takings and both people's hours count to their new figures, and a swap request lands on a phone they can accept or decline. Further down, a forecast slider re-reads each day's wage cost, a shift swap plays out in a group chat, and a timesheet approves in one go. Pricing has a working cost calculator, Customers tells one cafe's story in photographs with a before and after chart, and Start rewrites a preview rota as the sign-up form is filled in.

The worked example is Crewe, rota software for independent cafes, restaurants and bars. To make it yours, rewrite the rows inside the windows (their figures are computed from data attributes), swap the photographs, and choose one of five colour-and-type presets or repaint the tokens. The same layout suits scheduling, HR and payroll, booking, field-service and CRM products.

SaaS Landing Page Template - website template preview

What's included

14 items
  • Four plain pages (landing page, pricing, customer story, sign-up) sharing one stylesheet and one script, with a cross-page fade where browsers support it
  • Hero product window you can handle: drag a shift to another person by mouse, touch or keyboard, and the wage cost, forecast share and hours recount
  • A phone tile that receives each swap request, with Accept and Decline that keep or undo the move, plus a reset
  • Product windows built in HTML and collaged over colour slabs and real photographs, with every total computed from the markup
  • Forecast slider that re-reads each day's wage cost against a target band
  • A shift-swap chat that plays in place when it scrolls into view, and a timesheet that approves row by row or all at once
  • Pricing calculator for venues, people and an add-on, with prices held in data attributes, a comparison table and billing questions
  • Photo-led customer story with a facts window, chapters, a pull quote, a before and after chart and quotes filtered by venue type
  • Sign-up page whose preview rota follows the form: venue name, type, opening hours and team size
  • Floating pill navigation on desktop and a bottom pill with a serif page sheet on phones
  • Quote cards on ink with headshots breaking out of their lower edge
  • Self-hosted Young Serif and Be Vietnam Pro, and about 0.9 MB of baked WebP photography
  • Five measured colour-and-type presets (tomato, cobalt, teal, ochre, berry), each a pair of flat block colours with its own display face, switched from one data-palette attribute
  • Readable without JavaScript, with every figure present as text

Perfect for

5 use cases
  • SaaS landing pages and product marketing sites
  • Scheduling, HR and payroll software
  • Booking, appointment and field-service apps
  • CRMs and small-business tools that sell to owners
  • Startup sites that need pricing, a customer story and a sign-up page

How it works

4 sections

Product windows driven by their markup

Each window is ordinary HTML. People carry an hourly rate, shifts carry start and end times, days carry a wage and a share of takings, and the script reads those attributes to compute every total. Change a row and the figures follow; without JavaScript the figures you wrote stay on the page.

Moving a shift

Shifts are buttons that move only up and down their day column, so a move always means another person on the same day. A pointer or touch drag highlights the row under it and refuses anyone already working that day. By keyboard, Enter picks a shift up, the arrow keys choose a person, Enter drops and Escape cancels, with a live region reading out each step and the new totals.

The swap request

Each accepted move sends a request to the phone tile, addressed to the person who received the shift. Accepting keeps it; declining animates the shift back to where it came from and recounts. A reset link restores the rota as shipped.

Plain pages, shared script

Each page loads on its own with a short cross-document fade where supported. One script runs on all four and each feature skips itself when its markup is missing, so sections and pages can be deleted freely. The phone sheet traps focus, closes on Escape or an outside tap, and pauses smooth scrolling while open.

Plugins ScrollTrigger, Draggable, Flip
Difficulty Advanced
Smooth scroll Lenis integration
Colour palettes 5 ready-made palettes, each measured for AA contrast. Switch with one attribute, or copy the values you want into :root. Try them in the preview above.
Includes HTML + JS + CSS source, documentation, AI setup prompt, lifetime updates

Lighthouse, as measured

Google Lighthouse on this template's demo (4 pages, lowest score shown), from the latest scan. A measurement of the demo as shipped, not a promise for your page.

Accessibility
100
Best practices
100

No performance score, on purpose. That figure depends on how you deploy: your server's compression and caching, your CDN, the connection and the device doing the test, none of which the code controls. The same page can score very differently on two consecutive runs, so measure it where it will live.

Questions about this template

What kinds of software does this layout suit besides rota apps?

Anything sold to people who run something: scheduling and HR tools, payroll, booking and appointment software, field-service apps and CRMs. The windows are plain HTML, so the rota becomes a pipeline, calendar or job board in the same chrome. Keep the colour slab and a photograph of your users beside each one and rewrite the copy.

Do I need screenshots of my product?

No. Every product view is a designed HTML window with rows you edit as text, so it stays sharp at any size and can animate. Many buyers keep the windows as simplified sketches of their real interface, which reads better on a landing page than a cropped screenshot and does not date when the app changes.

How do I change the rota figures in the hero?

Edit the rows. Each person has an hourly rate, each shift a start and end time, and the window has the week's forecast takings, all as data attributes. Hours, wage cost and the percentage are computed from them, and the visible shift labels are text you write, so you can also turn the rota into any other grid of movable items.

Does the sign-up form create accounts or send email?

No. It is a static front end. It collects a name, venue name, venue type, team size and work email, checks the required fields and shows a success panel, but nothing is sent or stored. Point the form at Formspree, Netlify Forms, your CRM or your own sign-up endpoint and remove the marked submit handler.

Are the pricing calculator and plans tied to a real billing system?

No. The calculator works out a monthly figure from prices held as data attributes on its window, and the plan buttons link to the sign-up page. Change the attributes and the plan cards to match your own prices, and send the buttons to your checkout or billing provider when you have one.

Can I use my own customers in the customer story page?

Yes, and you should: the cafe, its owners and their quotes are fiction, and the people in the photographs are not those characters. The page is a sequence of chapters, a pull quote, a before and after chart driven by two lists of numbers, and short quotes filtered by a data attribute, all ready for your own words and photographs.

Paid template

Purchase to unlock the code.

Buying SaaS Landing Page Template opens the HTML, CSS and JavaScript source, the full documentation, an AI setup prompt for your editor, and every update we ship to it. Standard license: unlimited personal and commercial projects. Every paid product is tested for desktop and mobile layouts, reduced-motion handling, animation cleanup and keyboard controls wherever there is something to operate.

£29 Standard license, unlimited projects

Browse free effects

Or the whole library: the Vault, £79.20, one payment.

Documentation

Quick Start

  1. Unzip and open index.html in a browser, or serve the folder with any static server (npx serve .).
  2. The pages are plain HTML files: index.html (the landing page), pricing.html (plans, calculator, comparison, billing questions), customers.html (a long-form customer story and short quotes) and start.html (sign-up with a live preview).
  3. All pages share assets/style.css and assets/script.js. There is no build step.
  4. Deploy the folder as it is to any static host.

Using It With Your Own Design

  • Colour: pick one of the five presets (see Palettes) or repaint the tokens at the top of assets/style.css (--paper, --ink, --block, --block-2, their --on-* text colours, and --light). Keep body text on your block colours at 4.5:1; the measured pairs are listed in the :root comment.
  • Type: Young Serif for every display line by default (each palette can set its own --font-display and --font-display-weight), Be Vietnam Pro for body and interface text, all self-hosted in assets/fonts/.
  • Your product: each window is ordinary markup. Rewrite the rows, labels and figures for your own software; the totals are computed from data attributes on those rows (see below), so they stay right.
  • Photographs: one per collage, plus four headshots and the customer story set. See Images.
  • Another kind of SaaS: the layout suits scheduling and HR tools, payroll, booking software, field-service apps and CRMs. Replace the rota with a pipeline, a calendar or a job board in the same window chrome, keep the colour slab and the photograph, and rewrite the copy.

Pages and Configuration

Page Sections Hands-on piece
Home Hero collage, proof line, three feature bands (moss, tomato, paper), quotes on ink, pricing teaser, closing band Drag a shift on the rota; forecast slider; swap thread; timesheet approval
Pricing Calculator collage, plans on tomato, comparison table, billing questions on moss Venues and people steppers, payroll switch
Customers Story hero with a facts window, three chapters, pull quote, before and after chart, filterable quotes Before / With switch, venue filter
Start Sign-up form beside a tomato field with a photograph and a preview window The preview rewrites itself as the form is filled in

Every feature looks for its own markup and does nothing when it is missing, so you can delete a section, or a page and its links, without touching the script.

Navigation

Desktop: a quiet top bar (wordmark, three links, one pill) that turns into a floating pill once the page scrolls. Mark the current page with aria-current="page" in the bar, the footer and the phone sheet. Phones: the bar keeps the wordmark, and a bottom pill opens a sheet of page names set in the display serif on the page's block colour (data-sheet-colour="block-2" on <body> for the second block colour, the first otherwise). The sheet moves focus in, keeps Tab inside, closes on Escape, the Close button or a tap outside, returns focus to the Menu button and pauses smooth scrolling while open. The pill tucks away while you scroll down and returns when you scroll up. Without JavaScript the footer page list is the navigation.

The hero rota ([data-rota])

  • Each person is a .rota__row with data-name and data-rate (hourly rate).
  • Each day is a .rota__cell with data-day (mon to sun); a shift is a <button class="shift"> inside it with data-start and data-end (24-hour, HH:MM). The visible label (7–3) is text you write.
  • data-forecast on the window is the week's forecast takings; wage cost is hours times rate, and the percentage is against that forecast.
  • A shift moves to another person in the same day column, by pointer or touch, or by keyboard: Enter or Space picks it up, the arrow keys choose a person, Enter drops and Escape cancels. A person already working that day is refused. Totals count to their new values and a live region announces them.
  • The phone ([data-phone]) shows the request to whoever received the shift. Accept keeps it; Decline sends the shift back. Reset the rota puts everything back.
  • The hint above the window ([data-rota-hint]) names a move that works with the shipped rows; change it if you change the rows.

Wage cost against forecast ([data-planner])

One .planner__bar per day with data-wage (that day's wage cost) and data-share (that day's share of the week's takings; the shares should add up to 1). data-low, data-high and data-max on [data-planner-bars] set the target band and the chart's top. The range input sets the forecast. The inline --h heights and labels in the markup are what a visitor without JavaScript sees.

Swap thread ([data-thread]) and timesheets ([data-timesheet])

The thread's messages are plain paragraphs; they play in one after another when the phone scrolls into view, and Approve or Decline replaces the buttons with a result line. Timesheet rows carry data-mins (the clocked length in minutes) for the approved total.

Pricing calculator ([data-calc])

All prices are data attributes on the calculator: data-venue-price, data-group-price, data-group-from (venues needed for the group price), data-included (people included per venue), data-extra-price (per extra person) and data-payroll-price (per venue). Change them there and in the plan cards' text.

Customers

[data-week] takes data-before and data-after (hours per day, Monday first) and data-max (the chart's top). The two captions are on [data-week-captions]. Short stories in [data-more] carry data-kind; the filter buttons' data-filter values match those, and a filter with no matches shows [data-more-empty].

Start (sign-up)

The form is a static front end and sends nothing. It collects a name, venue name, venue type, team size and work email; on submit the script checks the three required fields and shows a success panel. To make it live, remove the submit handler in initStart (marked in assets/script.js) and point the form's action at Formspree, Netlify Forms, your CRM or your own sign-up endpoint. The preview window is decoration that follows the form: venue type sets the opening hours (data-hours on each radio) and shift labels (PATTERNS in the script), and team size draws up to six rows.

Palettes

Five colour-and-type presets ship in assets/style.css. The default is in :root; the other four are :root[data-palette="..."] blocks. Each is a committed pair of flat block colours with its own paper, ink, highlight and display face, measured to the same contrast bar (the figures are in each block's comment).

Palette data-palette Block colours Display face
Tomato (default) none Tomato #C43B23, moss #3D5233 Young Serif
Cobalt cobalt Cobalt #2B44C7, aubergine #5E2750 Gloock
Teal teal Teal #0F6E68, clay #A4482A Rubik 600
Ochre ochre Ochre #B97A1E (ink text), navy #23395B Epilogue 700
Berry berry Berry #A3264F, pine #1F4E4A Young Serif

To use one, set it on the <html> tag of every page: <html lang="en-GB" data-palette="teal">. Or, once you have chosen, copy that block's values into :root and delete the palette blocks. The display faces are self-hosted in assets/fonts/; a browser downloads only the face in use.

The tokens are semantic: --block and --block-2 are the two band colours, --on-block and --on-block-2 the text that reads on each (light on dark blocks, ink on a light one), --block-text the first block colour darkened where it is needed as text on paper, and --light the highlight (a lifted shift, the swap request, slabs). A block colour is never the page ground, and the two blocks are never text and ground for each other.

Images

The photographs are bundled as art-directed WebP derivatives in assets/img/, baked from Pexels originals (Pexels licence: free to use, no attribution required; credit is appreciated). assets/img-manifest.json lists every source URL with its crop, size and grade; to regenerate after changing it, run bun scripts/build-template-assets.ts saas-landing-template from the GSAP Vault repository, or replace files in assets/img/ directly at the same names and sizes.

File Shows Source
hero-server.webp, -sm Server in a tan apron reading her phone by a green wall pexels.com/photo/8441003
rota-owner.webp Owner at a laptop on the counter pexels.com/photo/4353592
swap-phone.webp Hands holding a phone over an apron pexels.com/photo/4349947
clock-in.webp Tying an apron at the start of a shift pexels.com/photo/6223013
head-orla.webp Barista, arms folded pexels.com/photo/6684767
head-dev.webp Bar manager in a waistcoat pexels.com/photo/32692401
head-marisol.webp Chef in a copper apron pexels.com/photo/5737830
head-kofi.webp Shopkeeper with a crate of tomatoes pexels.com/photo/8475166
cta-kitchen.webp Line cook with a flaming pan pexels.com/photo/36430025
pricing-bar.webp Bartender behind the bar pexels.com/photo/8941709
story-owners.webp, -sm Two cafe owners outside their cafe pexels.com/photo/6205762
story-rory.webp At the espresso machine pexels.com/photo/6205609
story-ada.webp Steaming milk pexels.com/photo/6205649
story-table.webp Three staff round a laptop pexels.com/photo/6205496
story-counter.webp Both owners at the counter pexels.com/photo/6205544
start-door.webp Shopkeeper opening his door pexels.com/photo/8475169

The people photographed are not the named characters; the names, quotes and figures are fiction. Replace them with your own customers before you publish.

What is mocked

Everything a visitor can press works in the page, and nothing leaves it: the rota, swap request, approvals, calculator and sign-up are front-end demonstrations with no account, server or email behind them. The customer story, quotes and figures are fictional.

Accessibility

  • Every interaction works by keyboard and touch as well as mouse: the rota (Enter, arrows, Escape), steppers, switches, filters and the form use native buttons and inputs with visible focus.
  • Live regions announce rota totals, swap results, the forecast verdict, calculator totals and form errors.
  • Reduced motion: no entrances or count-ups; every control still works and moves happen instantly.
  • Without JavaScript, or with the CDN blocked, every page reads as a complete document with its static figures, and the footer carries the navigation.
  • Text contrast is measured on every surface (see the :root comment).

Dependencies

  • GSAP with ScrollTrigger (all pages), Draggable (Home) and Flip (Customers), loaded from jsDelivr. Built against GSAP 3.15.0; works with GSAP 3.12+.
  • Lenis 1.3.17 for smooth scrolling, optional: delete the script tag and initLenis to drop it, or add ?smooth=off to a URL to compare.

Fonts

Young Serif, Be Vietnam Pro (400, 500, 600), and the palette faces Gloock, Rubik 600 and Epilogue 700, latin subsets, self-hosted as WOFF2 in assets/fonts/ under the SIL Open Font License (assets/fonts/OFL.txt). The display face and the regular body weight are preloaded on every page.

Teardown

All animation lives in one gsap.context (window.gsapContext). Calling window.gsapContext.revert() removes every tween, ScrollTrigger, Draggable and listener the script added, and destroys the Lenis instance it created.

Worked examples, the events and programmatic API, and the class reference ship with the download, alongside the full source.