Skip to content

How detection works

This page describes how Liftwire captures a page, decides which tactics are on it, chooses the sites it learns from and decides what to publish. It says what runs today and what does not. Live library counts are on Library status; the one live list on this page is the set of sites the evidence was observed on.

What runs on your audits today

Your audits (audit_page, audit_site) capture your page and then run deterministic detectors only: rules made of CSS selectors and text patterns, stored with a published tactic. No model looks at your page. The two-pass model annotation described below runs on corpus sites, not on your audits, and the built-in detectors listed below run on corpus captures only. A published tactic without a detector rule is therefore reported as missing whether or not your page has it, and every audit response says so with annotation: "detectors_only". verify_change follows the same rule: when no detector settles a tactic, the result is undetermined, never absent.

Capture

Each page is loaded in headless Chromium at two viewports: desktop 1440×900 and mobile 390×844. For each viewport the capture keeps a full-page screenshot and the rendered DOM, runs axe-core with the wcag2a, wcag2aa, wcag21a and wcag21aa rule sets, and records LCP and CLS. LCP and CLS come from one headless load: they are lab values, not field data from your visitors. Calls to action and forms are recorded with their position. The site builder is identified from the markup, and a bot wall or challenge page is detected and reported instead of being read as the page.

Sections on corpus pages

A corpus page is split into sections by its structure and layout, not by looking at the screenshot. The segmenter walks the in-flow blocks under body, never splits a header, navigation, footer or FAQ, merges blocks shorter than 120 px into their neighbours, and caps a page at 25 sections by merging the smallest neighbours rather than dropping content. Each section gets a kind, such as hero, pricing table or footer. The kind is a hint only; nothing is decided on it.

This design was chosen in a spike, after the first set of heuristics failed on real pages. It passed 20/20 of the tuning pages and 11/11 of the held-out pages.

Sections on customer audits

Your audits use a simpler pass today: landmarks and section elements, not the corpus segmenter. Section boundaries in your audit can therefore differ from those in corpus examples.

Detectors

There are 5 built-in detectors, each written for one tactic:

  • pricing-annual-toggle-with-saving, written for pricing pages
  • pricing-feature-comparison-table, written for pricing and comparison pages
  • logo-wall, written for homepage, pricing, landing, product and customers pages
  • no-credit-card-reassurance, written for homepage, pricing, signup and landing pages
  • pricing-objection-faq, written for pricing and homepage pages

They are tuned for precision: a miss only costs a model call, while a false hit would skip one. A detector hit is stored as an approved observation, and that tactic is not sent to a model for that capture.

Detectors can also be grown from the data. Once a tactic has 20 approved observations and 20 approved negatives, a rule is proposed. It is promoted only if it reaches precision 0.9 and recall 0.7 on both the full set and a held-out set. Otherwise it stays a proposal and does nothing.

Two-pass annotation (corpus)

On a corpus capture, every tactic that no detector settled goes to two passes: two different pinned models, with two differently phrased prompts, reading the section crops. Pass A uses claude-sonnet-4-6, pass B claude-opus-4-8, and the judge claude-opus-4-8. The ids are pinned rather than aliases, because an alias moves to a newer model without notice and would change the agreement figures; changing one means measuring agreement again.

When both passes agree, the observation is approved. When they disagree, a judge reads both rationales and decides. A judge decision below confidence 0.7 stays pending, and a pending observation never counts toward publishing.

A capture is checked against at most 40 tactics for its page type: published tactics first, then drafts in the order they were created. While the library holds many drafts, most drafts are not checked on every page.

Agreement

Agreement between the passes is measured as Cohen's kappa (κ), never as raw agreement. Most crop and tactic pairs are cases where neither pass sees the tactic, and those pairs push raw agreement up whatever the passes actually do: in the pilot, raw agreement was 0.974 while κ was 0.838. After the prompts were tightened, κ was 0.934 on the same 80 crops across 12 tactics.

A tactic is demoted to draft when its κ over its last 200 pairs falls below 0.75, once it has at least 50 pairs and at least 5 where a pass saw the tactic. With fewer, the figure is not measured and nothing is demoted.

κ is agreement between two models, not accuracy. Two models can agree and both be wrong. Accuracy needs the golden set.

Golden set

The golden set is crops labelled by hand. Precision is true positives divided by true positives plus false positives: of the times the system says a tactic is present, how often it is right. A tactic is demoted when its precision falls below 0.85, once it has at least 20 labelled presences.

The golden set is not yet populated, and no labelling tool exists yet. No tactic has a precision figure today. Library status shows the live row and says why.

Corpus selection

Corpus sites are B2B SaaS marketing sites. 60 come from G2 category pages and the Y Combinator company directory. 53 are the brands from Webabunga, the NerdCow newsletter that broke down one SaaS site per episode. Landing-page galleries and pattern libraries are forbidden as sources (saaslandingpage.com, landingfolio.com, saasframe.io, lapa.ninja, land-book.com, pageflows.com, mobbin.com, goodui.org, growth.design, reallygoodux.io, saaspages.xyz, onepagelove.com and httpster.net), and the seed list is refused if any site in it came from one.

A site enters the corpus only through the seed run or an explicit capture command run by the operator. Auditing your own page does not add your site to the corpus. Captures from your audits and verifications never enter it: corpus capture never reuses them, an observation can never be recorded against one, so they never become examples, and they are never used to train or fine-tune any model.

Discovery and manners

For each site the crawler takes the homepage plus up to 5 key pages, such as pricing, signup, demo and product. It scores candidates by URL path, link text, whether the link is in the navigation and whether the sitemap lists it. Blog, docs, legal, privacy, terms, login and careers pages are excluded.

robots.txt is honoured. Both crawlers keep a gap of at least 2 s between requests to the same host, and the article crawler waits longer when a site's robots.txt sets a Crawl-delay. They say who they are: LiftwireBot for pages and LiftwireCorpusBot for articles, each with a link to the takedown page.

Refresh

A page captured in the last 30 days is not captured again. There is no scheduled corpus refresh yet, and no re-annotation. A capture annotated before a tactic existed is never checked for that tactic later, so a new tactic gains observations only from pages captured after it was added.

Evidence sources

Tactics are drawn from published research and write-ups, read as text and cited with a link. Active publishers: Nielsen Norman Group, CXL, Marketing Examples (Harry Dry), Conversion Rate Experts and Convert Insights. Quotes from Nielsen Norman Group carry the three credits its terms ask for: the company, a link to the article and the author. The NerdCow newsletter is a source too; it is NerdCow's own material.

Not used:

  • Baymard Institute: its written terms forbid automated collection on its website and repackaging its content for others. No longer fetched, and its evidence is ignored by the publish and grade rules wherever it is stored.
  • GoodUI: its written terms forbid automated collection and any use of its material to ground or train a model. No longer fetched, and its evidence is ignored by the publish and grade rules wherever it is stored.
  • Growth.Design: its written terms forbid automated collection and any AI-related use of its content. Never fetched.
  • Unbounce: its written terms forbid copying, storing or making derivative works from its site. Deactivated before it was crawled, and any evidence from it is ignored by the publish and grade rules wherever it is stored.

Written terms govern. robots.txt is not consent: a site whose robots.txt allows crawling is still left out when its terms forbid this use, and a publisher whose terms need a licence is not used.

Publish rule and grades

A tactic is published only when it has supporting evidence from at least 2 independent publishers and is observed on at least 5 corpus sites, or has at least 1 experiment-grade source and is observed on at least 3 corpus sites. Independent means a different domain: two articles from one publisher are one source. Evidence that contradicts a tactic counts toward nothing, and neither does evidence from an excluded publisher. Anything short of the rule stays in draft and is never returned to agents, and a published tactic that stops meeting it goes back to draft.

Every tactic carries a grade, computed from the evidence and never assigned:

  • Observed: Seen on corpus sites where both annotation passes agreed, a judge resolved a disagreement with confidence of 0.7 or more, or a deterministic detector matched.
  • Tested: At least one experiment-grade evidence link, or verified-present changes reported 60 or more days ago on 3 or more customer sites, as recorded by verify_change.
  • Measured: Outcomes on at least 2 sites, at least one recorded through verify_change, each with at least 500 GA4 sessions or Search Console clicks in the smaller period.

What each grade lets an agent say is on Evidence grades.

What the evidence covers

A tactic carries two kinds of evidence, and they cover different ground. Where a tactic was evidenced is its evidence links: published research and experiment write-ups from the publishers above, whose experiments ran on many kinds of site, and each link says where. Where a tactic was observed is the corpus, and the corpus is narrower. It is limited to business-to-business software marketing sites, because the seed list is (see Corpus selection).

Today, tactics have been observed on 24 corpus sites, and every one is a business-to-business software marketing site from the seed list: activecampaign.com, amplitude.com, asana.com, attio.com, basecamp.com, clickup.com, close.com, contentsquare.com, datadoghq.com, elastic.co, fin.ai, freshworks.com, grafana.com, hubspot.com, linear.app, missiveapp.com, mixpanel.com, notion.com, pendo.io, pipedrive.com, posthog.com, ramp.com, salesforce.com and userpilot.com. None is an online shop, a publication, a marketplace or a consumer app. The 20 published tactics were observed on 16 of these sites between them: close.com (15 of 20), posthog.com (10 of 20), salesforce.com (8 of 20), attio.com (6 of 20), clickup.com (6 of 20), missiveapp.com (5 of 20), fin.ai (4 of 20), pendo.io (4 of 20), notion.com (3 of 20), activecampaign.com (2 of 20), amplitude.com (2 of 20), basecamp.com (2 of 20), userpilot.com (2 of 20), asana.com (1 of 20), grafana.com (1 of 20) and mixpanel.com (1 of 20).

So read "observed on" a number of sites as "observed on that many business-to-business software marketing sites". If you run an online shop, a publication, a marketplace or a consumer app, the site count says little about pages like yours; the evidence links say more. The list above is read from the database when this page loads, so it changes when the corpus does.