Content Measurement
Measure content performance with traffic, engagement, conversion, and revenue metrics.
Overview
Effective content measurement connects content activities to business outcomes. This guide covers the metrics framework, tracking implementation, and reporting strategies to prove and improve content ROI.
Content Metrics Framework
The Metrics Hierarchy
┌─────────────────────────────────────────────────────────────────────────────┐
│ Business Impact Metrics │
│ Revenue attributed │ Customers acquired │ Customer lifetime value │
├─────────────────────────────────────────────────────────────────────────────┤
│ Conversion Metrics │
│ MQLs │ SQLs │ Trials │ Demos │ Form fills │ Signups │
├─────────────────────────────────────────────────────────────────────────────┤
│ Engagement Metrics │
│ Time on page │ Scroll depth │ Pages/session │ Return visitors │
├─────────────────────────────────────────────────────────────────────────────┤
│ Traffic Metrics │
│ Pageviews │ Sessions │ Users │ Traffic sources │ Rankings │
└─────────────────────────────────────────────────────────────────────────────┘Metrics by Funnel Stage
| Stage | Metrics | Target | |-------|---------|--------| | Awareness | Impressions, reach, traffic | Growing MoM | | Engagement | Time on page, scroll depth, shares | >3 min, >70%, increasing | | Consideration | Email signups, downloads, return visits | 2-5% conversion | | Decision | Demo requests, trial starts, purchases | Increasing MoM | | Advocacy | Shares, backlinks, referrals | Positive trend |
Traffic Metrics
Core Traffic KPIs
interface TrafficMetrics {
volume: {
pageviews: number; // Total content views
uniquePageviews: number; // Deduplicated views
sessions: number; // Visits including content
users: number; // Unique visitors
};
sources: {
organic: number; // Search engine traffic
direct: number; // Direct/bookmarks
referral: number; // Backlink traffic
social: number; // Social media
email: number; // Newsletter/email
paid: number; // Advertising
};
quality: {
bounceRate: number; // Single-page sessions
avgSessionDuration: number; // Time on site
pagesPerSession: number; // Content depth
};
}Organic Search Metrics
interface SEOMetrics {
rankings: {
keywords: number; // Total ranking keywords
top3: number; // Keywords in position 1-3
top10: number; // Keywords on page 1
featured: number; // Featured snippets won
};
traffic: {
organicSessions: number;
organicClicks: number; // From Search Console
impressions: number; // Search impressions
ctr: number; // Click-through rate
};
authority: {
domainAuthority: number; // Moz DA
referringDomains: number; // Backlink sources
backlinks: number; // Total backlinks
};
}Engagement Metrics
On-Page Engagement
// Track scroll depth with pxlpeak
function trackScrollDepth() {
const depths = [25, 50, 75, 90, 100];
const tracked = new Set<number>();
window.addEventListener('scroll', () => {
const scrollPercent = (window.scrollY + window.innerHeight) /
document.documentElement.scrollHeight * 100;
depths.forEach(depth => {
if (scrollPercent >= depth && !tracked.has(depth)) {
tracked.add(depth);
pxlpeak.track('scroll_depth', {
depth_percent: depth,
content_id: getContentId(),
content_title: document.title
});
}
});
});
}
// Track time on page
function trackTimeOnPage() {
const intervals = [30, 60, 120, 300, 600]; // seconds
let elapsed = 0;
const timer = setInterval(() => {
elapsed += 10;
const milestone = intervals.find(i => i === elapsed);
if (milestone) {
pxlpeak.track('time_on_page', {
seconds: milestone,
content_id: getContentId()
});
}
if (elapsed >= intervals[intervals.length - 1]) {
clearInterval(timer);
}
}, 10000);
}Engagement Benchmarks
| Metric | Poor | Average | Good | Excellent | |--------|------|---------|------|-----------| | Avg. Time on Page | Under 1 min | 1-2 min | 2-4 min | Over 4 min | | Scroll Depth | Under 25% | 25-50% | 50-75% | Over 75% | | Bounce Rate | Over 80% | 60-80% | 40-60% | Under 40% | | Pages/Session | Under 1.5 | 1.5-2.5 | 2.5-4 | Over 4 | | Return Rate | Under 10% | 10-20% | 20-35% | Over 35% |
Social Engagement
interface SocialEngagement {
shares: {
linkedin: number;
twitter: number;
facebook: number;
email: number;
};
comments: number;
reactions: number;
saves: number;
virality: {
shareRate: number; // Shares per 1000 views
amplification: number; // Reach from shares
};
}Conversion Metrics
Content Conversion Tracking
// Track content-driven conversions
pxlpeak.conversion({
type: 'content_download',
value: 0,
properties: {
content_id: 'ebook-attribution-guide',
content_type: 'ebook',
content_title: 'Marketing Attribution Playbook',
download_location: 'blog_sidebar',
// Attribution context
source_content: 'blog-attribution-101',
touchpoints_before_conversion: 3
}
});
// Track form submissions
document.querySelector('#lead-form').addEventListener('submit', (e) => {
pxlpeak.conversion({
type: 'form_submission',
properties: {
form_name: 'demo_request',
form_location: 'content_page',
content_id: getContentId()
}
});
});Conversion Rate Benchmarks
| Conversion Type | Average | Good | Excellent | |-----------------|---------|------|-----------| | Email Signup | 1-2% | 2-5% | >5% | | Content Download | 2-5% | 5-10% | >10% | | Demo Request | 0.5-1% | 1-3% | >3% | | Trial Start | 1-2% | 2-5% | >5% | | Purchase | 0.5-1% | 1-3% | >3% |
Lead Quality from Content
interface ContentLeadQuality {
scoring: {
contentEngaged: number; // Points for each content piece
contentDepth: number; // Points for time spent
contentVariety: number; // Points for pillar coverage
recency: number; // Points for recent engagement
};
qualification: {
mql: 'Score > 50 + demo content viewed';
sql: 'Score > 75 + pricing page viewed';
hot: 'Score > 90 + trial started';
};
contentInfluence: {
firstTouchContent: string; // Entry point
lastTouchContent: string; // Most recent
totalContentTouches: number;
keyContent: string[]; // High-value pieces consumed
};
}Revenue Attribution
Content-Attributed Revenue
interface ContentRevenue {
firstTouch: {
// Revenue from customers who first touched via content
revenue: number;
deals: number;
avgDealSize: number;
};
lastTouch: {
// Revenue where content was last touch before conversion
revenue: number;
deals: number;
};
multiTouch: {
// Revenue influenced by content in journey
influencedRevenue: number;
influencedDeals: number;
avgTouchpoints: number;
};
contentSpecific: {
// Revenue by specific content piece
pillarPages: Map<string, number>;
blogPosts: Map<string, number>;
downloadables: Map<string, number>;
};
}Revenue Attribution Models
// Configure attribution for content
const attributionConfig = {
firstTouch: {
model: 'first_click',
weight: 100,
window: 90 // days
},
lastTouch: {
model: 'last_click',
weight: 100,
window: 30
},
linear: {
model: 'linear',
weight: 'equal_distribution',
window: 90
},
timeDecay: {
model: 'time_decay',
halfLife: 7, // days
window: 30
},
positionBased: {
model: 'position',
firstTouch: 40,
lastTouch: 40,
middle: 20, // distributed
window: 60
}
};
// Calculate content ROI
function calculateContentROI(params: {
contentCost: number;
attributedRevenue: number;
}): number {
return ((params.attributedRevenue - params.contentCost) / params.contentCost) * 100;
}Content Performance Dashboard
Key Dashboard Views
interface ContentDashboard {
overview: {
totalContent: number;
publishedThisMonth: number;
totalPageviews: number;
avgEngagement: number;
totalConversions: number;
attributedRevenue: number;
};
topPerformers: {
byTraffic: ContentPerformance[];
byEngagement: ContentPerformance[];
byConversions: ContentPerformance[];
byRevenue: ContentPerformance[];
};
trends: {
trafficTrend: TimeSeriesData;
engagementTrend: TimeSeriesData;
conversionTrend: TimeSeriesData;
};
breakdown: {
byContentType: Map<string, Metrics>;
byPillar: Map<string, Metrics>;
byAuthor: Map<string, Metrics>;
byFunnelStage: Map<string, Metrics>;
};
}
interface ContentPerformance {
id: string;
title: string;
url: string;
publishDate: string;
pageviews: number;
avgTimeOnPage: number;
scrollDepth: number;
conversions: number;
revenue: number;
trend: 'up' | 'down' | 'stable';
}Building Reports with pxlpeak
// Query content performance
const contentReport = await pxlpeak.analytics.query({
siteId: 'site_xxx',
dateRange: { start: '2026-01-01', end: '2026-01-31' },
metrics: [
'pageviews',
'unique_pageviews',
'avg_time_on_page',
'bounce_rate',
'conversions',
'revenue'
],
dimensions: ['page_path', 'page_title'],
filters: [
{ field: 'page_path', operator: 'contains', value: '/blog/' }
],
sort: [{ field: 'pageviews', direction: 'desc' }],
limit: 50
});
// Content attribution report
const attributionReport = await pxlpeak.attribution.query({
siteId: 'site_xxx',
dateRange: { start: '2026-01-01', end: '2026-01-31' },
model: 'linear',
conversionEvent: 'purchase',
groupBy: 'content_id',
filters: [
{ field: 'content_type', operator: 'eq', value: 'blog' }
]
});Content Scoring Model
Scoring Framework
interface ContentScore {
// Traffic score (25%)
trafficScore: {
weight: 0.25,
factors: {
pageviews: { weight: 0.4, benchmark: 1000 },
growth: { weight: 0.3, benchmark: 0.1 }, // 10% MoM
rankings: { weight: 0.3, benchmark: 10 } // Top 10 keywords
}
};
// Engagement score (25%)
engagementScore: {
weight: 0.25,
factors: {
timeOnPage: { weight: 0.3, benchmark: 180 }, // 3 min
scrollDepth: { weight: 0.3, benchmark: 75 }, // 75%
bounceRate: { weight: 0.2, benchmark: 50 }, // <50%
shares: { weight: 0.2, benchmark: 50 }
}
};
// Conversion score (30%)
conversionScore: {
weight: 0.30,
factors: {
conversionRate: { weight: 0.5, benchmark: 2 }, // 2%
leadsGenerated: { weight: 0.3, benchmark: 10 },
leadQuality: { weight: 0.2, benchmark: 50 } // MQL score
}
};
// Revenue score (20%)
revenueScore: {
weight: 0.20,
factors: {
attributedRevenue: { weight: 0.6, benchmark: 5000 },
pipeline: { weight: 0.4, benchmark: 20000 }
}
};
}
function calculateContentScore(content: ContentMetrics): number {
// Calculate weighted score 0-100
const scores = {
traffic: calculateFactorScore(content.traffic, scoreModel.trafficScore),
engagement: calculateFactorScore(content.engagement, scoreModel.engagementScore),
conversion: calculateFactorScore(content.conversion, scoreModel.conversionScore),
revenue: calculateFactorScore(content.revenue, scoreModel.revenueScore)
};
return Object.entries(scores).reduce((total, [key, score]) => {
return total + (score * scoreModel[`${key}Score`].weight);
}, 0);
}Reporting Cadence
Report Schedule
| Report | Frequency | Audience | Focus | |--------|-----------|----------|-------| | Daily Pulse | Daily | Content team | Traffic anomalies, trending | | Weekly Performance | Weekly | Marketing | Top content, trends | | Monthly Deep Dive | Monthly | Leadership | ROI, attribution | | Quarterly Review | Quarterly | Executive | Business impact |
Monthly Report Template
## Content Marketing Monthly Report
### [Month, Year]
---
### Executive Summary
- Total content published: [X]
- Organic traffic: [X] sessions ([+/-X%] MoM)
- Content conversions: [X] leads ([+/-X%] MoM)
- Attributed revenue: $[X] ([+/-X%] MoM)
---
### Traffic Performance
| Metric | This Month | Last Month | YoY |
|--------|------------|------------|-----|
| Pageviews | X | X | X% |
| Organic Sessions | X | X | X% |
| New vs Returning | X% / X% | - | - |
**Top Performing Content:**
1. [Title] - [X] pageviews
2. [Title] - [X] pageviews
3. [Title] - [X] pageviews
---
### Engagement
- Avg. time on page: [X:XX]
- Avg. scroll depth: [X%]
- Social shares: [X]
---
### Conversions
| Conversion Type | Count | Rate | Revenue |
|-----------------|-------|------|---------|
| Email signups | X | X% | - |
| Content downloads | X | X% | - |
| Demo requests | X | X% | $X |
| Purchases | X | X% | $X |
---
### Key Insights
1. [Insight with data]
2. [Insight with data]
3. [Insight with data]
### Recommendations
1. [Action item]
2. [Action item]
3. [Action item]Tools & Implementation
Measurement Stack
| Tool | Purpose | Integration | |------|---------|-------------| | pxlpeak | Traffic, conversion, attribution | Primary analytics | | Search Console | Search performance | SEO tracking | | Ahrefs/Semrush | Keyword rankings, backlinks | SEO monitoring | | Social platforms | Social engagement | Native analytics | | CRM | Lead quality, revenue | Conversion tracking |
Related Guides: