The product
One template. Thousands of personalized experiences.
The platform lets a company upload a contact dataset, map its fields to reusable variables, provide a template, and generate an individualized web experience for every contact.
A generic personalization platform for generating large volumes of individualized web experiences from reusable templates and contact data. Users upload CSV, Excel, Google Sheets, JSON, or other supported datasets, map fields to variables such as {{contact.firstname}}, configure templates, preview the result, and generate unique personalized pages at scale. I built it as a microservice architecture with NestJS, PostgreSQL, Redis, background queues, Cloudflare storage, and a dedicated video-processing service so large generation workloads run asynchronously.
A generic personalization platform capable of turning large contact datasets and reusable templates into thousands of individualized web experiences, with asynchronous processing, personalized video, forms, analytics, and exports.
The product
The platform lets a company upload a contact dataset, map its fields to reusable variables, provide a template, and generate an individualized web experience for every contact.
The idea
Instead of creating separate pages for every recipient, the platform takes one reusable template and combines it with contact data to automatically produce unique experiences.
Data
Users can import large datasets from supported sources, map their fields to the platform's variables, validate the data, and preview how a real contact will appear before generation begins.
Templates
Users can provide an HTML template and use variables such as {{contact.firstname}} or {{contact.company}} wherever personalization is needed.
Contact dataset
Variable mapping
Template
Job queue
Workers
Personalized pages
Responses & analytics
Scale
Large generation workloads are broken into background jobs using Redis and queues. Workers process contacts independently, track progress, retry failures, and allow the application to remain responsive while generation continues.
Personalized video
Dedicated video blocks allow predefined video content to use contact information such as names, company information, and existing contact images. Video processing is separated into its own microservice so it doesn't block the main generation pipeline.
Generated pages
Each generated page receives its own unique URL based on the campaign's configured identity, allowing individualized experiences to be shared and tracked separately.
Forms
Generated pages can contain configurable forms. Submissions are stored with their campaign and contact context so the responses can be reviewed later in the dashboard.
Analytics
Campaign owners can monitor generated pages, activity, interactions, submissions, processing status, and other campaign-level information from the dashboard.
Architecture
The platform uses a microservice architecture with NestJS, PostgreSQL, Redis, background workers, Cloudflare storage, and a dedicated video service to separate user-facing operations from expensive processing workloads.
React
NestJS APIs
PostgreSQL
Redis
Generation workers
Video service
Cloudflare storage
Campaign lifecycle
The platform connects the entire campaign lifecycle — from importing contacts and configuring a template to generating pages, collecting responses, analyzing activity, and exporting the final dataset.
Import contacts
Configure template
Generate
Publish pages
Visitor interaction
Collect responses
Export CSV
The result
The result is a generic platform that can turn large contact datasets into individualized web experiences without requiring a developer to manually build every page.
Multi-format data import
Campaigns start from CSV, Excel, Google Sheets, JSON, or other supported tabular sources, with column mapping, validation, and duplicate handling.
Variable mapping
Contact fields become reusable variables such as {{contact.firstname}}, {{contact.company}}, and {{contact.image}}, with fallbacks and missing-field handling.
HTML template system
Users provide the page structure, insert variables throughout text, images, links, buttons, forms, and metadata, then preview with real contact data.
Bulk page generation
One template plus a contact dataset produces individualized pages, each with a unique URL based on campaign identity, username, identifier, or slug.
Async job queues
Redis-backed queues break generation into contact-level jobs so workers can process, retry, resume, and track progress without blocking the app.
Personalized video
Dedicated video blocks can insert contact names, images, and company data. Video generation runs in its own microservice so it does not stall HTML generation.
Dynamic forms
Generated pages can collect submissions with custom fields. Responses stay associated with the campaign and contact, then show up in the dashboard.
Campaign analytics
Owners can monitor generated pages, views, link interactions, form submissions, processing progress, and failed generations.
CSV export
Collected campaign data can be exported with original contact information, generated URLs, form responses, activity, and processing status.
~100K
contacts
~1 hour
generation
More work
2024
Pet healthcare website · booking and local SEO
2024
Performance-focused business website · 3s to 450ms
2023
Corporate website · frontend & performance engineering
2024
Personal brand website · content, search and performance