Skip to main content

Build a Conversion Optimized Landing Page for Your PPC Campaigns in Under 5 Minutes [▶️ TUTORIAL]

1. Create a free account on Anything.com

Create a free account on Anything.com. Once you're logged into the dashboard, click '+Create New Project' and you'll see the chat box appear that looks similar to ChatGPT

2. Upload the starter template via the chat window

Click here to download the starter template (preview starter template) and upload it to your Anything project via the chat window and paste the prompt below:

Click to view prompt

Attached is the html that I want to start with. Please import it to this project so that I can start iterating on it

3. Prompt Anything to customize it for your brand

Enter the prompt below to have Anything customize the landing page from the generic Booking Engine demo example to your brand

Click to view prompt

This landing page is a template for an example conversion optimized landing page for a fictional booking engine.

I want you to customize it for my brand to promote my {CATEGORY_NAME} product which is featured on hotel tech report in the {CATEGORY_NAME} category.

INSTRUCTIONS:

Keep the exact layout, components and sections of the page. All that you are going to change is the content and styling (colors,fonts, images, etc)

Here is the page on my website that has more info about this product: {WEBSITE_URL}

Can you please:

1. Go to my website to learn about my product and replace the content about the fictional booking engine example to instead promote my product

2. Fetch my logo, fonts and color palette from my website to make the styles match my website and brand

4. Make any manual adjustments (OPTIONAL)

If there are minor changes you'd like to make like swapping in a better logo asset for the nav bar or your clients logos for the social proof logo section or any copy changes you want to make, simply chat with Anything and request the changes to make them in real time.

5. Connect your domain (OPTIONAL)

If you want to hosted the landing page on your own domain you can do so by clicking Publish > Custom Domain (Video tutorial)

6. Store form completions as leads with referral source URL

Paste the prompt below into the Anything project chat and it will setup a database to store form conversions with UTM referral source URL.

Click to view prompt

You are a full-stack engineer adding form functionality to the landing page. Build the backend logic and frontend hooks needed to (1) store every completed submission, (2) capture partial submissions even if the user abandons before clicking submit, and (3) show a polished inline success state on completion.

Do not change the page's design, layout, or copy — only add the data and interaction layer.

1. Storage — every submission saved

Create a database table (or equivalent persistent storage in this environment) for form submissions with these columns:

  • id (primary key, auto)

  • created_at (timestamp, auto)

  • updated_at (timestamp, auto)

  • status (enum: partial | completed)

  • name (string, nullable)

  • email (string, nullable)

  • company (string, nullable)

  • utm_source (string, default "HotelTechReport")

  • utm_campaign (string, nullable)

  • utm_medium (string, default "ppc")

  • referrer (string, nullable — from document.referrer)

  • session_id (string — generated client-side on page load, used to dedupe partials)

Create an API endpoint (e.g. POST /api/leads) that accepts the form payload, writes to this table, and returns the new record ID.

2. Partial capture — recover abandoned leads

The biggest leak in PPC landing pages is users who start the form, give up, and bounce. Capture what they entered before they leave:

  • On page load, generate a unique session_id (UUID v4) and store it in sessionStorage. This is the dedupe key for partials.

  • On each form field's blur event (when the user tabs or clicks away), if any field has a value, fire a debounced (300ms) save to the API endpoint with status: 'partial'.

  • On every subsequent partial save in the same session, UPDATE the existing record matched by session_id — don't INSERT a new one. End result: one record per session, progressively filled in as the user types.

  • When the user finally submits, mark the same record as status: 'completed'.

  • If the user abandons without submitting, the record stays at status: 'partial' with whatever fields they filled in — that's the recoverable lead.

  • Email priority: as soon as a valid-format email is entered (basic regex check), fire that partial save immediately on blur — even if no other fields are filled. Email alone is enough to follow up later.

  • Critical UX: do NOT show a "saving" indicator, do NOT alert the user, do NOT block the form. All partial capture happens silently in the background.

3. Success state — polished completion

When the form submits successfully:

  • Replace the form card's contents in place (same card, no layout shift) with:

    • A brand-color circle containing a white checkmark icon (~48px circle).

    • A confident headline ("You're all set" or "Got it — talk soon").

    • A short reassuring line ("Someone from {{COMPANY_NAME}}'s team will be in touch within 1 business day.").

  • Do NOT redirect to a separate thank-you page — keep the user on the same URL so conversion pixels and analytics fire correctly on the page they were already on.

  • On submission failure (network error, validation, etc.), show an inline error below the submit button with a clear next step ("Something went wrong. Please try again or email us directly.") — and do NOT lose the data the user typed.

Output

Apply all of the above without altering the visual design from V3. At the bottom of your response, briefly note:

  1. Where the submission data is stored and how to access it in this environment.

  2. How to query for partial submissions specifically (the recoverable lead pool).

  3. Any environment-specific assumptions you made.

7. Send new leads to your CRM

From the previous step, leads are stored in a database. Now, in this step, the prompt below, when you paste it into Anything's website builder chat, will create logic to:

  • Send new leads to your CRM

  • Send you a notification email when new leads convert on your landing page

  • you a weekly digest email of the leads that converted during the last week

Click to view prompt

I want to wire up my landing page so that every form submission flows directly into my CRM. Here's what to set up.

Fill in these details

  • My CRM: [INSERT YOUR CRM] (e.g. HubSpot, Salesforce, Pipedrive, Zoho, ActiveCampaign, Close)

  • CRM API documentation URL: [INSERT YOUR API DOCS URL] (the link to the "create contact" or "create lead" docs page — e.g. https://developers.hubspot.com/docs/api/crm/contacts, https://developers.pipedrive.com/docs/api/v1/Leads)

  • Which Hotel Tech Report PPC auction is this landing page running on: [INSERT AUCTION NAME] (e.g. "Property Management Systems", "Channel Manager", "Hotel Marketing Agencies", "Revenue Management" — required so every lead is tagged with the specific auction it came from in your CRM)

  • Optional: list / pipeline / tag where leads should land in the CRM: [INSERT TAG OR LEAVE BLANK] (e.g. "PPC - Hotel Tech Report" — leave blank for the default contacts list)


Send every lead to my CRM

After every completed form submission, POST the same payload to the CRM's API to create a new contact or lead.

  1. Read the CRM API docs URL above to identify the create-contact endpoint, the auth method, the required fields, and the exact field names the CRM expects.

  2. If the CRM requires an API key, tell me to add it to Project Settings → Saved Secrets under a name you specify (e.g. CRM_API_KEY). Reference it by that name from the backend function. Do NOT ask me to paste the key into chat. If the CRM has a no-auth form-post endpoint (e.g. HubSpot Forms API, Salesforce Web-to-Lead), prefer that — no API key needed.

  3. In the existing /api/leads handler, after the database write succeeds and status is set to completed, build the CRM payload from the form data. Map our fields to what the CRM expects (e.g. split name into firstname / lastname if needed). Hardcoded source attribution (always include — these are baked into the page, not pulled from URL parameters):

    • Lead Source = "Hotel Tech Report" (use the CRM's standard lead-source field — e.g. HubSpot's hs_analytics_source or Lead Source, Salesforce's LeadSource, Pipedrive's Source Channel. If the CRM has a generic source field, use that; if not, create a custom field called Lead Source.)

    • Lead Source Detail = "PPC — [HTR auction name from above]" (e.g. "PPC — Property Management Systems". Use the CRM's source-detail / sub-source / drill-down field if it has one; otherwise create a custom field.)

    • Lead Medium = "PPC"

    • Lead Campaign = "Hotel Tech Report — [HTR auction name from above]" (e.g. "Hotel Tech Report — Property Management Systems")

    These hardcoded values guarantee every lead from this page is unambiguously tagged as a Hotel Tech Report PPC lead from the specific auction, even if UTM parameters are missing or stripped from the URL. UTM data (include as supplemental, not as a substitute):

    • utm_source, utm_campaign, utm_medium, utm_term, utm_content if present in the URL — store these in separate CRM fields (custom if needed) so we have both the hardcoded truth AND the campaign-level detail when available.

    If a list / tag / pipeline was specified in the fields above, also include it in the payload.

  4. Make the API call server-side, never from the browser. Wrap it in try/catch — if the CRM call fails, log it but DO NOT fail the form submission for the user. The lead is already saved in the database, so CRM dispatch is fire-and-forget.

  5. Add crm_synced_at (timestamp) and crm_sync_error (text) columns to the leads table. Set them after each CRM POST attempt. Leads where crm_synced_at is null are the retry pool.


After you ship this, tell me:

  1. The exact CRM endpoint and auth method you used.

  2. The Saved Secret name(s) I need to add and where in the CRM's settings I can find each value.

  3. How to send a test submission and verify it actually lands in my CRM.

  4. How to query for leads that didn't sync (where crm_synced_at is null) so I can retry them manually.

8. Prompts to add additional functionality (optional)

Prompt 1: Get notified about new leads in Slack

I want a Slack notification in my chosen channel every time a new lead converts on my landing page. Here's what to set up.

Fill in these details

  • Slack Incoming Webhook URL: [INSERT YOUR SLACK WEBHOOK URL] (How to get one: go to https://api.slack.com/apps → "Create New App" → "From scratch" → name it something like "HTR Lead Alerts" → in the left sidebar click "Incoming Webhooks" → toggle Activate Incoming Webhooks ON → click "Add New Webhook to Workspace" → pick the channel that should receive the alerts → copy the URL. The URL itself acts as a credential, so add it to Project Settings → Saved Secrets — DO NOT paste it directly into chat.)

  • Which Hotel Tech Report PPC auction is this landing page running on: [INSERT AUCTION NAME] (e.g. "Property Management Systems", "Channel Manager", "Hotel Marketing Agencies", "Revenue Management" — used in the Slack message header so the team can see at a glance which auction generated the lead)


Send a Slack alert on every new lead

After every completed form submission (NOT partials), POST a formatted message to the Slack webhook URL stored in Saved Secrets.

  1. Tell me to add the Slack webhook URL to Project Settings → Saved Secrets under a name you specify (e.g. SLACK_WEBHOOK_URL). Reference it from the backend function. Do NOT ask me to paste the URL into chat.

  2. Format the message using Slack Block Kit for a clean, professional look. Structure:

    • Header block: 🎯 New PPC Lead from Hotel Tech Report ({HTR auction name})

    • Section block (fields, two-column where Block Kit allows):

      • Company: {company}

      • Name: {name}

      • Email: {email} — rendered as a clickable mailto: link inline in the message text (do NOT use interactive buttons — those require a separate webhook handler)

      • Role / Qualifier: {role_or_qualifier}

      • Source: Hotel Tech Report → PPC → {HTR auction name}

      • Submitted: relative time (e.g. "2 minutes ago") using Slack's <!date^...> formatting so it stays accurate

    • Context block at the bottom: any UTM data present in the URL (utm_campaign, utm_term, utm_content) for the marketing team — small gray text

  3. Make the POST server-side from the backend function, never from the browser. Wrap it in try/catch — if the Slack POST fails, log the error but DO NOT fail the form submission for the user. The lead is already saved in the database; Slack notification is a fire-and-forget bonus.

  4. Add a slack_notified_at timestamp column to the leads table. Set it after a successful Slack POST. Leads where this is null but status = completed are alerts that didn't fire — useful for debugging.

  5. This fires ONLY on completed submissions, not on partials.


After you ship this, tell me:

  1. The Saved Secret name I need to add for the Slack webhook URL.

  2. A test command or button I can run to fire a sample alert to the channel without filling out the form, so I can verify the formatting before going live.

  3. How to change the channel later (the answer should be: generate a new webhook URL in Slack pointed at the new channel, then replace the value in Saved Secrets).

Prompt 2: Get notified about new leads via Email

Now that my landing page is capturing leads to the database, I want to set up email notifications so I get alerted in real time on new conversions and a weekly digest of all the leads. Here's what to set up.

Fill in these details

  • Email address for lead notifications: [INSERT YOUR EMAIL] (e.g. [email protected] — this address receives both the per-lead alerts and the weekly digest)

  • Which Hotel Tech Report PPC auction is this landing page running on: [INSERT AUCTION NAME] (e.g. "Property Management Systems", "Channel Manager", "Hotel Marketing Agencies", "Revenue Management" — used in the email subject and body so I can see at a glance which auction the lead came from)


Part 1 — Email me every time a new lead converts

After every completed form submission (NOT partials), send a real-time email to the address above:

  • Subject: New PPC lead from Hotel Tech Report ({HTR auction name from above}): {Company name} (e.g. "New PPC lead from Hotel Tech Report (Property Management Systems): Acme Hotel Group")

  • Body should include:

    • Name

    • Email (formatted as a mailto: link so I can reply with one click)

    • Company

    • Role / qualifier

    • Source: Hotel Tech Report — PPC — [HTR auction name]

    • UTM source / campaign / medium / term / content (if present in the URL)

    • Submitted-at timestamp

Use whatever email-sending service is available in this environment — Resend, SendGrid, Postmark, or Anything's built-in mailer. If it requires an API key, tell me to store it in Project Settings → Saved Secrets under a name you specify. Do NOT ask me to paste the key into chat.

This fires ONLY on completed submissions, not on partials.


Part 2 — Weekly digest email

Send a weekly summary email every Monday morning to the same address. The digest should contain:

  • Total completed lead count for the past 7 days

  • A simple table of all those leads (name, company, email, role/qualifier, submitted date)

  • Total partial-submission count for the same period (status = 'partial' records — these are recoverable leads worth following up)

  • Conversion-by-day breakdown for the past 7 days

Use whatever scheduled-function / cron capability is available. If scheduling isn't natively supported, tell me the simplest way to set up a weekly trigger.


After you ship this, tell me:

  1. The email-sending service you wired up and any setup I still need to do on my side (e.g. sender domain verification, DNS records).

  2. The Saved Secret name I need to add for the email service (if any) and where to find the API key.

  3. How to trigger a test alert to my inbox so I can verify the per-lead email actually arrives.

  4. How the weekly digest is scheduled, and how I can change the recipient or cadence later.

Did this answer your question?