Fabric Media's flagship analytics publication had healthy fundamentals but was surfacing on zero of twenty trade-query Google News carousels. TOTIB delivered a complete external audit, every API-fixable finding shipped live, 1,572 AI-written meta descriptions, a Cloudflare migration that retired a production server, and a news-sitemap Worker running at the edge.
The Measure (themeasure.net) is the flagship data-driven publication from Fabric Media — a New York and Los Angeles based strategic communications firm at the intersection of media, technology, and advertising. The publication covers TV advertising, streaming and FAST, sports media, the creator economy, and the business of audience measurement, with regular columns from veteran trade reporters.
Underlying fundamentals were sound: Ghost(Pro) infrastructure, valid structured data, clean sitemaps, 1,748 published articles, 9,000+ newsletter members. But the property was operating well below its discovery ceiling.
TOTIB was engaged to run an external audit and ship every fix possible inside a single working session.
Eight findings, surfaced via external probing and Ghost Admin API inspection:
The directive that gates large-image previews in Google Discover and Top Stories was missing site-wide. Every article was silently downgraded to small-thumbnail treatment in the surfaces that actually drive news traffic.
Every published article lacked a meta description. Google was synthesizing snippets from headlines or first paragraphs — neither describes what the article actually says. Strong content was ranking on diluted snippets.
Every article told Google "we have an author named X" but never told it which person on the internet that was. The identity-link field was empty sitewide — the defining E-E-A-T signal for editorial sites.
themeasure.net was redirecting to www through a temporary 302 chain served by a DigitalOcean box that wasn't part of the Ghost stack. Temporary status, link-equity dilution, extra latency, and an extra server to maintain.
The publication-level fallback social image was a 1200×253 banner — letterboxed on every Facebook and Twitter share where a per-article image wasn't set, plus the homepage, tag archives, and author pages. Cards looked broken.
The structured-data signal that tells Google "this is a journalism publication published by Fabric Media" was absent. Without it, the ranking signals reserved for recognized publishers don't apply.
The top 13 tag archives — iSpot, TV Advertising, Streaming, Creator Economy and others — and all 11 static pages had no SEO descriptions. Twenty-three orphan tags and one duplicate were also cluttering the taxonomy.
The structured-data signal Google reads to surface a search box inside the publication's own sitelinks block was missing. Branded SERP real estate the publication should own was being left on the table.
A SerpAPI competitive baseline against 20 trade-specific Google News queries — iSpot, Tubular, Nielsen, streaming ad spend, Netflix ad tier, creator economy — surfaced the deeper structural problem. The Measure is indexed by Google News. It's not competing in it.
TVREV winning 10 of 20 carousels is the moment that reframed the engagement. Both publications share the same parent. Fabric's team already understands how to win these surfaces. They simply hadn't applied the playbook to The Measure yet.
Without meta descriptions, Google synthesized snippets from the article body — usually a stat or quote yanked from mid-paragraph, often missing the actual point of the piece. Captured live from SerpAPI at engagement baseline before the backfill propagated.
Snippets are descriptive of the topic, not the article. The first iSpot result is about an upfront-buying survey — the snippet starts mid-sentence on the survey's participation. The Tubular Labs piece is a podcast interview about TikTok — the snippet is generic boilerplate about Tubular Labs as a company.
Eight of eight audit findings addressed live in-engagement. Follow-on deliverables added an auto-fill Worker for new posts, IndexNow on every publish, DMARC policy, an HSTS-preload submission, and remediation of a Portal misconfiguration that had silently killed the newsletter signup funnel since December.
`max-image-preview:large` site-wide. Every article eligible for big-image cards in Discover and Top Stories.
Claude Haiku 4.5 via Anthropic Batches. Editorial-voice trade-pub prompt. Cost: $3.
Org-type schema identifying The Measure as a news outlet under Fabric Media. Publisher + parent + socials.
Ten staff: bios + LinkedIn-priority `sameAs` entries. Sourced from Fabric bios, Muck Rack, verified Twitter.
SEO descriptions for top 13 tag archives. 23 orphan tags deleted; duplicate consolidated.
11 pages get descriptions. About page rewritten 2× with Fabric context, named columns, internal links.
The publication-level fallback that fires for homepage, tag and author archives, and any post without a feature image. Was a 1200×253 banner that letterboxed on every social card. Per-article images untouched.
WebSite JSON-LD potentialAction for sitelinks search-box eligibility.
Cloudflare Worker at /news-sitemap.xml pulling last-48h posts from Ghost Content API.
Ghost post.published webhook → Worker → Haiku 4.5 → Ghost Admin API. Every new post gets a real meta description + excerpt at publish time. No human in the loop.
Same Worker also pings IndexNow (Bing / Yandex / Seznam) on publish. New articles get crawled in minutes instead of days. Key-verification file served at /__indexnow/<key>.txt.
_dmarc.themeasure.net TXT record with reporting addresses. Spoofing protection now in place; unblocks the Ghost(Pro) custom-sending-domain wizard when Fabric is ready.
Submitted to the Chromium HSTS preload list. Once accepted, every browser ships with themeasure.net hardcoded as HTTPS-only — no first-request downgrade window.
For six months — December 2025 through the engagement — The Measure had effectively zero new free subscribers. The reflex diagnoses were a broken form, a deliverability collapse, or a Portal bug. None of those.
A second 2025 paid tier had been published with visibility: public
while the free tier had been left at visibility: none.
Every visitor who clicked Subscribe saw a paywall ($) instead of an email field,
bounced, and the funnel collapsed silently.
Two Ghost Admin API PUTs to flip the tier visibility flags. Verified live by
submitting a test signup against the Portal API
(HTTP 201)
and a screenshot capture of the corrected modal.
Restoring the signup form fixes the acute problem. It does not fix the structural one underneath it: even when signups were arriving at 8–13 a month, the list was still shrinking. Organic unsubscribes on a list this size run about 75–85 a month — roughly ten times the rate at which new free subscribers were arriving even in the publication's best months.
Acquisition rate versus churn rate is the next strategic conversation — ungated lead magnets, paid promotion of the highest-performing pieces, content-distribution partnerships, on-site CTAs sized to the article. Out of scope for this engagement; in scope for the next one.
Each writer's profile feeds three things: the author block on every article, the author-archive page, and the author signal Google reads behind the scenes. All three were running on empty fields.
{
"name": "Jon Lafayette",
"bio": "",
"location": "Chicago, IL",
"website": "",
"twitter": "",
"facebook": ""
}
{
"name": "Jon Lafayette",
"bio": "Business Editor at Broadcasting+Cable since 2010, covering TV advertising, distribution, and M&A. Previously TVWeek, Cable World, Electronic Media, Advertising Age, NY Post.",
"location": "Chicago, IL",
"website": "https://www.linkedin.com/in/jonlafayette/",
"twitter": "@jlafayette",
"facebook": ""
}
The same change ripples through the author signal Google reads on every article — empty before, identity-linked after:
"author": {
"@type": "Person",
"name": "Jon Lafayette",
"image": {...},
"url": ".../author/jon/",
"sameAs": []
}
"author": {
"@type": "Person",
"name": "Jon Lafayette",
"image": {...},
"url": ".../author/jon/",
"sameAs": [
"https://www.linkedin.com/in/jonlafayette/",
"https://x.com/jlafayette"
]
}
Researched and applied for ten writers: Eleanor Semeraro, John Cassillo, Jon Lafayette, Scout Jacobs, Elizabeth Philbin, Jason Damata, Antony Bruno, Mike Gasbara, Kate Ginsburg, Casey Greene. ~95% of recent posts covered. Nothing fabricated — every bio sourced from Fabric Media bio pages, Muck Rack, LinkedIn, verified Twitter handles, RocketReach.
0 of 1,748 published articles had a custom meta description. Google synthesized snippets for every page, every search result, every preview.
1,572 articles backfilled via Claude Haiku 4.5 over the Anthropic Batches API at 50% pricing. Median description length 148 characters. Editorial-voice trade-pub prompt. Total spend: $3.
Remaining 10% are 176 articles whose existing meta descriptions matched a non-broken pattern, or whose content was below the 50-character minimum for confident summarization. Both edge cases are flagged in the engagement log for editorial review.
The audit's apex redirect and security header items had separate remediation paths (a DigitalOcean droplet edit and a Ghost(Pro) support ticket). DNS migration to Cloudflare dissolved both inside the same engagement.
| Item | Before | After |
|---|---|---|
| Apex redirect | 302, two hops, DigitalOcean Caddy | 301, single hop, Cloudflare edge |
| HSTS | None | max-age=63072000; includeSubDomains; preload |
| X-Content-Type-Options | None | nosniff |
| Referrer-Policy | None | strict-origin-when-cross-origin |
| Permissions-Policy | None | geolocation=(), camera=(), microphone=() |
| Minimum TLS | 1.0 | 1.2 |
| Always Use HTTPS | Off | On |
| News sitemap | None | Cloudflare Worker at /news-sitemap.xml |
| Infrastructure footprint | Ghost(Pro) + Fastly + DigitalOcean | Ghost(Pro) + Fastly + Cloudflare |
The DigitalOcean Caddy server can be shut down post-cutover. One fewer machine, one fewer monthly bill.
The Best Practices score is the explicit lift target: missing security headers were holding it at 77 across every page type. The Cloudflare Transform Rule pushes it to ~95 once the cutover completes. SEO scoring already moved on article pages from the meta-description backfill.
Measured at the live URL after the Ghost-side work landed. The hatched bar is projected, not yet measured — Cloudflare-mediated lifts on Best Practices arrive after the registry transfer completes propagation.
Performance and Accessibility are unaffected by this engagement — the audit's scope was discovery and structural SEO, not asset optimization or DOM remediation. Both surfaces are recommended for a separate engagement.
Nameservers and registrar both moved to Cloudflare during the engagement. The table below is each row checked against the live URL after the cutover.
| Item | Before | After |
|---|---|---|
| Apex redirect | HTTP/1.1 302 via Caddy droplet | HTTP/2 301 via Cloudflare |
| Browser security headers | None | HSTS preload, X-Content-Type-Options, Referrer-Policy, Permissions-Policy |
| HTTPS posture | No TLS floor, no Always-HTTPS | Min TLS 1.2 + Always-HTTPS at the edge |
| Origin path | DigitalOcean Caddy box at 178.128.137.126 | Cloudflare + Ghost(Pro) only |
| DNS + registrar | GoDaddy nameservers + registrar | Cloudflare nameservers + registrar |
| Google News SOV (20 trade queries) | 0 of 20 | Pending Publisher Center claim |
Two follow-ons close the discovery gap surfaced in the SerpAPI baseline. Both are designed to compete in news surfaces — not just to be indexed by them.
alt Ghost emits when no caption was entered. Haiku 4.5 Vision produced editorial one-sentence descriptions via Batches API; 238 of 243 came back with usable copy. Apply pass writes them back through the Ghost Admin API with confidence-tier review. Accessibility + image-search win.
ghost.io sender. Ghost(Pro)'s custom sending domain feature is a self-service wizard at Publisher tier or higher — adds DKIM + return-path CNAMEs, aligns DMARC, removes the "via ghost.io" badge in Gmail. DMARC record is already in place; the rest waits on Fabric's Ghost-side activation.
inventory/sov-history.csv and regenerates the embedded sparkline. Trajectory will compound once the Publisher Center claim lands.