Hardik Dewra

3 min read

Dynamic text on landing pages for paid search

Swapping the headline per keyword works on tight search campaigns and breaks on Performance Max. What to swap, what to leave alone, and the fallback rule.

Dynamic text replacement swaps a headline on your landing page based on a URL parameter, usually the keyword that triggered the ad. On tight paid search campaigns it makes the page match the ad closely, and that helps. On Performance Max, Dynamic Search Ads and anything keywordless it fails quietly. So build it with a fallback, or do not build it at all.

The setup is simple

You add a parameter to the ad's destination. The page reads it when it loads, and one piece of text swaps. In Google Ads you do this with a final URL suffix such as kw={keyword}. The click then lands on yoursite.com/offer?kw=emergency%20plumber. The page reads kw from the query string and writes it into the H1. In Framer that is a small code component that reads the URL, not a subscription. Unbounce and Instapage sell it as a headline feature. The mechanism underneath is the same handful of lines.

What the keyword parameter actually returns

This trips people up all the time. Google's documentation is clear. On the Search Network, {keyword} returns the keyword from your account that matched the query, and not the words the person typed. Say someone searches plumber near me open now at 2am, and your broad match keyword is emergency plumber. The headline reads emergency plumber. That is usually the better outcome, because raw search terms arrive misspelt, rude or fourteen words long. There is no ValueTrack parameter for the actual search term. So anyone promising you the exact search on the page is selling you something else.

It returns nothing on keywordless campaigns

Google states that when an ad matches without keywords, {keyword} returns a blank value. This covers Performance Max, Dynamic Search Ads and AI Max for Search. If a growing share of your budget runs through those campaign types, a growing share of your traffic lands on a page with an empty headline. Never render the parameter on its own. Always render parameter or fallback, and make the fallback the strongest static headline you have, the one you would ship if the feature did not exist.

Swap the headline, leave the offer alone

Keep the dynamic part to the H1 and at most one line under it. The offer, the price, the proof, the form and the button copy all stay fixed. There are two reasons. A page that changes its price or its promise per keyword is a policy risk under Google's destination requirements, which expect the destination to match what the ad said. And a page where five elements move is a page you can never debug, because you cannot tell which version a given visitor saw.

Handle the formatting or it looks broken

Raw keywords arrive lowercase, URL encoded and any length at all. Decode the value, strip plus signs and percent codes, then use sentence case. Title Case Every Word reads like spam. Cap the length too. Anything over about 45 characters should fall back to the default instead of wrapping to four lines on a phone. Strip anything that is not a letter, number, space or hyphen. A query string can be edited by anyone, and you do not want random text showing up inside your H1.

Five real pages usually beat one dynamic text page

Dynamic text only changes words. It cannot change the proof, the hero image, the objection handling or the form, and that is where most of the conversion difference lives. With five ad groups, five purpose built pages will out-convert one page with a rotating headline. In Framer each one is a duplicate plus twenty minutes of editing. Reach for dynamic text when you have hundreds of long tail keywords spread across a handful of near identical intents. This is real for local service and category pages. Skip it otherwise.

Ship it with this checklist

One, set the parameter in the final URL suffix at campaign level, never in the final URL. Two, write the fallback headline first and check the page still looks finished with the parameter missing. Three, test three URLs by hand: a normal keyword, a 60 character keyword, and no parameter at all. Four, clean the value and cap its length before it renders. Five, send the rendered headline as a property on your conversion event, so you can see which versions actually convert. Six, check it on a phone. The headline that fits on desktop is the one that wraps to five lines on a 390 pixel screen.