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.
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.
01
Import contacts
CSV, Excel, Google Sheets, or JSON, with validation and duplicate checks.
02
Map the columns
Fields become variables like {{contact.firstname}}, with fallbacks.
03
Preview with real data
See exactly what a real contact's page will look like.
04
Generate in the background
Each contact is its own job, processed in parallel.
05
Share unique URLs
Every contact gets a page, tracked separately.
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
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.
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.
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.”
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.