Overview

Media Buys are the actual execution layer where budget meets publisher inventory. While Tactics define your strategic allocation (targeting + budget), Media Buys execute that strategy with specific publishers through ADCP (Ad Context Protocol).
Three-Tier Architecture: Campaign → Tactic → Media Buy
  • Campaigns: Overall marketing initiative with total budget
  • Tactics: Strategic budget allocation with targeting strategy
  • Media Buys: Direct publisher execution at negotiated CPMs

The Media Buy Lifecycle

Phase 1: Discovery & Selection

Media buys begin with publisher product discovery:
// Discover available publisher products
const products = await discover_publisher_products({
  query: "premium video inventory for sports fans",
  maxCpm: 30,
  formats: ["video", "display"]
});

// Returns publisher media products with pricing:
// • ESPN Video Package - $25 CPM (guaranteed delivery)
// • Fox Sports Display - $18 CPM (non-guaranteed)  
// • NBC Sports CTV - $45 CPM (premium guaranteed)

Phase 2: Creation & Pricing

Create a media buy within a tactic with transparent pricing:
const mediaBuy = await media_buy_create({
  tacticId: "tactic_123",
  salesAgentId: "agent_espn_456", 
  mediaProductId: "prod_video_789",
  name: "Q4 ESPN Video Buy",
  budget: {
    amount: 25000,
    currency: "USD",
    dailyCap: 1000,
    pacing: "even"
  },
  cpm: 25.00,           // Base CPM from publisher
  signalCost: 2.50      // Additional cost for data targeting
});

// Total effective CPM: $27.50
// Projected impressions: ~909,090

Phase 3: Execution via ADCP

Media buys are submitted to publishers through their ADCP sales agents:
const execution = await media_buy_execute({
  mediaBuyId: "mb_123"
});

// Status progression:
// draft → pending_approval → active → completed
// ⚪     → 🟡              → 🟢    → ✅

Phase 4: Performance Tracking

Real-time performance data flows back from publishers:
const performance = await media_buy_get({
  mediaBuyId: "mb_123"
});

// Returns live metrics:
// 📊 Impressions: 450,230 delivered
// 💰 Spend: $12,381 (49.5% of budget)
// 📈 CPM: $27.51 (on target)
// ⏱️ Pacing: On track (51% remaining, 10 days left)

Key Concepts

Budget Allocation

Media buys inherit budget from their parent tactic:

Pricing Transparency

Every media buy shows complete pricing breakdown:
  • Base CPM: Publisher’s rate for the inventory
  • Signal Cost: Additional cost for data/targeting
  • Total CPM: Effective cost you pay per thousand impressions
// Example pricing breakdown
{
  pricing: {
    cpm: 25.00,         // What publisher charges
    signalCost: 2.50,   // Data/targeting premium
    totalCpm: 27.50     // What you actually pay
  }
}

Publisher Integration States

Media buys progress through clear states:
StatusIconDescriptionNext Action
draftCreated but not submittedExecute to submit
pending_approval🟡Awaiting publisher approvalWait for webhook
active🟢Live and deliveringMonitor performance
rejected🔴Publisher declinedReview and modify
completedFully deliveredAnalyze results
failedTechnical failureCheck error details

Working with Media Buys

Creating Your First Media Buy

User: "Create a $10,000 media buy with ESPN for my sports tactic"

Claude: Creating ESPN media buy...

✅ Media Buy Created Successfully!

## 💰 Q4 ESPN Sports Buy

### 📦 Publisher Details
• Publisher: ESPN
• Product: Premium Video Inventory
• Delivery: Guaranteed

### 💳 Budget Allocation
• Amount: $10,000 USD
• Daily Cap: $500
• Pacing: even

### 💰 Pricing
• Base CPM: $28.00
• Signal Cost: +$2.00
• Total CPM: $30.00
• Projected Impressions: ~333,333

### 🔗 ADCP Integration
• Status: ⚪ draft

Next: Execute this buy with media_buy_execute

Managing Multiple Media Buys

Tactics typically have multiple media buys for diversification:
// List all media buys for a tactic
const mediaBuys = await media_buy_list({
  tacticId: "tactic_123"
});

// Returns aggregated view:
// Total Media Buys: 5
// Active: 3 ($45,000 allocated)
// Pending: 1 ($10,000 allocated)  
// Draft: 1 ($5,000 allocated)
// 
// Top Performer: ESPN Buy (120% delivery)
// Needs Attention: Fox Buy (65% delivery)

Performance Optimization

Media buys can be optimized while running:
// Pause underperforming buy
await media_buy_update({
  mediaBuyId: "mb_underperformer",
  status: "paused"
});

// Increase budget for high performer
await media_buy_update({
  mediaBuyId: "mb_top_performer",
  budget: {
    amount: 15000  // Increased from 10000
  }
});

// Adjust pacing for time-sensitive campaign
await media_buy_update({
  mediaBuyId: "mb_urgent",
  budget: {
    pacing: "asap"  // Changed from "even"
  }
});

Advanced Features

Webhook Integration

Media buys support real-time status updates via webhooks:
// Webhook payload when publisher approves
{
  event: "media_buy.approved",
  mediaBuyId: "mb_123",
  adcpMediaBuyId: "adcp_456",
  status: "active",
  timestamp: "2024-01-15T10:30:00Z"
}

// Automatic status update in your system
// No polling required

Budget Pacing Strategies

Three pacing options control delivery speed:
StrategyUse CaseBehavior
evenStandard campaignsConsistent daily delivery
asapTime-sensitiveDeliver as fast as possible
front_loadedLaunch campaignsHigher initial spend, taper down

Publisher Product Types

Different inventory types serve different goals:
TypeDescriptionTypical CPMBest For
premiumTop-tier placements$30-60Brand campaigns
run_of_siteGeneral inventory$10-25Scale/reach
targeted_packageCustom audiences$20-40Performance

Best Practices

1. Diversification Strategy

Don’t put all budget in one media buy:
// Good: Diversified across publishers
Tactic: $50,000
├── ESPN: $15,000 (30%)
├── Fox: $12,000 (24%)
├── NBC: $10,000 (20%)
├── CNN: $8,000 (16%)
└── CBS: $5,000 (10%)

// Risky: Single publisher concentration
Tactic: $50,000
└── ESPN: $50,000 (100%) ❌

2. CPM Benchmarking

Compare CPMs across similar inventory:
// Analyze CPM efficiency
const analysis = await analyze_media_buys({
  tacticId: "tactic_123"
});

// Premium Video CPMs:
// ESPN: $28 (baseline)
// Fox: $26 (-7% vs ESPN) ✅
// NBC: $32 (+14% vs ESPN) ⚠️
// CBS: $25 (-11% vs ESPN) ✅

3. Performance Monitoring

Set up regular performance checks:
// Daily monitoring routine
const dailyCheck = async () => {
  const mediaBuys = await media_buy_list({
    tacticId: "tactic_123",
    status: "active"
  });
  
  for (const mb of mediaBuys) {
    if (mb.performance.cpm > mb.pricing.totalCpm * 1.1) {
      // CPM drifting 10% above target
      console.warn(`Review ${mb.name}: CPM drift detected`);
    }
    
    if (mb.performance.impressions < mb.projectedDaily * 0.8) {
      // Under-delivering by 20%
      console.warn(`Review ${mb.name}: Under-delivery detected`);
    }
  }
};

Common Patterns

Testing New Publishers

// Start small with new publishers
const testBuy = await media_buy_create({
  tacticId: "tactic_123",
  salesAgentId: "new_publisher",
  name: "Test Buy - New Publisher",
  budget: {
    amount: 1000,  // Small test budget
    pacing: "even"
  },
  cpm: 20.00
});

// If performance is good, scale up
if (testBuy.performance.qualityScore > 80) {
  await media_buy_update({
    mediaBuyId: testBuy.id,
    budget: { amount: 10000 }  // 10x increase
  });
}

Seasonal Inventory Booking

// Book premium inventory in advance
const holidayBuy = await media_buy_create({
  tacticId: "tactic_holiday",
  name: "Black Friday Premium Video",
  budget: {
    amount: 50000,
    pacing: "front_loaded"  // Heavy early delivery
  },
  startDate: "2024-11-25",
  endDate: "2024-11-30"
});

Integration with Tactics

Media buys aggregate up to tactics for strategic view:
// Tactic aggregates all media buy metrics
const tactic = await tactic_get({
  tacticId: "tactic_123"
});

// Shows aggregated metrics:
{
  metrics: {
    totalSpend: 45230,        // Sum of all media buys
    totalImpressions: 1650000, // Combined delivery
    averageCpm: 27.41,        // Weighted average
    activeMediaBuys: 3,       // Currently delivering
    totalMediaBuys: 5         // All statuses
  }
}

API Reference

Next Steps