Developer GuideCookbookDelegate: Multi-Campaign with Budgets

Delegate: Multi-Campaign with Budgets

Context: Demand source (DSP) running 3 simultaneous campaigns — a Q1 brand campaign, a CTV performance campaign, and an always-on fallback. Each has its own budget. Higher-priority campaigns win when multiple rules match.

Expected result: Brand campaign gets first pick of inventory; CTV performance is second; always-on fills the rest.


Strategy JSON

{
  "version": "1.0",
  "dsp_id": "your-dsp-uuid",
  "campaigns": [
    {
      "id": "q1-brand",
      "name": "Q1 Brand Awareness",
      "active": true,
      "priority": 1,
      "daily_budget": 1000.00,
      "start_date": "2026-01-01",
      "end_date": "2026-03-31"
    },
    {
      "id": "ctv-perf",
      "name": "CTV Performance",
      "active": true,
      "priority": 2,
      "daily_budget": 500.00
    },
    {
      "id": "always-on",
      "name": "Always On",
      "active": true,
      "priority": 99
    }
  ],
  "rules": [
    {
      "name": "Q1 Brand — CTV Prime Time",
      "campaign_id": "q1-brand",
      "conditions": {
        "device.devicetype": "3",
        "hour": ["17", "18", "19", "20", "21", "22", "23"]
      },
      "bid": {
        "base_cpm": 8.00,
        "max_cpm": 15.00,
        "min_cpm": 5.00
      },
      "priority": 1
    },
    {
      "name": "Q1 Brand — Any CTV",
      "campaign_id": "q1-brand",
      "conditions": {
        "device.devicetype": "3"
      },
      "bid": {
        "base_cpm": 6.00,
        "max_cpm": 10.00,
        "min_cpm": 4.00
      },
      "priority": 2
    },
    {
      "name": "CTV Performance — MENA",
      "campaign_id": "ctv-perf",
      "conditions": {
        "device.devicetype": "3",
        "geo.country": ["AE", "SA", "KW", "QA"]
      },
      "bid": {
        "base_cpm": 7.00,
        "max_cpm": 12.00,
        "min_cpm": 4.00
      },
      "priority": 3
    },
    {
      "name": "Always On — Any",
      "campaign_id": "always-on",
      "conditions": {},
      "bid": {
        "base_cpm": 1.50,
        "max_cpm": 3.00,
        "min_cpm": 0.50
      },
      "priority": 99
    }
  ],
  "default_bid": 0
}

Priority resolution

When multiple rules match the same auction, the lowest priority number wins:

ScenarioMatching rulesRule usedBid
CTV + UAE + 20:00Q1 Brand Prime Time, Q1 Brand CTV, CTV Perf MENA, Always OnQ1 Brand Prime Time (priority 1)$8.00
CTV + UK + 20:00Q1 Brand Prime Time, Q1 Brand CTV, Always OnQ1 Brand Prime Time (priority 1)$8.00
CTV + UAE + 10:00Q1 Brand CTV, CTV Perf MENA, Always OnQ1 Brand CTV (priority 2)$6.00
Mobile + UKAlways OnAlways On (priority 99)$1.50

Campaign date scheduling

Q1 Brand has start_date: 2026-01-01 and end_date: 2026-03-31. After March 31, the campaign’s rules are skipped automatically — no manual deactivation needed. CTV Performance and Always On continue running indefinitely.

To pause a campaign mid-flight without deleting it: set "active": false.


Budget waterfall

When Q1 Brand’s $1,000 daily budget is exhausted:

  • Q1 Brand rules are skipped for the rest of the day
  • CTV Performance rules take over for CTV inventory
  • Always On handles everything else

Budget resets at midnight UTC daily.