Outbound orchestration follows a simple loop of segment → automate → launch → measure. Audience lists feed campaigns, campaigns bind published workflows, and analytics slices performance by campaign/workflow so marketers can immediately see how changes propagate. Audience rows also surface campaign reuse counts so marketing teams understand downstream blast radius before editing high-value segments.
List inventory & controls: The audience list page fetches every list with customer counts, campaign usage, and archive/unarchive actions while exposing a scheduling dialog for ServiceTitan-driven lists.
Create once, handle every source: The builder supports ServiceTitan API, custom reports, CSV uploads, and Speed-to-Lead imports with dynamic filters, cron schedules, exclusions, and CSV validation before persisting both list metadata and members.
Scheduling visibility: The scheduling view shows cron definitions with human summaries, next run times, and status chips while a single toggle enables or disables both the list and the backing cron row.
Channel-aware scheduling modal: Operators pick call or text channels, map the correct Vapi/text assistant, require hold reasons for reschedules, and launch ServiceTitan maintenance/reschedule/text jobs with hash-based dedupe and “put on hold” failure surfacing.
Actionable audience details: Detail views combine pagination, search, and a campaign-usage panel so marketers know exactly who they’ll affect and where the list is already wired in.
Visual editor: React Flow powers custom trigger/call/text nodes, animated edges, validation overlays, and a toolbar/log panel. Publishing flips the canvas into read-only mode for safe inspection.
Data + validation hooks: Hooks load nodes/edges from Supabase, translate rows into React Flow structures, run validation, and surface node/edge errors inline. Actions cover dragging, connecting, auto-layout, saving, and deletion while preserving trigger nodes.
Server protections: Server actions validate the entire graph before save, delete orphaned rows, upsert node config (business hours, batching, assistant IDs, template overrides), and update edge qualification rules. Publishing/archiving cascades status changes so live flows stay immutable.
Workspace + editor modal: The campaigns page hosts the table, inline editor, and deep links into analytics for one-click monitoring.
Operational guardrails: Tables surface workflow/audience joins, created/queued/completed counts, and gate editing to campaigns in CREATED. Pause/resume follows valid transitions with confirmation dialogs that spell out expected behavior.
Launch-ready modal: The modal loads prerequisites (published workflows, compatible lists, verified numbers, ServiceTitan tags/campaigns, optional exclusions), toggles ServiceTitan targeting, and creates/updates campaigns with immediate scheduling support.
Unified monitoring: Campaign selectors, date/time presets, auto-refresh intervals, and cards expose queue depth, workflow-node outcomes, historical throughput, and audience stats.
High-signal hook: The analytics hook loads campaigns once, fetches workflow metadata for single-campaign views, polls instant analytics, retrieves timeseries via Supabase RPCs, filters trigger nodes, and formats chart buckets with adaptive timestamps.
Aligned back end: RPCs power instant metrics (waiting/queued/in-progress/booked counts) plus historical phase/time analytics so monitoring stays in lockstep with campaign truth.
Illustrate the data flow between audiences, workflows, campaigns, and analytics in the public docs to reinforce how changes propagate.
Call out operational guardrails—status transitions, archiving rules, cron prerequisites—so users know which states allow editing and what validation will block unsafe actions.