Skip to main content

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

For the full vocabulary

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."
}
]
}
}
]
}
Placeholder syntax

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)

VariableExample
{{ 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)

VariableExample
{{ 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)

VariableExample
{{ 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 your salespersons config
  • google_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?