©Code byMilanParmar

Personalization engine: 1,000+ campaigns and 100K+ personalized pages, served in 60ms

Marketing and sales teams wanted a personal landing page for every contact, but building them by hand doesn't scale. I built a platform in eight weeks that does it: upload a contact list, map its columns to a template, preview with real data, and generate a unique page, with personal images, video, and forms, for every contact. It has run 1,000+ campaigns and generated 100K+ pages, processes around 100,000 contacts in roughly an hour, and serves each page in about 60ms.

Category
SaaS
Industry
Marketing technology
Type
Personalization & campaign platform
Year
2026

At a glance

Client
Marketing technology company (name kept private)
The problem
Personalized landing pages work, but making thousands of them by hand is impossible, and running it as one big job crashes or stalls.
What I built
A generic personalization platform: contact import from CSV, Excel, Google Sheets, or JSON; variable mapping; HTML templates with live preview; queued bulk generation; personalized video; forms; analytics; and CSV export.
The result
1,000+ campaigns run and 100K+ personalized pages generated. Around 100,000 contacts processed in roughly an hour, and each page served in about 60ms.
Timeline
8 weeks
Budget
$35,000

The problem: personalized landing pages don't scale by hand

A landing page with someone's name, company, and a relevant message gets far more attention than a generic one. But making one per contact means copying a page thousands of times, and generating them all in one request either times out or freezes the app.

The company needed a reusable engine: any template, any contact list, any campaign, without a developer building each one.

How the personalization engine turns one template into thousands of pages

A campaign owner uploads contacts, maps each column to a template variable, and previews the result with real contact data before anything is generated. Missing fields fall back to defaults instead of leaving gaps on the page.

  1. 01

    Import contacts

    CSV, Excel, Google Sheets, or JSON, with validation and duplicate checks.

  2. 02

    Map the columns

    Fields become variables like {{contact.firstname}}, with fallbacks.

  3. 03

    Preview with real data

    See exactly what a real contact's page will look like.

  4. 04

    Generate in the background

    Each contact is its own job, processed in parallel.

  5. 05

    Share unique URLs

    Every contact gets a page, tracked separately.

  6. 06

    Collect and export

    Form responses and activity, exported as CSV.

Generating 100,000 pages in about an hour with background queues

Generation never runs inside a web request. The job is split into one small task per contact and placed in Redis-backed queues. Workers process tasks in parallel, retry failures, pick up where they left off after a restart, and report progress to the dashboard. That's how the platform handles around 100,000 contacts in roughly an hour while the app stays responsive. Once generated, each page is served in about 60ms.

Personalized video, forms, and campaign analytics

Pages can include video blocks with the contact's name, image, or company. Video is far heavier than text, so it runs in its own service and never slows down page generation.

Every page can also carry a form. Responses are saved against the campaign and the contact, shown in the dashboard, and exported as CSV alongside the generated URLs and activity.

Results

  • 1,000+

    campaigns run

  • 100K+

    personalized pages generated

  • ~100K/hour

    contacts processed

  • ~60ms

    page response time

Key decisions

  1. 01

    Background queues for bulk generation

    100,000 pages can't be built in one request. Small, retryable jobs make large campaigns reliable.

    Trade-off: Job tracking, workers, and retries to build and run.

  2. 02

    Video in its own service

    Video rendering is slow and heavy. Isolating it lets it scale separately and keeps page generation fast.

    Trade-off: One more service to deploy and monitor.

  3. 03

    Map every data source to one contact format

    Every spreadsheet names its columns differently. Mapping first means any template works with any list.

What the client said

“We upload a contact list and an hour later everyone has their own page. We run it for every campaign now without needing a developer.”
Product lead

FAQs

What is a personalized landing page?

A page generated for one specific person, using their name, company, image, or other details from your contact list. Each person gets their own URL, so you can see who visited and what they did.

How do you generate thousands of personalized pages at once?

Split the work into one small job per contact and process the jobs in the background with a queue. Workers run in parallel, retry failures, and report progress. Trying to do it all in one request is what makes most tools time out on large lists.

Can you personalize videos for each contact?

Yes. A video template can insert a contact's name, photo, or company. Because rendering video is heavy, it should run as its own service so it doesn't slow everything else down.