CleanGrid Solar
Rep portal

Sign in to see your day.

Enter your email — we'll send you a 6-digit code.

Code sent. Check your inbox.

No invitation

Ask Keagan for an invite.

Your email isn't on the list yet. Once a manager adds you, you'll get an invite link in your inbox.

Floor dashboard

Floor activity.

 

Ready h today
—
across the floor
Calls today
—
logged
Transfers today
—
live transfers
Qualified
—
 
Sales today
—
completed

Floor trend — last 14 days

Ready hours · transfers · qualified

Today by the hour

calls · answered · connects

Today by rep

transfers + qualified

Floor call quality · last 30 days

—
Where calls end furthest section reached
Funnel tap a stage to see why
Top objections (floor-wide) count · resolved
By rep · avg score & transfers sorted by scored calls
Reps

Manage CC rep accounts.

 

Add a CC rep

They'll get an email with a sign-in code.

Upload Agent Report CSV

Backup for when the automated daily ingest misses a run. Drop the ReadyMode "Agent Report" export here; reps' dashboards pick it up immediately.

Drop a CSV here, or

Today on the floor

—

Active reps

—

Pending invitations

—
Rep

—

 

Ready h · 7d
—
Calls · 7d
—
Transfers · 7d
—
Qualified · 7d
—
 
Sales · 7d
—

Last 30 days

Ready hours · transfers · qualified

Disposition mix · 30d

share of calls

Voice sample

—

—

Their call quality · 30 days

—
Best comeback strongest reply to toughest objection
Funnel tap a stage
Where their calls end furthest section reached
Top objections count · resolved
Transfers

Every transfer the floor sent.

Tap a row to listen to both calls.

Loading…
Lead files

Which files are working, which are burning out.

Burn ratio = recent connect rate ÷ lifetime connect rate. Below 0.7 means decay.

Active files
—
dialed in last 2d
Cooling
—
3–7d since last call
Burning
—
burn ratio < 0.7
Calls · 7d
—
across active files

All files

—
Loading…
—

—

 

Lifetime calls
—
Connect %
—
 
Machine %
—
last 7d
Burn ratio
—
 
Active days
—
total dialed

Daily connect rate · last 30d

calls · connect % · machine %

Hour-of-day · last 14d

when this file actually answers
Call Analyzer

Bulk call-processing activity.

Every day we transcribe and analyze yesterday's recordings end-to-end.

Budget used
—
 
Last 14d analyzed
—
full + cheap tier
Last 14d error rate
—
 
Last audit
—
 

Daily processing log

—
Loading…

How it works

system design

The pipeline. A Vercel cron fires every morning at 6 AM ET. For yesterday's ReadyMode call recordings (~1,200/day), the pipeline pulls each MP3 from S3, decides a processing tier from call duration, runs transcription, runs analysis, and inserts a row into call_insights.

Three tiers route by duration after we pre-filter dispositions that have no conversation (Voicemail, WrongNumber, PressAny, DNC, NotLogged):

  • Skipped — call < 30 s. Metadata only, no model spend.
  • Cheap — call 30–59 s. gpt-4o-mini-transcribe + gpt-4o-mini analysis with a shortened prompt. ~$0.005/call.
  • Full — call ≥ 60 s. gpt-4o-transcribe-diarize with the rep's reference voice clip + gpt-4.1-mini analysis on the full coaching schema. ~$0.03/call.

The audit watches the watchers. A second cron at 8 AM ET runs call_insight_audit() against yesterday's rows. It flags: stuck-pending rows, >5% empty transcripts, >5% regression in the three plain-English coaching fields (top_strength, top_mistake, one_thing_to_fix_first), internal inconsistencies (e.g. objection counted but no objection captured), and volume/cost anomalies vs. the trailing-7-day median. If anything trips, the system emails Keagan via Resend. Silent on healthy days.

Budget guardrail. A single-row table caps cumulative spend across all backfill + production runs. The chunk RPC auto-pauses the pipeline if a run would breach the cap.

The OpenAI request

structure of the analysis call (full tier)

System prompt. Verbatim port of the n8n workflow that produced our first 60 days of analysis — kept identical so trend continuity is preserved. It frames the model as a sales-call analyst evaluating a 4-section call structure: intro · solution · qualifying · transfer.

User message. The diarized transcript (rep + customer turns labeled), plus the call's duration and the rep's name.

Response format. Strict JSON schema (response_format: json_schema mode) with 25 required fields:

  • section reach (which of the 4 sections the rep made it through, plus per-section status: skipped / partial / complete)
  • transfer outcome (attempted? completed?)
  • customer signals (bill amount mentioned, sunlight positive, address confirmed, homeowner status, credit hint)
  • disqualification check (should the rep have DQ'd? why?)
  • objection list — each with type, the rep's response, response quality (strong / partial / weak), whether it was resolved
  • 7 numeric scores (intro · solution · qualifying · objection handling · control · transfer positioning · overall)
  • 3 plain-English coaching fields — what the rep did best, their biggest mistake, the one thing to fix on their next call

Why this shape. The schema is designed to power top-down trend analysis: every field is enum-backed (where possible) so we can aggregate across all calls and surface drift. The 3 plain-English fields are the seed for personalized coaching — the audit watches them specifically for regression to enum values or short text.

Step 2 of 2 — optional

Record a 9-second voice sample.

Pitch into your mic for 9 seconds like you would on a real call. We use the sample to recognize your voice on long recordings — accurate transcripts mean accurate coaching.

0.0s / 9.0s
—
Ready hours
—
this week
Calls
—
phone calls
Transfers
—
live transfers
Qualified
—
 
Completed sales
—
 

This week

hours worked · transfers · qualified

Agent report

 
Qualified rate
—
of transfers
Transfer rate
—
of calls
Calls / ready hr
—
pace
Talk avg
—
seconds / call
DNQ rate
—
of calls
Not interested
—
of calls

Call quality · last 30 days

—
Best comeback your strongest reply to your toughest objection
Funnel tap a stage to see why
Where your calls end furthest section reached
Top objections you hit count · resolved
Loading…
Account

Hey there.

Sign-in email

Current: —

After saving, we'll email a 6-digit code to your new address. Use it to sign in next time.

Loading your portal…