Tutorial: Personalized Landing Page
Build a landing page where each lead sees their own business name, city, and rating — automatically from a Google Place ID in the URL.
URL format: https://yoursite.com/lp/wifi-proposal/ajay/0x47e66fdad6f1cc73:0x341211b3fccd79e1
This tutorial uses the raw nested lead.* shape (the original Phase 7 surface). For new pages, we recommend the flat email-marketing-style merge tags ({{ firstname }}, {{ company_name }}, {{ city }}, ~40 in total) that any LLM already knows from Mailchimp/HubSpot training — see Merge Tags. Both surfaces are always available in dynamic-landing templates; merge tags are additive.
Prerequisites
- SpiderIQ credentials with IDAP data (businesses from campaigns)
- MCP server connected (see Quick Install)
- Site settings and navigation configured (see Build a Homepage)
How It Works
1. Lead clicks URL with their Google Place ID
2. Cloudflare Worker matches /lp/ route
3. Worker fetches page template from CMS
4. Worker fetches lead data from IDAP (by Place ID)
5. Worker matches salesperson from URL slug
6. Liquid template renders with {{ lead.name }}, {{ salesperson.name }}, etc.
7. Personalized HTML returned in ~200ms
Step 1: Check Your Lead Data
First, verify you have lead data in IDAP:
# List businesses
GET /api/v1/idap/businesses?limit=5&include=emails&format=yaml
# Or resolve a specific business by Place ID
GET /api/v1/idap/businesses/resolve?place_id=0x47e66fdad6f1cc73:0x341211b3fccd79e1&include=emails,phones
You should see fields like name, city, country_code, rating, domain, phone_e164.
Step 2: Create the Landing Page
POST /api/v1/dashboard/content/pages
{
"title": "WiFi Proposal",
"slug": "wifi-proposal",
"template": "dynamic_landing",
"custom_fields": {
"headline": "Stop Losing Guests Over Wi-Fi at {business}",
"subheadline": "We help properties in {city} transform frustrated guests into 5-star reviewers.",
"intro_text": "Reached out to",
"intro_suffix": " — let's transform your Wi-Fi together!",
"cta_headline": "Ready to Transform {business}?",
"cta_text": "Let's discuss a custom Wi-Fi solution for your property.",
"cta_button": "Book a Discovery Call"
},
"blocks": [
{
"id": "features-1",
"type": "features_grid",
"data": {
"headline": "Why DanMagi for {business}?",
"features": [
{ "title": "Guest Room Coverage", "description": "Perfect coverage for all rooms.", "icon": "wifi" },
{ "title": "47% Fewer Support Tickets", "description": "Built-in troubleshooting.", "icon": "chart-down" },
{ "title": "Enterprise Security", "description": "GDPR, PCI-DSS compliant.", "icon": "shield" }
]
}
},
{
"id": "faq-1",
"type": "faq",
"data": {
"items": [
{
"question": "How long does deployment take at {business}?",
"answer": "Typically 3-4 weeks from contract to go-live."
},
{
"question": "Can you integrate with our existing systems?",
"answer": "Yes, we integrate with PMS systems and work with your existing internet service."
}
]
}
}
]
}
Use {business} and {city} in custom_fields values. The Liquid template uses the replace filter:
{{ page.custom_fields.headline | replace: '{business}', lead.name | replace: '{city}', lead.city }}
Step 3: Publish the Page
POST /api/v1/dashboard/content/pages/{page_id}/publish
Step 4: Configure Salesperson Profiles
PATCH /api/v1/dashboard/templates/config
{
"salespersons": {
"ajay": {
"name": "Ajay Verma",
"title": "VP Sales",
"location": "Dubai, UAE",
"bio": "25 years in Dubai's hospitality scene. Deep regional connections across UAE, GCC and beyond.",
"photo_url": "https://media.cdn.spideriq.ai/team/ajay.webp",
"calendar_url": "https://calendly.com/ajay-danmagi"
},
"peter": {
"name": "Peter Efland",
"title": "VP Sales",
"location": "Rio de Janeiro, Brazil",
"bio": "Rio-based specialist with extensive hospitality tech experience across Brazil and beyond.",
"photo_url": "https://media.cdn.spideriq.ai/team/peter.webp",
"calendar_url": "https://calendly.com/peter-danmagi"
}
}
}
The URL slug (ajay, peter) must match the key in this config exactly.
Step 5: Deploy
# Apply theme
POST /api/v1/dashboard/templates/apply-theme
{ "theme": "default" }
# Deploy
POST /api/v1/dashboard/content/deploy
Step 6: Test with Real URLs
# Ajay's version
curl -sL "https://yoursite.com/lp/wifi-proposal/ajay/0x47e66fdad6f1cc73:0x341211b3fccd79e1" | grep "Ajay Verma"
# Peter's version (same lead, different salesperson)
curl -sL "https://yoursite.com/lp/wifi-proposal/peter/0x47e66fdad6f1cc73:0x341211b3fccd79e1" | grep "Peter Efland"
# Without salesperson (lead-only personalization)
curl -sL "https://yoursite.com/lp/wifi-proposal/0x47e66fdad6f1cc73:0x341211b3fccd79e1" | grep "La Maison"
Both URLs show the same business data but different salesperson profiles.
Available Template Variables
Lead Data (from IDAP)
| Variable | Example |
|---|---|
{{ lead.name }} | La Maison Champs Elysees |
{{ lead.city }} | Paris |
{{ lead.country_code }} | FR |
{{ lead.rating }} | 4.6 |
{{ lead.reviews_count }} | 234 |
{{ lead.phone_e164 }} | +33155501234 |
{{ lead.domain }} | lamaisonchampselysees.com |
{{ lead.website }} | https://lamaisonchampselysees.com |
{{ lead.address }} | 8 Rue Jean Goujon, 75008 Paris |
{{ lead.categories }} | Hotel |
{{ lead.related.emails }} | Array of verified emails |
{{ lead.related.phones }} | Array of phone numbers |
{{ lead.related.contacts }} | Array of team members |
Salesperson Data (from config)
| Variable | Example |
|---|---|
{{ salesperson.name }} | Ajay Verma |
{{ salesperson.title }} | VP Sales |
{{ salesperson.location }} | Dubai, UAE |
{{ salesperson.bio }} | 25 years in hospitality... |
{{ salesperson.photo_url }} | https://media.cdn.spideriq.ai/team/ajay.webp |
{{ salesperson.calendar_url }} | https://calendly.com/ajay |
Page Data (from CMS)
| Variable | Example |
|---|---|
{{ page.title }} | WiFi Proposal |
{{ page.custom_fields.headline }} | Stop Losing Guests... |
{{ page.blocks }} | Array of page blocks |
Using in Email Campaigns
Generate unique URLs per lead in your outreach:
https://yoursite.com/lp/{page_slug}/{salesperson}/{google_place_id}
Where:
page_slug— the slug you chose when creating the page (wifi-proposal)salesperson— matches a key in yoursalespersonsconfiggoogle_place_id— the lead's Google Maps Place ID (from SpiderMaps data)
Example email merge field:
Hi {{first_name}},
I noticed {{business_name}} has a {{rating}}-star rating on Google Maps.
I put together a quick proposal for you:
{{personalized_url}}
What's Next?
- Build a Homepage — add a marketing homepage
- Build a Blog — add posts, authors, and tags
- AGENTS.md — full API reference and MCP tools