141

Analytics Dashboard Website Template

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

An eight-page web analytics dashboard on one flat white sheet ruled by hairlines, with no cards, no shadows and square corners. Daily traffic draws as a barcode of thin green bars with pink misses under a dotted target, a metric strip switches the chart, and every breakdown row filters the whole dashboard. Worked example: an online travel magazine with a shop and memberships.

FlipDraggable advanced
12 more details
data-vizkeyboard-navigationclick-togglehover-effectcount-upfilterflip-layoutdraggabletabstheme-switchstaggerprogressive-enhancement

Released

About this template

A working analytics dashboard for any product that counts visits, sign-ups or sales: web analytics, a marketing or ads dashboard, SaaS product analytics, e-commerce reporting or an operations console. It is built as one flat white sheet divided by 1px hairlines, with square regions, 3px corners on controls and no shadows anywhere. Colour lives only in the data: thin green bars, pink where a day missed its target, a dotted target line and a lime second segment.

Read the full template overview

The Overview opens on a strip of six metrics, each with thirty mini bars of its own. Pick one, by click, arrow keys or the number keys, and the full-width barcode chart below ripples to that series, the dotted target slides to its new level and the misses recolour. Hover or arrow through the bars to read any day. Below it, sources and pages sit in tint-bar rows; click any row and every figure, chart and list on the page re-tweens to that filter, with a chip to clear it. The period menu (or the M, Q, H and Y keys) and a previous-period switch redraw everything the same way, and a live list shows what people are reading now.

Five more pages work in the same skin. Pages is a sortable, searchable table with a sparkline per row, section tabs, bulk CSV export and a drawer with each page's own barcode, read depth and referrers. Sources has a channel proportion bar that picks referrers, and a campaign link builder that writes a tagged address as you type and saves it to the campaign list. Audience reads a weekday by hour heatmap by pointer or keyboard. Goals has dotted targets in every row, an add-goal dialog and a funnel you reorder by dragging. Revenue has a three-line chart with a checkbox legend and comparison, and a member cohort grid. Settings covers the site, team invites, a share link, email reports, the tracking script and a typed delete confirmation.

Every building block is laid out live on a UI elements page with its hooks and states, an index rail and search. The worked example is a privacy-friendly analytics dashboard signed in to The Ferry Review, an independent magazine about sea travel with a shop and paid memberships. All figures come from one data file you replace with your own API.

Analytics Dashboard - website template preview

What's included

13 items
  • Eight pages: Overview, Pages, Sources, Audience, Goals, Revenue, Settings and a UI elements page, on one stylesheet and one script
  • Flat ruled layout: hairline regions, square corners, no shadows, colour only in the data, light and dark themes on the same token names
  • Barcode bar charts with pink misses, a dotted target and previous-period ticks; hover or arrow keys read any day
  • Metric strip that switches the main chart, each metric with its own mini bars
  • Breakdown rows with tint bars that filter the whole Overview, with a removable chip and a shareable address
  • Period menu with keyboard shortcuts and a previous-period comparison that redraw every chart and figure
  • Pages: section tabs, search with an empty state, sorting with a Flip reorder, sparklines, paging, bulk CSV export and a detail drawer
  • Sources: channel proportion bar, referrers by channel and a campaign link builder that saves to the campaign list
  • Audience: weekday by hour heatmap with a roving keyboard focus and a measure switch
  • Goals: dotted target meters, an add-goal dialog with validation and a funnel builder you reorder by drag, buttons or keys
  • Revenue: three-line chart with a checkbox legend, comparison and scrub readout, sortable channel table and a cohort grid
  • Settings: tabbed sections linked to the address, unsaved-changes bar, team invites, share link, address chips, tracking check and typed delete confirmation
  • Phone layout with a full-height navigation sheet that shows each page's key figure; complete pages without JavaScript or with reduced motion; self-hosted Funnel Sans and Spline Sans Mono

Perfect for

5 use cases
  • Web and product analytics dashboards
  • Marketing, campaign and ads reporting
  • SaaS admin panels and internal tools
  • E-commerce and subscription reporting
  • Operations and logistics consoles

How it works

5 sections

One data file, one chart file

Every figure comes from a small data module that builds a year of seeded daily traffic and answers queries by metric, period and filter. A second module turns numbers into chart markup. The static pages were rendered from the same two files, so each page reads the same without JavaScript, and replacing the data module with calls to your own analytics API re-points the whole dashboard.

Barcode charts

Each day is a thin square bar drawn at the chart's measured pixel size, so bars stay crisp at any width. Bars that miss the target turn pink, the target is a dotted rule, and the previous period shows as short ticks. A focusable layer reads the day under the pointer or the arrow keys, with labels placed on whole pixels.

Filters and periods

Clicking a source, page, country or browser row stores a filter in the address and redraws the strip, the charts and every list for that slice, with figures counting to their new values. The period and comparison are remembered as you move between pages.

Interactions on every page

Tables sort, search and page with a Flip reorder; the funnel steps reorder by drag with Draggable or by buttons and arrow keys, and the funnel bars tween to the new reach. The heatmap and cohort grid use a roving tab stop. Drawers and dialogs trap focus and return it to their trigger.

Fallbacks

Without JavaScript every page shows its static charts, tables and a page list footer. With reduced motion the charts draw at rest. If the GSAP CDN is blocked, the script still runs every control and redraws charts without tweens.

Plugins Flip, Draggable
Difficulty Advanced
Includes HTML + JS + CSS source, documentation, AI setup prompt, lifetime updates

Lighthouse, as measured

Google Lighthouse on this template's demo (8 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

Does this only suit a web analytics product?

No. The sheet is metrics, charts and dense tables, so it re-points to a marketing or ads dashboard, SaaS product analytics, e-commerce or subscription reporting, or an operations console. Rename the metrics in the data file, change the breakdown lists and table columns, and swap the dashboard name and The Ferry Review for your own product and customer.

How do I connect it to my real analytics data?

All figures come from assets/data.js. Replace the seeded daily list with rows from your API (Plausible, Umami, Fathom, a warehouse or your own backend) and keep the shapes the helpers return: a point list per metric and period, totals, and lists of rows with shares. The charts, filters and tables read from those helpers, so no page markup needs to change.

Do the forms, invites and campaign links actually save anything?

No, they are an unwired front end. The add-goal dialog, team invites, email report recipients, share link, campaign builder and delete confirmation validate and update the page, but nothing is stored or sent. Connect each to your backend or a service such as Supabase, Firebase or your own API; the README lists the hooks each form uses.

Can I change the green and pink, or drop the dark theme?

Yes. Colours are tokens at the top of style.css, restated for dark mode under the same names, with measured contrast notes. Change the green and pink for your brand, keeping bars at 3:1 against the sheet and text colours at 4.5:1. To ship light only, delete the dark block and the theme button in the sidebar footer.

How do I add another page or remove one?

Each page is a plain HTML file sharing the sidebar, top row and footer list. Copy a page, change its title and content, and add its link to the sidebar and footer in every file. To remove one, delete the file and its links; the script looks for each feature's hooks, so nothing breaks when a panel or page is missing.

Can the targets and the barcode style be used for other measures?

Yes. Each metric in the data file has a daily target and a direction, so a measure where lower is better, such as bounce rate or delivery time, turns pink above the line instead. Any element with the barcode hook draws a chart from a metric key and an optional fixed period, target and target label.

Paid template

Purchase to unlock the code.

Buying Analytics Dashboard 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 the folder and open index.html in a browser, or serve it:

Code snippet omitted: it ships with the download.

  1. Load /index.html (or the folder with a trailing slash) so the relative assets/ paths resolve.
  2. Change the dashboard name (.logo, plain text by default; put your own mark inside it if you have one) and the site name (.site-name, .site-domain) on each page.
  3. Replace assets/data.js with your own figures (see "Re-pointing the data").

No build step. Each page is a plain HTML file with assets/style.css, assets/data.js, assets/charts.js, GSAP from a CDN and assets/script.js.

Using It With Your Own Design

  • Colour: change the tokens at the top of assets/style.css. The light block is :root; the dark theme restates the same names under :root[data-theme="dark"]. Bars need 3:1 against --sheet, text 4.5:1; the measured pairs are noted in the first comment.
  • Type: Funnel Sans (UI and figures) and Spline Sans Mono (axes, paths, keys) are self-hosted in assets/fonts/. Swap --font-ui and --font-mono and the @font-face rules.
  • Shape: --r is the control corner (3px). Regions have none. Keep box-shadow out to keep the register.
  • Density: --pad, --pad-x and --side-w set the cell padding and sidebar width. The bar chart height is .bc-plot { height }.
  • Brand: the dashboard name is plain text in .logo. The site favicon square is .site-fav.

Pages and Configuration

Shared shell

Every page has the same sidebar ([data-nav]), phone bar (.phonebar with [data-nav-open]), top row (.top), a page-list footer (.pagelist) and the shortcuts dialog (#shortcuts). To add a page, copy one, change its <title>, h1 and content, and add its link to the sidebar and footer of every page. Mark the current link with aria-current="page".

The top row's period menu ([data-range] items), comparison switch ([data-compare]) and filter chips ([data-chips]) are optional per page: delete them where they make no sense, as Settings does.

Re-pointing the data

assets/data.js exposes window.Dashboard.data:

  • METRICS: key, label, format (int, pct, dur, gbp), how days combine (sum or avg), a daily target and better (up or down).
  • RANGES: the periods in the menu, their day count, step (7 for weekly bars) and shortcut key.
  • series(metric, range, { previous, filter }) returns [{ t, v }]; total(...) returns a number; target(metric, range) scales the target to the bar size.
  • Lists: SOURCES, CHANNELS, CAMPAIGNS, PAGES, COUNTRIES, DEVICES, BROWSERS, SYSTEMS, DEPTH, GOALS, FUNNEL_STEPS, COHORTS, HEAT. Each row has an id, a name and a share of visitors.

The demo builds a year of days from a seeded random sequence. Replace the body of days (or the helpers) with rows from your API and keep the return shapes; the charts, filters and tables read only these helpers. The static HTML was rendered from the same helpers, so update the numbers in the markup too if you need the no-JavaScript view to match your data.

assets/charts.js (window.Dashboard.charts) turns numbers into markup: barcode, minibars, sparkline, proportion, listRows, lineChart, heatmap, funnel, plus formatting helpers. Colours come from CSS classes, never from the chart code.

Barcode charts

Any element with data-barcode and data-key="<metric>" draws a bar chart. Optional attributes:

  • data-range-fixed="30d" keeps it on one period instead of following the menu.
  • data-show-prev adds previous-period ticks.
  • data-target, data-better and data-target-label override the metric's target (Settings uses this for the daily plan allowance).

Bars that miss the target take .is-miss (pink). Focus the chart and use the arrow keys, Home, End, Page Up and Page Down to read a day.

Metric strip

[data-strip] holds role="tab" buttons with data-metric. On the Overview it drives #chart-main; elsewhere set data-strip-for="<id>" to the barcode it controls.

Breakdown lists and filters

A ul[data-brk] is redrawn from its data attributes: data-list (a list name in the data file), data-kind (makes rows filter buttons: source, channel, campaign, page, country, browser), data-limit, data-pct, data-marks (mark or id monograms), data-name="path" for page lists. On the Overview a filter is kept in the address (index.html?source=google), so links from other pages can open a filtered Overview.

Line charts

[data-revenue-chart] wraps a [data-lines] chart with [data-series-toggle] checkboxes and an optional [data-compare-local] switch for dotted previous-period lines.

Page hooks

  • Pages: [data-page-table], [data-section-tab], [data-search], [data-sort], [data-per-page], [data-row-check], [data-check-all], [data-bulk], [data-export-all], [data-open-page], drawer [data-drawer].
  • Sources: [data-channel], [data-prop="channels"], [data-referrers], campaign builder [data-utm-form], [data-utm-out], [data-utm-save], list [data-campaigns].
  • Audience: [data-heatmap], [data-heat-measure], readout [data-hr-when], [data-hr-value], [data-hr-share].
  • Goals: [data-add-goal] opens #goal-modal; funnel [data-funnel], steps [data-steps] with [data-handle], [data-step-up], [data-step-down], [data-step-remove], [data-step-pick], [data-step-add].
  • Revenue: [data-rev-tile], [data-sortable] tables, cohorts [data-cohorts] with [data-co-mode].
  • Settings: tabs [data-set-tabs] linked to the address hash; forms marked [data-dirty-form] show the [data-unsaved] bar; [data-invite], [data-remove-member], [data-share], [data-recips], [data-verify], [data-danger].
  • Anywhere: data-toast="message" shows a toast; data-copy="text" copies text; data-open-modal="<id>" opens a dialog.

Front end only

Nothing is saved or sent. Goals, invites, recipients, share links, campaigns and the delete confirmation update the page only; CSV export builds the file in the browser. Wire each form to your backend (Supabase, Firebase or your own API). The tracking snippet points at a placeholder stats.example.com.

Keyboard shortcuts

M, Q, H and Y pick the period; C toggles the comparison; 1 to 6 pick a metric on the Overview; X clears a filter; / focuses search; T switches theme; ? lists them. They are ignored while typing in a field.

Palette

Token Light Dark Role
--sheet #FFFFFF #101112 The page; every region
--rail #F7F7F5 #17181A Table heads, hover, read-only fields
--ink #111214 #ECECE8 Text and primary buttons
--ink-2 #5B5E64 #9A9CA2 Labels and secondary text
--line / --line-2 #E6E6E2 / #CFCFCA #26282B / #3A3D41 Hairlines / control borders
--green #10A846 #2FCB6A Bars on target, positive
--pink #E2336A #FF5E8E Bars under target, negative
--lime #C4EE3A #B6E030 Second segment only, never text
--green-ink, --pink-ink, --amber-ink darker partners Coloured text that must reach 4.5:1

The theme follows the system on first visit; the sidebar button switches it and remembers the choice. To ship one theme, delete the other block and the button.

Accessibility

  • Every control is a native button, link or input with a visible focus ring for keyboard use only.
  • The metric strip and tabs are ARIA tab lists with arrow keys. The heatmap and cohort grid use a roving tab stop with arrow keys.
  • Charts are focusable groups that announce the day under the arrow keys; every chart has a table or list carrying the same figures.
  • Drawers, dialogs and the phone sheet trap focus, close on Escape and return focus to their trigger.
  • Colour is never the only signal: misses are also announced and listed, deltas carry a sign.
  • Reduced motion draws charts at rest and stops the live dot pulsing. Without JavaScript every page shows its static charts and tables and a page list for navigation.

Dependencies

  • GSAP 3.12+ (demo built against 3.15.0) from jsDelivr. Flip is loaded on pages.html and Draggable on goals.html; both are optional, and the pages work without them (no reorder animation; buttons and keys still reorder the funnel).
  • Funnel Sans and Spline Sans Mono, self-hosted in assets/fonts/ (latin, the weights used). SIL Open Font License; see assets/fonts/OFL.txt.
  • No other libraries. Plain page loads crossfade with a CSS view transition where the browser supports it.

Teardown

Each page is standalone. On pagehide the script removes its listeners, timers and observers and reverts its GSAP context. If you embed the dashboard in a single-page app, call the same cleanup when the view unmounts, or load the page in its own route.

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