Mojo Bridge

Status
operational
Tier
Tier 2 — Platform
Owner
Ryan Colston
Started
2026-05-25
Target launch
2026-05-26

Mojo Dialer → BigQuery sync. Captures setter dialing activity + the full owner/property/phone graph Mojo holds, so the setter-program deliverables can join Mojo data to FUB on normalized phone. Lives at ~/rylobasic/systems/setter-program/mojo-bridge/.

Why

Mojo has no public API but its SPA at app201.mojosells.com/v2/rest/* is stable and session-cookie authed. The 12,425 contacts on account 689102 carry MLS metadata, AVM history, multi-phone/multi-email arrays with per-channel DNC flags, and full MLS remarks — none of which surface in the Mojo↔FUB native integration. Without this bridge, every call our setters will make lives only inside Mojo's UI, with no programmatic way to track dial volume, talk time, or outcome attribution against FUB consults.

The bridge buys time. The long-term answer is Custom Dialer (Twilio + STT + Vertex, ~Sept 2026). Until then, BQ becomes the system of record while Mojo keeps doing the four things it does well: power dialing, skip tracing, FSBO/Expired feeds, MLS metadata enrichment.

Current state

What's live as of 2026-05-26: - Scaffold at ~/rylobasic/systems/setter-program/mojo-bridge/ (MR !198 merged) - Cloud Run service pos-mojo-bridge at https://pos-mojo-bridge-uvqirrk5la-uc.a.run.app — image :ab28bc12, revision 00001-sv6 (MR !200) - Cloud Scheduler pos-mojo-bridge-mojo-daily-ingest daily 06:00 CT → POST /mojo-daily-ingest - Tfvars + Terraform at infra/terraform/pos-mojo-bridge/ (MR !201) - Drift coveragecheck-tfvars-drift.sh now governs 8/8 services including mojo-bridge (MR !202) - Mac-mini launchd refresh runner com.rycolston.mojo-session-refresh — every 15 min polls sync_log for session_expired, drives Playwright through Mojo login, writes new MOJO_SESSION_COOKIE version. Reads creds from 1P item mojosells.com in POSPJ vault (MR !203) - Cloud Monitoring alert policy mojo-bridge: non-ok rows in sync_log — scheduled query daily 06:45 CT writes to mojo_raw.sync_log_alerts, RAISEs on non-empty, alert fires email to ry@rycolston.com (MR !204, synthetic-row tested end-to-end) - B4 auto-apply detects hyphenated service names (MR !205 — bug surfaced by mojo-bridge being the first multi-word pos-* service) - GCS bucket gs://pospj-480915-mojo-bridge/ with 2-year lifecycle on raw/ - 12 mojo_raw.* BQ tables + mojo_raw.sync_log_alerts (alert dest) - Secret Manager MOJO_SESSION_COOKIE v3 — auto-refreshed by Mac-mini runner when stale - Deployed daily-ingest smoke-test 2026-05-26 08:34 CT: 5/5 endpoints OK, 1 time_sheet + 76 posting_history rows landed via the actual Cloud Run service (run_id 34484651-d268-4506-88a9-c783c8cfa0a4)

What's NOT live (parked, not blocking): - Recording audio mirror to GCS (90-day cliff). Stub endpoint /mojo-mirror-recordings returns {"status":"not_implemented"}. - Cold-load helper for first backfill of all 12,425 contacts.

Next 3 actions

  1. Wait for first setter to land on Mojo account 689102 (Appointment Setter Hiring)
  2. Implement recording mirror (90-day cliff is the only forcing function). Wire GCS lifecycle + signed URL fetch.
  3. When the cookie naturally expires (~7-30 days), confirm the launchd runner self-heals — that's the load-bearing reliability claim and only a real expiry can prove it.

Decisions log

Open issues

Reference