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- Remove the 301 redirects that point from the old site to the new site.
- Add 301 redirects from the new site back to the old site.
- Open the Change of Address tool in the old property, and select Cancel Move.
- Plan the reversal with care: a second move cannot be submitted right after the first.
Why it worksSearch 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 withKeep each HTML, CSS and JavaScript file under Googlebot's 2 MB limit
Do this- Measure the HTML size of each template that must rank.
- Measure every CSS and JavaScript bundle too: each file is fetched separately under the same limit.
- Move bulky inline data out of the HTML, and split any bundle that is near the limit.
Why it worksGoogle'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- Split long articles into sections of about 375 words or fewer.
- Give each section a question as its H2.
- Keep a clean heading hierarchy, because parent headings can travel with a chunk.
Why it worksGoogle'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 withMine Bing grounding queries for missing sub-questions
Do this- Open AI Performance in Bing Webmaster Tools, then Grounding Queries.
- List the phrases Copilot generated when it retrieved your pages.
- Add a section for each sub-question the page does not answer.
- Read the citation trend by quarter, not by month.
Why it worksThis 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 withRead the searches ChatGPT runs for a prompt
Do this- Send a prompt about something current, so that ChatGPT searches.
- Open DevTools, then Network, and filter by the conversation id from the URL.
- Reload, open the conversation response, and search it for 'queries'.
- If the payload changes, use Perplexity: it prints its searches on the page.
Why it worksChatGPT 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- Ask ChatGPT, Perplexity and Google your buyers' deal-breaker questions.
- Trace each wrong claim to its source, often a Reddit thread or an old article.
- Publish one detailed page with the correct facts.
- Then corroborate the facts on third-party pages.
Why it worksIn 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 withChange every corroborating profile in one session
Do this- List every profile that repeats the entity description, such as Crunchbase, LinkedIn and review sites.
- Change all of them within the same few days.
- Watch the Knowledge Panel subtitle for the update.
Why it worksThe 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 withTrack the entity with the Knowledge Graph Search API
Do this- Call the kgsearch entities:search endpoint with the brand name and types=Organization.
- Record whether a result carries an @id.
- Query each competitor in the same run.
- Divide each resultScore by the highest score in that run, and track the index by month.
Why it worksA 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 withRun a Google Preferred Sources campaign
Do this- Open google.com/preferences/source?q= followed by your bare domain to confirm the site is eligible.
- Use that URL as the deeplink on a button in the header, article ends and newsletter footer.
- Fire a GA4 event on each click.
Why it worksA 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- List the 5 tokens: meta-externalagent, meta-externalfetcher, meta-webindexer, meta-externalads and facebookexternalhit.
- Decide per token, because they cover training, live fetch, index, ads and link preview.
- Block meta-externalfetcher at the WAF if you need it blocked: it is user-initiated and may bypass robots.txt.
- Allow 24 hours for a robots.txt change, because the crawlers cache the file.
Why it worksMost 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 withVerify AI bots by their Web Bot Auth signature
Do this- Read the Signature-Agent header, and fetch /.well-known/http-message-signatures-directory at that host.
- Pick the key that matches keyid in Signature-Input, and verify the Signature.
- Check the created and expires values to reject replayed requests.
Why it worksWeb 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 withA Cloudflare WAF allow rule does not get Perplexity past Bot Fight Mode
Do this- Check whether Bot Fight Mode is on for the zone.
- 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.
- If Perplexity is still challenged, decide whether to turn Bot Fight Mode off. That removes its protection for the whole zone.
Why it worksPerplexity'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- Verify the section, such as a subfolder, as its own Search Console property.
- Open Settings, then Search generative AI, and set that property to Exclude.
- Leave the parent property on Include, and allow 1 to 2 days.
Why it worksSearch 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 withA max-snippet cap does not cover text in your structured data
Do this- List the pages that carry max-snippet.
- Audit the text those pages supply in structured data, because Google treats it as separately permitted.
- Remember that max-snippet:0 equals nosnippet, and that a robots.txt disallow means the tag is never read.
Why it worksGoogle'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- Open Admin, then Attribution settings, and note the key event lookback window. The default is 90 days; 30 and 60 are options.
- Before you shorten it, export session source and medium for returning users.
- Compare the same report after the change.
Why it worksGoogle 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 withAudit GA4 key events after you link Google Ads personalization
Do this- Open the key events list after the link.
- 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.
- Check that none of them is imported into Google Ads as a conversion you bid on.
Why it worksGoogle 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 withOne stray UTM on an auto-tagged URL gives (not set)
Do this- Find Google Ads URLs where a template adds only 1 or 2 UTM parameters.
- Either remove the UTMs and rely on auto-tagging, or add utm_source, utm_medium and utm_campaign together.
- Check paid rows for (not set) after launch.
Why it worksGoogle 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- Divide Yahoo feedback loop complaints by mail delivered to Yahoo domains.
- Treat the result as a floor: Yahoo divides by mail that reached the inbox, which you cannot count.
- Keep that floor well below 0.3%.
Why it worksYahoo 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 withTest a stricter DMARC policy with t=y
Do this- Publish p=quarantine with t=y first.
- Read the reports: with t=y, receivers apply the policy one level below the one you published.
- Remove t=y when the reports are clean, then repeat the steps for p=reject.
Why it worksRFC 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 withKeep SPF void lookups at 2 or fewer
Do this- Find the mechanisms in your SPF record that return no DNS answer.
- Remove or fix each one, so that void lookups stay at 2 or fewer.
Why it worksRFC 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- List every third party that received the consumer's personal information by sale or sharing.
- Notify each one of the opt-out, and direct it to comply and to forward the request.
- Stop selling or sharing as soon as feasibly possible, and within 15 business days at most.
Why it works11 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 withCalifornia: apply a GPC signal to pseudonymous profiles too
Do this- Treat a Global Privacy Control signal as an opt-out of sale and sharing for that browser or device.
- Apply it to every profile linked to that browser or device, including pseudonymous profiles in a CDP or identity graph.
- Show the visitor that the signal was processed, for example with the text 'Opt-Out Request Honored'.
Why it worksThe 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- Check whether any payment changes the order of a comparison or roundup page.
- Remove any payment that sets the order.
- Do not rely on a disclosure to cover a paid rank.
- In the EU, disclose any paid placement on the results surface itself.
Why it worksIn 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 withDisclose incentivized reviews next to the star average
Do this- Calculate the average star rating with and without the incentivized reviews.
- If they raise it materially, place a disclosure next to the displayed average.
- Tell reviewers in the request that a negative review is acceptable.
Why it worksIn 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- Tie the data study to one product category.
- Link the category page in your own press release, where the credit goes.
- Credit the brand and the category together, such as OnBuy Pet Suppliers, and let the journalist choose the final wording.
- Measure the share of links that hit money pages before and after.
Why it worksJournalists 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 withWord a UK FOI request so that it needs no clarification
Do this- Search whatdotheyknow.com first: an earlier successful request for the same data saves the wait.
- Number each question, and structure it as what, where, when, why and how.
- Write dates as DD/MM/YY, and ask for a spreadsheet by email.
- Leave out every reference to Acts or laws.
Why it worksA 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 withCap each outreach campaign at 51 to 100 emails
Do this- Split the prospect list into campaigns of 51 to 100 emails.
- Write each campaign's angle for that group.
- Scale with more campaigns, not larger sends.
Why it worksIn 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 withDedupe syndicated links before you report a campaign
Do this- Export backlinks with the title and surrounding-text columns.
- Group rows with the same article title and text, and count each group once.
- Map domains that belong to one publishing group, such as Reach PLC titles.
- Report 4 numbers: backlinks, referring domains, deduped domains and syndicated copies.
Why it worksOne 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 withPick the journalist request platform by link type and site strength
Do this- For follow links, start with Source of Sources: 36.26% of its requests offer one.
- For strong sites, use Qwoted: 70.3% of its requests come from DR 70 to 100 sites.
- Screen HARO requests: just over 38% come from DR 0 to 9 sites.
- Check each request for a follow link before you pitch.
Why it worksBuzzStream'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- As the host site, ask: do we set the editorial agenda for this content?
- Ask: does the content fit our own first-party topics?
- Ask: would the placement make sense with no ranking value?
- Decline when any answer is no.
Why it worksThe 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 withAfter a site reputation abuse manual action, remove; do not move
Do this- Remove or noindex the pages named in the site reputation abuse manual action.
- Do not move the same content to another folder on the same domain.
- State the number of removed pages in the reconsideration request.
Why it worksGoogle'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- Create a custom channel group with an AI channel.
- Add 2 conditions joined by OR: medium exactly matches ai-assistant, or source fully matches a regex of escaped hostnames such as chatgpt\.com.
- Leave x.com and t.co out; claim only x.ai, grok.com and grok.x.ai for Grok.
- Drag the channel above Referral and Organic Search.
Why it worksGA4 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 withMeasure the GA4 undercount of AI referrals from server logs
Do this- Log the path, user agent and referer of every request.
- Count the landing-page document requests whose referer host is on your AI hostname list.
- Subtract the sessions GA4 puts in the AI channel for the same period.
- Report the gap as your own undercount.
Why it worksPublished 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 withUse live AI fetches per URL as a citation alarm
Do this- Count requests per URL per day from ChatGPT-User, Claude-User and Perplexity-User.
- Chart the daily count for each money page.
- Investigate a spike: that page is being read into live answers.
Why it worksThese 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- Log every citation of your domain for your money prompts.
- Mark it named when the answer text names the brand, and ghost when it does not.
- Report the 2 counts separately, and judge programs on the named count.
Why it worksIn 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 withCheck the denominator of every AI citation share
Do this- Ask the vendor for the denominator, the sample size and the fieldwork date.
- Label top-source-pool shares and all-citation shares in separate columns.
- Use the all-citation share for budget decisions.
Why it worksAhrefs 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 withNever use API answers for citation counts
Do this- Ask your tracker whether it samples the API or the web interface.
- Measure citations on the web interface or on Perplexity.
- Use the API only for mention rate, and never put both on one chart.
Why it worksIn 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 withSplit Reddit citations into original and machine-translated
Do this- In non-English markets, flag every cited Reddit URL that carries the ?tl= parameter: it is a machine-translated page.
- Report original and translated citations as 2 counts, per engine and per market. Do not drop either.
- Check that your tracker keeps URL parameters, or the split is lost.
Why it worksPeec 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- Count prompt runs as n, not prompts.
- Calculate 1.96 times the square root of p(1-p)/n.
- Treat a change smaller than that margin as noise.
- Print n next to every rate.
Why it worksAt 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 withSize citation-share samples per engine
Do this- Plan about 30 to 50 queries on Gemini for an interval of plus or minus 5 points.
- Plan about 90 to 100 queries on Perplexity for the same interval.
- Plan at least 150 on ChatGPT search, where results converge unevenly.
- Report a 95% bootstrap interval over responses, with 1,000 resamples.
Why it worksThe 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- Check whether view-through conversion optimization is on for each Demand Gen campaign. It is off by default.
- If it is on, compare the Conversions column with the lead count in your CRM.
- Expect a gap: Google does not export these impression-based conversions to your backend, and offline conversion import does not cover them.
Why it worksGoogle 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 withSplit podcast conversions into observed and modeled
Do this- In Podscribe, switch the report between modeled and unmodeled results.
- Report observed and modeled conversions as 2 separate numbers.
- Check the total against promo codes or vanity URLs.
Why it worksPodcast 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- When you hash emails yourself for enhanced conversions (Google Ads API or Data Manager uploads), trim whitespace and lowercase every address.
- Remove dots and plus suffixes for gmail.com and googlemail.com only.
- Keep dots and plus suffixes on every other domain.
- Do not hash the country, state, city or zip values.
Why it worksGoogle'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 withTrim Meta server event backfills to the last 7 days
Do this- Check the event_time of every server event before you send a batch.
- Remove any event older than 7 days, and log the events you drop.
- Send the rest.
Why it worksMeta'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 withGive repeat conversions on one GCLID unique timestamps
Do this- Upload each conversion with its GCLID, conversion name and conversion time.
- Give each separate conversion on the same GCLID its own conversion time.
- Correct a value by adjustment within 55 days. A retracted conversion cannot be adjusted.
Why it worksGoogle Ads deduplicates uploads on the combination of GCLID, conversion name and conversion time. Two real purchases with the same timestamp become one.
Works withStore the GCLID for sales that close after day 63
Do this- Upload conversions matched by user-provided data only for clicks up to 63 days old.
- Upload conversions with a GCLID for clicks up to 90 days old.
- Capture the GCLID on every lead, so that a sale closed between day 63 and day 90 can still be imported.
Why it worksGoogle 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- Check the campaign's Final URL before you add URL exclusions.
- If the homepage must not serve, choose a more specific Final URL, then exclude the homepage.
- With a Merchant Center feed, expect that the homepage may still serve.
Why it worksGoogle 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 withAI Max for Search: URL expansion overrides pinned assets
Do this- If pinned Responsive search ad assets must always show, turn off Final URL expansion and URL inclusions.
- Pin assets only in campaigns where both stay off.
Why it worksGoogle 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