Skip to content

Commit 098fce2

Browse files
bokelleyclaude
andauthored
feat: Add TIME pricing model for duration-based sponsorships (#930) (#1021)
Add a new `time` pricing model that charges per time unit (hour, day, week, or month), enabling self-serve sponsorship buys where total cost scales with campaign duration. This complements `flat_rate` which represents a fixed total cost regardless of duration. Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 0eb3451 commit 098fce2

7 files changed

Lines changed: 138 additions & 7 deletions

File tree

.changeset/add-time-pricing.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"adcontextprotocol": minor
3+
---
4+
5+
Add TIME pricing model for sponsorship-based advertising where price scales with campaign duration. Supports hour, day, week, and month time units with optional min/max duration constraints.

docs/media-buy/advanced-topics/pricing-models.mdx

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
title: Pricing Models
3-
description: Comprehensive guide to AdCP's flexible pricing models including CPM, CPCV, CPP, CPC, CPA, and DOOH support
4-
keywords: [pricing models, CPM, CPCV, CPP, CPC, CPA, CPV, GRP, video pricing, DOOH, share of voice, measurement, conversions]
3+
description: Comprehensive guide to AdCP's flexible pricing models including CPM, CPCV, CPP, CPC, CPA, Time, and DOOH support
4+
keywords: [pricing models, CPM, CPCV, CPP, CPC, CPA, CPV, GRP, video pricing, DOOH, share of voice, measurement, conversions, time-based, sponsorship, daily rate]
55
---
66

77

@@ -310,6 +310,54 @@ Buyers should verify the measurement provider meets their campaign requirements
310310

311311
---
312312

313+
### Time (Cost Per Time Unit)
314+
**Cost per time unit** - Rate scales with campaign duration, enabling self-serve sponsorships.
315+
316+
**Use Cases**: Homepage takeovers, section sponsorships, premium placements where price depends on booking duration
317+
318+
**Example**:
319+
```json
320+
{
321+
"$schema": "https://adcontextprotocol.org/schemas/v2/pricing-options/time-option.json",
322+
"pricing_option_id": "time_usd_daily",
323+
"pricing_model": "time",
324+
"fixed_price": 50000.00,
325+
"currency": "USD",
326+
"parameters": {
327+
"time_unit": "day",
328+
"min_duration": 1,
329+
"max_duration": 30
330+
}
331+
}
332+
```
333+
334+
**Billing**: Cost = `fixed_price` x number of `time_unit`s in the campaign flight. For example, a 3-day campaign at $50,000/day = $150,000 total.
335+
336+
**Parameters**:
337+
- `time_unit` (required): `"hour"`, `"day"`, `"week"`, or `"month"`
338+
- `min_duration` (optional): Minimum booking duration in time units
339+
- `max_duration` (optional): Maximum booking duration in time units
340+
341+
**Time Unit Calculation**:
342+
343+
| Time Unit | Calculation |
344+
|-----------|-------------|
345+
| `hour` | rate x hours in flight |
346+
| `day` | rate x calendar days in flight |
347+
| `week` | rate x weeks (seller-defined rounding) |
348+
| `month` | rate x months (seller-defined pro-rating) |
349+
350+
**Comparison with Flat Rate**:
351+
352+
| Aspect | Flat Rate | Time |
353+
|--------|-----------|------|
354+
| Semantics | Fixed total cost | Rate x duration |
355+
| `fixed_price` means | Total campaign cost | Cost per time unit |
356+
| Buyer flexibility | Must negotiate duration | Self-serve any duration |
357+
| Use case | Fixed sponsorships | Scalable sponsorships |
358+
359+
---
360+
313361
## Digital Out-of-Home (DOOH) Pricing
314362

315363
DOOH advertising uses existing pricing models—typically **CPM** or **flat_rate**—with optional parameters to describe the inventory allocation.
@@ -459,6 +507,7 @@ Different pricing models report different primary metrics:
459507
| CPC | clicks | impressions, ctr, spend |
460508
| CPA | conversions | conversion_value, cost_per_acquisition, roas, spend |
461509
| Flat Rate | N/A | impressions, reach, frequency |
510+
| Time | N/A | impressions, reach, frequency |
462511

463512
## Example: Multi-Model CTV Product
464513

docs/media-buy/product-discovery/media-products.mdx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ A **Product** is the core sellable unit in AdCP. This document details the Produ
77

88
<Tip>
99
**Pricing Models**
10-
Products declare which pricing models they support. Buyers select a specific pricing option when creating media buys. See the complete [Pricing Models Guide](/docs/media-buy/advanced-topics/pricing-models) for details on CPM, CPCV, CPP, CPC, vCPM, and flat rate pricing.
10+
Products declare which pricing models they support. Buyers select a specific pricing option when creating media buys. See the complete [Pricing Models Guide](/docs/media-buy/advanced-topics/pricing-models) for details on CPM, CPCV, CPP, CPC, CPA, vCPM, flat rate, and time-based pricing.
1111
</Tip>
1212

1313
## The Product Model
@@ -41,10 +41,10 @@ Publishers declare which pricing models they support for each product. Buyers se
4141
- **CPC** (Cost Per Click) - Cost per click on the ad
4242
- **CPCV** (Cost Per Completed View) - Cost per 100% video/audio completion
4343
- **CPV** (Cost Per View) - Cost per view at publisher-defined threshold
44-
- **CPA** (Cost Per Action) - Cost per conversion/acquisition
45-
- **CPL** (Cost Per Lead) - Cost per lead generated
44+
- **CPA** (Cost Per Acquisition) - Cost per conversion event (purchase, lead, signup, etc.)
4645
- **CPP** (Cost Per Point) - Cost per Gross Rating Point (TV/audio)
4746
- **Flat Rate** - Fixed cost regardless of delivery volume
47+
- **Time** - Cost per time unit (day, week, month) that scales with campaign duration
4848

4949
#### PricingOption Structure
5050

static/schemas/source/core/pricing-option.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
},
2828
{
2929
"$ref": "/schemas/pricing-options/flat-rate-option.json"
30+
},
31+
{
32+
"$ref": "/schemas/pricing-options/time-option.json"
3033
}
3134
]
3235
}

static/schemas/source/enums/pricing-model.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
"cpv",
1313
"cpp",
1414
"cpa",
15-
"flat_rate"
15+
"flat_rate",
16+
"time"
1617
],
1718
"enumDescriptions": {
1819
"cpm": "Cost Per Mille - cost per 1,000 impressions",
@@ -22,6 +23,7 @@
2223
"cpv": "Cost Per View - cost per view at publisher-defined threshold (e.g., 50% completion)",
2324
"cpp": "Cost Per Point - cost per Gross Rating Point or Target Rating Point (TV/audio)",
2425
"cpa": "Cost Per Acquisition - cost per conversion event (purchase, lead, signup, etc.)",
25-
"flat_rate": "Flat Rate - fixed cost regardless of delivery volume (sponsorships, takeovers)"
26+
"flat_rate": "Flat Rate - fixed cost regardless of delivery volume (sponsorships, takeovers)",
27+
"time": "Time - cost per time unit (hour, day, week, or month) that scales with campaign duration"
2628
}
2729
}

static/schemas/source/index.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,10 @@
552552
"flat-rate-option": {
553553
"$ref": "/schemas/pricing-options/flat-rate-option.json",
554554
"description": "Flat rate pricing for DOOH and sponsorships - supports fixed rate and auction modes"
555+
},
556+
"time-option": {
557+
"$ref": "/schemas/pricing-options/time-option.json",
558+
"description": "Time-based pricing - cost per time unit (hour, day, week, month) that scales with campaign duration"
555559
}
556560
}
557561
},
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
{
2+
"$schema": "http://json-schema.org/draft-07/schema#",
3+
"$id": "/schemas/pricing-options/time-option.json",
4+
"title": "Time-Based Pricing Option",
5+
"description": "Cost per time unit (hour, day, week, or month) - rate scales with campaign duration. If fixed_price is present, it's fixed pricing. If absent, it's auction-based.",
6+
"type": "object",
7+
"properties": {
8+
"pricing_option_id": {
9+
"type": "string",
10+
"description": "Unique identifier for this pricing option within the product"
11+
},
12+
"pricing_model": {
13+
"type": "string",
14+
"const": "time",
15+
"description": "Cost per time unit - rate scales with campaign duration"
16+
},
17+
"currency": {
18+
"type": "string",
19+
"description": "ISO 4217 currency code",
20+
"pattern": "^[A-Z]{3}$",
21+
"examples": ["USD", "EUR", "GBP", "JPY"]
22+
},
23+
"fixed_price": {
24+
"type": "number",
25+
"description": "Cost per time unit. If present, this is fixed pricing. If absent, auction-based.",
26+
"minimum": 0
27+
},
28+
"floor_price": {
29+
"type": "number",
30+
"description": "Minimum acceptable bid per time unit for auction pricing (mutually exclusive with fixed_price). Bids below this value will be rejected.",
31+
"minimum": 0
32+
},
33+
"price_guidance": {
34+
"description": "Optional pricing guidance for auction-based bidding",
35+
"$ref": "/schemas/pricing-options/price-guidance.json"
36+
},
37+
"parameters": {
38+
"type": "object",
39+
"description": "Time-based pricing parameters",
40+
"required": ["time_unit"],
41+
"properties": {
42+
"time_unit": {
43+
"type": "string",
44+
"enum": ["hour", "day", "week", "month"],
45+
"description": "The time unit for pricing. Total cost = fixed_price × number of time_units in the campaign flight."
46+
},
47+
"min_duration": {
48+
"type": "integer",
49+
"minimum": 1,
50+
"description": "Minimum booking duration in time_units"
51+
},
52+
"max_duration": {
53+
"type": "integer",
54+
"minimum": 1,
55+
"description": "Maximum booking duration in time_units. Must be >= min_duration when both are present."
56+
}
57+
},
58+
"additionalProperties": true
59+
},
60+
"min_spend_per_package": {
61+
"type": "number",
62+
"description": "Minimum spend requirement per package using this pricing option, in the specified currency",
63+
"minimum": 0
64+
}
65+
},
66+
"required": ["pricing_option_id", "pricing_model", "currency", "parameters"],
67+
"additionalProperties": true
68+
}

0 commit comments

Comments
 (0)