Monetization
Start earning money.
DirectoryFast v1.6.0 introduces a comprehensive monetization platform that transforms your directory into a revenue-generating business. This complete guide covers all monetization features and their implementation.
Overview
The monetization system provides three primary revenue streams:
🚀 Paid Submissions - Express and Premium submission tiers
📺 Advertising Platform - Strategic ad placements throughout your site
⭐ Featured Products - Enhanced visibility for listings
All payments are processed securely through Polar with webhook-driven automation.
Quick Start
Prerequisites
Active Polar account with organization setup
DirectoryFast v1.6.0 or higher
Database migrations applied (
pnpm prisma db push
)
Essential Setup
Configure Polar Integration
POLAR_ACCESS_TOKEN=your_access_token POLAR_WEBHOOK_SECRET=your_webhook_secret POLAR_SERVER=production # or 'sandbox'
Sync Products from Polar
Navigate to
/dashboard/admin/monetization
Click "Sync from Polar" to import all products
Assign feature types to enable specific monetization features
Enable Features
Configure advertising in
/dashboard/admin/settings
Set paid submission preferences
Test webhook endpoints
Paid Submissions System
Overview
The paid submissions system offers tiered pricing for different review speeds and benefits, allowing users to pay for faster processing and enhanced visibility.
Submission Tiers
Free Submission (Default)
Processing Time: 7-14 days
Review Type: Manual review process
Placement: Standard listing placement
Features: Basic submission form
Admin Control: Can be disabled globally
Express Submission
Processing Time: 24-48 hours
Review Type: Priority review queue
Placement: Standard listing placement
Features:
Submission status tracking
Email notifications
Priority support
Premium Submission
Processing Time: Same day review
Review Type: Immediate priority processing
Placement: Featured placement for 7 days
Features:
All Express features
Featured listing boost
Social media promotion
Dedicated support channel
Configuration
Admin Dashboard Setup
Product Configuration
Feature Type: express_submission Polar Product: Your Express product ID Price: $9.99 (auto-synced from Polar) Status: Active
Submission Settings
Navigate to
/dashboard/admin/monetization
Configure free submission toggle
Monitor submission analytics
Review payment tracking
Implementation Example
// Submission form with tier selection
const submissionTiers = [
{
id: 'free',
name: 'Free Submission',
price: 0,
features: ['7-14 days processing', 'Standard placement'],
timeline: '7-14 days'
},
{
id: 'express',
name: 'Express Submission',
price: 9.99,
features: ['24-48h processing', 'Priority queue'],
timeline: '24-48 hours'
},
{
id: 'premium',
name: 'Premium Submission',
price: 29.99,
features: ['Same day review', '7-day featured'],
timeline: 'Same day'
}
];
Webhook Processing
Paid submissions are automatically processed via webhooks:
// Automatic paid submission processing
if (metadata.type === 'paid_submission') {
const suggestion = await prisma.suggestion.create({
data: {
title: submissionData.productTitle,
owner: submissionData.productOwner,
status: 'pending',
isPaid: true,
paymentId: orderId,
submissionType: metadata.submissionType,
// Auto-linked to user and category
}
});
}
Advertising Platform
Overview
The advertising platform provides strategic ad placements throughout your directory with capacity management and real-time analytics.
Ad Placement Locations
Homepage Hero Ads
Location: Top of homepage
Format: Compact banner (350x80px)
Capacity: Up to 4 ads in grid layout
Visibility: Highest traffic area
Ideal For: Brand awareness, new product launches
Product Page Sidebar Ads
Location: Product detail page sidebar
Format: Compact banner (350x80px)
Capacity: Up to 4 ads stacked
Visibility: High-intent product viewers
Ideal For: Related products, competitors
Blog Post Sidebar Ads
Location: Blog post content sidebar
Format: Compact banner (350x80px)
Capacity: Up to 4 ads stacked
Visibility: Engaged content readers
Ideal For: Thought leadership, educational content
Collection Page Ads
Location: Collection browsing pages
Format: Compact banner (350x80px)
Capacity: Up to 4 ads in grid
Visibility: Category-focused users
Ideal For: Category-specific targeting
Category Page Ads
Location: Category listing pages
Format: Compact banner (350x80px)
Capacity: Up to 4 ads in grid
Visibility: Category browsers
Ideal For: Niche market targeting
Pricing Model
Flat-Rate Monthly Pricing - No complex CPC/CPM calculations
Simple monthly subscription per placement
Predictable costs for advertisers
Guaranteed placement duration
No click-through requirements
Ad Campaign Workflow
Campaign Creation
Advertiser selects placement location
Provides ad creative and targeting details
Completes Polar checkout process
Admin Approval
Campaign enters "PENDING_APPROVAL" status
Admin reviews ad content and guidelines
Approval activates campaign and starts billing
Active Campaign
Ad displays in selected placement
Real-time impression and click tracking
Automatic campaign management
Analytics & Reporting
Campaign performance metrics
Revenue tracking per placement
Advertiser dashboard access
Implementation Details
Ad Purchase Flow
// Ad campaign purchase process
const adPackages = [
{
id: 'homepage-hero',
name: 'Homepage Hero Ads',
description: 'Prime placement at the top of homepage',
price: 299.99,
placement: 'HOMEPAGE_HERO',
features: ['4 ad slots', 'Premium visibility', 'Monthly duration']
}
// ... other packages
];
const handleAdPurchase = async (packageData, campaignData) => {
const response = await fetch('/api/ads/checkout', {
method: 'POST',
body: JSON.stringify({ packageData, campaignData })
});
const { checkoutUrl } = await response.json();
window.location.href = checkoutUrl;
};
Auto-Placement Management
// Automatic ad placement creation
const placement = await prisma.adPlacement.create({
data: {
name: placementData.name,
location: placementData.location,
dimensions: '350x80',
maxAdsPerPage: 4,
priority: 8,
isActive: true
}
});
Revenue Tracking
Track advertising revenue with detailed analytics:
Revenue by placement - Performance per ad location
Campaign profitability - ROI tracking per campaign
Occupancy rates - Placement capacity utilization
Advertiser retention - Repeat customer analysis
Featured Products
Traditional Featured Listings
Enhanced visibility for existing directory products:
30-day featured placement in special sections
Enhanced presentation with visual indicators
Priority positioning in search results
Homepage feature rotation
Implementation
// Featured product purchase
const createFeatured = async (productSlug: string) => {
const response = await fetch('/api/checkout/polar', {
method: 'POST',
body: JSON.stringify({
productSlug,
metadata: { featureType: 'featured' }
})
});
const { checkoutUrl } = await response.json();
window.location.href = checkoutUrl;
};
Auto-Management
Featured products are automatically managed:
Automatic expiration after 30 days
Renewal notifications before expiration
Usage analytics and performance tracking
Revenue attribution to featured placements
Admin Dashboard
Monetization Overview
Access comprehensive controls at /dashboard/admin/monetization
:
Product Management
Polar Product Sync - One-click product import
Feature Type Assignment - Map products to features
Pricing Management - Auto-sync from Polar
Status Control - Activate/deactivate products
Revenue Analytics
Total Revenue Tracking - Across all monetization features
Monthly/Annual Trends - Growth tracking
Feature Performance - Revenue by feature type
Customer Metrics - LTV and retention analysis
Campaign Management (Advertising)
Active Campaigns - Monitor running ad campaigns
Approval Queue - Review pending advertisements
Placement Analytics - Performance by ad location
Capacity Management - Monitor placement availability
Settings Configuration
Configure monetization features in /dashboard/admin/settings
:
Polar Configuration
API Credentials - Access token and webhook secret
Server Environment - Production vs sandbox
Connection Status - Real-time configuration validation
Feature Toggles
Advertising System - Global enable/disable
Free Submissions - Allow/disallow free tier
Feature Announcements - User-facing feature notifications
Database Schema
Core Models
PolarProduct
model PolarProduct {
id String @id @default(cuid())
productId String @unique // Polar product UUID
name String
slug String @unique
featureType String? // Feature assignment
price Float?
isActive Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
Suggestion (Enhanced)
model Suggestion {
// ... existing fields
isPaid Boolean @default(false)
paymentId String?
submissionType String @default('free')
}
Advertising Models
model AdCampaign {
id String @id @default(cuid())
name String
description String?
status String // PENDING_PAYMENT, PENDING_APPROVAL, ACTIVE, PAUSED
startDate DateTime
endDate DateTime
bidAmount Float
totalSpent Float @default(0)
userId String
ads Ad[]
}
model Ad {
id String @id @default(cuid())
title String
description String
imageUrl String
clickUrl String
status String // PENDING_PAYMENT, PENDING, APPROVED, ACTIVE, PAUSED
campaignId String
campaign AdCampaign @relation(fields: [campaignId], references: [id])
placements AdPlacement[]
}
model AdPlacement {
id String @id @default(cuid())
name String
location String // HOMEPAGE_HERO, PRODUCT_PAGE_SIDEBAR, etc.
dimensions String @default("350x80")
maxAdsPerPage Int @default(4)
priority Int @default(5)
isActive Boolean @default(true)
ads Ad[]
}
API Endpoints
Paid Submissions
POST /api/submit-paid
- Handle submission with paymentGET /api/admin/submissions
- Admin submission management
Advertising
POST /api/ads/checkout
- Create ad campaign checkoutGET /api/ads/placements
- Available ad placementsPATCH /api/admin/ads/approve/:id
- Approve ad campaign
Monetization
POST /api/admin/polar-products/sync
- Sync products from PolarGET /api/featured/revenue
- Revenue analyticsGET /api/admin/analytics/revenue
- Comprehensive revenue data
Security & Guidelines
Payment Security
PCI Compliance - Handled by Polar
Webhook Verification - Cryptographic signature validation
Environment Isolation - Separate sandbox/production environments
Content Guidelines
Ad Content Review - Manual approval process
Submission Quality - Paid submissions still subject to guidelines
Refund Policy - Clear terms for service delivery
Privacy Considerations
Data Collection - Analytics data collection disclosure
Customer Information - Secure handling of payment data
GDPR Compliance - User consent and data management
Troubleshooting
Common Issues
Sync Problems
# Check Polar connection
curl -H "Authorization: Bearer $POLAR_ACCESS_TOKEN" \
https://api.polar.sh/v1/products
Webhook Issues
Verify webhook URL is publicly accessible
Check webhook secret matches environment variable
Monitor webhook delivery in Polar dashboard
Revenue Discrepancies
Ensure all webhook events are properly processed
Check for failed payments or refunds
Verify currency conversion if applicable
Debug Tools
Enable comprehensive logging:
DEBUG_POLAR=true
DEBUG_WEBHOOKS=true
DEBUG_REVENUE=true
Performance Monitoring
Monitor key metrics:
Webhook Processing Time - Payment automation speed
Ad Load Performance - Site speed impact
Revenue Accuracy - Financial reconciliation
Best Practices
Revenue Optimization
A/B Test Pricing - Experiment with submission tier pricing
Seasonal Campaigns - Adjust ad pricing for high-traffic periods
Customer Retention - Implement loyalty programs for repeat advertisers
User Experience
Clear Pricing - Transparent cost structure
Fast Processing - Deliver on promised processing times
Quality Control - Maintain high standards for all tiers
Growth Strategies
Package Deals - Bundle features for higher value
Volume Discounts - Incentivize bulk purchases
Referral Programs - Customer acquisition through existing users
Migration Guide
From v1.5.x to v1.6.0
Database Migration
pnpm prisma db push
Environment Updates
# Add if missing DEBUG_POLAR=false
Feature Configuration
Enable advertising in admin settings
Configure paid submission products
Test webhook endpoints
User Communication
Announce new monetization features
Update terms of service
Provide pricing transparency
Last updated