App Stack Teardowns · Issue 1 · Android

BuzzFeed App

Google ad server (AdMob or GAM, same SDK), three bidding partners, four declared formats, OneTrust consent running TCF v2 and GPP in parallel. Static analysis of the production build plus a runtime capture, cross-checked against BuzzFeed's public 10-K.

By Guy Alon··~12 min read

The numbers at a glance

Mediation

Google

Demand partners

3

all bidding

Programmatic share

76%

of ad revenue (10-K)

Amazon share

28%

of total revenue (10-K)

Supply chain

75/100

Beamflow health

CMP

OneTrust

TCF + GPP

About this analysis

This is an independent technical observation of a publicly distributed build of the BuzzFeed - Quizzes & News Android app. Findings are derived from inspection of the build artifact and observed runtime behavior on a clean test device, alongside a crawl of the publisher's public ads.txt and the corresponding SSP sellers.json files. SDK presence, demand-partner detection, and placement screenshots are public observations. Operational commentary is editorial. No assertions are made regarding causality, intent, quantitative revenue impact, or regulatory compliance. We are not affiliated with BuzzFeed, Inc.. If you represent BuzzFeed, Inc. and would like to add context or request a correction, contact us.

Methodology

Build:
Publicly distributed production build, captured 2026-05-11
Static analysis:
SDK detection + configuration audit of the unpacked build artifact
Runtime capture:
Real Android device, US location, screen mirror via scrcpy
Supply chain audit:
ads.txt + sellers.json crawl via Beamflow.co

1. The app at a glance

App

BuzzFeed - Quizzes & News

Publisher

BuzzFeed, Inc.

Bundle ID

com.buzzfeed.android

Category

News / Entertainment content

Install range

10M+ installs (Play Store)

App environment

Google ad platform

AdMob or GAM (same SDK)

CMP

OneTrust + TCF v2 + GPP

MMP

Branch

Monetization model

IAA + commerce affiliates (Amazon, RescueBox, others). No IAP detected.

Privacy Sandbox

Attribution enabled

Analytics

Firebase Analytics, Crashlytics, Performance, Google Analytics

The BuzzFeed Android app sits on the Play Store with 10M+ installs. The product is a feed-and-article reader with a Shopping tab and a Quizzes tab. Revenue comes from two paths: programmatic and direct-sold display on the editorial surfaces, and commerce affiliate links (mostly Amazon) on the Shopping tab. No in-app purchase was detected in the build.

Reading the public 10-K against the build

BuzzFeed, Inc. (BZFD) filed its 2025 Form 10-K on 2026-03-16. Four numbers from that filing are worth holding in mind while reading the rest of this teardown:

$185.3M

total revenue for fiscal 2025, down 2% year over year. The breakdown below is how that $185M splits across ads, content, and commerce.

76%

of total ad revenue is programmatic ($69.6M of $91.7M). Direct-sold is shrinking 25% YoY while programmatic grew 7%.

28%

of total company revenue comes from Amazon alone (~$52M), primarily affiliate commerce. The buy-button on Shopping pages is the single biggest revenue surface.

30%

of total revenue is commerce affiliate ($56.5M of $185.3M). Bigger than content revenue. Comparable to half of advertising revenue.

One thing to hold from those numbers. A stack that is now 76% programmatic on the ad side is more sensitive to bidder competition than to any one direct-sales relationship, which is why the partner count finding in Section 8 carries more weight than it would on a direct-sold property. The Amazon affiliate share is shown here for context only. The teardown focuses on the ad stack, which is the $91.7M side of the P&L and what static analysis of the build can actually see.

Source: BuzzFeed, Inc. Form 10-K, fiscal year ended December 31, 2025. Filed via SEC EDGAR. All figures in this block are taken directly from the filing.

2. The stack at a glance

Mediation platform

Google ad server (AdMob or GAM, same SDK)

Google platform

AdMob or GAM (same SDK)

Demand partners

3 detected

Ad format types

4 supported

3. Demand partners detected

NetworkRole in stackBidding
Google (AdMob / GAM)Mediation + demandActive
Meta Audience NetworkIn-app demandActive
Amazon APSHeader bidding adapterActive

4. Ad placements in context

BuzzFeed declares four ad formats in the SDK surface (Banner, Native, Interstitial, Rewarded), all served through the Google ad server. The runtime capture covered home feed, category feeds, articles, listicles, the Shopping tab, and the Quizzes tab. Each surface runs a different cadence and creative mix.

Declared in the SDK

BannerNativeInterstitialRewarded
SurfaceTop stickyIn-bodyRefresh cadence
Home feedNoneDisplay or native (full-card)No refresh
Category feedNoneDisplay bannerNo refresh
Article320×50 display bannerDisplay MREC (likely expandable), video, or native10s sticky · 30s in-article
Listicle320×50 display bannerDisplay MREC or native10s sticky · 30s per item
Shopping320×50 display bannerDisplay MREC + Amazon affiliate buy-button10s sticky · no in-body refresh
Quizzes320×50 display bannerDisplay MREC (sometimes native-styled)10s sticky · 30s in-quiz

Density and refresh

Article, Shopping, and Quizzes pages share the same two-slot pattern: a sticky banner anchored at the top of the screen, and a larger in-body unit (MREC, native, or video). The top sticky refreshes every 10 seconds, the in-body unit every 30 seconds. Both refresh on a timer, with or without scroll.

Home and category feeds run no top sticky and the in-feed banners do not refresh during the session. The Shopping article surfaces also expose Amazon affiliate buy-buttons inline with display creative. That is the commerce revenue path running in parallel with the ad path.

Not observedNo interstitials, no rewarded video, no app-open. Each is a format declared in the SDK (rewarded) or available to add (interstitial, app-open) but left unused in the build.

Ad slot between editorial cards in the BuzzFeed home feedHome feedIn-feed ad

In-feed ad slot

A full-card ad slot between editorial story cards in the Latest feed. The creative captured here happens to be an app install (Dollin), but on a programmatic slot the publisher does not pick the creative. Anything that wins the auction fills it. The slot could be display or native at the format level; from a screenshot alone you can't tell which. The same creative persisted across scroll-and-return sessions, so feed banners are running with refresh disabled.

Clorox sticky banner pinned at the top of the BuzzFeed Shopping tabShoppingTop sticky

Sticky banner on Shopping

A 320x50-class sticky banner pinned to the top of the Shopping tab landing page. Refreshes every 10 seconds throughout the session. The same slot served Clorox, JCPenney, and an All Day Portable Breastmilk creative across consecutive refreshes.

Shopping article showing a top sticky banner, an Amazon affiliate buy button, and a programmatic display adShoppingAffiliate + ad

Affiliate button + display ad on Shopping

Three monetization surfaces visible in one viewport on a Shopping article: a JCPenney sticky banner at the top, an Amazon affiliate buy-button (orange CTA) on the product card, and a Bottle Washer Pro display ad below. The affiliate revenue path runs alongside the display ad path on every Shopping article.

Sensodyne top sticky banner and a large Homes.com in-article expandable creative on a BuzzFeed articleArticleIn-article MREC

Top sticky + expandable in-article ad

The standard article ad pattern at its largest fill: a Sensodyne Pronamel sticky banner anchored at the top (10-second refresh) and a large in-article Homes.com creative that fills most of the viewport. The size and behavior fit an expandable display unit (Google supports these as a standard format) where a base MREC expands to a larger creative on serve. The in-body unit refreshes every 30 seconds even when the reader does not scroll.

Video ad served by Google in a BuzzFeed article slot, with autoplay video and Learn more CTAArticleVideo ad

Video ad served by Google

A video-in-banner creative served by Google demand into the in-article slot. Autoplay with sound off by default, unmute toggle, and a Learn more CTA pinned below the player. Many content publishers block video creative in display slots. BuzzFeed has allowed it.

BuzzFeed article with a top sticky banner and an Original Farmers Market MREC mid-articleArticleIn-article MREC

Different article, same pattern

A second article (Anne Hathaway) shows the same two-slot pattern with different fills: All Day Portable Breastmilk on the top sticky and an Original Farmers Market brand creative in the in-article MREC. Refresh cadence was confirmed against this surface by watching the slots tick over without scrolling.

BuzzFeed Quizzes tab with YouTube TV top sticky banner and Learning Tree Enterprise AI Training adQuizzesIn-article MREC

Sticky + large native on Quizzes

Quizzes surface with the same top-sticky pattern (YouTube TV creative refreshing every 10 seconds) plus a large green-themed Learning Tree native ad embedded between quiz question modules. The in-quiz unit refreshes every 30 seconds.

BuzzFeed article with a Huawei Watch Fit 5 top sticky banner and Boston University LLM in-article native adArticleIn-article MREC

Premium-brand demand on the same slot

Worth noting that the same article ad slots also fill with premium-brand creative. Here a Huawei Watch Fit 5 sticky banner on top and a Boston University LLM Program in-article native unit. The slot is format-agnostic. Demand mix swings with each auction.

5. Peer comparison

How BuzzFeed's stack measures against the typical Tier-1 English-language news app. Direct peer rows will be added as future issues of this series teardown comparable apps.

AppMediationPartnersFormatsCMPMMP
BuzzFeedGoogle ad server (AdMob or GAM, same SDK)3 (all bidding)4OneTrust + TCF + GPPBranch
Industry default (Tier-1 EN news)AdMob or AppLovin MAX5-74-5OneTrust or SourcepointAppsFlyer or Branch

Industry-default row is the typical pattern observed across Tier-1 English-language news apps, not a single source.

6. Supply chain audit

Run on Beamflow.co →

Audit of both the web-side ads.txt and the mobile-side app-ads.txt for buzzfeed.com, cross-checked against each declared SSP's sellers.json file via Beamflow.co (full disclosure: Beamflow is my supply-chain monitoring product). Both files share the same root domain authority under the IAB Tech Lab spec, so the entries below cover the full supply path declared for BuzzFeed's web and app inventory. Server response: HTTPS, 406ms response, 2 redirects, text/plain.

75Health

909 clean · 413 issues

1,322 total entries

sellers.json Verification50% weight

C 80%

Supply Chain Completeness15% weight

F 10%

Syntax Health10% weight

A 99%

Duplicate Detection10% weight

B 88%

File Health15% weight

A 100%

257 severe156 cleanup

File-level warnings

  • ·Missing recommended "contact" variable
  • ·High duplicate rate: 167 duplicate records found

SSP verification · 1,322 ads.txt entries checked

1,037

Verified by SSP sellers.json (78%)

257

Unverified (201 not found, 56 DIRECT/RESELLER mismatches)

Buyers cannot verify 257 of 1,322 entries, so some of that supply is probably being bid lower or skipped entirely.

Top problem SSPs

SSPEntriesIssues
freewheel.tvNow FreeWheel2222
google.com5217
conversantmedia.com2616

Operator read

A health score of 75 on a file this size (1,322 entries) is middle-of-the-pack for a Tier-1 publisher. The expensive number is the 257 entries unverified by SSP sellers.json (20% of the file). On a property doing BuzzFeed-scale traffic, even a 2-4% bid skip on those paths is real money. The 167 duplicate records are cosmetic by comparison, but worth deduping on the next release. The Supply Chain Completeness F grade comes from the gap between the ads.txt declarations and what the upstream sellers.json files actually confirm.

7. What this app gets right

Architectural and configuration choices in the BuzzFeed build worth copying or benchmarking against.

Ad density is restrained

Across feed, articles, and listicles, the placement cadence reads as one ad every few editorial cards rather than every card. None of the captured screens felt aggressive or disruptive to read flow. Density is the dial most teams overshoot on a content app. BuzzFeed has resisted the easy yield bump.

Single ad-unit architecture

One Ad Unit ID surface in the build, covering all four declared formats. A centralized AdManager-style abstraction is the right pattern for content apps with many surfaces, and reflects a team that has thought about ad-ops debt. The alternative is one ad-unit per screen, which is what most teams ship first and regret later.

Full TCF v2 + GPP consent stack

OneTrust running both IAB TCF v2 for Europe and IAB GPP for US state-level signals. Few publishers run both. For a property monetizing across the EU/UK and the US state-privacy patchwork, this is what good looks like.

Privacy Sandbox Attribution enabled

The team has opted into Privacy Sandbox Attribution Reporting. Most publishers have not. Worth doing now even if the actual attribution data path is still maturing, because the cost of opting in later (after IDFA/cookie deprecation is fully reflected in spend) is higher than the cost of doing it now.

All partners bidding-enabled

No waterfall remnants in the build. Google (via AdMob or GAM), Meta Audience Network, and Amazon APS are all wired for bidding. The partner count is light (see Section 8), but the way they call into the auction is the right way.

8. Findings and open questions

Observations and open questions about the stack, ordered by estimated yield impact.

#1Partner count is below benchmark, and this stack is mostly programmatic

Three bidding partners sits below the 5-7 industry default for a Tier-1 English-language news app. The mechanics matter. In a unified auction, every additional qualified bidder pushes the clearing price up, because the second-highest bid (the price the winner pays) gets stronger with more bid pressure on the slot. With three demand sources, BuzzFeed is leaving auction pressure on the table even when each partner is performing fine on its own. The public 10-K reinforces this read. 76% of ad revenue is now programmatic ($69.6M of $91.7M for FY2025). Direct-sold shrank 25% YoY, programmatic grew 7%. So the thinness of the bidder pool is where the money is leaking. For a non-gaming content app, the obvious adds are demand sources with strong US news and entertainment inventory, with AppLovin and Mintegral most-cited at this scale. Format mix and auction structure are not the problem here. Bidder count is.

#2Rewarded video declared but firing path unknown

Rewarded is declared in the SDK surface. We did not observe it fire during the live session covering home feed, articles, and listicles. Two plausible triggers are quiz-content gates and premium-article paywalls. A targeted capture on the Quizzes tab would settle whether this is real yield or orphan SDK declaration.

#320% of ads.txt entries are unverified by SSP sellers.json

Beamflow's audit shows 257 entries on buzzfeed.com cannot be verified against the SSP's own sellers.json (201 not found + 56 DIRECT/RESELLER mismatches). Buyers either skip those paths or bid them lower. On a property at BuzzFeed's traffic, that is meaningful spend leaking. See the full audit in Section 6.

9. What an operator should take from this

  • ·If you run a content-publisher app with three bidding partners, audit your peer set. Tier-1 English news apps typically run 5-7. Closing that gap is usually the highest-yield change on a stack that is otherwise well-architected.
  • ·Centralized ad-loading (one Ad Unit ID, many formats) is the right pattern for content apps with many surfaces. BuzzFeed's build is a clean reference. The one-ad-unit-per-screen alternative is what most teams ship first and regret later.
  • ·If you monetize across Europe and the US state-law patchwork, run TCF v2 and GPP in parallel. OneTrust supports it. Getting consent wrong costs much more than getting it right once.
  • ·Audit ads.txt against SSP sellers.json on every release. A 20% unverified rate is common in the wild. On a Tier-1 property, even a low-single-digit bid skip on those paths is real revenue.

Related from MonetizationGuy

Running a similar stack?

If your app has a comparable mediation setup and you want a full audit (not just static analysis, but a real walk-through of your live waterfall, demand, and supply chain), the free 30-minute call is the starting point.

Book a Free 30-Min Call