Convert engaged readers into paying subscribers with data-driven paywall optimization.
Subscription Funnel Overview
The Conversion Journey
Visitor → Reader → Registered → Engaged → Subscriber → Retained
100% 40% 15% 8% 2% 1.5%
Key Subscription Metrics
| Metric | Formula | Benchmark |
|---|---|---|
| Visitor-to-Sub | Subscribers ÷ Visitors | 0.5-2% |
| Paywall Conversion | Subs ÷ Paywall Hits | 2-5% |
| Trial Conversion | Paid ÷ Trials | 40-60% |
| Annual Retention | Renewed ÷ Eligible | 70-85% |
| Monthly Retention | Active ÷ Start | 92-96% |
Paywall Strategy
Paywall Types
| Type | Description | Best For |
|---|---|---|
| Hard | All content behind paywall | Premium brands |
| Metered | X free articles/month | Growing audience |
| Freemium | Some free, premium locked | Broad reach |
| Dynamic | AI-based access decisions | Optimization |
Track Paywall Hits
// Track meter status
zenovay('track','meter_status', {
user_id: userId,
articles_read_period: 3,
limit: 5,
period: 'month',
is_registered: false
});
// Track paywall shown
zenovay('track','paywall_shown', {
user_id: userId,
article_id: 'art_12345',
trigger: 'meter_limit',
articles_read: 5,
user_segment: 'engaged_anonymous',
paywall_variant: 'offer_50_off'
});
Paywall Placement
| Trigger | Conversion Rate | Notes |
|---|---|---|
| After 3 articles | 2.1% | Aggressive |
| After 5 articles | 3.5% | Standard |
| After 10 articles | 4.2% | Conservative |
| Mid-article | 1.8% | Frustrating |
| End of article | 2.8% | Less friction |
Registration Wall
Track Registration
// Registration wall shown
zenovay('track','regwall_shown', {
user_id: userId,
articles_read: 2,
trigger: 'article_limit',
variant: 'value_prop_newsletter'
});
// Registration completed
zenovay('track','user_registered', {
user_id: userId,
method: 'email',
source: 'regwall',
articles_before_reg: 2,
newsletter_opted_in: true
});
Registration Conversion
| Variant | Shown | Registered | Rate |
|---|---|---|---|
| Value prop | 10K | 1,800 | 18% |
| Newsletter focus | 10K | 2,100 | 21% |
| Social login | 10K | 2,400 | 24% |
| Minimal fields | 10K | 2,600 | 26% |
Subscription Page Optimization
Track Subscription Page
// Subscription page viewed
zenovay('track','subscription_page_viewed', {
user_id: userId,
source: 'paywall',
previous_page: 'art_12345',
plan_shown: ['monthly', 'annual'],
offer_active: 'summer_50_off'
});
// Plan selected
zenovay('track','plan_selected', {
user_id: userId,
plan: 'annual',
price: 99,
original_price: 199,
discount: 50
});
Pricing Page A/B Tests
Test these elements:
- Number of plans shown
- Annual vs monthly prominence
- Price anchoring
- Discount presentation
- Feature comparison
| Test | Variant A | Variant B | Winner |
|---|---|---|---|
| Plans | 2 options | 3 options | A (+15%) |
| Default | Monthly | Annual | B (+22%) |
| Discount | % off | $ saved | B (+8%) |
Checkout Optimization
Track Checkout Flow
// Checkout started
zenovay('track','checkout_started', {
user_id: userId,
plan: 'annual',
price: 99,
currency: 'USD'
});
// Payment method selected
zenovay('track','payment_method_selected', {
user_id: userId,
method: 'credit_card' // apple_pay, google_pay, paypal
});
// Checkout completed
zenovay('track','subscription_started', {
user_id: userId,
plan: 'annual',
price: 99,
trial_days: 7,
payment_method: 'credit_card',
offer_used: 'summer_50_off',
source: 'paywall',
articles_before_sub: 12
});
Checkout Drop-off
| Step | Users | Drop-off |
|---|---|---|
| Pricing page | 1,000 | - |
| Plan selected | 450 | 55% |
| Payment info | 320 | 29% |
| Completed | 280 | 13% |
Focus: Plan selection has highest drop-off.
Trial Optimization
Track Trial Users
// Trial started
zenovay('track','trial_started', {
user_id: userId,
trial_length: 7,
plan: 'annual',
source: 'paywall_offer'
});
// Trial engagement
zenovay('track','trial_engagement', {
user_id: userId,
trial_day: 3,
articles_read: 8,
features_used: ['newsletter', 'archive', 'app'],
engagement_score: 75
});
// Trial converted
zenovay('track','trial_converted', {
user_id: userId,
trial_length: 7,
days_to_convert: 5,
articles_during_trial: 15,
plan: 'annual',
price: 99
});
// Trial cancelled
zenovay('track','trial_cancelled', {
user_id: userId,
trial_day: 6,
articles_during_trial: 2,
reason: 'not_enough_value',
engagement_score: 25
});
Trial Conversion by Engagement
| Trial Engagement | Conversion Rate |
|---|---|
| 0-2 articles | 15% |
| 3-5 articles | 35% |
| 6-10 articles | 55% |
| 11+ articles | 72% |
Insight: Encourage 6+ articles during trial.
Offer Optimization
Track Offers
// Offer shown
zenovay('track','offer_shown', {
user_id: userId,
offer_id: 'summer_50_off',
discount_percent: 50,
offer_type: 'first_year',
location: 'paywall',
user_segment: 'high_engagement'
});
// Offer accepted
zenovay('track','offer_accepted', {
user_id: userId,
offer_id: 'summer_50_off',
discount_value: 100,
final_price: 99
});
Offer Performance
| Offer | Shown | Converted | Rate | Revenue |
|---|---|---|---|---|
| No discount | 5K | 125 | 2.5% | $24,875 |
| 25% off | 5K | 200 | 4.0% | $29,850 |
| 50% off | 5K | 350 | 7.0% | $34,650 |
| Free month | 5K | 280 | 5.6% | $52,080* |
*Free month has higher LTV due to annual lock-in.
Propensity Scoring
Predict Conversion Likelihood
// Calculate propensity score
function calculatePropensityScore(userId) {
const factors = {
visit_frequency: getVisitFrequency(userId),
article_depth: getScrollDepth(userId),
content_variety: getCategoriesRead(userId),
registration_age: getDaysSinceReg(userId),
paywall_hits: getPaywallHits(userId),
newsletter_engagement: getNewsletterScore(userId)
};
const score = predictConversion(factors);
zenovay('track','propensity_score', {
user_id: userId,
score: score, // 0-100
factors: factors,
recommended_action: getRecommendedAction(score)
});
}
Score-Based Actions
| Propensity | % Users | Action |
|---|---|---|
| 80-100 | 5% | Direct ask, full price |
| 60-79 | 15% | Soft ask, small discount |
| 40-59 | 25% | Nurture, newsletter |
| 20-39 | 30% | Engagement focus |
| 0-19 | 25% | Awareness building |
Churn Prevention
Track Cancellation
// Cancellation page viewed
zenovay('track','cancel_page_viewed', {
user_id: userId,
subscription_age_days: 180,
plan: 'annual',
renewal_date: '2025-02-15'
});
// Cancellation reason
zenovay('track','cancel_reason', {
user_id: userId,
reason: 'too_expensive',
secondary_reason: 'not_reading_enough',
feedback: 'Great content but budget tight'
});
// Save offer shown
zenovay('track','save_offer_shown', {
user_id: userId,
offer: 'pause_3_months',
alternative: '50_percent_off_3_months'
});
// Subscription cancelled
zenovay('track','subscription_cancelled', {
user_id: userId,
reason: 'too_expensive',
tenure_days: 180,
ltv: 99,
save_offer_declined: true
});
Save Offers Performance
| Offer | Shown | Saved | Rate |
|---|---|---|---|
| Pause subscription | 500 | 120 | 24% |
| Downgrade to cheaper | 500 | 95 | 19% |
| 50% off 3 months | 500 | 180 | 36% |
| Switch to annual | 500 | 85 | 17% |
Attribution
Subscription Source
| Source | Subscribers | % | CAC |
|---|---|---|---|
| Organic search | 1,200 | 35% | $15 |
| Direct | 800 | 23% | $0 |
| Newsletter | 650 | 19% | $8 |
| Social | 400 | 12% | $45 |
| Paid ads | 350 | 10% | $85 |
Content Attribution
Track which content drives subscriptions:
// Track content before subscription
zenovay('track','subscription_started', {
user_id: userId,
articles_before_sub: articleList,
converting_article: 'art_12345',
days_as_reader: 45,
// ...other fields
});
| Content Type | Subs | Conversion Rate |
|---|---|---|
| Exclusive investigation | 180 | 8.2% |
| Breaking news | 420 | 1.5% |
| Expert analysis | 280 | 5.1% |
| How-to guides | 150 | 3.8% |
Subscriber Health
Track Subscriber Engagement
// Weekly subscriber health
zenovay('track','subscriber_health', {
user_id: userId,
subscription_age_days: 90,
articles_this_week: 5,
features_used: ['newsletter', 'app'],
health_score: 72,
renewal_risk: 'low'
});
Health Score Actions
| Score | Risk Level | Action |
|---|---|---|
| 80+ | Very Low | Upsell, referral ask |
| 60-79 | Low | Maintain engagement |
| 40-59 | Medium | Re-engagement campaign |
| 20-39 | High | Personal outreach |
| <20 | Critical | Save offer preemptively |
Reporting
Daily Subscription Report
- New subscribers
- Trials started
- Cancellations
- Net change
- Revenue
Weekly Analysis
- Conversion rate by source
- Offer performance
- Paywall optimization
- Trial engagement
Monthly Deep Dive
- Cohort analysis
- LTV calculations
- Churn analysis
- Content attribution
Subscription Goals
Set Conversion Goals
// Track against goals
zenovay('track','subscription_goal_progress', {
period: '2025-01',
target_subs: 500,
current_subs: 320,
target_revenue: 50000,
current_revenue: 32000,
days_remaining: 15
});
Example Goals
| Goal | Target | Current | Status |
|---|---|---|---|
| Monthly subs | 500 | 320 | 64% |
| Trial conversion | 50% | 48% | On track |
| Churn rate | <5% | 4.2% | Good |
| LTV | $180 | $165 | Focus |
Best Practices
Conversion Optimization
-
Know your audience
- Segment by engagement
- Different offers for different segments
-
Reduce friction
- Simple checkout
- Multiple payment options
- Clear value proposition
-
Test everything
- Paywall placement
- Pricing
- Offers
- Messaging
-
Track the full journey
- First visit to subscription
- All touchpoints
Common Mistakes
-
Aggressive paywall too early
- Let readers fall in love first
- Build habit before asking
-
Ignoring engagement
- Subscribers who don't read churn
- Monitor ongoing engagement
-
One-size-fits-all
- Personalize offers
- Segment messaging
-
Focusing only on new subs
- Retention is cheaper than acquisition
- Monitor subscriber health