What You're Building
A fully automated pipeline that takes a cold prospect, enriches their data, generates a personalised landing page with their name, company, tools and competitors — then sends them a unique URL. Every contact gets their own page. You build it once.
Data Layer
Clay or Apollo pulls name, company, industry, headcount, tools and competitors from LinkedIn or a domain. Your input is just a list of URLs.
AI Layer
One prompt turns each data row into fully written personalised copy — headline, body, competitor block, and CTA button text. No manual writing.
Page Layer
Webflow or Framer CMS hosts one template. Each prospect gets their own slug URL with their data injected automatically via CMS fields.
Outreach Layer
Instantly or Lemlist sends each contact their unique URL. Tracked clicks show you who engaged and exactly when to follow up.
Enrich Your Lead Data
You need six fields per contact before anything else — name, company, industry, headcount, tech stack, and top competitors. Here's exactly how to get them without doing any manual research.
Build your prospect list
Use Apollo.io to search by job title, company size, industry and location. Filter to decision-makers only. Export as CSV with LinkedIn URLs included. Start with 50–200 contacts per batch — enough to test and iterate without burning your domain.
Apollo.ioLinkedIn Sales NavRun enrichment in Clay
Import your CSV into Clay. Add a "Company Enrichment" waterfall column — Clay pulls simultaneously from Clearbit, BuiltWith, Similarweb and LinkedIn. One click gets you industry, headcount, tech stack and competitors for every row.
Company Name → Auto from LinkedIn URL Industry → Clearbit enrichment Headcount → Clearbit enrichment Tech Stack → BuiltWith enrichment Top 3 Competitors → Similarweb enrichment First Name → LinkedIn profile scrape
Validate before processing
Add a formula column in Clay that flags rows with missing critical fields. Only rows that pass the check get sent to the AI prompt. Rows that fail go to a "Needs Review" table for manual input.
# Returns TRUE if row is safe to process
AND(
NOT(ISBLANK(first_name)),
NOT(ISBLANK(company_name)),
LEN(first_name) > 1,
LEN(company_name) > 1
)
Build the Page Template
You build one page. That page has variable slots. Every prospect gets their own URL pointing to the same template — but the variables swap out for their specific data. Zero duplication of design work.
Set up a Webflow CMS Collection
Create a new CMS Collection called "Prospects". Add these fields — the AI will generate content for the text fields automatically:
first_name Plain Text — from enrichment company_name Plain Text — from enrichment industry Plain Text — from enrichment tools Plain Text — comma list from enrichment competitor_1 Plain Text — from enrichment competitor_2 Plain Text — from enrichment headline Plain Text — AI-generated subheading Rich Text — AI-generated body_copy Rich Text — AI-generated cta_text Plain Text — e.g. "Book Marcus's audit" slug Plain Text — e.g. "marcus-meridian"
Design the template and bind fields
Create one CMS Collection page. Build your layout in the Webflow designer, then bind each text element to the relevant CMS field. Critical binding points:
Hero headline
Bind to headline — AI-generated, mentions company name
CTA button
Bind button label to cta_text — "Book Marcus's free audit"
Competitor block
Bind 3 text elements to competitor_1, competitor_2, competitor_3
Tools section
Bind to tools — shows their exact stack (HubSpot, Xero, etc.)
Each prospect gets a unique slug URL
Webflow generates a URL per CMS item based on the slug field. Set slug to firstname-companyname — lowercase, hyphenated. Each person's page looks like:
yoursite.com/p/marcus-meridian yoursite.com/p/sarah-fasttrack yoursite.com/p/james-nexus-distribution
This is the URL you put in your cold email. Each person gets their own link, their own page, their own experience.
Personalise in Bulk
Once you have 100 enriched rows, you generate 100 personalised pages without touching a single one individually. This is where the automation compounds.
Run the AI prompt as a Clay column
In Clay, add an "AI Prompt" column. Paste the mega prompt from the section below. Clay calls the AI API (OpenAI or Claude) for each row and populates the output — headline, body copy, CTA text — into separate output columns. Runs for all rows simultaneously.
Push all rows to Webflow via Make
Build a Make scenario that reads your Clay export and creates one Webflow CMS item per row. Make maps each Clay column to its Webflow field. 100 rows = 100 pages created in under 3 minutes.
Trigger: Google Sheets / Clay export (or HTTP webhook)
Step 1: Iterator — loop each prospect row
Step 2: Webflow → Create CMS Item
Map: first_name → first_name
Map: company_name → company_name
Map: headline → headline
Map: cta_text → cta_text
Map: slug → slug (auto-lowercase)
Step 3: Append full page URL to output sheet
Format: https://yoursite.com/p/{{slug}}
Generate the personalised URL list
After Make runs, your output sheet has a URL column — one unique page per prospect. This column feeds directly into your cold email tool as a merge variable.
=LOWER(SUBSTITUTE(A2," ","-")&"-"&SUBSTITUTE(B2," ","-")) // A2 = first_name, B2 = company_name // Output: "marcus-meridian", "sarah-fasttrack" // Full URL formula: ="https://yoursite.com/p/"&LOWER(SUBSTITUTE(A2," ","-"))&"-"&LOWER(SUBSTITUTE(B2," ","-"))
Plug Into Your CRM
Every CRM handles personalised URL fields differently. Find yours below.
CRM Integration Reference
| CRM | Where to store the URL | Email merge tag | How to trigger |
|---|---|---|---|
| HubSpotMost popular | Custom contact property: personalised_url |
{{contact.personalised_url}} |
Workflow: contact enrolled → send sequence with merge tag in step 1 |
| Salesforce | Custom field on Contact/Lead: Personalised_URL__c |
{{{Personalised_URL__c}}} |
Salesforce Flow → trigger email on field populated |
| Pipedrive | Custom person field: "Page URL" | [[person.personalised_url]] via Lemlist |
Pipedrive → Make → add to Lemlist campaign on deal stage change |
| GoHighLevelAgencies | Custom field on Contact: personalised_url |
{{contact.personalised_url}} |
GHL Workflow → Send Email action → custom value in body |
| Notion CRM | URL property column: "Page URL" | Export CSV → import to Instantly | Notion → Make → email tool when status changes to "Ready" |
| Airtable | URL field: "Personalised URL" | Via Zapier custom variable | Airtable Automation → Zapier → Instantly on status change |
| No CRMStarting out | Google Sheet column: "Page URL" | CSV import → {{personalised_url}} |
Upload CSV directly into Instantly or Lemlist — map URL column as custom variable |
How to Send Personalised Links at Scale
Once your URL column is ready, here's exactly how to get each unique link into the right person's email — tool by tool.
Instantly.ai — recommended for cold email
Upload your prospect CSV. In the "Variables" step, map the "Page URL" column as a custom variable named personalised_url. In your email template, insert the link like this:
Hi {{first_name}},
I noticed {{company_name}} is running outbound — thought you'd
want to see what this looks like built specifically for you:
→ {{personalised_url}}
Takes 2 minutes to look at. Built for {{company_name}} specifically.
James
Instantly replaces every variable per contact automatically on send. Each recipient gets their unique URL, no manual work needed.
Lemlist — best for multi-channel sequences
Lemlist has native dynamic landing page support via Lempage, OR you can use your Webflow URLs as custom variables. Upload CSV → map custom attribute → reference in email body. Lemlist also lets you embed a screenshot of the personalised page directly in the email as a visual hook.
HubSpot Sequences
Import contacts with the personalised_url property populated. Enroll in a sequence. Use {{contact.personalised_url}} as a personalisation token in the email template. HubSpot replaces it per contact on send. Works natively — no third-party tool needed.
Manual send (Gmail + Hunter or Mailmeteor)
If you're doing low-volume outreach from Gmail, use Mailmeteor. Upload a Google Sheet with your contacts and a "Page URL" column. Mailmeteor sends personalised Gmail drafts — one per row — with the URL inserted automatically. Free plan handles up to 50 emails/day.
Track Visits & Follow Up
Monitor page visits per prospect
Add Plausible Analytics or Google Analytics to your Webflow template page. Every page visit logs the slug — so you can see exactly who visited "marcus-meridian" and when. Cross-reference with your CRM contact record to log the engagement.
Set up a visit-triggered follow-up
Connect Webflow analytics events to your CRM via Make. When someone visits their personalised page, update their contact status and trigger a follow-up email 30 minutes later while they're still warm.
Trigger: Plausible webhook → new page visit event Step 1: Extract slug from page path Step 2: Match slug to contact in CRM Step 3: Update contact status to "Page Viewed" Step 4: Make delay module → wait 30 minutes Step 5: Send follow-up email via HubSpot / Instantly
Fallback Rules — When Data Is Incomplete
Enrichment data is never 100% complete. These rules ensure you never send a page that looks broken, awkward, or like a template gone wrong.
| Missing Field | Fallback Value | What to do | Risk |
|---|---|---|---|
first_name |
"there" → "Hi there" |
Use generic greeting. Do NOT leave the variable blank — "Hi [first_name]" instantly kills credibility. "Hi there" is neutral and acceptable. Try to recover from email domain: firstname@company.com often gives you the name. | Critical |
company_name |
"your business" |
Replace all company name instances with "your business". Re-run AI prompt with this substitution. The page still functions — just loses its sharpest hook. Try recovering from email domain first (strip TLD and format: orcascale.co → "OrcaScale"). | Critical |
industry |
"your industry" |
Generic but acceptable. Before using the fallback, prompt the AI to infer industry from the company name and domain. Often works well (e.g. "MedSupply Ltd" → healthcare). Use the fallback only if inference fails. | Medium |
tools |
Omit tools section entirely | Do NOT fabricate tool names. Remove the tools paragraph from AI output. Flag the row with a "no_tools" boolean column in Clay. The page still converts without it — just loses one personalisation layer. Consider mentioning their industry's typical stack instead. | Medium |
competitor_1 (none found) |
Industry benchmark stat | Replace the competitor block with a relevant stat: "Companies in [industry] using automation save an average of 8 hours/week on operations." Still creates urgency without naming anyone. Source your stats — fabricated numbers destroy trust if spotted. | Medium |
competitor_2 (only one found) |
Show one competitor row only | Single-row competitor blocks work fine. Do not fabricate a second competitor name. Adjust your AI prompt to output "one or two" competitors depending on what's available. | Low |
headcount |
Omit size references | Remove any copy referencing team size. Not essential — only include when data is confirmed. Guessing headcount and getting it badly wrong is worse than omitting it. | Low |
Clay fallback formula pattern
# For first_name column — output safe value IF(ISBLANK(raw_first_name), "there", raw_first_name) # For company_name column IF(ISBLANK(raw_company_name), "your business", raw_company_name) # For tools — output empty string so AI prompt skips it IF(ISBLANK(raw_tools), "", raw_tools) # Quality score column — count populated fields (NOT(ISBLANK(first_name))*1) + (NOT(ISBLANK(company_name))*1) + (NOT(ISBLANK(industry))*1) + (NOT(ISBLANK(tools))*1) + (NOT(ISBLANK(competitor_1))*1) # Score 3+ = process normally | Score 1-2 = manual review | Score 0 = skip
The Mega Prompt
This is the complete prompt. Replace every {{variable}} with real enriched data and paste it into Claude or ChatGPT. It generates the full page — headline, body, competitor block, tools section, and CTA button text — ready to publish. You can also run this directly as a Clay AI column with variables mapped from your spreadsheet.
1. Manual: replace variables yourself and paste into Claude or ChatGPT — takes 30 seconds per prospect.
2. Automated: paste into a Clay "AI Prompt" column. Clay fills in the variables from your columns automatically and runs it for all 100+ rows at once.
You are an expert B2B conversion copywriter who specialises in hyper-personalised landing pages for outbound sales.
I will give you data about a specific prospect. Your job is to write a complete, personalised landing page for them. Everything must feel like it was written specifically for this person and their business — not generated from a template.
---
PROSPECT DATA:
First name: {{first_name}}
Company name: {{company_name}}
Industry: {{industry}}
Company size: {{headcount}} employees
Tools they use: {{tools}}
Competitors: {{competitor_1}}, {{competitor_2}}, {{competitor_3}}
Their pain: {{pain_point}}
MY OFFER:
What I do: {{your_offer}}
Key result: {{key_result}}
Proof stat: {{proof_stat}}
---
OUTPUT FORMAT — produce each section with the label in square brackets. Do not add any other sections.
[HEADLINE]
One punchy sentence. Mention their company name. Focus on the result, not the service. Maximum 12 words.
Example: "{{company_name}}, your competitors are already automating this."
[SUBHEADING]
Two sentences maximum. Reference their industry. Acknowledge a specific manual pain relevant to their size and sector. Maximum 30 words total.
[TOOLS PARAGRAPH]
One paragraph (2-3 sentences). Mention their specific tools ({{tools}}) by name. Show you understand their current stack and explain how your offer works with or alongside it.
If {{tools}} is empty: write a credible generic paragraph about their industry's typical operational challenges without naming specific tools.
[COMPETITOR BLOCK]
Show the competitors provided: {{competitor_1}}, {{competitor_2}}, {{competitor_3}}.
Format each one as:
• [Competitor name] — [what type of process they automated] — [plausible result e.g. "-9h/week", "£1,800/mo saved", "NPS +22pts"]
Results must be plausible and specific. Do NOT fabricate company names — only use the competitors provided.
If fewer than 3 competitors are provided, only show the ones given. If none provided, replace this section with one relevant industry benchmark statistic instead.
[BODY PARAGRAPH]
2-3 sentences. Explain what happens when they take action. Keep it low-friction: fast to set up, they see results before committing, no risk. Do not use the words "leverage", "synergy", "robust" or "empower". No em dashes.
[PROOF STAT]
One sentence using: {{proof_stat}}. Frame it as a result already achieved, not a promise.
[CTA BUTTON TEXT]
Exact format only: Book {{first_name}}'s free audit →
No other text. Just this line.
[PAGE TITLE TAG]
For browser tab: Built for {{company_name}} — [your brand name here]
---
TONE AND STYLE RULES:
- Read like a human wrote it specifically for this person — not like AI output
- Direct and confident. No corporate jargon. No fluff.
- Short sentences. One idea per sentence.
- Use {{first_name}} and {{company_name}} naturally — not forced or repetitive
- Plain text output only — no markdown, no asterisks, no headers beyond the section labels
FALLBACK RULES — apply automatically if data is missing:
- {{first_name}} missing → use "you" naturally in its place
- {{company_name}} missing → use "your business" throughout
- {{tools}} missing → skip the Tools Paragraph entirely
- {{competitor_1}} missing → replace Competitor Block with one industry benchmark stat
- {{pain_point}} missing → infer the most likely pain from industry and company size
- {{headcount}} missing → omit any reference to team size
---
Now write the complete personalised landing page for {{first_name}} at {{company_name}}.
Want us to set this up for you?
OrcaScale builds the entire system — enrichment, AI copy, page template, CRM integration and outreach automation — fully configured for your business. You see it working before anything is agreed.
Or email contact@orcascale.co — we reply within 24 hours.