Topic Web and software engineering

Tailored websites: how to personalise a site for each visitor

The short answer

A tailored website changes what each visitor sees based on signals you can explain: the campaign that brought them, their country or language, what they did on earlier visits, or their account. Start with simple rules on one high-traffic page, ask for consent before using personal data, and keep a control group so you can measure whether it helps.

Written by

Siddharth Kajaria, Founder and CEO

Published

Updated

Reading time

15 min read

A tailor pins a grey jacket to fit on a dress form while two other jackets hang on a rail behind her.
In this post15 min read
  1. What is a tailored website?
  2. The four levels of website personalisation
  3. What each level needs technically
  4. Consent and privacy: personalise without being creepy
  5. How to test whether personalisation helps
  6. When isn’t website personalisation worth it?
  7. Examples of personalisation by industry
  8. How we’d approach building it

Key takeaways

A website that shows every visitor the same page treats a first-time visitor from a paid campaign, a returning customer and someone browsing from another country as if they wanted the same thing. A tailored website closes some of that gap. Done well, it feels like the site simply understood what you came for. Done badly, it feels like being followed around a shop.

This guide is about doing it well. It sets out four levels of personalisation, from the simple and safe to the complex, what each one needs technically, how to handle consent, how to test whether it actually helps, and when it isn’t worth building at all.

What is a tailored website?

A tailored website is one that changes parts of what a visitor sees, such as the headline, the examples, the order of content or the call to action, based on what it knows about that visitor. The rest of the page stays the same. The aim is relevance: tailoring a digital platform to user needs so each visitor reaches what they came for with fewer clicks.

Personalisation is different from customisation. Personalisation is the site choosing for the visitor (“you came from the freelancer campaign, so here is invoicing”). Customisation is the visitor choosing for themselves (setting a language, saving a dashboard layout, picking which updates to see). Good tailored websites use both, and customisation is often the better starting point because the visitor is in control.

The four levels of website personalisation

Each level uses a different signal, needs more data and more engineering than the one before, and carries more risk of feeling intrusive. Most sites should start at level one and move up only when the previous level has proved its worth.

The same page for everyone
  1. Campaign or source

  2. Location and language

  3. Behaviour on the site

  4. Account or profile

Built into the product

Start at level 1

Each level in more detail:

Level 1: by campaign or source

Match the page to the link the visitor clicked. If an ad or email talks about invoicing for freelancers, the landing page should say the same thing in its headline and examples, not show the generic home page. The signal is the campaign tag in the link (such as utm_campaign) or the referring site.

This is the cheapest and safest level. It uses no personal data, needs no stored history and is easy to test, because each campaign already has its own traffic. Most of what people call landing page optimisation is personalisation at this level, which is why landing page testing for paid campaigns usually starts here.

Level 2: by location and language

Show the right language, currency, delivery information, phone number and examples for where the visitor is. The signals are the language their browser asks for (the Accept-Language header) and the country your CDN or hosting platform detects from their IP address.

Two rules keep this level from going wrong:

  • Suggest, don’t force. Offer a switch to the detected language or country and remember the choice. Automatically redirecting people traps travellers, expats and anyone on a VPN in the wrong version.
  • Give each language its own URL (such as /fr/ or a separate domain) rather than changing the language on one URL, so search engines can index every version and people can share the right link.

Level 3: by behaviour on the site

Change what you show based on what the visitor has done: the pages they read, the product category they browsed, whether they started a sign-up and stopped. A returning visitor who read three articles about one topic might see that topic first; someone who abandoned a form might see a shorter version of it.

This level needs a record of behaviour across visits, usually a first-party cookie linked to your own analytics events, and that means consent in many places. It also needs enough traffic for each behaviour group to be worth designing for. Many sites find that a few well-chosen rules (“returning visitor”, “viewed pricing”) capture most of the value.

Level 4: by account or profile

Once visitors sign in, you know what they told you and what they use: their role, plan, industry, the features they have tried. Logged-in personalisation can be deep: an onboarding checklist that skips what they’ve done, a home screen built around their role, help articles for the features they actually use.

This is where personalisation becomes part of the product rather than the marketing site, and it is built into the web app itself. It is also where people expect it most: a logged-in customer is usually happy for the product to remember them.

Planning personalisation?

What each level needs technically

Each level reads different signals, makes its decision in a different place and stores different data:

What each level of website personalisation needs technically, and how to keep it simple
LevelWhat it needsKeep it simple by
Campaign or sourceSignals: campaign tags and the referrer. The decision can run on the server, at the edge or in the browser. Data stored: none. The work is one written variant per campaign.Matching only the campaigns that already bring traffic, and retiring each variant when its campaign ends.
Location and languageSignals: the Accept-Language header and the country your CDN detects. The decision runs on the server or at the edge. Data stored: the visitor’s chosen language or country. Each language also needs its own pages.Suggesting the detected version instead of redirecting, remembering the choice, and giving each language its own URL.
BehaviourSignals: pages viewed, events and visit count. The decision runs on the server or at the edge, with a first-party cookie. Data stored: a visitor ID and recent events, with consent. It also needs enough traffic per group to be worth designing for.A few well-chosen rules, such as “returning visitor” or “viewed pricing”, behind the visitor’s consent choice.
Account or profileSignals: account fields and product usage. The decision runs in the application’s server. Data stored: the account record you already hold. It is product work, built into the app’s own screens.Using only the account fields that change what you show, such as role, plan or industry.

The building blocks are:

  • Rules. Readable “if this, show that” rules cover most needs. They are easy to explain, test and switch off. Machine learning recommendations make sense only with large catalogues and a lot of traffic.
  • Content variants. Each personalised slot (the hero, a block of examples, a call to action) needs its variants written and stored, usually as fields in your CMS, with a default that always works.
  • A place to make the decision. Deciding on the server or at the edge, before the page is sent, avoids the flicker of a page that changes after it loads, and keeps the page fast. Deciding in the browser is simpler to add to an existing site but often causes that flicker.
  • Caching that knows about variants. A cached page must not show one visitor’s version to another. Cache each variant separately (for example, by varying the cache on language or a variant cookie), or cache the page and fill only the personalised slot per request.
  • Measurement. Every personalised view should be logged with the variant shown, so you can compare outcomes later.

A simple rules engine

Here is a small, dependency-free example in JavaScript that picks a hero block for each visitor. It reads three signals from a request (a campaign tag, a country header from the CDN and two cookies) and applies rules in order. Save it as personalise.mjs and run it with Node.js 18 or later:

// personalise.mjs: pick the hero block for a visitor from simple rules
// Runs on Node.js 18 or later, with no dependencies: node personalise.mjs
import { pathToFileURL } from 'node:url';

const HEROES = {
  default: { heading: 'Accounting software for growing teams', cta: 'Start a free trial' },
  'campaign:freelancers': { heading: 'Invoicing made simple for freelancers', cta: 'Send your first invoice' },
  'country:GB': { heading: 'Accounting software, priced in pounds', cta: 'See UK plans' },
  returning: { heading: 'Welcome back', cta: 'Pick up where you left off' },
};

// Rules run top to bottom and the first match wins. Each reads one signal you can explain.
const RULES = [
  { id: 'campaign:freelancers', when: (v) => v.utmCampaign === 'freelancers' },
  { id: 'returning', when: (v) => v.consented && v.visits > 1 },
  { id: 'country:GB', when: (v) => v.country === 'GB' },
];

export function pickHero(visitor) {
  const rule = RULES.find((r) => r.when(visitor));
  const id = rule ? rule.id : 'default';
  return { id, ...HEROES[id] };
}

// Read the signals from a request. Anything missing falls back to the default.
export function visitorFrom(url, headers = {}, cookies = {}) {
  const params = new URL(url).searchParams;
  return {
    utmCampaign: params.get('utm_campaign'),
    country: headers['x-country'] ?? null, // set by your CDN or edge platform; the header name varies
    consented: cookies.consent === 'yes',
    visits: Number.parseInt(cookies.visits ?? '0', 10) || 0,
  };
}

// Run this file directly to check the rules against four sample visitors.
if (import.meta.url === pathToFileURL(process.argv[1]).href) {
  const samples = [
    ['https://example.com/?utm_campaign=freelancers', {}, {}],
    ['https://example.com/', { 'x-country': 'GB' }, {}],
    ['https://example.com/', { 'x-country': 'GB' }, { consent: 'yes', visits: '3' }],
    ['https://example.com/', {}, { consent: 'no', visits: '3' }],
  ];
  for (const [url, headers, cookies] of samples) {
    console.log(pickHero(visitorFrom(url, headers, cookies)).id);
  }
}

Running it prints campaign:freelancers, country:GB, returning and default, one per sample visitor. Notice the last one: the visitor has been before, but hasn’t consented, so the behaviour rule doesn’t apply and they see the default. In a real site, pickHero would run in your server or edge function before the page is rendered, and the header name for the visitor’s country depends on your CDN or hosting platform.

The line between helpful and creepy is usually whether the visitor can see why the site is showing them something. “Because you’re in the UK” and “because you came from our freelancer email” feel fine. “Because we noticed you looked at this three times last week” can feel like surveillance, even when it is technically allowed.

Practical rules that keep personalisation on the right side of that line:

  • Ask before you remember. Behaviour-based personalisation that stores a visitor ID belongs behind the visitor’s consent choice, and the site must still work well without it.
  • Personalise on what visitors would expect you to know, such as the campaign they clicked, their language, their account settings, not on inferences about health, finances, religion or other sensitive traits.
  • Explain and let people switch off. A short note (“Showing UK pricing. Change”) and a setting to turn personalisation off build trust.
  • Keep data to what changes the page. If a field never changes what you show, don’t collect it for personalisation.
  • Never personalise the price of the same product for different people without a clear, stated reason such as a regional price list. It is the fastest way to lose trust.

Privacy laws, such as the EU’s GDPR and India’s DPDP Act, set rules on personal data and consent that vary by country, so check how they apply to your audience with someone qualified before you launch behaviour-based personalisation. Consent choices and personalisation settings work best when they are part of the UI UX design from the start, rather than a banner added at the end.

How to test whether personalisation helps

Run a controlled test: personalisation adds content to maintain, so prove it earns its place.

  1. Pick one goal per experiment, such as sign-ups, demo requests or a key product action. Not “engagement”.
  2. Keep a control group. Show a random share of eligible visitors the default version, even when a rule matches them. Without a control group, you can’t tell whether a personalised visitor converted because of the personalisation or because they were already more likely to.
  3. Decide the sample size before you start, using a sample size calculator, and don’t stop the test early because one version is ahead.
  4. Compare the personalised group with its control, not with the whole site.
  5. Keep the variants that win and remove the rest. A rule that doesn’t help is content someone has to keep updating for nothing.

If your traffic is too small for a fair test, prefer the levels that are obviously right (matching the campaign, showing the right language) and spend the effort on a clearer single page. Our guide to a conversion-focused website covers that side.

When isn’t website personalisation worth it?

Website personalisation isn’t worth it when the site has too little traffic to measure the effect, when there is no team to write and maintain the variants, or when the default page isn’t clear yet. Personalising an unclear page gives you several unclear pages.

Before you build, check whether the site is ready and whether you can test it fairly. Tick what is true for your site:

Worth doing yet?

Is the site ready?

Show or hide the tests5 tests
  1. 01 The default page is already clear

    True when
    Why it matters
  2. 02 Visitors come for different things

    True when
    Why it matters
  3. 03 There is enough traffic to measure

    True when
    Why it matters
  4. 04 Someone can keep the variants up to date

    True when
    Why it matters
  5. 05 The data is there

    True when
    Why it matters

Read next A conversion-focused website

Can you test it fairly?

Show or hide the tests4 tests
  1. 06 You can explain every rule

    True when
    Why it matters
  2. 07 One goal per experiment

    True when
    Why it matters
  3. 08 A control group from day one

    True when
    Why it matters
  4. 09 Every variant shown is logged

    True when
    Why it matters

Read next Landing page testing

Examples of personalisation by industry

The same four levels look different by sector:

6 industries

Generic examples, not client projects

Selling and publishing

  1. E-commerce

    Needs
    Product and delivery data per country, and variants written for each live campaign.
    Watch for
    Charging different people different prices for the same product without saying why (a regional price list is a stated reason).
  2. Travel

    Needs
    A language and currency switch the visitor can change, and remembered searches only for signed-in users.
    Watch for
    Redirecting by location, which traps travellers and people on a VPN in the wrong version.
  3. Media and publishing

    Needs
    Topic tags on every article, and a reader’s choices or consent before reading history is used.
    Watch for
    Narrowing what a reader sees until the rest of the site is hard to find.

Accounts and services

  1. Financial services

    Needs
    Country-specific product pages, and account data the application already holds.
    Watch for
    Personalising on inferences about a visitor’s finances rather than what they told you.
  2. Healthcare

    Needs
    A signed-in portal, and topics the patient picks for themselves.
    Watch for
    Inferring anything about health from browsing. Let the patient choose instead.
  3. B2B software

    Needs
    Campaigns tagged by industry, and product usage events in the app.
    Watch for
    Rules no one can explain. If no one can say why a customer sees a variant, no one can debug it either.

Whatever the sector, the data behind the rules matters as much as the rules. Our guide to data-driven targeted marketing covers collecting first-party data that makes these rules possible.

How we’d approach building it

We’d start by choosing one high-traffic page and one goal, then write down the two or three visitor groups whose needs on that page clearly differ. For each group we’d agree the rule, the variant and the default, and build the decision on the server or at the edge so the page stays fast and doesn’t flicker. Logging every variant shown comes before launch, a control group from day one, and a review after the agreed sample size to keep or remove each rule. Personalisation in a logged-in product is part of custom web app development, built into the application’s own screens and data.

02 FAQ

Questions, answered

Is website personalisation worth it for a small business?
Often only in its simplest forms. Matching a landing page to each ad campaign, and showing the right language and currency, are cheap and usually worth doing. Behaviour-based and profile-based personalisation need steady traffic to measure and ongoing effort to maintain, so most small sites get more from a clearer single page first.
Does personalisation hurt SEO?
Not if the page's main content stays the same for everyone and you personalise around it. Search engines usually crawl without cookies or campaign tags, so they see the default version; make sure that version is complete and good. Showing search engines different content from what visitors see is cloaking, which breaks search engine guidelines.
Can you personalise a website without cookies?
Yes, partly. The campaign tags in a link, the language the browser asks for and the country your CDN detects all arrive with each request, with nothing stored on the visitor's device. Remembering behaviour across visits needs a cookie or similar storage, and an account lets visitors choose what is remembered.
What data do you need to tailor a website to each visitor?
Less than most teams think. Campaign tags, language and location cover the first two levels. Behaviour-based rules need first-party analytics events, such as pages viewed and features used. Profile-based personalisation needs only the account fields that change what you show, such as role, plan or industry, not a full customer record.