Skip to content

Booking Flow

The DealBookingFlow is a CrewAI event-driven flow that orchestrates the end-to-end booking process. It is defined in flows/deal_booking_flow.py and extends Flow[BookingState].

Sequence Diagram

sequenceDiagram
    actor User as User / Campaign Manager
    participant API as Buyer API
(FastAPI) participant Flow as DealBookingFlow
(CrewAI) participant Portfolio as Portfolio Manager
Agent participant Channels as Channel Specialist
Agents participant ODClient as OpenDirect
Client participant Seller as Seller Agent
API User->>API: POST /bookings (CampaignBrief) API->>API: Create job (status: pending) API-->>User: 202 {job_id, status: pending} API->>Flow: Background task: kickoff() Note over Flow: Step 1: Validate brief Flow->>Flow: receive_campaign_brief() Flow->>Flow: plan_audience() Note over Flow: Step 2: Budget allocation Flow->>Portfolio: allocate_budget() Portfolio-->>Flow: Channel allocations (branding, ctv, mobile, performance) Note over Flow: Step 3: Parallel inventory research par Branding research Flow->>Channels: research_branding() Channels->>ODClient: search products, check avails ODClient->>Seller: GET /products, POST /products/avails Seller-->>ODClient: Product list, availability ODClient-->>Channels: Products + pricing Channels-->>Flow: Branding recommendations and CTV research Flow->>Channels: research_ctv() Channels->>ODClient: search products, check avails ODClient->>Seller: GET /products, POST /products/avails Seller-->>ODClient: Product list, availability ODClient-->>Channels: Products + pricing Channels-->>Flow: CTV recommendations and Performance research Flow->>Channels: research_performance() Channels-->>Flow: Performance recommendations and Mobile research Flow->>Channels: research_mobile() Channels-->>Flow: Mobile recommendations end Note over Flow: Step 4: Consolidate Flow->>Flow: consolidate_recommendations() Flow->>Flow: Set status: awaiting_approval User->>API: GET /bookings/{job_id} API-->>User: {status: awaiting_approval, recommendations: [...]} alt auto_approve = true Flow->>Flow: approve_all() Flow->>Flow: _execute_bookings() Flow->>Flow: Set status: completed else Manual approval User->>API: POST /bookings/{job_id}/approve
{approved_product_ids: [...]} API->>Flow: approve_recommendations(ids) Flow->>Flow: _execute_bookings() Flow-->>API: {status: success, booked: N} API-->>User: {status: success, booked: N, total_cost: X} end User->>API: GET /bookings/{job_id} API-->>User: {status: completed, booked_lines: [...]}

Flow Steps

Step Method Trigger Description
1 receive_campaign_brief() @start() Validates required fields and budget
2 plan_audience() Listens to step 1 Builds audience plan, estimates coverage, identifies gaps
3 allocate_budget() Listens to step 2 Portfolio crew splits budget across channels
4a research_branding() Listens to step 3 Branding crew searches display/video inventory
4b research_ctv() Listens to step 3 CTV crew searches streaming inventory
4c research_mobile() Listens to step 3 Mobile crew searches app inventory
4d research_performance() Listens to step 3 Performance crew searches remarketing inventory
5 consolidate_recommendations() Listens to 4a-4d (OR) Waits for all active channels, flattens recommendations
6 approve_recommendations() / approve_all() External call (API) Marks recommendations as approved/rejected
7 _execute_bookings() Called by step 6 Creates BookedLine entries for approved items

Execution Status Transitions

stateDiagram-v2
    [*] --> initialized
    initialized --> brief_received: receive_campaign_brief
    initialized --> validation_failed: invalid brief
    brief_received --> budget_allocated: allocate_budget
    budget_allocated --> researching: research_* agents
    researching --> awaiting_approval: consolidate_recommendations
    awaiting_approval --> executing_bookings: approve
    executing_bookings --> completed: bookings done
    budget_allocated --> failed: error
    researching --> failed: error
    executing_bookings --> failed: error

These states are tracked in BookingState.execution_status using the ExecutionStatus enum.