Skip to content

Scheduled media: booking rounds and expected confirmation time #8010

Open

Description

@bokelley

Problem

A lot of scheduled media is not booked "now". It is booked in rounds on a published calendar.

Dutch linear TV is a clear example. For each airing month:

  1. buying opens on a fixed date;
  2. the first request round closes about eight days later;
  3. the sales house confirms orders about two weeks after that.

Requests after the first round are still accepted, but at a different price index and without a placement guarantee. Other TV markets, radio and print have similar cycles.

AdCP has the pieces for single deadlines but not for a round:

  • installment.deadlines.booking_deadline and deadline-policy.booking_lead_days say when booking closes for an installment. They don't say when it opens, when the seller will confirm, or what happens to a request made after the round closes.
  • create_media_buy can return submitted with a task_id, which is right for a request the seller confirms later. But the buyer has no way to know when the confirmation is due, so it can only poll.

A buyer agent therefore cannot plan "submit before the round closes, expect confirmation on the 20th, put the creative in by the material deadline". Nor can it explain to a person why a buy made today won't be confirmed for two weeks.

Proposed shape

  1. Product or collection: booking rounds. An optional booking_rounds[], each with:
  2. create_media_buy submitted response: an optional expected_confirmation_at, so the buyer can schedule a check instead of polling.

Relationship to other work

Milestone: 3.3.0.

Activity

  1. added this to the 3.3.0 milestone on Oct 8, 2026
  2. added
    rfcProtocol change — auto-adds to roadmap board
    media-buyIssue concerns the media-buy protocol domain
    on Oct 8, 2026
  3. added
    claude-triagingTriage routine is actively working on this issue (1-3 min)
    claude-triagedIssue has been triaged by the Claude Code triage routine. Remove to re-triage.
    and removed
    claude-triagingTriage routine is actively working on this issue (1-3 min)
    on Oct 8, 2026
  4. bokelley commented on Oct 8, 2026

    @bokelley
    ContributorAuthor

    WG decision brief (3.3)

    Split. (1) expected_confirmation_at on submitted envelopes: PR #8016, small, stable optional, proposed for 3.3. (2) booking_rounds[]: draft sketch in PR #8022 (experimental), default 3.4 unless the WG agrees quickly. Scope freeze is about a week out, and the round shape has two adopters (the Dutch linear TV pilot, O-N-X) and no field experience.

    Decisions needed

    1. Ship expected_confirmation_at in 3.3 as stable? Recommend yes. One optional date-time, "estimate, not a commitment", x-added-in: 3.3.0. It is useful beyond TV (IO signing, manual review) and does not depend on the round design. It is on create_media_buy, buy_products and accept_proposal, not on the shared compact envelope.
    2. Follow-ons to feat(schema): add expected_confirmation_at to submitted media-buy envelopes #8016? Recommend update_media_buy's submitted envelope (changes confirm on the same calendar, pairs with Delivery evidence gaps for scheduled and offline channels: change cutoff, package installment selection, cinema and print proof #7777) in 3.3 if cheap. Exposing the estimate on get_task_status for non-terminal tasks waits for 3.4.
    3. Is booking_rounds[] in 3.3 or 3.4? Recommend 3.4, and ship it experimental then. feat(schema): selection-dependent price_adjustments on fixed-price pricing options #7955's own brief already defers late-booking surcharges tied to rounds to 3.4, and the price piece (Q5) is where the open design is. If the WG wants it in 3.3, feat(schema): draft booking_rounds on product for scheduled media (experimental) #8022 is a starting point, not a finished spec.
    4. Where does the calendar live? The sketch puts it on Product. Recommend product-level for now, with a stable round_id and only the open and next rounds listed. A shared seller-level calendar that products reference is better long term, since the calendar belongs to a sales house, not a product. Collections don't fit because products span them. Revisit with the pilot's real product count.
    5. How is a late request priced? A late price index is time-conditioned (received-at), while feat(schema): selection-dependent price_adjustments on fixed-price pricing options #7955's price_adjustments rows are evaluated at the purchase start_time and priced by selection. Recommend: in the sketch, late_request_pricing_option_id points at an ordinary pricing option on the same product, so the price stays inside terms_digest. For 3.4, add a round-keyed dimension to the price_adjustments table. Note: feat(schema): selection-dependent price_adjustments on fixed-price pricing options #7955 does carry index and premium kinds, but they cannot express lateness today.
    6. Which timestamp decides "late" and fixes the price? Recommend the seller's received-at time, fixed when submitted is returned. A later confirmation must not reprice.
    7. How does a buyer learn which round it landed in? Recommend echoing round_id, a late flag and the effective guarantee on the accepted media buy. Otherwise accepted_without_guarantee on a guaranteed product leaves terms that contradict the product. The downgrade must be visible before commitment.
    8. How is a request mapped to a round, and what about a flight spanning two rounds? Recommend: round semantics apply only when the flight falls inside one covers window (same rule feat(schema): selection-dependent price_adjustments on fixed-price pricing options #7955 uses for price windows); otherwise the buyer splits the buy. Is covers a plain date range in the seller's timezone, or datetimes? TV broadcast days don't end at midnight.
    9. Hard close and later rounds. Does round 2 have its own deadline and price index, or is everything after round 1 one "late" bucket? Recommend a separate booking_deadline (hard close) on the round now, and ask the pilot whether a distinct second round exists in practice.
    10. Vocabulary. Recommend expected_confirmation_at everywhere (matches feat(schema): add expected_confirmation_at to submitted media-buy envelopes #8016), request_deadline for the soft close, booking_deadline for the hard close (matches installment.deadlines), and change_cutoff (Delivery evidence gaps for scheduled and offline channels: change cutoff, package installment selection, cinema and print proof #7777) reused unchanged if rounds ever carry it. The enum is late-request-handling, not "policy", to avoid colliding with deadline_policy.
    11. Error for a rejected late request. No suitable code exists today (PRODUCT_EXPIRED is the nearest). Needs the normal error-code process before any normative text.

    Not blocking: #7620 (pDOOH booking horizons) has a different inventory model and should stay separate; the sketch has no compliance vectors or storyboard yet.

  5. bokelley commented on Oct 31, 2026

    @bokelley
    ContributorAuthor

    Part of this shipped: expected_confirmation_at on submitted envelopes, in #8016, #8104 and #8203 (all 3.3.0-beta.0).

    booking_rounds[] is #8022, an unmerged draft with 3.4 as the stated default and no decision to pull it into 3.3 (#8010 (comment)). Per the WG rule ('anything not decided moves to 3.4') only the booking rounds move to 3.4. Objections by Fri 2026-11-06. The milestone stays 3.3.0 for now; it will be moved after Nov 6.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    claude-triagedIssue has been triaged by the Claude Code triage routine. Remove to re-triage.media-buyIssue concerns the media-buy protocol domainrfcProtocol change — auto-adds to roadmap boardspec / protocol

    Type

    No type

    Projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions