{
  "title": "The Stale List Report — FrontDeskReview third-party price-freshness study",
  "source": "https://frontdeskreview.com/stale-lists/",
  "asOf": "2026-09-06",
  "recheckedOn": "2026-09-06",
  "cadence": "quarterly",
  "method": "For twelve software categories we searched for the highest-ranking third-party 'best <category>' articles, read every price each one states for a vendor in our catalog, and compared it with the vendor's own pricing page. Every disagreement was then re-read live by an independent checker, and every checker that reported a stale price was itself double-checked by two more. A row counts as stale only when a majority of independent checks agree that the article still presents that figure as the vendor's starting price and the vendor's own page states a different figure on the same billing basis today. Before publication every surviving row was read once more against the live page, and its quotation was matched against one canonical reading of that page - the same reading for every row, stated in full below. A row is published only where the recorded sentence is found in that reading, and the count the row carries is the count that reading produces. The sentence is a run of the page's text rather than of its bytes: on several of these pages markup falls between the words of the sentence, so the quotation exists as one string only once the tags inside it are gone. A quotation that reading could not find was never rewritten to fit - the row was moved to the control below, whatever its arithmetic said.",
  "canonicalReading": "Parse the served HTML into a DOM and take the document's text content, skipping the contents of script, style, template and noscript elements — a reader sees none of them. Then decode HTML entities, map every no-break space to an ordinary space, collapse each run of whitespace to a single space, and trim. Nothing is put in where a tag was, so a sentence broken across tags reads as one string — which is why several of these quotations exist as one string only in this reading and not in the page's raw bytes. A quotation is then counted once per non-overlapping occurrence in that text, and that count is the number the row prints.",
  "knockedOutOnQuotationBasis": "control rows 12, 23 and 24: every control row filed under “The quoted sentence is not the sentence on the page”, plus any row whose own note calls the stored quotation a reconstruction",
  "note": "Each confirmed row is a dated observation about one figure on one page. An article can be corrected at any time. The control rows are first-pass calls that later independent reads knocked out; they are published without a publisher or URL, and every publisher name inside a control note is replaced with the marker below.",
  "verbatimStandard": "quotedText on a confirmed row is a run of the live article's own text on the asOf date, never a reconstruction. It is matched against ONE canonical reading of the page, given verbatim in canonicalReading and used for every row: occurrencesInPage is the number of non-overlapping occurrences that reading produces (always at least 1), so the same recipe run over the article reproduces the number. Several of these sentences are a run of the page's text rather than of its bytes, because markup falls between their words. The row also carries the verdict of that re-read (verdict, always stale-confirmed), whether the vendor figure is a standing rather than promotional price (vendorFigureIsStanding), how the vendor's page answered (vendorAccess, vendorRoute) and the route the figure was read at (vendorCheckUrl). Rows whose stored quotation could not be found on the page were moved to control rather than rewritten. quotedText and vendorEvidence are published in full; their lengths are quotedTextChars and vendorEvidenceChars. Control notes are published as recorded, and stats.controlNoteCut names the length at which the record stores some of them.",
  "redactionMarker": "[publisher redacted]",
  "stats": {
    "themes": 12,
    "articlesFound": 48,
    "articlesRead": 45,
    "articlesUnread": 3,
    "pricesQuoted": 216,
    "disagreements": 82,
    "disagreementsNotStale": 70,
    "firstPassStale": 25,
    "confirmed": 12,
    "rejected": 13,
    "ourOwnCorrections": 65,
    "publishers": 9,
    "vendors": 10,
    "pctOfQuotesStale": 5.6,
    "pctOfDisagreementsStale": 14.6,
    "pctFirstPassSurviving": 48,
    "independentReads": 82,
    "medianGapPct": 20.4,
    "biggestGapPct": 172.4,
    "biggestGapVendor": "Respond.io",
    "notesRedacted": 3,
    "knockedOutOnVerbatimReRead": 3,
    "knockedOutOnVerbatimReReadIds": [
      12,
      23,
      24
    ],
    "vendorPagesNotServing": 6,
    "vendorPagesRefusingAllRoutes": 1,
    "longestEvidenceChars": 3595,
    "evidenceCharsPublished": 28117,
    "controlNoteCut": 260,
    "controlNotesAtCut": 11,
    "controlNotesInFull": 2
  },
  "funnel": [
    {
      "label": "Prices quoted for a vendor we carry",
      "count": 216,
      "note": "across 45 readable articles in 12 categories"
    },
    {
      "label": "Disagreed with our figure on a first read",
      "count": 82,
      "note": "a disagreement, not yet an error"
    },
    {
      "label": "Looked out of date to an independent checker",
      "count": 25,
      "note": "each one re-read live against the vendor's own page"
    },
    {
      "label": "Still out of date, and the quotation found in the page a reader sees",
      "count": 12,
      "note": "13 fell away — they are the control below"
    }
  ],
  "coverage": [
    {
      "theme": "whatsapp-business",
      "label": "Whatsapp Business",
      "articles": 4,
      "read": 4,
      "confirmed": 4
    },
    {
      "theme": "email-hosting",
      "label": "Email Hosting",
      "articles": 4,
      "read": 4,
      "confirmed": 3
    },
    {
      "theme": "crm-software",
      "label": "CRM Software",
      "articles": 4,
      "read": 3,
      "confirmed": 2
    },
    {
      "theme": "domain-registrars",
      "label": "Domain Registrars",
      "articles": 4,
      "read": 4,
      "confirmed": 1
    },
    {
      "theme": "landing-page-builders",
      "label": "Landing Page Builders",
      "articles": 4,
      "read": 4,
      "confirmed": 1
    },
    {
      "theme": "vps-hosting",
      "label": "Vps Hosting",
      "articles": 4,
      "read": 4,
      "confirmed": 1
    },
    {
      "theme": "antivirus-software",
      "label": "Antivirus Software",
      "articles": 4,
      "read": 4,
      "confirmed": 0
    },
    {
      "theme": "consent-management-platforms",
      "label": "Consent Management Platforms",
      "articles": 4,
      "read": 4,
      "confirmed": 0
    },
    {
      "theme": "mobile-device-management",
      "label": "Mobile Device Management",
      "articles": 4,
      "read": 4,
      "confirmed": 0
    },
    {
      "theme": "sales-tax-automation",
      "label": "Sales Tax Automation",
      "articles": 4,
      "read": 4,
      "confirmed": 0
    },
    {
      "theme": "voip-business-phone",
      "label": "VoIP Business Phone",
      "articles": 4,
      "read": 4,
      "confirmed": 0
    },
    {
      "theme": "visitor-management",
      "label": "Visitor Management",
      "articles": 4,
      "read": 2,
      "confirmed": 0
    }
  ],
  "confirmed": [
    {
      "rank": 1,
      "id": 19,
      "publisher": "learn.g2.com",
      "url": "https://learn.g2.com/best-whatsapp-marketing-software",
      "pageDate": "January 7, 2026",
      "pageDateLabel": "January 7, 2026",
      "articleRoute": "Route 1 - direct GET with a browser User-Agent (curl -sSL, Chrome 126 UA). Succeeded on first try; no further routes needed.",
      "occurrencesInPage": 1,
      "verdict": "stale-confirmed",
      "theme": "whatsapp-business",
      "label": "Whatsapp Business",
      "vendor": "Respond.io",
      "vendorSlug": "respond-io",
      "vendorHref": "/software/whatsapp-business/respond-io/",
      "quoted": 29,
      "quotedText": "respond.io: Best shared inbox for WhatsApp and multi-channel support Centralizes customer conversations from WhatsApp and other channels with workflow automation, routing, and team collaboration. (Pricing from $29/mo)",
      "quotedTextChars": 217,
      "vendorPrice": 79,
      "vendorPlan": "Starter (cheapest paid plan; next tiers Growth $159/mo and Advanced $279/mo annual, then quote-only Enterprise)",
      "vendorBasis": "USD per month in the page's default view, billed yearly at $948/yr. Billed monthly the same Starter plan is $99/month. Seat- and contact-metered on top: additional users from $12/month and Monthly Active Contact tiers priced separately; WhatsApp fees charged by Meta are not included.",
      "vendorUrl": "https://respond.io/pricing/",
      "vendorCheckUrl": "https://respond.io/pricing",
      "vendorRoute": "Route 1 - direct GET with a browser User-Agent (curl -sSL, Chrome 126 UA), HTTP 200, 923649 bytes. The page is Nuxt/Builder.io but ships the price cards server-rendered, plus schema.org offers and meta descriptions. An r.jina.ai cross-check returned HTTP 403 and was not required.",
      "vendorAccess": "direct",
      "vendorAccessLabel": "Read on the vendor's own pricing page",
      "vendorAccessNote": "The vendor's pricing page served this figure to us directly.",
      "vendorFigureIsStanding": true,
      "vendorEvidence": "[A] Rendered pricing card, default view. The billing toggle defaults to Yearly: the served DOM carries role=\"switch\" aria-checked=\"true\" on the Yearly control, and the card config carries \"options\":[{\"value\":\"monthly\",\"title\":\"Monthly\"},{\"value\":\"yearly\",\"title\":\"Yearly (Save up to 20%)\"}],\"selectedIndexByDefault\":1. Card text as rendered:\nstarter $ 79 /month $1,188 $948/yr (billed yearly) Big wins for small teams: Manage conversations across all channels collaboratively and achieve your business goals.\n\n[B] Page meta description, og:description and twitter:description, all three identical:\nRespond.io offers 4 plans: Starter ($79/mo), Growth ($159/mo), Advanced ($279/mo) & Enterprise. Pay only for the contacts you talk to. Enjoy a free 7-day trial.\n\n[C] schema.org Product offers embedded in the page as application/ld+json, all six offers verbatim and untruncated:\n{\"@type\":\"Offer\",\"name\":\"Starter (Monthly)\",\"price\":\"99.00\",\"priceCurrency\":\"USD\",\"url\":\"https://respond.io/pricing\",\"priceSpecification\":{\"@type\":\"UnitPriceSpecification\",\"price\":\"99.00\",\"priceCurrency\":\"USD\",\"billingDuration\":\"P1M\"}},{\"@type\":\"Offer\",\"name\":\"Growth (Monthly)\",\"price\":\"199.00\",\"priceCurrency\":\"USD\",\"url\":\"https://respond.io/pricing\",\"priceSpecification\":{\"@type\":\"UnitPriceSpecification\",\"price\":\"199.00\",\"priceCurrency\":\"USD\",\"billingDuration\":\"P1M\"}},{\"@type\":\"Offer\",\"name\":\"Advanced (Monthly)\",\"price\":\"349.00\",\"priceCurrency\":\"USD\",\"url\":\"https://respond.io/pricing\",\"priceSpecification\":{\"@type\":\"UnitPriceSpecification\",\"price\":\"349.00\",\"priceCurrency\":\"USD\",\"billingDuration\":\"P1M\"}},{\"@type\":\"Offer\",\"name\":\"Starter (Yearly)\",\"price\":\"79.00\",\"priceCurrency\":\"USD\",\"url\":\"https://respond.io/pricing\",\"priceSpecification\":{\"@type\":\"UnitPriceSpecification\",\"price\":\"948.00\",\"priceCurrency\":\"USD\",\"billingDuration\":\"P1Y\"}},{\"@type\":\"Offer\",\"name\":\"Growth (Yearly)\",\"price\":\"159.00\",\"priceCurrency\":\"USD\",\"url\":\"https://respond.io/pricing\",\"priceSpecification\":{\"@type\":\"UnitPriceSpecification\",\"price\":\"1908.00\",\"priceCurrency\":\"USD\",\"billingDuration\":\"P1Y\"}},{\"@type\":\"Offer\",\"name\":\"Advanced (Yearly)\",\"price\":\"279.00\",\"priceCurrency\":\"USD\",\"url\":\"https://respond.io/pricing\",\"priceSpecification\":{\"@type\":\"UnitPriceSpecification\",\"price\":\"3348.00\",\"priceCurrency\":\"USD\",\"billingDuration\":\"P1Y\"}}\n\n[D] Lowest paid tier on the page is Starter. There is no $29 tier and no plan below $79/mo on any billing basis. Enterprise is quote-only. No free plan is offered, only a 7-day free trial of the Growth plan.",
      "vendorEvidenceChars": 2508,
      "ourPrice": 79,
      "ourPlan": "Starter",
      "ourAccessedAt": "2026-09-03",
      "checks": 3,
      "agreeing": 3,
      "baselineExceptionReason": "",
      "gapUsd": 50,
      "gapPct": 172.4,
      "direction": "higher"
    },
    {
      "rank": 2,
      "id": 16,
      "publisher": "softwareadvice.com",
      "url": "https://www.softwareadvice.com/crm/",
      "pageDate": "Updated September 3, 2026",
      "pageDateLabel": "Updated September 3, 2026",
      "articleRoute": "Headful Chrome 152 (real browser, fresh profile) driven over the DevTools Protocol; the served document body captured with Network.getResponseBody, plus the post-hydration DOM via Runtime.evaluate. Prior routes, in order, all failed: (1) curl with a browser User-Agent -> HTTP 403 (5,617-byte body, unrelated content); (2) curl with a full browser header set (Accept, Accept-Language, Sec-Ch-Ua, Sec-Fetch-*, Upgrade-Insecure-Requests, --compressed) -> HTTP 403 on 2026-09-06, Cloudflare \"Just a moment...\" interstitial; (3) r.jina.ai text reader -> HTTP 403, Cloudflare interstitial passed through; (4) headless Chrome --headless=new --dump-dom -> Cloudflare interstitial (title \"Один момент…\"), 29,046 bytes, zero occurrences of \"Copper\". Only the headful-Chrome route returned the real page. A same-origin programmatic fetch() from inside the already-loaded page also returned 403, so the browser navigation is the only route that yields the bytes. Re-tried on 2026-09-07: route (2), curl with that same full browser header set, returned HTTP 200 and the real article. So the 403 above is what that route returned on 2026-09-06, the day this row was read — not a standing property of the route. The row's reading stands on the headful-Chrome capture recorded here; the edge's answer to a plain request is not stable from one day to the next, which is why the route is recorded with its date rather than as a fact about the site.",
      "occurrencesInPage": 1,
      "verdict": "stale-confirmed",
      "theme": "crm-software",
      "label": "CRM Software",
      "vendor": "Copper CRM",
      "vendorSlug": "copper",
      "vendorHref": "/software/crm-software/copper/",
      "quoted": 12,
      "quotedText": "Copper4.4 (622 reviews)Learn MoreCompareLearn MoreCompareAverage score:80/100Average Score:80/100Pros: seamless gmail and google workspace integration intuitive and user-friendly interfaceCons: poor customer support responsiveness insufficient customization optionsPricing:Starting at $12.00 per month",
      "quotedTextChars": 301,
      "vendorPrice": 23,
      "vendorPlan": "Basic",
      "vendorBasis": "USD, per seat, per month, paid annually (Copper's default-displayed Annual tab; $29 per seat, per month on month-to-month billing, shown struck through on the annual card). Excludes taxes and fees. Copper's entry tier is named \"Basic\"; there is no plan called \"Starter\".",
      "vendorUrl": "https://www.copper.com/pricing",
      "vendorCheckUrl": "https://www.copper.com/pricing",
      "vendorRoute": "Direct curl with a browser User-Agent -> HTTP 200, 704,697 bytes (no challenge, no JS needed; the prices are present in the served HTML). Independently re-fetched through the same headful Chrome/CDP setup: HTTP 200, served body byte-identical at 704,697 bytes (content-type text/html; charset=utf-8, last-modified Fri, 04 Sep 2026 01:20:38 GMT), and the rendered DOM confirms the visible figures.",
      "vendorAccess": "direct",
      "vendorAccessLabel": "Read on the vendor's own pricing page",
      "vendorAccessNote": "The vendor's pricing page served this figure to us directly.",
      "vendorFigureIsStanding": true,
      "vendorEvidence": "https://www.copper.com/pricing - plan cards, rendered text, untruncated. The page opens on the Annual tab (w--tab-active); the toggle reads: Monthly | Annual | Up to 26% off 🎉\n\nANNUAL TAB (default, active):\nBasic\n$\n23\n$\n29\nper seat, per month\npaid annually\nOptimize your processes with flexible pipelines and team collaboration features.\nTry free\nWhat's included:\n2,500 contact limit\nTask automation\nPipelines\nProject Management\nContact enrichment\nProfessional\n$\n59\n$\n69\nper seat, per month\npaid annually\nScale your business with revenue tracking tools, workflows and bulk email.\nTry free\nEverything in Basic, plus:\n15,000 contact limit\nWorkflow automation\nBulk email\nReporting\nIntegrations\n63% started off with Professional\nBusiness\n$\n99\n$\n134\nper seat, per month\npaid annually\nElevate your business with customer nurture, custom analytics and unlimited usage.\nTry free\nEverything in Professional, plus:\nUnlimited contacts\nEmail series\nCustom reports\nMulti-currency\nPremium support\n\nMONTHLY TAB:\nBasic\n$\n29\nper seat, per month\nOptimize your processes with flexible pipelines and team collaboration features.\nTry Free\nWhat's included:\n2,500 contact limit\nTask automation\nPipelines\nProject Management\nContact enrichment\nProfessional\n$\n69\nper seat, per month\nScale your business with revenue tracking tools, workflows and bulk email.\nTry Free\nEverything in Basic, plus:\n15,000 contact limit\nWorkflow automation\nBulk email\nReporting\nIntegrations\n63% started off with Professional\nBusiness\n$\n134\nper seat, per month\nElevate your business with customer nurture, custom analytics and unlimited usage.\nTry Free\nEverything in Professional, plus:\nUnlimited contacts\nEmail series\nCustom reports\nMulti-currency\nPremium support\n\nFootnote below the cards: \"Prices are in USD and don't include taxes and fees where applicable.\"\n\nUnderlying markup for the entry tier (raw served bytes, verbatim):\n<div class=\"pricing_plan_title-text\">Basic</div><div class=\"pricing_plan_price-wrap\"><div class=\"pricing_plan_price-sub-wrap\"><div class=\"pricing_plan_title-text text-color-accent\">$</div><div class=\"pricing_plan_title-text text-color-accent\">23</div></div><div class=\"pricing_plan_price-sub-wrap\"><div class=\"pricing_plan_title-text text-style-muted text-style-strikethrough\">$</div><div class=\"pricing_plan_title-text text-style-muted text-style-strikethrough\">29</div></div></div></div><div class=\"pricing_plan_sub-text-wrap\"><div class=\"text-size-tiny text-style-muted\">per seat, per month</div><div class=\"text-size-tiny text-style-muted\">paid annually</div></div>\n\nAbsent from the page (byte-level counts over the 704,697-byte served document): \"Starter\" = 0, \"$12\" = 0, \"limited time\" = 0, \"coupon\" = 0, \"discount\" = 0. The only \"% off\" string on the page is the annual-tab callout \"Up to 26% off 🎉\", which is the standing annual-vs-monthly saving (134 -> 99 = 26%), not a dated promotion.",
      "vendorEvidenceChars": 2880,
      "ourPrice": 23,
      "ourPlan": "Basic",
      "ourAccessedAt": "2026-09-02",
      "checks": 3,
      "agreeing": 3,
      "baselineExceptionReason": "",
      "gapUsd": 11,
      "gapPct": 91.7,
      "direction": "higher"
    },
    {
      "rank": 3,
      "id": 11,
      "publisher": "prismic.io",
      "url": "https://prismic.io/blog/the-12-best-landing-page-builders-detailed-comparison",
      "pageDate": "Published January 2, 2026",
      "pageDateLabel": "Published January 2, 2026",
      "articleRoute": "Route 1 (direct request, browser user agent): curl -L -A 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36' https://prismic.io/blog/the-12-best-landing-page-builders-detailed-comparison -- succeeded on the first attempt, no fallback needed. Raw bytes saved to article_11.html; server-rendered HTML, full article text present in the initial response.",
      "occurrencesInPage": 1,
      "verdict": "stale-confirmed",
      "theme": "landing-page-builders",
      "label": "Landing Page Builders",
      "vendor": "Unbounce",
      "vendorSlug": "unbounce",
      "vendorHref": "/software/landing-page-builders/unbounce/",
      "quoted": 99,
      "quotedText": "Pricing starts at $99/month, which is higher than some alternatives.",
      "quotedTextChars": 68,
      "vendorPrice": 29,
      "vendorPlan": "Starter (lowest paid tier). The $99/month figure under test is today the second tier, \"Build\". Unbounce has no plan named \"Launch\" any more -- the catalog's plan name is stale even though its $29 figure is not.",
      "vendorBasis": "Lowest paid tier (Starter), month-to-month billing, USD, list price, per month, excluding tax. The equivalent annual-billing rate is $22/month (\"Save 25% with yearly billing\"). Like-for-like on month-to-month billing, Unbounce's entry price is $29/month; $99/month is the month-to-month price of the Build tier, one step up.",
      "vendorUrl": "https://unbounce.com/pricing/",
      "vendorCheckUrl": "https://unbounce.com/pricing/",
      "vendorRoute": "Route 1 (direct request, browser user agent): curl -L with the same Chrome UA against https://unbounce.com/pricing/ -- HTTP 200, 562267 bytes, no fallback needed. Prices are present in the server-rendered HTML (both toggle states sit in the DOM) and additionally in the page's own schema.org SoftwareApplication JSON-LD.",
      "vendorAccess": "direct",
      "vendorAccessLabel": "Read on the vendor's own pricing page",
      "vendorAccessNote": "The vendor's pricing page served this figure to us directly.",
      "vendorFigureIsStanding": true,
      "vendorEvidence": "VISIBLE PRICING CARDS (unbounce.com/pricing/, monthly/yearly toggle; both values sit in the DOM). Toggle labels: \"Monthly\" / \"Yearly\" / \"Save 25% with yearly billing\".\nStarter -- \"Set up and launch your first landing pages\" -- \"$22 USD / month\" | \"$29 USD / month\" | \"Billed annually\" \"(Save 25%)\" -- What's included: Drag-and-drop builder; 5 pages; Traffic volume: up to 500; Users: 1; Root domains: 1; MCP server NEW; Lead gen forms; Free hosting; Phone, email, and live chat customer support.\nBuild -- \"Create unlimited landing pages quickly and easily\" -- \"$74 USD / month\" | \"$99 USD / month\" | \"Billed annually\" \"(Save 25%)\" -- All Starter plan features plus: Custom scripts and pixels; Unlimited pages; Traffic volume: up to 20k; Users: 1; Root domains: 1; Popups and sticky bars; Multi-step forms; AI copywriting; Custom code and styling; 1000+ integrations.\nExperiment (MOST POPULAR) -- \"Perform A/B tests and optimize conversions\" -- \"$112 USD / month\" | \"$149 USD / month\" | \"Billed annually\" \"(Save 25%)\".\nOptimize -- \"$187 USD / month\" | \"$249 USD / month\" | \"Billed annually\" \"(Save 25%)\".\nConcierge -- \"Let's talk!\" / \"Get in touch for your custom pricing\" / \"Contact Sales\".\n\nSAME PAGE, schema.org SoftwareApplication \"offers\" (JSON-LD embedded in the same response), verbatim prices:\nStarter Plan (Monthly): 29.00 USD -- \"Set up and launch your first landing pages\"\nStarter Plan (Annual): 22.00 USD -- \"... Billed annually.\"\nBuild Plan (Monthly): 99.00 USD -- \"Create unlimited landing pages quickly and easily\"\nBuild Plan (Annual): 74.00 USD\nExperiment Plan (Monthly): 149.00 USD\nExperiment Plan (Annual): 112.00 USD\nOptimize Plan (Monthly): 249.00 USD\nOptimize Plan (Annual): 187.00 USD\n14-Day Free Trial: 0 USD\nEvery offer carries \"availability\":\"https://schema.org/InStock\" and \"priceValidUntil\":\"2027-09-02\".\n\nNO ACTIVE PROMOTION: every \"limited time\" / promo string on the page (a 20%-off badge image and a \"/promo-details/13-anniversary-offer/\" T&Cs link) sits inside HTML comments explicitly labelled \"Comment for promo offer\". Occurrences of \"limited time\" outside HTML comments: 0. The 25% yearly saving is a standing billing-term discount shown on every paid card, not a time-limited rate.\n\nNOTE: the CTA area also renders \"We're sorry, Unbounce is unavailable in your location\" -- a geo message attached to the signup button only. It does not gate or alter the prices, which render in full.",
      "vendorEvidenceChars": 2419,
      "ourPrice": 29,
      "ourPlan": "Starter",
      "ourAccessedAt": "2026-09-02",
      "checks": 3,
      "agreeing": 3,
      "baselineExceptionReason": "",
      "gapUsd": 70,
      "gapPct": 70.7,
      "direction": "lower"
    },
    {
      "rank": 4,
      "id": 20,
      "publisher": "guideflow.com",
      "url": "https://www.guideflow.com/blog/whatsapp-marketing-software",
      "pageDate": "August 31, 2026",
      "pageDateLabel": "August 31, 2026",
      "articleRoute": "Route 1 of 4 -- direct HTTPS GET via curl with a desktop Chrome user agent (Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36). Succeeded on the first attempt; no fallback to full header set, headless Chromium, or r.jina.ai was needed.",
      "occurrencesInPage": 1,
      "verdict": "stale-confirmed",
      "theme": "whatsapp-business",
      "label": "Whatsapp Business",
      "vendor": "Zoko",
      "vendorSlug": "zoko",
      "vendorHref": "/software/whatsapp-business/zoko/",
      "quoted": 34.99,
      "quotedText": "Pricing: Starts at $34.99/month.",
      "quotedTextChars": 32,
      "vendorPrice": 49.99,
      "vendorPlan": "STARTER (rendered as \"STARTER\" on the pricing card; named \"Starter\" in the page's own JSON-LD). It is the cheapest of Zoko's four plans and therefore the entry plan.",
      "vendorBasis": "Standing monthly list price of the entry (Starter) plan, in USD, quoted by the vendor as \"$49.99/mo\". Per-conversation charges ($0.015/conversation on Starter) and platform fees (e.g. Instagram $9.99/month) are billed on top and are not part of this figure. No annual/monthly billing toggle exists on the page, so this is the only published price for the plan. Same basis as the article's \"Starts at $34.99/month\": entry-plan monthly subscription fee.",
      "vendorUrl": "https://www.zoko.io/pricing",
      "vendorCheckUrl": "https://www.zoko.io/pricing",
      "vendorRoute": "Direct HTTPS GET via curl with a desktop Chrome user agent -- HTTP 200, 69,459 bytes, no redirect. The vendor page did not refuse any request, so no fallback route was required.",
      "vendorAccess": "direct",
      "vendorAccessLabel": "Read on the vendor's own pricing page",
      "vendorAccessNote": "The vendor's pricing page served this figure to us directly.",
      "vendorFigureIsStanding": true,
      "vendorEvidence": "Route: direct HTTPS GET to https://www.zoko.io/pricing with a desktop Chrome user agent. HTTP 200, 69,459 bytes, no redirect, server-rendered (Webflow); no JS rewrites the price nodes (the four \"zc2-price\" class occurrences all sit in markup, none in any script).\n\nA) The four rendered plan cards, in page order, as the page renders them:\nMAX\n$499.99/mo\nELITE\n$139.99/mo\nPLUS\n$79.99/mo\nSTARTER\n$49.99/mo\n\nThe STARTER card's markup, verbatim:\n<p class=\"zc2-plan-name\">STARTER</p><p class=\"zc2-price\">$49<span class=\"zc2-price-cents\">.99/mo</span></p>\n\nImmediately beneath it, still inside the STARTER card:\nCONVERSATIONS\nMarkup on all conversations\n$0.015/conversation\nCALLING\n500 minutes - no markup\n$0.005/min after that\nAGENTS\nAdd as many agents as you like, for free\nPLATFORM FEES\nFacebook: Free\nInstagram: $9.99/month\nWhatsApp: rate card\n\nB) The page's own schema.org JSON-LD, quoted in full and untruncated:\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"SoftwareApplication\",\n  \"applicationCategory\": \"BusinessApplication\",\n  \"description\": \"Predictable monthly WhatsApp pricing for Shopify brands, with plans that carry no markup on Meta's messaging rates. Compare Starter, Plus, Elite, and Max.\",\n  \"name\": \"Zoko\",\n  \"offers\": {\n    \"@type\": \"AggregateOffer\",\n    \"highPrice\": \"499.99\",\n    \"lowPrice\": \"49.99\",\n    \"offerCount\": 4,\n    \"offers\": [\n      {\n        \"@type\": \"Offer\",\n        \"name\": \"Starter\",\n        \"price\": \"49.99\",\n        \"priceCurrency\": \"USD\"\n      },\n      {\n        \"@type\": \"Offer\",\n        \"name\": \"Plus\",\n        \"price\": \"79.99\",\n        \"priceCurrency\": \"USD\"\n      },\n      {\n        \"@type\": \"Offer\",\n        \"name\": \"Elite\",\n        \"price\": \"139.99\",\n        \"priceCurrency\": \"USD\"\n      },\n      {\n        \"@type\": \"Offer\",\n        \"name\": \"Max\",\n        \"price\": \"499.99\",\n        \"priceCurrency\": \"USD\"\n      }\n    ],\n    \"priceCurrency\": \"USD\"\n  },\n  \"operatingSystem\": \"Web Browser\",\n  \"provider\": {\n    \"@type\": \"Organization\",\n    \"name\": \"Zoko\",\n    \"url\": \"https://www.zoko.io\"\n  },\n  \"url\": \"https://www.zoko.io/pricing\"\n}\n\nC) Absence check on the vendor page: the string \"34.99\" occurs 0 times in the 69,459 raw bytes, and 0 times in the normalised text. \"49.99\" is the page's lowPrice.\n\nD) Terms surrounding the figure, quoted verbatim:\n\"7-day Free Trial\"\n\"No Contracts  •  Cancel anytime\"\n\"What discounts are available?\"\n\"We offer a discounted price for brands that have annual committed messaging volumes of 250K conversations or more per month. Please contact us for more information.\"\nThere is no monthly/annual billing toggle on the page: the words \"annual\" and \"monthly\" appear only in the FAQ text quoted above and in \"See your exact monthly cost in seconds.\" No introductory, first-month, or promotional rate is offered anywhere on the page.",
      "vendorEvidenceChars": 2807,
      "ourPrice": 49.99,
      "ourPlan": "Starter",
      "ourAccessedAt": "2026-09-03",
      "checks": 3,
      "agreeing": 3,
      "baselineExceptionReason": "",
      "gapUsd": 15,
      "gapPct": 42.9,
      "direction": "higher"
    },
    {
      "rank": 5,
      "id": 18,
      "publisher": "techradar.com",
      "url": "https://www.techradar.com/best/the-best-crm-software",
      "pageDate": "12 January 2026",
      "pageDateLabel": "12 January 2026",
      "articleRoute": "Route 1 of 4 succeeded: direct GET via curl 8.11.0 with a Chrome 128 browser user agent and --compressed. No further article routes were needed.",
      "occurrencesInPage": 1,
      "verdict": "stale-confirmed",
      "theme": "crm-software",
      "label": "CRM Software",
      "vendor": "Pipedrive",
      "vendorSlug": "pipedrive",
      "vendorHref": "/software/crm-software/pipedrive/",
      "quoted": 10,
      "quotedText": "Besides, Pipedrive is one of the most affordable CRM tools, starting at just $10 per user per month, compared to a rival like Salesforce which starts at $25 for the same period.",
      "quotedTextChars": 177,
      "vendorPrice": 14,
      "vendorPlan": "Lite",
      "vendorBasis": "USD per seat per month on the Lite plan billed annually (code lite_annual_v2; CA$ 19 / one payment of CA$ 228 per seat/year as rendered to the Canada-geolocated crawler). Month-to-month Lite is USD 24 per seat per month (lite_monthly_v2). Figure as of the 2026-08-27 capture, the most recent available; the live page is Cloudflare-blocked.",
      "vendorUrl": "https://www.pipedrive.com/en/pricing",
      "vendorCheckUrl": "https://web.archive.org/web/20260827062707/https://www.pipedrive.com/en/pricing",
      "vendorRoute": "All routes to the live page failed: (1) curl with browser UA -> HTTP 403 Cloudflare; (2) curl with full browser header set incl. sec-ch-ua/Sec-Fetch-* -> HTTP 403 Cloudflare; (3) headless Chromium --dump-dom -> served the Cloudflare 'Sorry, you have been blocked' interstitial; (4) r.jina.ai text reader -> HTTP 403 'Just a moment...' challenge; (5) WebFetch -> HTTP 403. Figure re-derived from the vendor's own page as archived by the Wayback Machine on 2026-08-27, both from the rendered Lite card and from the page's own embedded __NEXT_DATA__ pricingData block.",
      "vendorAccess": "refused",
      "vendorAccessLabel": "The vendor's page refused every route we tried",
      "vendorAccessNote": "Every route to the vendor's live pricing page was refused, so the figure could not be read there at all. It was read at the route below, which is the one a reader can use.",
      "vendorFigureIsStanding": true,
      "vendorEvidence": "Live https://www.pipedrive.com/en/pricing refused every route (Cloudflare 403). Evidence below is the vendor's own page, captured 2026-08-27 06:27:07 UTC, read at https://web.archive.org/web/20260827062707/https://www.pipedrive.com/en/pricing\n\n[1] Lite plan card, as the vendor page renders it (crawler geolocated to Canada, so the visible currency is CA$):\nLite Now with AI Organize your sales in one simple, intuitive workspace CA$ 19 One payment of CA$ 228 per seat/year Per seat per month, billed annually Try it free Free 14-day trial. No credit card required.\n\n[2] The USD figure comes from the same page's own embedded pricing data (script id=\"__NEXT_DATA__\", props.pageProps.pricingData.tiers.lite), quoted in full and unedited:\n{\n  \"year\": {\n    \"code\": \"lite_annual_v2\",\n    \"availableFrom\": \"2025-04-01 10:00:00\",\n    \"availableUntil\": null,\n    \"requiredFeatureSwitch\": null,\n    \"usd\": 14,\n    \"gbp\": 14,\n    \"eur\": 14,\n    \"aud\": 19,\n    \"cad\": 19\n  },\n  \"month\": {\n    \"code\": \"lite_monthly_v2\",\n    \"availableFrom\": \"2025-04-01 10:00:00\",\n    \"availableUntil\": null,\n    \"requiredFeatureSwitch\": null,\n    \"usd\": 24,\n    \"gbp\": 24,\n    \"eur\": 24,\n    \"aud\": 34,\n    \"cad\": 34\n  }\n}\n\n[3] Cross-check that this JSON drives the rendered card: cad=19 for lite/year matches the visible \"CA$ 19 ... Per seat per month, billed annually\".\n[4] Complete set of distinct USD values across all four tiers in that data: 14, 24, 39, 49, 59, 79, 99. There is no 10 in any currency; a regex for \"usd\": 10 returns zero matches. Pipedrive's four plans are Lite, Growth, Premium, Ultimate.\n[5] All eight availableUntil fields on the page are null, and pricingData contains no discount, promo, sale, offer or coupon key.",
      "vendorEvidenceChars": 1716,
      "ourPrice": 14,
      "ourPlan": "Lite",
      "ourAccessedAt": "2026-09-02",
      "checks": 4,
      "agreeing": 4,
      "baselineExceptionReason": "",
      "gapUsd": 4,
      "gapPct": 40,
      "direction": "higher"
    },
    {
      "rank": 6,
      "id": 22,
      "publisher": "guideflow.com",
      "url": "https://www.guideflow.com/blog/whatsapp-marketing-software",
      "pageDate": "August 31, 2026",
      "pageDateLabel": "August 31, 2026",
      "articleRoute": "Direct GET with a browser user agent (curl 8.11.0, Chrome 128 UA, --compressed, -L). First route tried, succeeded; no fallback needed.",
      "occurrencesInPage": 1,
      "verdict": "stale-confirmed",
      "theme": "whatsapp-business",
      "label": "Whatsapp Business",
      "vendor": "WATI",
      "vendorSlug": "wati",
      "vendorHref": "/software/whatsapp-business/wati/",
      "quoted": 49,
      "quotedText": "Pricing: Starts at $49/month for the Growth plan.",
      "quotedTextChars": 49,
      "vendorPrice": 59,
      "vendorPlan": "Growth (entry paid tier; tiers today are Growth / Pro / Business, with Growth the cheapest)",
      "vendorBasis": "USD, Growth plan, per month billed annually ($708.00/year, i.e. $59.00/mo) - the figure the pricing page shows by default, since the annual toggle is the default view. Month-to-month for the same plan is $69.00/mo, and quarterly is $207.00 per 3 months ($69.00/mo). List price, excluding the per-message WhatsApp conversation charges Wati bills separately on top of the plan for every tier.",
      "vendorUrl": "https://www.wati.io/pricing/",
      "vendorCheckUrl": "https://live-mt-server.wati.io/wati/api/v1/pricing/getPlansByGeo?countryCode=US",
      "vendorRoute": "Three routes run. (1) Direct GET with browser UA on https://www.wati.io/pricing/ -> HTTP 200, 700,186 bytes, but the price is NOT in those bytes: the plan price node ships empty and is filled client-side. (2) Headless Chromium render (chrome.exe --headless=new --virtual-time-budget=25000 --dump-dom) -> 752,352 bytes of rendered DOM, price present. (3) The public pricing API the page own jQuery calls, https://live-mt-server.wati.io/wati/api/v1/pricing/getPlansByGeo -> HTTP 200 JSON. The page hardcodes countryCode=DE, so it renders EUR regardless of visitor; the same endpoint with countryCode=US returns the USD plans that match the article currency.",
      "vendorAccess": "surrogate",
      "vendorAccessLabel": "The pricing page carries no price in its bytes",
      "vendorAccessNote": "The vendor's pricing page answered, but the figure is not in what it sends: the price nodes ship empty and are filled afterwards, or pricing is suppressed for our vantage point. The figure was read at the route below, which is the one a reader can use.",
      "vendorFigureIsStanding": true,
      "vendorEvidence": "RENDERED PAGE (headless Chromium, https://www.wati.io/pricing/, 2026-09-06) - Growth plan price nodes, verbatim DOM:\n<h2 class=\"h4 growth_plan_annual_api_pricing\"><strong class=\"\">€59</strong></h2> <span class=\"plan_pricing_tenure\">month <i>billed annually</i></span>\n<h2 class=\"h4 growth_plan_monthly_api_pricing\">€69</h2> <span class=\"plan_pricing_tenure\">month <i>billed monthly</i></span>\nRendered as text: \"Growth ... €59 month billed annually\" and \"Growth ... €69 month billed monthly\". (Currency is EUR because the page AJAX call hardcodes countryCode=DE for every visitor, not because of geo detection.)\n\nSTATIC PAGE BYTES - the same node before JS, showing why the raw HTML carries no number:\n<h2 class=\"h4 growth_plan_annual_api_pricing\"><strong class=\"\"></strong></h2>\n          <span class=\"plan_pricing_tenure\">month <i>billed annually</i></span>\n\nPRICING API (https://live-mt-server.wati.io/wati/api/v1/pricing/getPlansByGeo?countryCode=US, HTTP 200, 89,971 bytes) - every Growth record returned, untruncated, price is in minor units:\n{\"name\":\"Growth Plan USD Yearly WEST\",\"externalPlanId\":\"Growth-Plan-USD-Yearly-WEST\",\"price\":70800,\"currencyCode\":\"USD\",\"period\":1,\"periodUnit\":4}\n{\"name\":\"Growth Plan USD Monthly WEST\",\"externalPlanId\":\"Growth-Plan-USD-Monthly-WEST\",\"price\":6900,\"currencyCode\":\"USD\",\"period\":1,\"periodUnit\":3}\n{\"name\":\"Growth Plan USD Every 3 months WEST\",\"externalPlanId\":\"Growth-Plan-USD-Every-3-months-WEST\",\"price\":20700,\"currencyCode\":\"USD\",\"period\":3,\"periodUnit\":3}\nArithmetic, using the page own formula (item.price/100/12 for yearly): 70800/100/12 = $59.00 per month billed annually; 6900/100 = $69.00 per month billed monthly; 20700/100/3 = $69.00 per month billed quarterly.\n\nPRICING API (countryCode=DE, the exact URL the page itself requests, HTTP 200, 88,385 bytes) - Growth records, untruncated:\n{\"name\":\"Growth Plan EUR Yearly WEST\",\"externalPlanId\":\"Growth-Plan-EUR-Yearly-WEST\",\"price\":70800,\"currencyCode\":\"EUR\",\"period\":1,\"periodUnit\":4}\n{\"name\":\"Growth Plan EUR Monthly WEST\",\"externalPlanId\":\"Growth-Plan-EUR-Monthly-WEST\",\"price\":6900,\"currencyCode\":\"EUR\",\"period\":1,\"periodUnit\":3}\n{\"name\":\"Growth Plan EUR Every 3 months WEST\",\"externalPlanId\":\"Growth-Plan-EUR-Every-3-months-WEST\",\"price\":20700,\"currencyCode\":\"EUR\",\"period\":3,\"periodUnit\":3}\n\nABSENCE CHECK: no price of 49 occurs anywhere in the rendered pricing page (77,612 characters of normalised rendered text; zero matches for a euro-49, dollar-49, or standalone 49). The only discount language on the page is the ordinary annual-term saving (\"Save up to 10%\", \"Save up to 25%\", \"Up to ~25% off\") and a \"7 days free trial\"; there is no introductory or time-limited rate attached to the Growth plan.",
      "vendorEvidenceChars": 2715,
      "ourPrice": 59,
      "ourPlan": "Growth",
      "ourAccessedAt": "2026-09-03",
      "checks": 3,
      "agreeing": 3,
      "baselineExceptionReason": "",
      "gapUsd": 10,
      "gapPct": 20.4,
      "direction": "higher"
    },
    {
      "rank": 7,
      "id": 25,
      "publisher": "learn.g2.com",
      "url": "https://learn.g2.com/best-whatsapp-marketing-software",
      "pageDate": "January 7, 2026",
      "pageDateLabel": "January 7, 2026",
      "articleRoute": "Route 1 succeeded: direct curl request with a browser user agent (Chrome 128 UA), --compressed, redirects followed. No fallback needed - no full header set, headless render or text reader was used for the article.",
      "occurrencesInPage": 1,
      "verdict": "stale-confirmed",
      "theme": "whatsapp-business",
      "label": "Whatsapp Business",
      "vendor": "WATI",
      "vendorSlug": "wati",
      "vendorHref": "/software/whatsapp-business/wati/",
      "quoted": 49,
      "quotedText": "Wati: Best WhatsApp marketing tool for SMB automation Offers easy WhatsApp Business API access, automated replies, broadcasts, and team support tools designed for small and midsize businesses. (Pricing from ~$49/mo)",
      "quotedTextChars": 215,
      "vendorPrice": 59,
      "vendorPlan": "Growth - Wati's entry paid plan (the tiers are Growth / Pro / Business; there is no cheaper tier)",
      "vendorBasis": "USD per month, entry plan, billed annually: $59/month ($708/year, Growth-Plan-USD-Yearly-WEST). Billed monthly the same plan is $69/month (Growth-Plan-USD-Monthly-WEST, 6900 minor units); quarterly is $207 per quarter, also $69/month. The pricing page opens on the Annual tab, so $59 is the figure a visitor sees first. Excludes WhatsApp per-message charges, which Wati bills on top ('Additional charges apply for messages').",
      "vendorUrl": "https://www.wati.io/pricing/",
      "vendorCheckUrl": "https://live-mt-server.wati.io/wati/api/v1/pricing/getPlansByGeo?countryCode=US",
      "vendorRoute": "https://www.wati.io/pricing/ returned HTTP 200 to a plain curl with a browser UA (700,187 bytes decoded), but it ships its price nodes empty and fills them from a pricing API at runtime. Confirmed two further ways: a headless Chromium render (--headless=new --dump-dom, HTTP 200, 752,351 byte DOM) which paints the figures, and a direct HTTP 200 call to that same public pricing API for the US catalogue.",
      "vendorAccess": "surrogate",
      "vendorAccessLabel": "The pricing page carries no price in its bytes",
      "vendorAccessNote": "The vendor's pricing page answered, but the figure is not in what it sends: the price nodes ship empty and are filled afterwards, or pricing is suppressed for our vantage point. The figure was read at the route below, which is the one a reader can use.",
      "vendorFigureIsStanding": true,
      "vendorEvidence": "ROUTE A - headless Chromium render of https://www.wati.io/pricing/ (--headless=new --dump-dom --virtual-time-budget=25000, browser UA; HTTP 200; rendered DOM 752,351 bytes). The three plan cards are Growth / Pro / Business; Growth is the entry paid plan. The Growth price nodes, quoted untruncated exactly as they stand in the rendered DOM:\n  <h2 class=\"h4\"><strong>Growth</strong></h2>\n  <h2 class=\"h4 growth_plan_annual_api_pricing\"><strong class=\"\">€59</strong></h2>\n  <span class=\"plan_pricing_tenure\">month <i>billed annually</i></span>\n  <h2 class=\"h4 growth_plan_monthly_api_pricing\">€69</h2>\n  <span class=\"plan_pricing_tenure\">month <i>billed monthly</i></span>\nAs visible text: \"Growth ... €59 month billed annually\" and \"Growth ... €69 month billed monthly\". The currency is EUR because the fetching IP is in Europe: the page injects const __WATI_GEO_CONTINENT=\"EU\"; and its pricing AJAX call is url: 'https://live-mt-server.wati.io/wati/api/v1/pricing/getPlansByGeo?countryCode=DE'.\n\nROUTE B - the same public pricing API the page itself calls, asked for the US catalogue: GET https://live-mt-server.wati.io/wati/api/v1/pricing/getPlansByGeo?countryCode=US (HTTP 200, 89,448 bytes). All three GROWTH rows it returns, untruncated except for each row's long \"features\" array, which carries no plan price (full JSON saved at C:\\Users\\20012\\AppData\\Local\\Temp\\claude\\c--Users-20012-Documents-GitHub-bashka-billing\\0e7f03b8-e30a-4a24-9995-acf2bb900b21\\scratchpad\\study-verbatim\\wati_api_us.json):\n  {\"id\":\"fb648a00-37c7-455c-9ffe-abdf692a2791\",\"name\":\"Growth Plan USD Yearly WEST\",\"isActive\":true,\"externalPlanId\":\"Growth-Plan-USD-Yearly-WEST\",\"planFamilyId\":\"52bcba07-67e4-4073-8719-fd1e9516d7af\",\"price\":70800,\"period\":1,\"periodUnit\":4,\"displayName\":\"Growth Plan\",\"features\":[...]}\n  {\"id\":\"51c8f7b8-e56e-41f7-8c60-e17490e1270e\",\"name\":\"Growth Plan USD Monthly WEST\",\"isActive\":true,\"externalPlanId\":\"Growth-Plan-USD-Monthly-WEST\",\"planFamilyId\":\"52bcba07-67e4-4073-8719-fd1e9516d7af\",\"price\":6900,\"period\":1,\"periodUnit\":3,\"displayName\":\"Growth Plan\",\"features\":[...]}\n  {\"id\":\"59d66889-8399-4176-ac95-9f483a64595f\",\"name\":\"Growth Plan USD Every 3 months WEST\",\"isActive\":true,\"externalPlanId\":\"Growth-Plan-USD-Every-3-months-WEST\",\"planFamilyId\":\"52bcba07-67e4-4073-8719-fd1e9516d7af\",\"price\":20700,\"period\":3,\"periodUnit\":3,\"displayName\":\"Growth Plan\",\"features\":[...]}\nprice is in minor units; periodUnit 3 = month, 4 = year. The page's own arithmetic, quoted from its inline script, is $(\".growth_plan_annual_api_pricing strong\").html(currencies[item.currencyCode]+\"\"+item.price/100/12); and $(\".growth_plan_monthly_api_pricing\").html(currencies[item.currencyCode]+\"\"+item.price/100); - so 70800/100/12 = 59 and 6900/100 = 69. The US catalogue therefore prints the same numerals the render shows in EUR: $59/month billed annually, $69/month billed monthly, $207 per quarter (= $69/month).\n\nROUTE C - static HTML of https://www.wati.io/pricing/ (curl, browser UA, HTTP 200, 700,187 bytes decoded). It ships the price nodes EMPTY - <h2 class=\"h4 growth_plan_annual_api_pricing\"><strong class=\"\"></strong></h2> - alongside the comment <!-- Datas for this div coming from pricing API-->, which is why the API above is the citable route for a reader.\n\nNo cheaper tier exists: the catalogue returns only GROWTH, PRO and BUSINESS, and the rendered plan headings are Growth / Pro / Business. Every other currency figure on the page is an add-on or a per-extra-user rate (Additional Users @ €39/user/month on Pro, €89 on Business, $4.99/month Shopify add-on, $50/one-time custom subdomain).",
      "vendorEvidenceChars": 3595,
      "ourPrice": 59,
      "ourPlan": "Growth",
      "ourAccessedAt": "2026-09-03",
      "checks": 4,
      "agreeing": 3,
      "baselineExceptionReason": "",
      "gapUsd": 10,
      "gapPct": 20.4,
      "direction": "higher"
    },
    {
      "rank": 8,
      "id": 6,
      "publisher": "mailtrap.io",
      "url": "https://mailtrap.io/blog/email-hosting-providers/",
      "pageDate": "On November 12, 2025",
      "pageDateLabel": "On November 12, 2025",
      "articleRoute": "Route 1 of 4: direct curl request with a browser user agent (Chrome 127). No fallback needed - the full document returned on the first attempt.",
      "occurrencesInPage": 1,
      "verdict": "stale-confirmed",
      "theme": "email-hosting",
      "label": "Email Hosting",
      "vendor": "Google Workspace",
      "vendorSlug": "google-workspace",
      "vendorHref": "/software/email-hosting/google-workspace/",
      "quoted": 6,
      "quotedText": "Google Workspace offers a 14-day trial for new users, allowing up to 10 team members. The paid plan starts at $6 per person and includes 30 GB of cloud storage per person and up to 30 alias addresses. The Enterprise plan, which provides 5 TB of storage per user with the option to request more, is available upon request.",
      "quotedTextChars": 321,
      "vendorPrice": 7,
      "vendorPlan": "Business Starter (card labelled \"Starter\"; the page's own footnote calls it \"Business Starter\")",
      "vendorBasis": "USD, per user / month, Annual plan with a 1 year commitment (page toggle: \"Annual (Save 16% with 1 year commitment)\"). This is the cheapest standing entry rate; Flexible month-to-month billing is higher. A 30%-off-for-3-months promotion ($4.90, Sep 16 to Dec 16, 2026) was running at time of check and is excluded from the standing figure.",
      "vendorUrl": "https://workspace.google.com/pricing",
      "vendorCheckUrl": "https://web.archive.org/web/20260903022406/https://workspace.google.com/pricing",
      "vendorRoute": "The live vendor page was reached on every route but carries no price in its bytes on any of them. (1) curl with a browser user agent to https://workspace.google.com/pricing -> HTTP 200, 1,012,729 bytes, zero '$' price tokens and zero USD amounts; the plan names appear only in footnote prose. (2) curl with a full browser header set including Accept-Language: en-US, against https://workspace.google.com/intl/en_us/pricing.html , https://workspace.google.com/pricing.html?hl=en and https://workspace.google.com/intl/en_us/pricing.html?feature=meet -> all HTTP 200, all redirect back to the same JS application, all zero price tokens. (3) headless Chromium render -> HTTP 200 and the page renders, but the Starter/Standard/Plus price cards render with no numbers at all: the page prints literally \"All plans billed monthly, all prices $\" with the amount missing, and its region selector resolves to Russia, where Google does not sell Workspace, so pricing is suppressed for this vantage point. (4) r.jina.ai text reader -> HTTP 403, now gated. (5) WebFetch from a separate egress -> returned the page but likewise reported no numeric prices, confirming the figures are injected client-side and are absent from the document itself. Because the figure is not retrievable from here, it was re-derived from the Internet Archive's US-vantage renders of the same URL, which do contain the rendered price cards. Two independent captures were read and they agree on the standing figure.",
      "vendorAccess": "surrogate",
      "vendorAccessLabel": "The pricing page carries no price in its bytes",
      "vendorAccessNote": "The vendor's pricing page answered, but the figure is not in what it sends: the price nodes ship empty and are filled afterwards, or pricing is suppressed for our vantage point. The figure was read at the route below, which is the one a reader can use.",
      "vendorFigureIsStanding": true,
      "vendorEvidence": "Google Workspace pricing page, Business Starter card, archived US render of 2026-09-03 02:24:06 UTC (text extracted as the page renders it; entities decoded, U+00A0 mapped to space):\n\nStarter\n30% off for 3 months\nhelp\n30% off for 3 months\nhelp\nDiscount details\nSep 16, 2026 – Dec 16, 2026\n$4.90 USD\n$7.00\n(30% off)\nper user / month for all users\nStarting Dec 16, 2026\n$7.00 USD\nper user / month for all users\n$4.90\n$7\n**\n/ user per month\nStart a trial\nStarter includes:\n30 GB\npooled storage per person*\n\nToggle state above the cards: \"Annual (Save 16% with 1 year commitment)\".\n\nFootnote on the same page: \"Business Starter, Business Standard, and Business Plus plans can be purchased for a maximum of 300 users. There is no minimum or maximum user limit for Enterprise plans. Google Workspace customers may have access to additional features for a limited promotional period.\"\n\nSibling cards in the same render: Standard shows \"$7.00 USD / $14.00 / (50% off)\" then \"Starting Dec 16, 2026 / $14.00 USD / per user / month for all users\"; Plus standing $22.00.\n\nCross-check against an independent earlier capture, 2026-09-01 05:07:03 UTC (https://web.archive.org/web/20260901050703/https://workspace.google.com/pricing):\n\nStarter\n50% off for 3 months\nDiscount details\nSep 14, 2026 – Dec 14, 2026\n$3.50 USD\n$7.00\n(50% off)\nper user / month for all users\nStarting Dec 14, 2026\n$7.00 USD\nper user / month for all users\n\nThe discounted figure moved between captures ($3.50 at 50% off, then $4.90 at 30% off) while $7.00 held in both. That is what marks $7.00 as the standing rate and the lower numbers as promotional.",
      "vendorEvidenceChars": 1611,
      "ourPrice": 7,
      "ourPlan": "Business Starter",
      "ourAccessedAt": "2026-09-02",
      "checks": 5,
      "agreeing": 3,
      "baselineExceptionReason": "",
      "gapUsd": 1,
      "gapPct": 16.7,
      "direction": "higher"
    },
    {
      "rank": 9,
      "id": 8,
      "publisher": "serveravatar.com",
      "url": "https://serveravatar.com/budget-friendly-cloud-vps/",
      "pageDate": "Published: 16 August 2025 Last Updated: 26 February 2026",
      "pageDateLabel": "Published: 16 August 2025 Last Updated: 26 February 2026",
      "articleRoute": "Route 1 - direct curl with a browser user agent (Chrome 126 UA), no redirect; HTTP 200",
      "occurrencesInPage": 1,
      "verdict": "stale-confirmed",
      "theme": "vps-hosting",
      "label": "Vps Hosting",
      "vendor": "Vultr",
      "vendorSlug": "vultr",
      "vendorHref": "/software/vps-hosting/vultr/",
      "quoted": 6,
      "quotedText": "3. Vultr Vultr is known for having a simple pricing system and servers all around the world. It has more than 30 data centers throughout the world, so it’s great for projects that demand low-latency performance for a global audience. Benefits: Hourly or monthly billing options High-frequency compute instances for faster performance One-click app deployment (WordPress, Docker, etc.) Automatic backups and snapshots Why It’s Popular:Developers like Vultr because they can pay for it in a lot of different ways and choose from a lot of server locations. It works well for businesses because it is reliable and easy to grow. Pricing (2025): Starts at $6/month for 1 vCPU, 1 GB RAM, 25 GB SSD, and 1 TB bandwidth.",
      "quotedTextChars": 711,
      "vendorPrice": 5,
      "vendorPlan": "Cloud Compute - Regular Performance, 1 vCPU / 1 GB (plan id vc2-1c-1gb): 1 vCPU, 1 GB memory, 25 GB SSD, 1.00 TB bandwidth",
      "vendorBasis": "Monthly on-demand list price in USD, per Vultr's public pricing table and public plans API (monthly_cost 5, hourly_cost 0.007, invoice_type \"monthly\", deploy_ondemand true). Standard rate, not promotional; identical preemptible price. Regional variation exists per Vultr's own FAQ - $5.00/mo in 30 of 31 listed regions, Sao Paulo $7.50/mo.",
      "vendorUrl": "https://www.vultr.com/pricing/",
      "vendorCheckUrl": "https://api.vultr.com/v2/plans?type=vc2&per_page=100",
      "vendorRoute": "Route 1 (browser UA only) refused with HTTP 403; Route 2 - curl with full browser header set (Accept, Accept-Language, Sec-Ch-Ua, Sec-Fetch-*, Upgrade-Insecure-Requests) and --compressed - returned HTTP 200, 125567 bytes on the wire / 1400201 decoded. WebFetch and r.jina.ai both refused (403 / bot interstitial). Corroborated via Vultr's unauthenticated public plans API, HTTP 200.",
      "vendorAccess": "direct",
      "vendorAccessLabel": "Read on the vendor's own pricing page",
      "vendorAccessNote": "The vendor's pricing page served this figure to us directly.",
      "vendorFigureIsStanding": true,
      "vendorEvidence": "https://www.vultr.com/pricing/ -> Cloud Compute -> subsection \"Regular Performance\" (\"Powered by previous generation Intel CPUs and regular SSD.\"). Table header rendered as: vCPUs | Memory | Bandwidth | Storage | Monthly Price | Hourly Price. Rows rendered in that table, in order: \"1 vCPU | 0.5 GB Memory | 0.50 TB Bandwidth | 10 GB Storage | $2.50 /mo | $0.004 /hr IPv6 Only\"; \"1 vCPU | 0.5 GB Memory | 0.50 TB Bandwidth | 10 GB Storage | $3.50 /mo | $0.005 /hr\"; \"1 vCPU | 1 GB Memory | 1.00 TB Bandwidth | 25 GB Storage | $5.00 /mo | $0.007 /hr\"; \"1 vCPU | 2 GB Memory | 2.00 TB Bandwidth | 55 GB Storage | $10.00 /mo | $0.015 /hr\". The row matching the article's stated spec (1 vCPU, 1 GB RAM, 25 GB SSD, 1 TB bandwidth) is the third: $5.00 /mo. $6.00 /mo does appear on the same page, but only for OTHER Cloud Compute tiers whose specs do not match the article's: High Performance (AMD Pricing and Intel Pricing tables) \"1 vCPU | 1 GB Memory | 2.00 TB Bandwidth | 25 GB Storage | $6.00 /mo | $0.009 /hr\" (2 TB bandwidth, not 1 TB), and High Frequency \"1 vCPU | 1 GB Memory | 1.00 TB Bandwidth | 32 GB Storage | $6.00 /mo | $0.009 /hr\" (32 GB storage, not 25 GB). Corroborated independently by Vultr's unauthenticated public plans API, https://api.vultr.com/v2/plans?type=vc2&per_page=100 (HTTP 200), which returns for the Regular Performance family: {\"id\":\"vc2-1c-1gb\",\"vcpu_count\":1,\"ram\":1024,\"disk\":25,\"disk_type\":\"SSD\",\"disk_count\":1,\"bandwidth\":1024,\"monthly_cost\":5,\"hourly_cost\":0.007,\"monthly_cost_preemptible\":5,\"hourly_cost_preemptible\":0.007,\"invoice_type\":\"monthly\",\"type\":\"vc2\",\"cpu_vendor\":\"Intel\",\"storage_type\":\"local_storage\",\"vcpu_type\":\"thread\",\"deploy_ondemand\":true,\"deploy_preemptible\":false,\"locations\":[\"ewr\",\"ord\",\"dfw\",\"sea\",\"lax\",\"atl\",\"ams\",\"lhr\",\"fra\",\"sjc\",\"syd\",\"yto\",\"cdg\",\"nrt\",\"waw\",\"mad\",\"icn\",\"mia\",\"sgp\",\"sto\",\"mex\",\"sao\",\"mel\",\"bom\",\"jnb\",\"tlv\",\"blr\",\"del\",\"scl\",\"itm\",\"man\"],\"location_cost\":{\"sao\":{\"monthly_cost\":7.5,\"hourly_cost\":0.01,\"monthly_cost_preemptible\":7.5,\"hourly_cost_preemptible\":0.01}},\"gpu_brand\":\"none\"}. No promotional, introductory, trial, term-commitment or discount language attaches to this price anywhere on the pricing page; the only occurrence of the string \"Promo\" on the page is the footer navigation link \"Promotions\". The page does carry a standing FAQ caveat: \"At Vultr, we attempt to keep cloud pricing as consistent as possible globally. However, due to variation in regional costs (such as networking, hardware, labor, taxes, and fees), certain global data center locations may have different per hour and per month pricing for Vultr cloud services.\" Consistent with that, the API shows $5.00/mo in 30 of the 31 listed regions, with Sao Paulo (sao) the sole uplift at $7.50/mo.",
      "vendorEvidenceChars": 2755,
      "ourPrice": 5,
      "ourPlan": "Cloud Compute Regular — 1 GB",
      "ourAccessedAt": "2026-09-03",
      "checks": 5,
      "agreeing": 4,
      "baselineExceptionReason": "",
      "gapUsd": 1,
      "gapPct": 16.7,
      "direction": "lower"
    },
    {
      "rank": 10,
      "id": 17,
      "publisher": "mailtrap.io",
      "url": "https://mailtrap.io/blog/email-hosting-providers/",
      "pageDate": "On November 12, 2025",
      "pageDateLabel": "On November 12, 2025",
      "articleRoute": "Route 1 — direct curl, Chrome user agent (Mozilla/5.0 ... Chrome/125.0.0.0 Safari/537.36), --compressed, followed redirects. Succeeded on the first attempt; no fallback route needed.",
      "occurrencesInPage": 1,
      "verdict": "stale-confirmed",
      "theme": "email-hosting",
      "label": "Email Hosting",
      "vendor": "Microsoft 365 for Business",
      "vendorSlug": "microsoft-365-business",
      "vendorHref": "/software/email-hosting/microsoft-365-business/",
      "quoted": 6,
      "quotedText": "The starter plan costs $6 per user/month, offering 50 GB of email storage, 1 TB of OneDrive storage, and access to the suite of tools.",
      "quotedTextChars": 134,
      "vendorPrice": 7,
      "vendorPlan": "Microsoft 365 Business Basic",
      "vendorBasis": "USD, en-us storefront; $7.00 per user/month, paid yearly, on an annual subscription that auto-renews. Rendered from class 'oc-displayListPrice' (list price) with unit 'user/month, paid yearly'; no MSRP strikethrough and no discount block on this SKU. The page prints no monthly-billing alternative — all 13 unit spans read 'user/month, paid yearly'. Same per-user-per-month annual-commitment basis as the article's $6.",
      "vendorUrl": "https://www.microsoft.com/en-us/microsoft-365/business/microsoft-365-plans-and-pricing",
      "vendorCheckUrl": "https://www.microsoft.com/en-us/microsoft-365/business/compare-all-microsoft-365-business-products",
      "vendorRoute": "Route 3 — headless Chromium render (Chrome --headless=new --disable-gpu --no-sandbox --virtual-time-budget=30000 --dump-dom), 930,749-byte DOM. Route 1 (curl, browser UA) and Route 2 (curl, full browser header set incl. sec-ch-ua / Sec-Fetch-*) each returned an edge bot-block page: HTTP 200, 12,623 bytes, <title>Your request has been blocked</title>, 0 occurrences of 'Business Basic'. WebFetch timed out at 60s. Route 4 (r.jina.ai) returned HTTP 403 with a Cloudflare 'Just a moment...' interstitial.",
      "vendorAccess": "rendered",
      "vendorAccessLabel": "Served only to a rendered browser",
      "vendorAccessNote": "The vendor's pricing page refused plain requests and gave the figure up only to a full browser render. The link below is the address that render resolved to, which a reader with a browser can open.",
      "vendorFigureIsStanding": true,
      "vendorEvidence": "Rendered pricing card (headless Chromium DOM), untruncated as the page renders it:\nMicrosoft 365 Business Basic\nLightweight web and mobile apps to kickstart your business\n$7.00\nuser/month, paid yearly\n(Annual subscription–auto renews)1\n\nUnderlying markup for the same block, untruncated:\n<h2 class=\"oc-product-title\">  Microsoft 365 Business Basic  </h2> ... <div class=\"sku__pricing\" data-ocr-pricing-render=\"pricing\" aria-hidden=\"false\"> <div class=\"sku__pricing-current\"> <span class=\"oc-displayListPrice\">$7.00</span> </div> </div> <div class=\"sku__detail-recurrence\"> <span class=\"oc-displayUnit\">user/month, paid yearly</span> </div> <div class=\"sku__detail-commitment\"> <div data-oc-token-text=\"\"> (Annual subscription–auto renews)<sup><a class=\"ms-rte-link\" href=\"#footnote-1\" aria-label=\"Footnote 1\">1</a></sup> </div> </div>\n\nSecond, independent instance on the same page — the comparison-table column header, untruncated (note this instance uses an em dash where the card uses an en dash):\nMicrosoft 365 Business Basic\n$7.00\nuser/month, paid yearly\n(Annual subscription—auto renews)1\n\nEvery SKU card on the page, title -> printed list price -> unit:\nMicrosoft 365 Business Premium with Copilot -> $32.00 -> user/month, paid yearly\nMicrosoft 365 Business Standard with Copilot -> $23.50 -> user/month, paid yearly\nMicrosoft 365 Business Basic -> $7.00 -> user/month, paid yearly\nMicrosoft 365 Business Premium with Copilot (no Teams) -> $28.80 -> user/month, paid yearly\nMicrosoft 365 Business Standard with Copilot (no Teams) -> $20.30 -> user/month, paid yearly\nA separate SKU 'Microsoft 365 Business Basic (no Teams)' renders $5.40 user/month, paid yearly; that is the unbundled EEA/Swiss variant, not the plan the article describes.\n\nPromotional-markup check on the Business Basic block: the price carries class 'oc-displayListPrice' only. There is no 'sku__pricing-discount' div, no 'oc-displayMSRPPrice' strikethrough, and no 'limited time', '% off', 'introductory' or 'was $' string anywhere on the page. The one discount pair present ($21.00 struck to $18.00) sits inside an aria-hidden=\"true\" alternate render belonging to a Copilot-bearing SKU, and the only 'promotional' string on the page reads 'An annual commitment is required, and promotional pricing applies to the first year only' inside a footnote scoped to Microsoft 365 plans with Copilot. Neither touches Business Basic.\n\nOnly one billing basis is printed anywhere on the page: all 13 'oc-displayUnit' spans read 'user/month, paid yearly'; the string 'paid monthly' occurs zero times.",
      "vendorEvidenceChars": 2565,
      "ourPrice": 7,
      "ourPlan": "Business Basic",
      "ourAccessedAt": "2026-09-02",
      "checks": 3,
      "agreeing": 3,
      "baselineExceptionReason": "",
      "gapUsd": 1,
      "gapPct": 16.7,
      "direction": "higher"
    },
    {
      "rank": 11,
      "id": 21,
      "publisher": "techrepublic.com",
      "url": "https://www.techrepublic.com/article/best-business-email-providers/",
      "pageDate": "Aug 17, 2026",
      "pageDateLabel": "Aug 17, 2026",
      "articleRoute": "Route 1 succeeded: direct HTTPS GET via curl with a Chrome 127 browser user-agent and --compressed. HTTP 200, 66,075 bytes on the wire (gzip), 290,392 bytes decoded. No bot wall or captcha. Headless Chromium (gstack browse) was used additionally for one narrow purpose only: the byline date is injected client-side and is absent from the static bytes. The quotation itself was taken from the route-1 raw bytes.",
      "occurrencesInPage": 1,
      "verdict": "stale-confirmed",
      "theme": "email-hosting",
      "label": "Email Hosting",
      "vendor": "Microsoft 365 for Business",
      "vendorSlug": "microsoft-365-business",
      "vendorHref": "/software/email-hosting/microsoft-365-business/",
      "quoted": 6,
      "quotedText": "Microsoft 365 Business Basic: $7.20 per user per month or $6 per user per month with a one-year commitment",
      "quotedTextChars": 106,
      "vendorPrice": 7,
      "vendorPlan": "Microsoft 365 Business Basic",
      "vendorBasis": "USD per user/month on an annual commitment. The card states '$7.00 / user/month, paid yearly / (Annual subscription–auto renews)'. Every plan card on the page is quoted on this same paid-yearly basis; no month-to-month figure is displayed. This is the same basis the article uses for its $6 ('with a one-year commitment' / 'billed annually'), so the comparison is like-for-like.",
      "vendorUrl": "https://www.microsoft.com/en-us/licensing/news/2026-m365-packaging-pricing-updates",
      "vendorCheckUrl": "https://www.microsoft.com/en-us/microsoft-365/business/microsoft-365-plans-and-pricing",
      "vendorRoute": "Recorded pricing URL refuses non-browser requests. Route 1 (curl + browser UA) returned HTTP 200 but an Akamai interstitial titled 'Your request has been blocked. This could be due to several reasons.' (12,623 bytes, zero occurrences of 'Business Basic'). Route 2 (full Chrome header set: Accept, Accept-Language, sec-ch-ua, Sec-Fetch-*, Upgrade-Insecure-Requests) returned the identical 12,623-byte block page. Route 4 (r.jina.ai text reader) returned HTTP 403 behind a Cloudflare 'Just a moment...' challenge. Route 3 (headless Chromium) SUCCEEDED: HTTP 200, client-side redirect from the recorded compare-all URL to https://www.microsoft.com/en-us/microsoft-365/business/microsoft-365-plans-and-pricing, title 'Microsoft 365 Pricing for Business: Plans & Features', 17,047 characters of rendered text, 'Business Basic' present 3 times.",
      "vendorAccess": "rendered",
      "vendorAccessLabel": "Served only to a rendered browser",
      "vendorAccessNote": "The vendor's pricing page refused plain requests and gave the figure up only to a full browser render. The link below is the address that render resolved to, which a reader with a browser can open.",
      "vendorFigureIsStanding": true,
      "vendorEvidence": "Microsoft 365 Business Basic\nLightweight web and mobile apps to kickstart your business\n$7.00\nuser/month, paid yearly\n(Annual subscription–auto renews)1",
      "vendorEvidenceChars": 152,
      "ourPrice": 7,
      "ourPlan": "Business Basic",
      "ourAccessedAt": "2026-09-02",
      "checks": 3,
      "agreeing": 3,
      "baselineExceptionReason": "",
      "gapUsd": 1,
      "gapPct": 16.7,
      "direction": "higher"
    },
    {
      "rank": 12,
      "id": 3,
      "publisher": "domaindetails.com",
      "url": "https://domaindetails.com/registrars/cheapest",
      "pageDate": "",
      "pageDateLabel": "no date shown to a reader",
      "articleRoute": "Route 1 of the ladder succeeded: direct GET via curl 8.11.0 with a Chrome 128 browser User-Agent (--compressed, redirects followed). No fuller header set, headless render or text reader was needed.",
      "occurrencesInPage": 1,
      "verdict": "stale-confirmed",
      "theme": "domain-registrars",
      "label": "Domain Registrars",
      "vendor": "Porkbun",
      "vendorSlug": "porkbun",
      "vendorHref": "/software/domain-registrars/porkbun/",
      "quoted": 10.99,
      "quotedText": "The $10.99 price is consistent for both registration and renewal.",
      "quotedTextChars": 65,
      "vendorPrice": 11.08,
      "vendorPlan": ".com domain - Porkbun standard published rate (registration, renewal and transfer are one and the same price; Porkbun has no tiers or plans for this)",
      "vendorBasis": "US dollars per domain-year for .com, list price before any coupon. Registration $11.08, renewal $11.08, transfer $11.08 - the same basis the article uses in its Year 1 / Renewals columns, so the comparison is like for like.",
      "vendorUrl": "https://porkbun.com/products/domains",
      "vendorCheckUrl": "https://porkbun.com/products/domains",
      "vendorRoute": "Route 1 succeeded: direct GET of https://porkbun.com/products/domains via curl with a Chrome 128 browser User-Agent, HTTP 200, 769728 bytes. Corroborated by a second independent route, Porkbun's public unauthenticated pricing API at https://api.porkbun.com/api/json/v3/pricing/get, HTTP 200, status SUCCESS.",
      "vendorAccess": "direct",
      "vendorAccessLabel": "Read on the vendor's own pricing page",
      "vendorAccessNote": "The vendor's pricing page served this figure to us directly.",
      "vendorFigureIsStanding": true,
      "vendorEvidence": "ROUTE A - https://porkbun.com/products/domains (direct GET, browser UA, HTTP 200, 769728 bytes).\n\nA1. Hero price link, verbatim:\n<a class=\"black priceDisplayHomeLink\"\n               data-tld=\"com\"\n               href=\"/tld/com\">\n               .COM from $11.08            </a>\n\nA2. The .com row of the \"all extensions\" pricing table, verbatim and untruncated, exactly as the page carries it:\n<div class=\"domainsPricingAllExtensionsItem\" data-extension=\"com\" data-price-registration=\"1108\" data-price-renewal=\"1108\" data-price-transfer=\"1108\">\n         <div class=\"row\">\n \t  <div class=\"col-xs-3\"\">\n\t    <a href=\"/tld/com\">.com</a>\n \t  </div>\n \t  <div class=\"domainsPricingAllExtensionsItemPrice registration col-xs-3\">\n\t    <span class=\"pointer badge badge-porkbun atCostBadge\"><i class=\"fa-solid fa-star\"></i></span> $<span class=\"sortValue\">11.08</span>\n \t  </div>\n \t  <div class=\"domainsPricingAllExtensionsItemPrice renewal col-xs-3\">\n\t    <span class=\"badge badge-porkbun pointer atCostBadge\"><i class=\"fa-solid fa-star\"></i></span> $<span class=\"sortValue\">11.08</span>\n \t  </div>\n \t  <div class=\"domainsPricingAllExtensionsItemPrice transfer col-xs-3\">\n\t    <span class=\"badge badge-porkbun pointer atCostBadge\"><i class=\"fa-solid fa-star\"></i></span> $<span class=\"sortValue\">11.08</span>\n \t  </div>\n         </div>\n\t</div>\n\nA2 rendered as the page renders it (columns: EXTENSION | REGISTRATION | RENEWAL | TRANSFER):\n.com | * $11.08 | * $11.08 | * $11.08\n(the * is Porkbun at-cost star badge, class \"atCostBadge\"; it is not a discount marker)\n\nA3. Promotional control: this page renders first-year promotions as a struck-through list price plus a badge reading \"1st Yr Sale!\" -- e.g. .agency carries <small><s class=\"text-muted\">$25.23</s></small> <span class=\"badge badge-porkbun\">1st Yr Sale!</span> ... $3.60 against a $25.23 renewal. That badge occurs 338 times on this page. It does NOT occur in the .com row, and the .com row carries no struck-through price. Registration, renewal and transfer are the same number.\n\nROUTE B - https://api.porkbun.com/api/json/v3/pricing/get (Porkbun public, unauthenticated pricing API; GET, HTTP 200, 82223 bytes, status SUCCESS). The \"com\" entry verbatim:\n{\"registration\": \"11.08\", \"renewal\": \"11.08\", \"transfer\": \"11.08\", \"coupons\": []}\n\nBoth routes agree: $11.08 for registration, renewal and transfer, with an empty \"coupons\" array for .com.",
      "vendorEvidenceChars": 2394,
      "ourPrice": 11.08,
      "ourPlan": ".com (per year)",
      "ourAccessedAt": "2026-09-02",
      "checks": 3,
      "agreeing": 3,
      "baselineExceptionReason": "",
      "gapUsd": 0.09,
      "gapPct": 0.8,
      "direction": "higher"
    }
  ],
  "control": [
    {
      "id": 5,
      "vendor": "MXroute",
      "quoted": 4.08,
      "verdict": "quote-gone",
      "verdictLabel": "The quoted figure is no longer on the page",
      "checks": 4,
      "why": "KNOCKED OUT on the quotation, not on the economics. The string \"$4.08/mo\" does not appear on the [publisher redacted] article. I fetched the raw HTML (436,132 bytes) and grepped: \"$4.08\" occurs 0 times, and the entity form \"&#36;4.08\" 0 times. The bare token \"4.08\" occ",
      "whyRedacted": true,
      "whyStoredChars": 260,
      "whyChars": 269,
      "whyStopsAtCut": true
    },
    {
      "id": 13,
      "vendor": "Bitdefender",
      "quoted": 2.92,
      "verdict": "quote-gone",
      "verdictLabel": "The quoted figure is no longer on the page",
      "checks": 2,
      "why": "The article at [publisher redacted] (Last updated Sep 4, 2026) no longer contains the string \"2.92\" anywhere. Two independent fetches of the page with differently-worded extraction prompts confirm it. What the page states for Bitdefender",
      "whyRedacted": true,
      "whyStoredChars": 260,
      "whyChars": 237,
      "whyStopsAtCut": true
    },
    {
      "id": 14,
      "vendor": "Bitdefender",
      "quoted": 2.92,
      "verdict": "quote-gone",
      "verdictLabel": "The quoted figure is no longer on the page",
      "checks": 2,
      "why": "Article fetched today (HTTP 200, 2.49 MB; JSON-LD dateModified \"2026-07-17T15:29:02+00:00\", matching the stated \"Last updated 17 July 2026\"). The string \"2.92\" occurs 9 times in the raw HTML and every single occurrence is inside an SVG path coordinate or minif",
      "whyRedacted": false,
      "whyStoredChars": 260,
      "whyChars": 260,
      "whyStopsAtCut": true
    },
    {
      "id": 12,
      "vendor": "Leadpages",
      "quoted": 49,
      "verdict": "quote-misattributed",
      "verdictLabel": "The quoted sentence is not the sentence on the page",
      "checks": 4,
      "why": "Knocked out on the quotation. Two readers fetched the article by separate routes and neither found the sentence the record stored anywhere on it. The page carries that wording under a different vendor's heading and at a different figure; the section on this ve",
      "whyRedacted": false,
      "whyStoredChars": 260,
      "whyChars": 260,
      "whyStopsAtCut": true
    },
    {
      "id": 23,
      "vendor": "Instapage",
      "quoted": 199,
      "verdict": "quote-misattributed",
      "verdictLabel": "The quoted sentence is not the sentence on the page",
      "checks": 3,
      "why": "ROW KNOCKED OUT ON THE RE-READ AGAINST THE CANONICAL READING OF THE PAGE - THE TEXT A READER SEES. The stored quotation was a reconstruction, not page text: the sentence \"Pricing starts at $199/mo, which is higher than some alternatives.\" occurs zero times in the article, in raw bytes or in normalised text. What the article carries is that same sentence about a DIFFERENT vendor, at $99/month, under the heading immediately above this one; the stored row took that sentence, changed the number, and attributed it to this vendor. The vendor's own write-up on the page states no figure at all. The $199 is genuinely on the page, but only inside comparison tables, never in prose - recorded here as the table row in document order with cell boundaries rendered as single spaces, nothing reflowed into prose and no fragments joined. On the substance the row would have failed too: $199/month is the vendor's live, standing Optimize price today, so no figure has gone stale. The article's defect is narrower and different - it files the Optimize price under a column headed \"Starting Price\" when the entry plan is Create at $99/month ($79/month billed annually). That is a plan-labelling error by the publisher, not price drift, and it is not what this study measures. Recorded for our own catalogue: the pricing URL we held, instapage.com/en/pricing, is dead - it 302s to a marketing page carrying no prices - and the live pricing page is instapage.com/plans.",
      "whyRedacted": false,
      "whyStoredChars": 1457,
      "whyChars": 1457,
      "whyStopsAtCut": false
    },
    {
      "id": 1,
      "vendor": "TaxJar",
      "quoted": 99,
      "verdict": "not-stale-different-plan",
      "verdictLabel": "The figure names a different plan, not the entry price",
      "checks": 4,
      "why": "ROW KNOCKED OUT. The premise is a misattribution by the first pass. Fetched the [publisher redacted] article today (2026-09-05; JSON-LD datePublished 2025-12-26, dateModified 2026-03-23 -- matches the stated date line). Its TaxJar pricing table is a single run of text listi",
      "whyRedacted": true,
      "whyStoredChars": 260,
      "whyChars": 274,
      "whyStopsAtCut": true
    },
    {
      "id": 9,
      "vendor": "Landingi",
      "quoted": 49,
      "verdict": "not-stale-different-plan",
      "verdictLabel": "The figure names a different plan, not the entry price",
      "checks": 2,
      "why": "The article's $49/month is explicitly attributed to a named upper tier, the \"Automate plan\", and the sentence itself frames it as the more expensive of \"Landingi's two packages\" — the one you pay up for to get A/B testing, automation and integrations. The Cons",
      "whyRedacted": false,
      "whyStoredChars": 260,
      "whyChars": 260,
      "whyStopsAtCut": true
    },
    {
      "id": 10,
      "vendor": "Leadpages",
      "quoted": 37,
      "verdict": "not-stale-different-plan",
      "verdictLabel": "The figure names a different plan, not the entry price",
      "checks": 6,
      "why": "Knocked out on plan identity. Two readers found the quoted sentence live and correctly attributed, but the row measured it against Grow at $99/mo, the entry tier of the CRO line rather than the cheapest plan on the page. The vendor's own headline reads \"Plans ",
      "whyRedacted": false,
      "whyStoredChars": 260,
      "whyChars": 260,
      "whyStopsAtCut": true
    },
    {
      "id": 2,
      "vendor": "ManageEngine Mobile Device Manager Plus",
      "quoted": 2.5,
      "verdict": "not-stale-basis-difference",
      "verdictLabel": "A monthly headline read against an annual-billed rate",
      "checks": 2,
      "why": "Knocked out on basis. ManageEngine's pricing page publishes no per-device-per-month rate anywhere; it prices MDM Plus in device-count tiers as a bundle total (Standard Cloud 50 devices = $64/month or $645/year; Professional Cloud 50 devices = $119/month or $1,",
      "whyRedacted": false,
      "whyStoredChars": 260,
      "whyChars": 260,
      "whyStopsAtCut": true
    },
    {
      "id": 7,
      "vendor": "Leadpages",
      "quoted": 37,
      "verdict": "not-stale-basis-difference",
      "verdictLabel": "A monthly headline read against an annual-billed rate",
      "checks": 2,
      "why": "The row dies on the article's own wording. The premise records the quote as \"$37/month\" read as basis monthly, but every one of the three places the figure appears on the live page carries an explicit annual-billing qualifier, and the main sentence supplies th",
      "whyRedacted": false,
      "whyStoredChars": 260,
      "whyChars": 260,
      "whyStopsAtCut": true
    },
    {
      "id": 24,
      "vendor": "WATI",
      "quoted": 49,
      "verdict": "not-stale-basis-difference",
      "verdictLabel": "A monthly headline read against an annual-billed rate",
      "checks": 3,
      "why": "ROW KNOCKED OUT ON THE RE-READ AGAINST THE CANONICAL READING OF THE PAGE - THE TEXT A READER SEES - on two independent grounds. First, the stored quotation was a reconstruction: the string \"$49/month\" occurs zero times in the article, and the bare substring \"49/month\" does not appear anywhere in it either. The article states the figure three ways and every one of them is explicitly approximate - body prose \"Plans start around $49 a month...\", a table cell \"From ~$49 / mo\" with the page's own tilde, and the Sources line recorded here, which is the smallest self-contained run naming both the vendor and the figure. Second, the price is not stale. $49.00/month is a live, standing Wati Growth rate today - \"Growth Plan USD Monthly EAST\", isActive true, 4900 minor units - with no promotional, introductory or time-limited marker, and the same $49/mo recurs in the quarterly plan, which an introductory rate would not do. Wati runs separate WEST and EAST USD rate cards under one plan name: our recorded $59 is Growth USD Yearly WEST ($708/yr), and the article's $49 is Growth USD Monthly EAST. Both are standing prices for the plan Wati currently calls Growth, so the difference is billing term and region, not the passage of time. A reader in the US or EU who follows the article's own link sees $59/mo billed annually or $69/mo month-to-month and will not see $49 from that address - a fair criticism of the article's regional precision, but a geo-scoping criticism rather than staleness, and not the claim this study makes.",
      "whyRedacted": false,
      "whyStoredChars": 1530,
      "whyChars": 1530,
      "whyStopsAtCut": false
    },
    {
      "id": 4,
      "vendor": "Hostinger VPS",
      "quoted": 2.99,
      "verdict": "not-stale-promo",
      "verdictLabel": "A promotional rate rather than the standing price",
      "checks": 4,
      "why": "Knocked out on the vendor side. Two readers re-fetched the vendor's page by separate routes and both found KVM 1 at $6.49/mo under a 67%-off badge, struck through from $19.49, with \"Renews at $11.99/mo for 2 years\" printed on the same card. A first-term promot",
      "whyRedacted": false,
      "whyStoredChars": 260,
      "whyChars": 260,
      "whyStopsAtCut": true
    },
    {
      "id": 15,
      "vendor": "Hostinger VPS",
      "quoted": 5.99,
      "verdict": "not-stale-promo",
      "verdictLabel": "A promotional rate rather than the standing price",
      "checks": 2,
      "why": "Article quote is still live verbatim and is presented as Hostinger's starting price, so the quote-gone and different-plan exits do not apply. But the vendor's $6.49/mo is not a list monthly price: hostinger.com/vps-hosting shows it as a 67%-off promotional rat",
      "whyRedacted": false,
      "whyStoredChars": 260,
      "whyChars": 260,
      "whyStopsAtCut": true
    }
  ]
}