When we launched SmartReview, we had to pick a monetization model. Display ads were the obvious choice — easy to implement, predictable CPMs. We went with affiliate links instead.
Six months in, that decision is generating 4x more revenue per page than display ads would have. Here's the math and the reasoning.
The Display Ads Baseline
For a comparison/review site with our traffic profile, display ad networks typically offer:
| Metric | Typical Value |
|---|---|
| CPM (programmatic) | $2-5 |
| Fill rate | 85-95% |
| Ads per page | 3-5 |
| Revenue per 1K pageviews | $6-20 |
With 500K monthly pageviews, that's roughly $3K-$10K/month from display ads. Not bad, but there's a ceiling — and display ads actively harm the user experience on comparison pages.
The Affiliate Model
Comparison pages have a unique advantage: visitors are in buying mode. When someone lands on "AirPods Pro vs Sony WF-1000XM5," they're typically ready to purchase within 24-48 hours.
Our affiliate metrics:
| Metric | Our Performance |
|---|---|
| Click-through rate to retailer | 8.2% |
| Conversion rate (post-click) | 3.4% |
| Average order value | $180 |
| Average commission rate | 4.5% |
| Revenue per 1K pageviews | $25-45 |
With the same 500K pageviews: $12.5K-$22.5K/month. That's 2-4x the display ad revenue.
Why Comparison Pages Convert Better
The 8.2% CTR and 3.4% conversion rate are well above industry averages (typically 1-3% CTR, 1-2% conversion). Three factors drive this:
1. Intent Alignment
Our visitors have already decided what to buy — they're choosing which one. The affiliate link is the natural next step, not an interruption.
2. Trust Transfer
After reading a detailed, data-backed comparison, users trust the recommendation. When we say "Pick the Sony if noise cancellation is your priority" and link to the Sony product page, users follow through.
3. Price Transparency
We show current prices from multiple retailers. Users click through knowing exactly what they'll pay, which reduces bounce rate on the retailer's site.
The Technical Implementation
Our affiliate link system is more sophisticated than just dropping Amazon links:
interface AffiliateLink {
retailer: string; // amazon, bestbuy, walmart, etc.
productUrl: string; // direct product page URL
affiliateTag: string; // our affiliate ID
currentPrice: number; // live price (updated every 4 hours)
inStock: boolean; // availability check
shippingEstimate: string; // "Free 2-day" etc.
}
function buildAffiliateCTA(
product: Product,
links: AffiliateLink[]
): AffiliateCTAProps {
// Sort by: in-stock first, then lowest price
const sorted = links
.filter(l => l.inStock)
.sort((a, b) => a.currentPrice - b.currentPrice);
return {
primaryLink: sorted[0], // Best price, in stock
alternativeLinks: sorted.slice(1), // Other retailers
priceRange: {
low: sorted[0]?.currentPrice,
high: sorted[sorted.length - 1]?.currentPrice,
},
lastUpdated: new Date(),
};
}
Multi-Retailer Strategy
We don't just link to Amazon. Showing prices from multiple retailers:
- Increases trust — users see we're not biased toward one store
- Captures more clicks — some users prefer Best Buy or Walmart
- Hedges risk — if one affiliate program changes terms, we're diversified
- Improves conversion — users can pick their preferred retailer
function PriceComparison({ links }: { links: AffiliateLink[] }) {
return (
<div className="price-comparison">
<h3>Where to buy</h3>
{links.map(link => (
<a
key={link.retailer}
href={link.productUrl}
className="retailer-link"
data-retailer={link.retailer}
onClick={() => trackAffiliateClick(link)}
>
<span className="retailer-name">{link.retailer}</span>
<span className="price">${link.currentPrice}</span>
<span className="shipping">{link.shippingEstimate}</span>
{link.currentPrice === lowestPrice && (
<span className="badge">Best Price</span>
)}
</a>
))}
</div>
);
}
Link Placement Strategy
Where you put affiliate links matters as much as having them. Our highest-converting placements:
| Placement | CTR | Notes |
|---|---|---|
| Verdict section CTA | 12.1% | After the recommendation |
| Price comparison widget | 9.8% | Shows all retailers |
| Inline "check price" links | 6.3% | Within spec comparisons |
| Sticky bottom bar | 5.1% | Always visible on mobile |
| Hero section buttons | 3.2% | "View on Amazon" etc. |
The verdict section CTA converts best because it appears right after we've made the case for one product over the other. The user has context and conviction — the link is the natural action.
Tracking and Attribution
We track every affiliate click with custom events:
function trackAffiliateClick(link: AffiliateLink) {
// Internal analytics
analytics.track("affiliate_click", {
retailer: link.retailer,
product: link.productUrl,
price: link.currentPrice,
placement: getCurrentPlacement(),
comparisonSlug: getPageSlug(),
});
// Store for attribution
localStorage.setItem("last_affiliate_click", JSON.stringify({
timestamp: Date.now(),
retailer: link.retailer,
product: link.productUrl,
}));
}
This lets us answer questions like:
- Which comparison pages generate the most affiliate revenue?
- Which product categories have the highest conversion rates?
- Does showing 3 retailers vs 5 affect CTR?
- What's the optimal number of affiliate CTAs per page?
The Brand Partnership Layer
Affiliate revenue is our baseline. On top of that, we're building a brand partnership program:
| Tier | Price | What Brands Get |
|---|---|---|
| Enhanced Profile | $500/mo | Logo, brand story, verified specs on comparison pages |
| Sponsored Comparison | $1,000/mo | Featured placement, custom angles, lead capture |
| Category Sponsorship | $2,000/mo | Own all comparisons in a category |
This doesn't replace affiliate links — it layers on top. A brand paying for an Enhanced Profile still generates affiliate clicks. The partnership fee is incremental revenue.
Display Ads: When They Make Sense
Display ads aren't always wrong. They work better when:
- Traffic is informational, not transactional (blog posts, guides)
- Products aren't easily linked (B2B comparisons, abstract topics)
- Affiliate programs don't exist for your product category
- You need minimum viable revenue while building affiliate relationships
We use display ads on our blog content where affiliate intent is low. But on comparison pages — never.
Key Takeaways
- Match monetization to intent. Comparison pages = buying intent = affiliate links. Blog posts = informational intent = display ads.
- Show multiple retailers. It builds trust and captures more clicks.
- Place CTAs after conviction. The verdict section converts 3x better than the hero.
- Track everything. You can't optimize what you don't measure.
- Layer revenue streams. Affiliate + brand partnerships > either alone.
The bottom line: if your content helps people make purchase decisions, affiliate links will outperform display ads every time.
Part 9 of our "Building SmartReview" series. Previous: Part 8: Entity Resolution at Scale
Top comments (0)