🔥 Quarterly Surge Weeks Weeks where quarterly customers are 25%+ of stops or route is over capacity
⚖ Route Balance by Week Weeks with imbalanced route loads highlighted
📋 New Customer Routing Queue Active customers without a route assignment
📈 Route Growth Preview Current size, growth rate, and projected time to capacity
🎯 Customer Density by ZIP
📈 Service Type Mix
🎄 Holiday Schedule — manual push, 8 days before each holiday
When a holiday is coming up that affects the route, this lets you notify affected customers. You pick the holiday, preview who gets the message, and manually send. Nothing fires automatically.
Click Refresh to load upcoming holidays.
Affected customers
👥 Customer Intelligence ● LIVE (D1)
Active Subscriptions
—
from D1
New This Year
—
from D1 date_added
One-Time Customers
—
from D1 plan_type
Problem Accounts
—
balance > $0
VIP (3+ Years)
—
date_added before 2023
Signup Sources
—
from D1 signup_source
★ Loyalty:—
📈 2026 Monthly New Customers
⚠ Problem Children — Accounts Needing Attention
📍 Top Service Areas
🎯 How They Found Us
💵 Financials ● Square● Stripe● QB
⚙
Loading QuickBooks data...
⚠ Showing cached data — QB connection issue
💳 Revenue — Square + Stripe Combined
YTD Collected
--
incl. OH sales tax
YTD Net (after fees & tax)
--
MTD Collected
--
incl. OH sales tax
MTD Net (after fees & tax)
--
YTD Transactions
--
YTD Fees
--
Avg per Transaction
--
⚠ Could not load revenue data
🏭 Ohio Sales Tax — Exact by County (from D2 job prices)
YTD Service Revenue
--
GD completed jobs · excl. tax
YTD OH Sales Tax
--
exact per county rate
YTD Jobs Completed
--
from GD job data
Avg Job Price
--
before tax
County
Rate
Jobs
Service Revenue
OH Tax
Gross (w/ tax)
Click Refresh to load
📈 2026 YTD — QuickBooks P&L
YTD Revenue
--
Net Income
--
Total Expenses
--
Margin
--
📈 YTD Expenses Breakdown — QuickBooks
📈 2025 Full Year — QuickBooks Actuals
Net Income
—
requires 2025 QB P&L query
Revenue
—
requires 2025 QB P&L query
Expenses
—
requires 2025 QB P&L query
Margin
—
requires 2025 QB P&L query
⚙
Loading AR Aging from QuickBooks...
⚠ Could not load AR data from QuickBooks
💰 AR Aging Summary ● Live
📈 Year-over-Year Growth — Customer Signups by Year
—
💳 Square Fee Analysis
—
💳 Square Reconciliation & Refunds
Reconcile Square transactions, issue refunds, export to QuickBooks
Opens in a new tab. Use to search a transaction, issue a refund, or export a date range to QB.
💲 Payment Escalation Rules (Day 0-28 ladder)
Loading…
💰 Manual Settle — Auth-Pending Captures
The 7:30 PM auto-settle runs nightly for anything not settled here.
⚙
Loading…
Invoice #
Customer
Amount
Authorized
Held?
Click Refresh to load pending captures.
💲 2026 Pricing Model
★ Annual Prepaid: Pay 12, get 13th FREE · New orders only · Existing grandfathered
⚠ EDITING MODE — Prices are editable. Click the lock to save changes.
Full Pricing Matrix — Per-Cleaning
🎉 Marketing Coupons
Code
Discount
Used
Expires
Status
Actions
Click Refresh to load coupons…
+ New Marketing Coupon
📈 Square Rate Analysis
Pulls live Square API data — takes 30–90 sec
ⓘ FEE Adjustments: Volume-based processing adjustments Square applies at payout time — separate from per-transaction fees. They are legitimate and grow proportionally with volume. Factored into the TRUE ALL-IN RATE above.
Per-Transaction Detail
Date
Customer
Amount
County
OH Tax
Svc Amt
BIN
Bank
Brand
Type
Category
Sq Fee
Eff%
Plan Fee
∆ Plan
IC Floor
∆ IC
ⓘ Plan Fee = 2.6% + $0.10/txn (your stated Square rate).
∆ Plan = actual − plan fee (positive = Square charged more).
IC Floor = estimated interchange for this card type.
∆ IC = actual fee − interchange floor.
FEE payout adjustments are volume-based — shown in KPI cards, not per row.
⚡ Automation Control Panel
ALL OFF
Master Send Switch
Controls ALL automated email & SMS to customers (billing, renewals, reminders, follow-ups).
— loading
Manual Texting (reply by hand)
Lets you send a hand-typed SMS from the customer card or CRM inbox even while master is OFF. Does NOT enable automated sends.
— loading
Copy Inbound Texts to GorillaDesk
When ON, every inbound customer text is forwarded to the GD SMS inbox (+1 513-866-3270) so GorillaDesk keeps a history copy. Internal OCC→OCC forward only — not a customer send.
— loading
🛡️ Safety Kill Switches
Master blocks for each system. These override the switches above — if a system is BLOCKED here, nothing in it can send or charge, period.
Card Charges
Square card authorizations & captures
— loading
Email Sending
Hard block on all Brevo email sends
— loading
Text/SMS Sending
Hard block on all Telnyx SMS sends
— loading
GorillaDesk Sync
Customer data sync from GorillaDesk
— loading
Cluster Rebuild
Route cluster recalculation jobs
— loading
Test Mode (sends go to Howard only)
When ON, all sends are redirected to Howard — no real customers receive anything
— loading
💳 Billing Automations (22) — receipts, the payment-decline ladder, auto-charge, late fees
These are run by the billing engine. Turning one ON arms it; sends still require Master Send to be ON. Turning OFF stops that step immediately.
Expand to load billing automations…
⚠️
Master Clear
Removes ALL data from all 5 databases. Schema and connections are preserved — no functionality changes. Use this before reloading fresh CSV exports.
Reload Guide — What feeds what (click to expand)
STEP 1 — Howard uploads 3 CSV exports from GorillaDesk:
Feeds: Customer Card lifetime service history (CRM full profile)
GD Nightly Sync (cron)
→ DB customers (delta)
Keeps customers current after initial load — runs automatically at 2 AM ET
System activity
→ comms_log, cog_events, audit_log, crew_jobs
Rebuilds automatically as emails send, crew completes stops, events fire
Automation config
→ automation_settings, holidays, seasonal_rules
Re-configure toggles and rules in Automations tab after clear
Crew setup
→ crew_pins
Re-create crew PINs for crew app login after clear
Admin login
→ admin_users
Re-create your PIN login after clear (Settings → Admin Users)
Dashboard KPIs: Square + Stripe revenue pull live from APIs (not stored). Customer counts from customers_v2. Scheduling stats from D2 jobs_clean. All restore after Steps 1–2.
Source of truth for scheduling: D2 jobs_clean — all schedule/route data flows from this table. No D1 scheduled_jobs dependency.
Type CLEAR ALL DATA below and click Execute to wipe all databases.
📣 Customer Broadcasts
Pick a broadcast → choose Manual or Auto → set the audience → send. Each card's KPIs activate the moment a broadcast fires.
🔁OT Conversion Drip
ON
One-timers get a recurring pitch at Day 3, Day 21, Day 80 after first cleaning.
Mode
Synced with Automations
Next fire: tomorrow 9:00 AM ET
No data yet — broadcast has not been activated.
⭐#21 Review Request
OFF
24h after each completed service, asks for a Google review.
Mode
Synced with Automations
Currently disabled
No data yet — broadcast has not been activated.
🤝#23 Referral Offer
OFF
After a customer's 3rd completed service, sends their unique referral code + program rules.
Mode
Synced with Automations
Currently disabled
No data yet — broadcast has not been activated.
💬#24 Auto Review Response
OFF
Drafts a response when a new Google review lands — you approve and post.
Mode
Synced with Automations
Not yet wired
No data yet — broadcast has not been activated.
👜Upsell — 1 Can → 2 Cans
OFF
Active single-can customers who could add a second.
Mode
Flip Auto to add to Automations
Will fire 1st of each month at 9:00 AM ET
Not yet sent — KPIs start tracking after first broadcast fires.
📅Quarterly Reschedule
OFF
Quarterly customers ~4 weeks out — offer to move them up to fill a specific day/route.
Mode
Flip Auto to add to Automations
Will fire Mon 8:00 AM ET
Not yet sent — KPIs start tracking after first broadcast fires.
🦱Maggot Outreach — Summer Move-Up
OFF
Summer-specific quarterly move-up: “Let’s clean before the bugs hit.”
Mode
Flip Auto to add to Automations
Will fire weekly Jun 1 – Aug 31
Not yet sent — KPIs start tracking after first broadcast fires.
🔄Subscription Pitch — Join the Route
OFF
One-timers 26+ days post-clean not on recurring. “Your next clean’s about due — want a regular schedule?”
Mode
Flip Auto to add to Automations
Will fire daily 9:00 AM ET
Not yet sent — KPIs start tracking after first broadcast fires.
🤝Referral Push
OFF
Active customers who haven’t referred anyone yet — give them a nudge.
Mode
Flip Auto to add to Automations
Will fire 1st of each month
Not yet sent — KPIs start tracking after first broadcast fires.
🛣️Fill the Routes
OFF
Past one-timers + cancelled subs near next week’s route. 20% off if they hop on.
Mode
Flip Auto to add to Automations
Will fire weekly Mon 8:00 AM ET
Not yet sent — KPIs start tracking after first broadcast fires.
🔁Win Back — “We Miss You”
OFF
Cancelled customers gone 6+ months. Pure win-back: “We’d love you back. Here’s an offer.”
Mode
Flip Auto to add to Automations
Will fire 1st of each quarter
Not yet sent — KPIs start tracking after first broadcast fires.
🕐Re-engagement — Quiet Subscribers
OFF
Still subscribed but no service in 60+ days. They haven’t cancelled — yet.
Mode
Flip Auto to add to Automations
Will fire daily 9:00 AM ET
Not yet sent — KPIs start tracking after first broadcast fires.
📍Proximity — “We’ll Be On Your Street”
OFF
Lapsed customers in a specific ZIP for a given visit date. 90-day throttle.
Mode
Flip Auto to add to Automations
Will fire weekly Sun 6:00 PM ET
Not yet sent — KPIs start tracking after first broadcast fires.
🌷#55 Spring Reactivation
OFF
30-day heads-up before each seasonal customer’s season resumes. Covers S8 / S6 / S4 / WM (Warm Months) / 3X (3×/year).
Mode
Synced with Automations
Currently disabled
No data yet — broadcast has not been activated.
🌡️Start Season Early
OFF
Existing seasonal customers — temps warm, offer to start one month earlier than scheduled.
Mode
Flip Auto to add to Automations
Will check daily 8:00 AM ET
Not yet sent — KPIs start tracking after first broadcast fires.
🍂End of Season Add-On
OFF
At last scheduled cleaning, offer one more — temps still warm, bugs still active.
Mode
Flip Auto to add to Automations
Will fire daily 9:00 AM ET
Not yet sent — KPIs start tracking after first broadcast fires.
Emails Sent (30d)
—
requires Brevo analytics sync
Open Rate
—
requires Brevo analytics sync
Click Rate
—
requires Brevo analytics sync
Conversions
—
requires attribution worker
Attributed Revenue
—
requires attribution worker
OT Drip Pool
—
one-timers in sequence
OT Converted
—
OT → recurring (90d)
Proximity Eligible
—
dormant near this week's route
Reactivated MTD
—
brought back this month
📩 OT Conversion Drip — One-Time → RecurringLIVE
Automatically contacts one-time customers at Day 3, Day 21, and Day 80 after their first cleaning with a targeted pitch to convert them to a recurring plan. Runs daily via occ-ot-followup worker.
In Sequence
—
one-timers eligible
Day 3 Sent (30d)
—
initial touchpoint
Day 21 Sent (30d)
—
follow-up
Day 80 Sent (30d)
—
final push
Converted (90d)
—
OT → recurring
Worker: occ-ot-followup — runs daily at 9 AM ET
📍 Proximity Reactivation — “We’ll Be On Your Street”LIVE
Identifies dormant customers near this week’s route and sends a personalized “we’ll be on your street” reactivation email. 90-day throttle prevents duplicate sends. Backend: occ-command-center → nt_lapsed_send.
Enter a ZIP and click Find to preview eligible customers.
⭐ #21 Review RequestOFF
Sends a Google review request 24 hours after service is completed. One request per customer per service date — never duplicates. Worker: occ-ot-followup (daily 9 AM ET).
Requests Sent (30d)
—
review asks delivered
Reviews Earned (30d)
—
requires GBP sync
Open Rate
—
Brevo sync required
Worker: occ-ot-followup — runs daily at 9 AM ET
🤝 #23 Referral OfferOFF
After a customer’s 3rd completed service, automatically sends their unique referral code and explains the referral program. Worker: occ-referral-pitch (daily 10 AM ET).
Codes Sent (30d)
—
offers delivered
Referrals Activated
—
new signups from codes
Revenue from Referrals
—
attribution required
Worker: occ-referral-pitch
💬 #24 Auto Review ResponseOFF
When a new Google review is detected, drafts a personalized response for Howard to approve and post. Keeps OCC’s review engagement high without manual monitoring. Requires Google Business Profile API connection.
Drafts Created (30d)
—
pending approval
Responses Posted (30d)
—
GBP sync required
Avg Rating (90d)
—
GBP sync required
Requires GBP API — not yet wired
🌿 #55 Spring Reactivation — Seasonal 30-Day ReminderOFF
Emails (and/or SMS) seasonal customers a heads-up before their service restarts in spring. Fires once per customer, 30 days before their season resume date.
Channel: email.
Seasonal Customers
—
eligible for reminder
Reminders Sent (90d)
—
from comms_log
Toggle in Automations tab — config saved to D1
✉ EDDM & Growth Engine — New Neighborhood AcquisitionTOOL
Plan, cost, and track Every Door Direct Mail (EDDM) campaigns for new neighborhood acquisition. Enter a target ZIP, household count, and number of mail touches to calculate cost and print-ready specs. Uses LOB for printing and delivery.
Standalone planner — LOB integration
📊 Email Health — Bounce & Suppression Tracking
Live stats from Brevo for the last 30 days. Hard bounces are permanently blocked — those addresses never receive another email. Soft bounces retry automatically.
Hard Bounces
—
blocked permanently
Soft Bounces
—
retry eligible
Unsubscribes (30d)
—
opted out
Spam Reports (30d)
—
flag if rising
Dormant Pool
—
cancelled / lapsed / dormant
Proximity Eligible
—
dormant near this week’s route
Reactivated MTD
—
brought back this month
Route Headroom
—
open capacity across routes
📈 Route Headroom — Fill Up the Routes
Which routes have room to grow — densify the ones with the most headroom first (your “light route conquest”). Source: intel_growth_preview.
Loading route capacity…
📅 Upcoming Quarterlies — Reach Them Before the Visit NEW
Quarterly customers with a cleaning coming up — the window to upsell an extra can or confirm before the truck rolls. Source: growth_upcoming_quarterly.
Loading…
🔄 Join the Route — Call One-Timers After Their Clean NEW
One-time customers cleaned at least the number of days you pick (up to ~90 days), who aren’t on a recurring route — freshest first, so you call the about-due ones before the overdue ones: “your next clean is about due, want us on a regular schedule?” Default 26+ days. Source: growth_route_join.
Loading…
💤 Dormant Reactivation
— dormant / cancelled customers are ready for a win-back. Launch from the Win-Back composer (dormant + re-engagement segments, kill-switch protected).
📍 Proximity Reactivation — “We’ll Be On Your Street”
When the truck is in an area, message dormant customers nearby to fill that day’s route. The live send tool is in the Seasonal tab (90-day throttle, kill-switch protected).
🚀 Densify to 5,000 — Growth EngineSTRATEGY
Your biggest growth lever is density, not expansion: pack the premium neighborhoods you already serve (Liberty Twp, West Chester, Mason) and fill thin routes with targeted EDDM / door hangers — “light route conquest.” Goal: full-court press to 5,000 customers. The EDDM cost/print planner (OCC_Growth_Engine.html) gets surfaced here next.
Broadcasts Sent (90d)
—
all campaign types
Reactivated (90d)
—
came back after outreach
Avg Open Rate
—
Brevo sync required
Opt-Outs (90d)
—
unsubscribes from broadcasts
📥 Step 1 — Choose Broadcast Type
🎪 Step 2 — Define Your Audience
🚀 Step 3 — Choose Channel & Launch
⚠️ Howard approves every send. Clicking Launch builds a Brevo campaign and sends Howard a test first. No one gets a message until he approves.
📊 Broadcast History
Date
Campaign Type
Channel
Sent
Open Rate
Reactivated
Status
No broadcasts sent yet — launch one above to get started.
Active Agents
—
referral partners
Total Referrals
—
all time
Paid Out
—
rewards issued
Pending
—
awaiting completion
🤝 Referral Agents
Active customers who have received their referral code after their 3rd cleaning. Sent by occ-referral-pitch (daily 10 AM ET). Each agent gets a unique link tracked back to their account.
Texts quarterly customers whose next cleaning is 4+ weeks out, offering to move it up a month. Sends via Telnyx from +1-513-866-8936. Select a route below — the day auto-fills. SMS goes out one week before the route day.
Pick a Route
1
Mason / Maineville
Monday
45040, 45039, 45034, 45036, 45065
2
Loveland / Montgomery
Tuesday
45140, 45243, 45227, 45236, 45242
3
Hyde Park / Mt. Lookout
Wednesday
45208, 45209, 45244, 45226, 45207, 45206
4
Milford / Clermont
Thursday
45150, 45103, 45102, 45122, 45174
💬 SMS Preview
Quarterly Customers — Ready to Text
✅ Customer Accepted — Add to Route
When a customer responds YES, find them below and click “Add to Route” to schedule them.
📝 Template Library
📝 Email, SMS & Document Templates
Click any template to edit. Changes persist live to D1 and stay in sync with the CRM. Locked items show a yellow banner before save.
📊 Reports & B2B Data Delivery
📚 Report Library
Pre-built templates plus any you've saved. Click Run Now to generate immediately, or use Schedules to deliver on a recurring basis.
Select a report above to run, or use + Custom Report to build one.
👤 B2B Recipients
B2B contacts who receive scheduled report deliveries — apartment managers, property managers, vendor partners, etc.
Loading recipients…
📅 Scheduled Sends
Active recurring deliveries. Each schedule pairs a report with a recipient and a cadence. Pending Approval = first send needs manual approval before going live.
Loading schedules…
📋 Delivery Log
Audit trail of every report ever sent. Filter by status, retry failed deliveries, download archived files.
Loading delivery log…
📊 Live Data
Loading reports…
🚚 Route Reports
📊 Quick Reports
Stops Per Route
Completion rates by route and day
Crew Efficiency
Stops/hour, time per stop, idle time
Cost Per Stop
QB YTD ÷ total stops — actual vs target
Route Completion Rates
% completed on-time vs rescheduled
Route Balance
Overloaded vs light — find where to add stops
Underserved ZIPs
Low customer count — growth opportunities
Seasonal Volume
Load changes by month — plan crew & trucks
Profitability by Run
Every date + route + week + zones — click to drill
🔧 Custom Report Builder
📊 Report Preview
💾 Saved Reports
👥 Customers
Total Prepaid
—
Active customers
Need GD Plan Setup
—
≤40 days until renewal
Notice Due
—
≤30 days · send now
GD Plan Set
0
Confirmed in GD
Customer
Plan
Renewal Charge
Last Cleaned
Next Clean
Plan Expires
Days Left
Cleanings Left
Actions
🔧 Settings
Company Information
Company Details
Company Name
Owner
Phone
Email
Address
Website
Logo
📷 Upload Logo
Business Hours
Tax ID
Founded
Payment Processors
Square
Square (Current)
Type: Cost-plus (actual interchange per card)
Rate: Varies by card (Visa ~2.4%, MC ~2.6%, Amex ~2.8%)
Connected: March 2026
✅ Connected
Helcim
Helcim (Pending)
Type: Cost-plus (interchange + markup)
Rate: Interchange + 0.3% + $0.08
Meeting scheduled — Howard to sign up
⏳ Pending Setup
Stripe
Stripe (Available)
Type: Flat rate
Rate: 2.9% + $0.30
Not Connected
Integrations
🛒
WooCommerce
Site: ohiocleancans.com
Syncs: Orders, customers, coupons
Last Sync: Apr 7, 2026 2:00 AM
✅ Connected
📚
QuickBooks Online
Syncs: Invoices, payments, customers
QB sync queue ready — waiting on Julie for account mapping
1,842 customers imported. Invoice migration: 14,750 of 39,000
37.8%
10
Go Live○ Not Started
Review everything, flip the switch.
Complete all steps above, then click GO LIVE to activate COG.
VENDORS & SUPPLIERS
Name
Category
Contact
Phone
Email
Notes
Actions
Loading…
📣 Marketing
Active Takeovers
—
routes currently armed
Channels Fired (7d)
—
emails + SMS + posts
Signups Attributed (30d)
—
from NT campaigns
Avg CPA
—
per attributed signup
📅 Active Takeovers
Loading…
📋 Past Takeovers
Loading…
🚀 Arm New Neighborhood Takeover
Pick the truck visit date first — COG loads which routes run that day. Choose the route, ZIP, neighborhood name, and how wide to cast the net. Every channel holds for your approval.
🕑 T‑17 → T+14 Full Sequence
Day
Fire Date
Channel
Action
Est. Cost
Status
🔒 Each channel is held in “Pending Approval” until you approve it.
🔧 Neighborhood Takeover Platform
🔒 Confirm Takeover Arm
Nothing sends automatically. Each channel sits in “Pending Approval” until you click Send.
📊 Brevo Email Health — Open / Click / Bounce Tracking
Open Rate (30d)
—
Click Rate (30d)
—
Hard Bounces
—
blocked from future sends
Soft Bounces
—
retry eligible
Unsubscribes
—
Spam Complaints
—
Click Refresh to load delivery health data.
Campaign Engine
🚀 New Campaign
Select a segment to see estimated recipients.
📧 Active Campaigns
📅 Scheduled
📝 Past Campaigns
📄 Template Library
Every customer-facing template, grouped by channel. Locked templates cannot be edited without Howard's approval. See the Templates tab for full edit access.
Edit Template
Template Name
Category
Subject (email/broadcast)
Trigger / Description
Email Body
SMS Message — short text version
Locked template. Editing will override Howard's locked content. Save will use force_unlock=true.