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.
The numbers at a glance
Mediation
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
| Network | Role in stack | Bidding |
|---|---|---|
| Google (AdMob / GAM) | Mediation + demand | Active |
| Meta Audience Network | In-app demand | Active |
| Amazon APS | Header bidding adapter | Active |
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
| Surface | Top sticky | In-body | Refresh cadence |
|---|---|---|---|
| Home feed | None | Display or native (full-card) | No refresh |
| Category feed | None | Display banner | No refresh |
| Article | 320×50 display banner | Display MREC (likely expandable), video, or native | 10s sticky · 30s in-article |
| Listicle | 320×50 display banner | Display MREC or native | 10s sticky · 30s per item |
| Shopping | 320×50 display banner | Display MREC + Amazon affiliate buy-button | 10s sticky · no in-body refresh |
| Quizzes | 320×50 display banner | Display 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.
Home feedIn-feed adIn-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.
ShoppingTop stickySticky 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.
ShoppingAffiliate + adAffiliate 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.
ArticleIn-article MRECTop 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.
ArticleVideo adVideo 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.
ArticleIn-article MRECDifferent 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.
QuizzesIn-article MRECSticky + 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.
ArticleIn-article MRECPremium-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.
| App | Mediation | Partners | Formats | CMP | MMP |
|---|---|---|---|---|---|
| BuzzFeed | Google ad server (AdMob or GAM, same SDK) | 3 (all bidding) | 4 | OneTrust + TCF + GPP | Branch |
| Industry default (Tier-1 EN news) | AdMob or AppLovin MAX | 5-7 | 4-5 | OneTrust or Sourcepoint | AppsFlyer 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.
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%
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
| SSP | Entries | Issues |
|---|---|---|
| freewheel.tvNow FreeWheel | 22 | 22 |
| google.com | 52 | 17 |
| conversantmedia.com | 26 | 16 |
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