PostHog for search traffic: from a landing page to the signup

You want proof that search clicks turn into signups. PostHog can show the landing path that brought a person and whether they later signed up. This guide shows the setup, the funnel and the two monthly checks that keep you honest.

By , founder of Porteur · Updated 14 September 2026 · Markdown

Set up clean channel attribution and UTMs

Start with clean sources. You need referrers for search and UTMs for your own campaigns. Keep them separate and consistent.

  1. Use PostHog’s Web analytics dashboard

    Confirm that Organic Search appears as a channel type and that $referring_domain is populated for google.com, bing.com and others.

  2. Standardise your UTMs

    Use Google’s Campaign URL Builder format: utm_source, utm_medium, utm_campaign, utm_term, utm_content. Use lowercase and a fixed naming scheme.

  3. Tag only external links

    Add UTMs to links you place off-site, such as a newsletter or partner page. Never add UTMs to internal links on your own site.

  4. Avoid indexed UTM URLs

    UTM URLs you share can get linked and indexed. Set a canonical tag on those URLs to the clean version, for example canonical https://yourproduct.com/pricing.

Keep the first landing page on the person

PostHog stores initial referrer and UTMs on the person. Add the first landing page as a person property too. You need it to answer first-touch questions reliably.

  1. Choose the property name

    Use first_landing_page_path for the path only, for example /guides/getting-started. Or first_landing_page_url for the full URL.

  2. Set it once on first visit

    On the first $pageview for a new visitor, set the person property if it does not exist. Use a set once method so later visits do not overwrite it.

  3. Capture the value from $pathname

    Read the path from your router or window.location.pathname and write that value. Keep it short and stable. Avoid query strings.

  4. Test on staging

    Create a fresh test browser profile. Arrive from a google.com search result. Check the person profile stores the initial referrer and your first_landing_page_path once.

// Pseudocode: set once on first pageview
posthog.onFeatureFlags(function() {
  // Run after PostHog is ready in your app
  const path = window.location.pathname
  // Implement a guard so you only set this when the property is empty
  posthog.setPersonPropertiesOnce({ first_landing_page_path: path })
});

A correct profile shows initial referrer as google.com, initial UTM fields empty, and first_landing_page_path as /guides/getting-started after a first visit from search to that page.

Build the funnel: landing path to signup broken down by search referrer

You want a funnel that starts on a landing path and ends on signup. Then break it down by initial referring domain to isolate Organic Search performance by source.

  1. Define the end event

    Pick your signup event. Use the existing product event you track for signup or account creation. Mark it clearly.

  2. Set the start step

    Use $pageview where $pathname starts with your landing area, for example /guides or /pricing. Or pick a single page like /guides/getting-started.

  3. Choose the conversion window

    Keep it long enough to cover typical research and return visits. A few weeks is common on SaaS. Use the same window each month.

  4. Break down by initial referring domain

    Use the initial referring domain person property as the breakdown. This groups people by first touch, for example google.com or bing.com.

  5. Add a secondary breakdown by first_landing_page_path

    When you want the page-level view, add your first landing page person property as a second breakdown. This shows which paths create people who later sign up.

A useful cut filters the funnel to initial referring domain contains google.com and shows the top first_landing_page_path values by conversion rate to signup.

For one page focus, build a micro funnel: $pageview where $pathname equals /pricing to signup. Break it down by initial referring domain. You will see whether /pricing works for Organic Search visitors from google.com compared to direct or email.

Answer the two monthly questions

Each month, answer two questions. Keep a short note in the repo with links to the saved reports. Consistency matters more than perfect precision.

  • Which landing pages from Organic Search brought people who later signed up, and what changed since last month
  • Which pages get Google clicks but start no signups, and what to fix next
  1. Pages that bring future signups

    Open your landing-to-signup funnel. Filter to initial referring domain contains google.com. Save the table by first_landing_page_path with absolute signups and rate. Note the top risers and fallers month on month.

  2. Pages that win clicks but not people

    Open Search Console’s performance report by page. Export pages with clicks in the last 28 days. Compare that list to your PostHog funnel table. Pages with clicks but no people who later sign up go on your fix list.

  3. Pick one fix per page

    If a page wins clicks and bounces, check intent, offer and internal links. For /guides/getting-started, add a clear CTA and a path to a relevant signup. Recheck next month.

  4. Keep timing aligned

    Run both reports for the same 28 day window. Search Console has data lag and anonymisation. Do not try to reconcile clicks to sessions one by one.

What Search Console and analytics say together

Search Console gives the query, the landing page, impressions and clicks. Analytics tells you what visitors did after the click. Joined by landing page, you get action from both.

  • Use Search Console to find queries and pages with rising or falling clicks.
  • Use PostHog to see if those landings create people who later sign up.
  • Prioritise pages with clicks and poor downstream performance. Protect pages with modest clicks and excellent downstream signup rates.

If you also run GA4, you can add the Search Console link there to see Google organic search reports by landing page. GA4 will still not tell you who signed up later without joining to product events. That is why you keep this in PostHog for the person-level view.

Example: HogQL for first-touch landing page to signup

You can write a HogQL query to list signups by a person’s first landing page and initial referring domain. This mirrors the funnel and gives you a table you can export.

-- Pseudocode HogQL: adapt names to your events and properties
SELECT
  person.properties["first_landing_page_path"] AS first_landing_page,
  person.properties["initial_referring_domain"] AS initial_ref_domain,
  countIf(event = 'signup') AS signups
FROM events
WHERE timestamp >= now() - interval 28 day
GROUP BY first_landing_page, initial_ref_domain
ORDER BY signups DESC
LIMIT 50;

A useful variant filters initial_ref_domain to google.com and orders by signups per unique person who first landed on that path in the period. Keep the period fixed at 28 days for month-on-month notes.

Fix the pages that start no signups

Some pages will get clicks and create no future signups. Work on the page, not on the report. Start with what a searcher sees and how they move next.

  • Match intent: if the query is “how to integrate X with Y”, the landing must teach that and link to a guided signup.
  • Surface the offer: add a clear next step. For example, a sticky bar on /guides/getting-started with “Try it free” that leads to /signup.
  • Link forward: add internal links to relevant product pages from content pages. Do not rely on a buried footer link.
  • Speed matters: keep LCP under 2.5 seconds as of 2026. Slow pages bleed visitors before the CTA.

A fixed page shows stable traffic from google.com and a rise in people whose first_landing_page_path is that page and who reach the signup event within your window. Keep notes so you can credit the change next month.

Questions

Sources

Check my site, free

Drop your homepage URL and see which landing pages in your space get clicks today and which rivals they belong to, free in about thirty seconds, then wire it to your own data later in Porteur.

  • Free check, no card
  • Read-only, your own accounts
  • Readable by your agent

Read next