How DropDialer routes drops between Drop Cowboy & Slybroadcast, with automatic failover
TL;DR — How It Works
A single global toggle (RVMProviderConfig master record) decides which ringless voicemail provider sends drops: Drop Cowboy only, Slybroadcast only, or Both. In "Both" mode, Drop Cowboy stays primary, but if it racks up too many consecutive failed deliveries (default 10, account-wide), the system automatically flips the toggle to Slybroadcast and emails the super-admin alert list. It stays on Slybroadcast until an admin manually switches back. The two provider paths are completely separate code — Slybroadcast was added without touching any existing Drop Cowboy logic.
Drop Cowboy only
All drops send through Drop Cowboy. This is the default and the safe state. No failover applies.
Slybroadcast only
All drops send through Slybroadcast. Used to fully cut over, or as the resting state after an auto-failover.
Both (DC → Sly)
Drop Cowboy is primary. Automatic failover to Slybroadcast fires after N consecutive DC failures.
Admins set the mode (and the failover threshold) on the RVM Provider page, reachable from the SuperAdmin sidebar under "Telecom & Numbers".
There is exactly one config record, keyed config_key: "master". Every send path and the failover guard read it. Fields:
| Field | Meaning |
|---|---|
active_provider | "dropcowboy" | "slybroadcast" | "both" — the live mode |
failover_threshold | Consecutive DC failures that trigger auto-flip in "both" mode (default 10) |
failover_triggered | True once an auto-failover has fired. Prevents re-firing. Cleared on any manual switch. |
failover_triggered_at | Timestamp of the last auto-failover |
updated_by | Admin email, or "system" for an auto-failover |
All reads/writes go through functions/manageRVMProvider (admin-only). A manual change always sets failover_triggered: false — the admin is back in control.
sendOneOffDrop as it always has (no UI change).sendOneOffDrop reads RVMProviderConfig. If active_provider === "slybroadcast", it forwards the request (with the user'sAuthorization header) to sendSlybroadcastDrop and returns. Drop Cowboy code never runs."dropcowboy" or "both"), the existing Drop Cowboy path runs unchanged — DC is always primary.functions.invoke? The Base44 SDK'sinvoke does not pass the caller's user token, so sendSlybroadcastDrop'sauth.me() would 401. Forwarding the original Authorization header makes the Sly function authenticate as the exact same user, preserving subscription / free-tier / drops-limit enforcement.functions/sendSlybroadcastDrop mirrors the Drop Cowboy one-off structure but delivers via Slybroadcast's hosted-MP3 gateway (vmb.json.php). It independently:
RVMDelivery record tagged provider: "slybroadcast".c_dispo_url) carrying the record's foreign_id.functions/slybroadcastWebhook receives that disposition, matches the record byforeign_id (falling back to session id, then a pending phone match), flips its status to success/failure, and increments the customer's drops_used on a fresh success — exactly mirroring the DC "you only pay for what lands" billing model.
The failover guard lives inside functions/dropCowboyWebhook as a fully additive function (checkProviderFailover). It runs on every Drop Cowboy failure webhook that represents a fresh pending→terminal transition (duplicate/late webhooks are ignored, so they can't artificially pile up the streak).
active_provider === "both" and failover_triggered is false.failover_threshold of them.active_provider to "slybroadcast", set failover_triggered: true, stamp the time, and set updated_by: "system".checkConsecutiveFailures guard auto-pauses an individual campaign after 10 consecutive failures. The two guards are independent.When an auto-failover fires, the guard reuses the existing critical-alert plumbing:
CriticalAlertSettings (master record) for the recipient list and the global kill switch.rvm_provider_failover can be turned off in the Critical Alerts UI.functions/sendSecOpsEmail (Resend), which logs each send to AlertLog.entities/RVMProviderConfig — the single master toggle recordfunctions/manageRVMProvider — admin get/set the toggle & threshold (clears failover flag on manual change)functions/sendOneOffDrop — reads the toggle, routes to Sly when active, else runs DC unchangedfunctions/sendSlybroadcastDrop — isolated Slybroadcast send (audio + TTS + rotation + logging)functions/slybroadcastWebhook — Slybroadcast disposition postback handlerfunctions/dropCowboyWebhook → checkProviderFailover() — additive auto-failover guardcomponents/admin/criticalAlertsCatalog — defines the rvm_provider_failover alertpages/AdminRVMProvider — the toggle UI (SuperAdmin → Telecom & Numbers)functions/slybroadcastTest — admin diagnostic to fire one real Sly voicemailThe provider toggle now controls all outbound RVM sending across the app — not just one-off drops. Each send path reads RVMProviderConfig at send time and, when active_provider === "slybroadcast", routes that drop through Slybroadcast instead of Drop Cowboy. All the shared prep (audio normalize, ElevenLabs TTS, sender rotation, throttling, delivery logging) is provider-agnostic and runs identically either way.
Paths governed by the toggle
sendOneOffDrop)createCampaign)relaunchCampaign)processScheduledDrops)Separation guarantees
fetch /v1/rvm block is untouched — it only runs in the DC branchslybroadcastSendDrop (auth paths) or an inline gateway post (scheduler)provider so DC & Sly traffic stay distinguishableaudio_url — a real, downloadable MP3/WAV link. Slybroadcast plays that URL directly, so every campaign the app creates routes to Sly cleanly.Document history: Written May 30, 2026 alongside the RVM provider failover build. Architecture principle: add Slybroadcast as a fully independent provider path with an automatic safety net, without introducing any regression risk to the proven Drop Cowboy flow. Verified live via manageRVMProvider get/set, sendSlybroadcastDrop auth, and the sendSecOpsEmail alert path.