Skip to content
GrowthVector.io

Technique Graph

48 techniques in 8 color groups and 17 clusters. Each one names a setting or threshold, and rests on a named study, a named case or official documentation. A line joins 2 techniques that work better together. Drag to move, scroll or pinch to zoom, and select a node for its steps.

All 48 techniques as a list

Technical SEO2

Crawl and migration

  • Undo a Search Console Change of Address in this order
    Do this
    1. Remove the 301 redirects that point from the old site to the new site.
    2. Add 301 redirects from the new site back to the old site.
    3. Open the Change of Address tool in the old property, and select Cancel Move.
    4. Plan the reversal with care: a second move cannot be submitted right after the first.
    Why it works

    Search Console Help allows the cancel for 180 days, and warns that Google might continue to redirect if the old directives stay live. The reversal makes Google recrawl both sites.

    Works with
  • Keep each HTML, CSS and JavaScript file under Googlebot's 2 MB limit
    Do this
    1. Measure the HTML size of each template that must rank.
    2. Measure every CSS and JavaScript bundle too: each file is fetched separately under the same limit.
    3. Move bulky inline data out of the HTML, and split any bundle that is near the limit.
    Why it works

    Google's Googlebot documentation says it crawls the first 2 MB of a supported file type, and the first 64 MB of a PDF. The 2 MB figure replaced the older 15 MB, so pages that were safe before can now be cut off.

    Works with

AI Search (GEO and AEO)12

Retrieval

  • Keep each section inside a 500-token chunk
    Do this
    1. Split long articles into sections of about 375 words or fewer.
    2. Give each section a question as its H2.
    3. Keep a clean heading hierarchy, because parent headings can travel with a chunk.
    Why it works

    Google's Discovery Engine, the retrieval layer of Vertex AI Search, allows chunks of up to 500 tokens, about 375 words. Google's consumer AI features likely chunk in a similar way, so a section under the cap can fit in one chunk.

    Works with
  • Mine Bing grounding queries for missing sub-questions
    Do this
    1. Open AI Performance in Bing Webmaster Tools, then Grounding Queries.
    2. List the phrases Copilot generated when it retrieved your pages.
    3. Add a section for each sub-question the page does not answer.
    4. Read the citation trend by quarter, not by month.
    Why it works

    This is first-party data on the queries an AI engine runs, and Google gives nothing like it. Monthly counts swing too much to read: one property fell from 1,520 citations a day to 34 over 2 months with no known content change.

    Works with
  • Read the searches ChatGPT runs for a prompt
    Do this
    1. Send a prompt about something current, so that ChatGPT searches.
    2. Open DevTools, then Network, and filter by the conversation id from the URL.
    3. Reload, open the conversation response, and search it for 'queries'.
    4. If the payload changes, use Perplexity: it prints its searches on the page.
    Why it works

    ChatGPT usually runs 1 to 3 searches per prompt, and their wording is not the prompt's wording. Those search strings are the keywords to rank for. The payload is not documented, so the Perplexity check is the stable fallback.

    Works with

Entity presence

  • Fix AI misinformation with one detailed owned page first
    Do this
    1. Ask ChatGPT, Perplexity and Google your buyers' deal-breaker questions.
    2. Trace each wrong claim to its source, often a Reddit thread or an old article.
    3. Publish one detailed page with the correct facts.
    4. Then corroborate the facts on third-party pages.
    Why it works

    In an Ahrefs test, most AI platforms repeated a detailed false story over the brand's own vague FAQ. Detail wins. The feedback buttons on each platform are slow and promise nothing.

    Works with
  • Change every corroborating profile in one session
    Do this
    1. List every profile that repeats the entity description, such as Crunchbase, LinkedIn and review sites.
    2. Change all of them within the same few days.
    3. Watch the Knowledge Panel subtitle for the update.
    Why it works

    The one documented before-and-after case: Jason Barnard changed 61 profiles in one afternoon in January 2022, and his Knowledge Panel subtitle updated in 3 weeks. The same kind of change took 4 to 6 months when it was spread out.

    Works with
  • Track the entity with the Knowledge Graph Search API
    Do this
    1. Call the kgsearch entities:search endpoint with the brand name and types=Organization.
    2. Record whether a result carries an @id.
    3. Query each competitor in the same run.
    4. Divide each resultScore by the highest score in that run, and track the index by month.
    Why it works

    A missing @id suggests that Google has not resolved the brand as an entity. Raw scores vary by query, so only the index inside one run compares across months.

    Works with
  • Run a Google Preferred Sources campaign
    Do this
    1. Open google.com/preferences/source?q= followed by your bare domain to confirm the site is eligible.
    2. Use that URL as the deeplink on a button in the header, article ends and newsletter footer.
    3. Fire a GA4 event on each click.
    Why it works

    A reader's preferred sources appear more often in Top Stories, so this pays for sites that publish fresh, news-type content. No Search Console or GA4 metric counts your selections, so the click event is the only measure.

    Works with

Crawler access

  • Decide on all 5 Meta crawler tokens, not 2
    Do this
    1. List the 5 tokens: meta-externalagent, meta-externalfetcher, meta-webindexer, meta-externalads and facebookexternalhit.
    2. Decide per token, because they cover training, live fetch, index, ads and link preview.
    3. Block meta-externalfetcher at the WAF if you need it blocked: it is user-initiated and may bypass robots.txt.
    4. Allow 24 hours for a robots.txt change, because the crawlers cache the file.
    Why it works

    Most guides list only 2 of the 5. A block on the common pair leaves meta-webindexer open, which builds the index behind Meta AI answers. Meta's own crawler documentation describes all 5 and the fetcher's robots.txt exception.

    Works with
  • Verify AI bots by their Web Bot Auth signature
    Do this
    1. Read the Signature-Agent header, and fetch /.well-known/http-message-signatures-directory at that host.
    2. Pick the key that matches keyid in Signature-Input, and verify the Signature.
    3. Check the created and expires values to reject replayed requests.
    Why it works

    Web Bot Auth is an IETF draft built on RFC 9421 HTTP Message Signatures, so a signed request proves identity without an IP list. Cloudflare Browser Rendering signs its requests today. Most AI crawlers still identify only by user agent and IP range, so keep the IP check for the rest.

    Works with
  • A Cloudflare WAF allow rule does not get Perplexity past Bot Fight Mode
    Do this
    1. Check whether Bot Fight Mode is on for the zone.
    2. Write the allow rule to match the user agent and Perplexity's published IP list together, and place a Skip rule above your blocking rules.
    3. If Perplexity is still challenged, decide whether to turn Bot Fight Mode off. That removes its protection for the whole zone.
    Why it works

    Perplexity's bot documentation says 'Cloudflare's Bot Fight Mode can't be skipped with WAF custom rules', so the mode can still challenge its bots after a correct allow rule.

    Works with

AI feature controls

  • Exclude one section from Google's AI features with a child property
    Do this
    1. Verify the section, such as a subfolder, as its own Search Console property.
    2. Open Settings, then Search generative AI, and set that property to Exclude.
    3. Leave the parent property on Include, and allow 1 to 2 days.
    Why it works

    Search Console Help says a property inherits from its closest parent that changed the control, so a child property can hold its own setting. Exclude covers AI Overviews, AI Mode and Discover AI features together, and Google says an excluded site gets no traffic or impressions from them. It does not affect AI training or ranking elsewhere.

    Works with
  • A max-snippet cap does not cover text in your structured data
    Do this
    1. List the pages that carry max-snippet.
    2. Audit the text those pages supply in structured data, because Google treats it as separately permitted.
    3. Remember that max-snippet:0 equals nosnippet, and that a robots.txt disallow means the tag is never read.
    Why it works

    Google's robots meta tag documentation says max-snippet also limits how much content may be used as direct input for AI Overviews and AI Mode. It adds that the limit does not apply where a publisher has separately granted permission for use of the content.

    Works with

Analytics and Attribution3

GA4 attribution

  • A shorter key event lookback window moves sessions to Direct
    Do this
    1. Open Admin, then Attribution settings, and note the key event lookback window. The default is 90 days; 30 and 60 are options.
    2. Before you shorten it, export session source and medium for returning users.
    3. Compare the same report after the change.
    Why it works

    Google Analytics Help says the window you choose 'also applies to session attribution'. Google's example is a user who returns on day 68. Inside a 90-day window that session keeps its campaign source, so a shorter window should send it to Direct.

    Works with
  • Audit GA4 key events after you link Google Ads personalization
    Do this
    1. Open the key events list after the link.
    2. Look for 7 events marked automatically: add_to_cart, add_to_wishlist, begin_checkout, session_start, view_item, view_item_list and view_search_results.
    3. Check that none of them is imported into Google Ads as a conversion you bid on.
    Why it works

    Google Analytics Help says that with Ads Personalization on and a linked Google Ads account, 'these events are also marked as key events'. Key event totals rise with no change in user behavior.

    Works with
  • One stray UTM on an auto-tagged URL gives (not set)
    Do this
    1. Find Google Ads URLs where a template adds only 1 or 2 UTM parameters.
    2. Either remove the UTMs and rely on auto-tagging, or add utm_source, utm_medium and utm_campaign together.
    3. Check paid rows for (not set) after launch.
    Why it works

    Google Analytics Help says that when the GCLID cannot be used and any UTM is present, it derives all cross-channel source values 'from UTM parameters, exclusively'. Each missing parameter then reports as (not set).

    Works with

Email3

Authentication and reputation

  • Read your Yahoo complaint rate as a floor
    Do this
    1. Divide Yahoo feedback loop complaints by mail delivered to Yahoo domains.
    2. Treat the result as a floor: Yahoo divides by mail that reached the inbox, which you cannot count.
    3. Keep that floor well below 0.3%.
    Why it works

    Yahoo Sender Hub says 'Spam rate is calculated in our system based on mail delivered to the inbox'. Mail filed to spam leaves Yahoo's denominator, so Yahoo's rate is higher than a rate based on all delivered mail.

    Works with
  • Test a stricter DMARC policy with t=y
    Do this
    1. Publish p=quarantine with t=y first.
    2. Read the reports: with t=y, receivers apply the policy one level below the one you published.
    3. Remove t=y when the reports are clean, then repeat the steps for p=reject.
    Why it works

    RFC 9989 removes the pct tag and defines t=y as a test mode, where the applied policy is 'one level below the specified policy'. A receiver that still follows the older RFC 7489 ignores unknown tags and can apply the full policy, so the safe start is quarantine, not reject.

    Works with
  • Keep SPF void lookups at 2 or fewer
    Do this
    1. Find the mechanisms in your SPF record that return no DNS answer.
    2. Remove or fix each one, so that void lookups stay at 2 or fewer.
    Why it works

    RFC 7208 says implementations should limit void lookups to 2, and a check that goes over the limit returns permerror. This limit is separate from the limit of 10 DNS lookups, so a record can pass that count and still fail.

    Works with

Privacy and Disclosure Rules4

California privacy

  • California: pass every opt-out to the third parties that got the data
    Do this
    1. List every third party that received the consumer's personal information by sale or sharing.
    2. Notify each one of the opt-out, and direct it to comply and to forward the request.
    3. Stop selling or sharing as soon as feasibly possible, and within 15 business days at most.
    Why it works

    11 CCR § 7026(f)(2) requires this of a business under the CCPA that sells or shares personal information. Unlike the deletion rule, it has no exemption for impossible or disproportionate effort. The duty runs to third parties, not to service providers or contractors under a CCPA contract.

    Works with
  • California: apply a GPC signal to pseudonymous profiles too
    Do this
    1. Treat a Global Privacy Control signal as an opt-out of sale and sharing for that browser or device.
    2. Apply it to every profile linked to that browser or device, including pseudonymous profiles in a CDP or identity graph.
    3. Show the visitor that the signal was processed, for example with the text 'Opt-Out Request Honored'.
    Why it works

    The CCPA regulations (11 CCR § 7025(c)(1)) extend the signal to any consumer profile associated with the browser or device, including pseudonymous profiles. A posted Do Not Sell link does not replace processing the signal (§ 7025(e)). The display of the processed status applies from 2026-01-01.

    Works with

Paid ranking and reviews

  • Keep payments out of the rank order of comparison pages
    Do this
    1. Check whether any payment changes the order of a comparison or roundup page.
    2. Remove any payment that sets the order.
    3. Do not rely on a disclosure to cover a paid rank.
    4. In the EU, disclose any paid placement on the results surface itself.
    Why it works

    In the US, the FTC Endorsement Guides (16 CFR § 255.4(b), Example 3) call paid-for rankings deceptive whatever the site says about independence, and say a disclosure is inadequate when payments decide the ranking. The manufacturer who pays can also be held liable. The EU rule is point 11a of Annex I of the Unfair Commercial Practices Directive.

    Works with
  • Disclose incentivized reviews next to the star average
    Do this
    1. Calculate the average star rating with and without the incentivized reviews.
    2. If they raise it materially, place a disclosure next to the displayed average.
    3. Tell reviewers in the request that a negative review is acceptable.
    Why it works

    In the US, the FTC Endorsement Guides (16 CFR § 255.5(b), Example 6(ii)) say the practice could still be deceptive, even with a disclosure on each review, when incentivized reviews are counted in an average star rating and raise it materially. The example gives no threshold for 'materially', and it assumes reviewers know that a negative review is acceptable.

    Works with

Links and Digital PR7

Data-led PR

  • Point press credit links at the category page
    Do this
    1. Tie the data study to one product category.
    2. Link the category page in your own press release, where the credit goes.
    3. Credit the brand and the category together, such as OnBuy Pet Suppliers, and let the journalist choose the final wording.
    4. Measure the share of links that hit money pages before and after.
    Why it works

    Journalists usually copy the link pattern of the release. Rise at Seven's work for Dojo moved 54 links from one exclusive story into the card-machine category page, and that category's traffic rose 152%. Before the program, 16.5% of Dojo's links pointed at category pages.

    Works with
  • Word a UK FOI request so that it needs no clarification
    Do this
    1. Search whatdotheyknow.com first: an earlier successful request for the same data saves the wait.
    2. Number each question, and structure it as what, where, when, why and how.
    3. Write dates as DD/MM/YY, and ask for a spreadsheet by email.
    4. Leave out every reference to Acts or laws.
    Why it works

    A UK public body has 20 working days to answer, and a clarification question resets that timer. On a campaign with a 4 to 8 week cycle, one vague question can use up the whole buffer.

    Works with
  • Cap each outreach campaign at 51 to 100 emails
    Do this
    1. Split the prospect list into campaigns of 51 to 100 emails.
    2. Write each campaign's angle for that group.
    3. Scale with more campaigns, not larger sends.
    Why it works

    In BuzzStream's analysis of 31 million outreach emails, campaigns of 51 to 100 emails earned the most links, 12.08 on average. Campaigns of 1,001 to 5,000 emails earned about 70% fewer. The data is correlational.

    Works with
  • Dedupe syndicated links before you report a campaign
    Do this
    1. Export backlinks with the title and surrounding-text columns.
    2. Group rows with the same article title and text, and count each group once.
    3. Map domains that belong to one publishing group, such as Reach PLC titles.
    4. Report 4 numbers: backlinks, referring domains, deduped domains and syndicated copies.
    Why it works

    One article syndicated across a newspaper group is one editorial decision. As a worked example, 60 reported referring domains at a 33% syndication rate is about 40 real placements. Ask vendors to quote on the deduped number, with syndication stated.

    Works with
  • Pick the journalist request platform by link type and site strength
    Do this
    1. For follow links, start with Source of Sources: 36.26% of its requests offer one.
    2. For strong sites, use Qwoted: 70.3% of its requests come from DR 70 to 100 sites.
    3. Screen HARO requests: just over 38% come from DR 0 to 9 sites.
    4. Check each request for a follow link before you pitch.
    Why it works

    BuzzStream's study of 7 journalist request platforms found that only 21.9% of requests explicitly offer a follow link, and that the platforms differ widely. The data is from July 2025.

    Works with

Site reputation abuse

  • Run a 3-question test before you host third-party content
    Do this
    1. As the host site, ask: do we set the editorial agenda for this content?
    2. Ask: does the content fit our own first-party topics?
    3. Ask: would the placement make sense with no ranking value?
    4. Decline when any answer is no.
    Why it works

    The test targets content placed on a host only to use its ranking signals, which is what Google's site reputation abuse policy covers. Google has enforced that policy with manual actions on the host's affected sections.

    Works with
  • After a site reputation abuse manual action, remove; do not move
    Do this
    1. Remove or noindex the pages named in the site reputation abuse manual action.
    2. Do not move the same content to another folder on the same domain.
    3. State the number of removed pages in the reconsideration request.
    Why it works

    Google's guidance on the policy says that moving the content within the same domain can be treated as an attempt to get around the policy, which can lead to a wider action.

    Works with

AI Visibility Measurement9

Traffic and logs

  • Build a GA4 AI channel that mail and X cannot leak into
    Do this
    1. Create a custom channel group with an AI channel.
    2. Add 2 conditions joined by OR: medium exactly matches ai-assistant, or source fully matches a regex of escaped hostnames such as chatgpt\.com.
    3. Leave x.com and t.co out; claim only x.ai, grok.com and grok.x.ai for Grok.
    4. Drag the channel above Referral and Organic Search.
    Why it works

    GA4 assigns the first channel that matches, so a channel below Referral gets nothing. A loose pattern catches mail.google.com, and x.com in the list empties Organic Social. The medium condition catches the hosts Google recognizes that your list does not name.

    Works with
  • Measure the GA4 undercount of AI referrals from server logs
    Do this
    1. Log the path, user agent and referer of every request.
    2. Count the landing-page document requests whose referer host is on your AI hostname list.
    3. Subtract the sessions GA4 puts in the AI channel for the same period.
    4. Report the gap as your own undercount.
    Why it works

    Published estimates of AI visits that GA4 cannot see run from 35% to 70%, and they come from vendors. The gap between your logs and your GA4 channel is your own number. Visits with no referrer at all, such as those from free ChatGPT users, are missing from both counts.

    Works with
  • Use live AI fetches per URL as a citation alarm
    Do this
    1. Count requests per URL per day from ChatGPT-User, Claude-User and Perplexity-User.
    2. Chart the daily count for each money page.
    3. Investigate a spike: that page is being read into live answers.
    Why it works

    These agents fetch a page at the moment a person's question needs it. The count is the closest free, real-time signal of citation, and it needs no tracking vendor.

    Works with

Citation accounting

  • Split AI citations into named and ghost
    Do this
    1. Log every citation of your domain for your money prompts.
    2. Mark it named when the answer text names the brand, and ghost when it does not.
    3. Report the 2 counts separately, and judge programs on the named count.
    Why it works

    In a Semrush study with Kevin Indig, about 6 in 10 AI citations never named the brand: the page was a source, and the answer did not mention it. Only about 13% of appearances were both cited and named.

    Works with
  • Check the denominator of every AI citation share
    Do this
    1. Ask the vendor for the denominator, the sample size and the fieldwork date.
    2. Label top-source-pool shares and all-citation shares in separate columns.
    3. Use the all-citation share for budget decisions.
    Why it works

    Ahrefs gives YouTube 21.1% of Google AI Overview citations in its top-50 pool, and 5.6% of all citations. Reddit shows a similar gap in other studies. The 2 figures lead to different budgets.

    Works with
  • Never use API answers for citation counts
    Do this
    1. Ask your tracker whether it samples the API or the web interface.
    2. Measure citations on the web interface or on Perplexity.
    3. Use the API only for mention rate, and never put both on one chart.
    Why it works

    In a SurferSEO study of 1,000 prompts, ChatGPT API answers and web answers shared 24% of brands and 4% of sources. The API does not show what buyers see.

    Works with
  • Split Reddit citations into original and machine-translated
    Do this
    1. In non-English markets, flag every cited Reddit URL that carries the ?tl= parameter: it is a machine-translated page.
    2. Report original and translated citations as 2 counts, per engine and per market. Do not drop either.
    3. Check that your tracker keeps URL parameters, or the split is lost.
    Why it works

    Peec analyzed 64.77 million Reddit citations across 20 countries from March to June 2026. On Google AI Overviews and AI Mode, translated pages were 40% to 73% of Reddit citations in non-English markets, and under 1% in English-speaking markets. ChatGPT's share fell from 6.14% in April to 0.30% in early June, and Perplexity cited none, so the answer differs by engine.

    Works with

Sampling statistics

  • Check every visibility change against its margin of error
    Do this
    1. Count prompt runs as n, not prompts.
    2. Calculate 1.96 times the square root of p(1-p)/n.
    3. Treat a change smaller than that margin as noise.
    4. Print n next to every rate.
    Why it works

    At a 20% mention rate, the margin is 11.1 points at 50 runs and 3.5 points at 500 runs. Repeated runs of one prompt are correlated, so the true margin is wider: treat this number as a minimum.

    Works with
  • Size citation-share samples per engine
    Do this
    1. Plan about 30 to 50 queries on Gemini for an interval of plus or minus 5 points.
    2. Plan about 90 to 100 queries on Perplexity for the same interval.
    3. Plan at least 150 on ChatGPT search, where results converge unevenly.
    4. Report a 95% bootstrap interval over responses, with 1,000 resamples.
    Why it works

    The numbers come from the arXiv paper 'Quantifying Uncertainty in AI Visibility' (Sielinski, 2026, arXiv:2603.08924). Citation share is a ratio, so the paper rejects the usual Wilson interval for proportions and uses a bootstrap.

    Works with

Paid Media8

Conversion measurement

  • Check Demand Gen conversions for view-through counts
    Do this
    1. Check whether view-through conversion optimization is on for each Demand Gen campaign. It is off by default.
    2. If it is on, compare the Conversions column with the lead count in your CRM.
    3. Expect a gap: Google does not export these impression-based conversions to your backend, and offline conversion import does not cover them.
    Why it works

    Google Ads Help lists Demand Gen as an exception where view-through conversions enter the Conversions column once that optimization is enabled. A view counts when at least 1 pixel of the ad is on screen for any time. The feature is an open beta on YouTube and Discover, so its scope can change.

    Works with
  • Split podcast conversions into observed and modeled
    Do this
    1. In Podscribe, switch the report between modeled and unmodeled results.
    2. Report observed and modeled conversions as 2 separate numbers.
    3. Check the total against promo codes or vanity URLs.
    Why it works

    Podcast pixel attribution matches only listeners on residential IP addresses, and the vendor scales the count up for the rest. In Podscribe's own worked example, 20 attributed purchases at a 47% residential share become 42.6, so more than half of the reported total is inferred. Podscribe publishes no sample size for its modeling basis.

    Works with

Conversion uploads

  • Strip dots and plus suffixes only for Gmail before hashing
    Do this
    1. When you hash emails yourself for enhanced conversions (Google Ads API or Data Manager uploads), trim whitespace and lowercase every address.
    2. Remove dots and plus suffixes for gmail.com and googlemail.com only.
    3. Keep dots and plus suffixes on every other domain.
    4. Do not hash the country, state, city or zip values.
    Why it works

    Google's Enhanced Conversions for Leads guidance sets these rules, and a wrong hash causes a missed match. The failure is silent, so it shows only as a lower match rate.

    Works with
  • Trim Meta server event backfills to the last 7 days
    Do this
    1. Check the event_time of every server event before you send a batch.
    2. Remove any event older than 7 days, and log the events you drop.
    3. Send the rest.
    Why it works

    Meta's Conversions API documentation says that one event_time older than 7 days returns an error for the whole request, and none of its events are processed. One stale row can lose a full batch of good conversions.

    Works with
  • Give repeat conversions on one GCLID unique timestamps
    Do this
    1. Upload each conversion with its GCLID, conversion name and conversion time.
    2. Give each separate conversion on the same GCLID its own conversion time.
    3. Correct a value by adjustment within 55 days. A retracted conversion cannot be adjusted.
    Why it works

    Google Ads deduplicates uploads on the combination of GCLID, conversion name and conversion time. Two real purchases with the same timestamp become one.

    Works with
  • Store the GCLID for sales that close after day 63
    Do this
    1. Upload conversions matched by user-provided data only for clicks up to 63 days old.
    2. Upload conversions with a GCLID for clicks up to 90 days old.
    3. Capture the GCLID on every lead, so that a sale closed between day 63 and day 90 can still be imported.
    Why it works

    Google Ads Help gives 2 limits: 90 days after the click with a GCLID, and 63 days for enhanced conversions for leads. A long sales cycle that relies on hashed emails alone loses the deals that close after day 63.

    Works with

Final URL controls

  • Performance Max: a URL exclusion does not block the Final URL
    Do this
    1. Check the campaign's Final URL before you add URL exclusions.
    2. If the homepage must not serve, choose a more specific Final URL, then exclude the homepage.
    3. With a Merchant Center feed, expect that the homepage may still serve.
    Why it works

    Google Ads Help says an excluded Final URL 'will still be served and receive traffic for your campaign'. The exclusion only limits expansion to other pages.

    Works with
  • AI Max for Search: URL expansion overrides pinned assets
    Do this
    1. If pinned Responsive search ad assets must always show, turn off Final URL expansion and URL inclusions.
    2. Pin assets only in campaigns where both stay off.
    Why it works

    Google Ads Help says pinned Responsive search ad assets 'aren't used if a more relevant URL is chosen'. A legal or brand line that depends on a pin can therefore drop out of the ad.

    Works with