// Follow-up Due Today
// SYNCING...
[ NO SIGNAL ]
No session loaded.
Go to Import → paste Gemini JSON → hit Load. Takes 10 seconds.
1Run this in Gemini inside your Google Sheet
Copy the prompt → paste into Gemini sidebar in your daily leads sheet → run at end of every session, regardless of which sheet you used.
gemini_prompt.txt
Analyze the call data in this sheet and return ONLY a valid JSON object as your main response. No explanation, no markdown, no code fences around the JSON. Just raw JSON starting with { and ending with }. Use exactly this structure: { "date": "YYYY-MM-DD", "calls_made": number, "not_called": number, "showed_interest": number, "follow_up": number, "not_interested": number, "no_pickup": number, "left_vm": number, "disconnected": number, "closed": number, "interest_rate_pct": number, "pickup_rate_pct": number, "trades": [ { "name": "trade name", "called": number, "interested": number, "follow_up": number, "left_vm": number, "not_interested": number, "no_pickup": number } ], "objections": [ { "text": "short description of objection", "count": number, "example": "one real quote or paraphrase from notes" } ], "followups": [ { "business": "business name", "trade": "trade", "phone": "phone or empty string", "status": "Showed Interest or Follow Up", "heat": "hot or warm or cold", "genuine_interest": true or false, "license_age_days": number or null, "timestamp": "value from the Timestamp column for this row, exact string, or empty string if blank", "follow_up_date": "MM/DD/YYYY if a specific calendar date can be confidently determined from the notes, otherwise empty string", "follow_up_time": "HH:MM in 24hr format if a specific time can be confidently determined, otherwise empty string", "prep_brief": "1-2 sentence actionable insight for the next call with this lead, based on their notes — read their psychology and suggest the angle to close the sale while staying on-brand. Empty string if there isn't enough in the notes to base this on.", "why_follow_up": "detailed explanation of why we are following up with the contractor based on their notes and conversation history (e.g., asked to review details, busy during summer, wants call-back after vacation, needs to talk to spouse/partner). Make this thorough and context-rich." } ], "dials": [ { "business": "business name", "phone": "phone or empty string", "timestamp": "value from the Timestamp column for this row, exact string, or empty string if blank", "status": "status string normalized to: No Pickup, Left VM, Showed Interest, Follow Up, Not Interested, Disconnected, or Closed" } ], "priorities": ["Priority 1 as a plain sentence", "Priority 2 as a plain sentence", "Priority 3 as a plain sentence"], "session_notes": "2-3 sentence plain English summary of today" } Rules: - Identify columns dynamically by reading the first header row. Find columns named "Call Status", "Notes", "IssueDate" (usually Column J), and "Timestamp" (usually Column L). - calls_made = rows where Call Status is NOT "Not Called" - not_called = rows where Call Status is "Not Called" - interest_rate_pct = showed_interest / calls_made * 100, rounded to 1 decimal - pickup_rate_pct = (showed_interest + follow_up + not_interested + closed) / calls_made * 100, rounded to 1 decimal - dials must include an object for EVERY row in the sheet where Call Status is NOT "Not Called". For each row, copy the business name, phone number, and the exact value from the "Timestamp" column. Normalize the Call Status strictly to one of these exact enums: "No Pickup", "Left VM", "Showed Interest", "Follow Up", "Not Interested", "Disconnected", "Closed". (For example, map raw spreadsheet values "Showed Intrest" -> "Showed Interest", and "Follow up" -> "Follow Up"). Do not use any other status names. - followups must include ONLY rows with status "Showed Interest" or "Follow Up" — do NOT include "Left VM" rows in this array. - For rows with status "Follow Up": read the notes carefully and set "genuine_interest" to true if the person showed real curiosity, asked questions, or engaged meaningfully, even if they asked to be called back. Set it to false if it was a non-committal brush-off like "call me later", "not now", "too busy." Use your best judgment — this is a qualitative read. - license_age_days: Calculate the number of days between the date in the "IssueDate" column and today's date (the date at the top of this sheet or the session date). Include this as an integer on each followup row. If the "IssueDate" column is blank, missing, or unparseable, use null. - timestamp field = copy the exact value from the "Timestamp" column for that row with no reformatting. If it is blank or the column doesn't exist, use an empty string. Do not guess or invent a timestamp. - follow_up_date and follow_up_time: Read the Notes column for that row. You MUST act as the thinking layer to convert any follow-up mention (including relative ones like 'in 3 weeks' or 'in 2 months') into a concrete date in the US format "MM/DD/YYYY" (e.g., "08/23/2026"), using today's date (from the session date at the top of the sheet) as the absolute reference point. For any arbitrary relative timeframe (e.g. 'in N days/weeks/months'), perform the calendar math relative to the session date (e.g. 'in 3 weeks' -> session date + 21 days; 'in 3 months' -> session date + 90 days; 'in 2 months' -> session date + 60 days) to calculate the exact calendar date. ALWAYS output the calculated date strictly as "MM/DD/YYYY". NEVER output relative strings like "in a week" or "in 2 months". If there is absolutely no follow-up timing mentioned in the notes, use an empty string "". Never guess a date if there is zero timing context. - follow_up_time: Parse the time mentioned in the notes. Normalize it to a 24-hour hour and minute (e.g. "14:00" for 2 PM, "10:30" for 10:30 AM). If the note is vague or doesn't mention a follow-up time, leave follow_up_time as an empty string. - prep_brief: base this only on what's actually in the notes for that lead. Focus on their stated objections, hesitations, or interest signals, and suggest one concrete angle for the next conversation. Keep it short and practical, not generic sales advice. - why_follow_up: read the Notes column and provide a detailed reason/rationale for why the follow-up is requested or necessary. Explain what they said, what their situation is, and what we need to address or resolve during the follow-up. Be specific to the lead. - heat: "hot" = Showed Interest, "warm" = Follow Up with genuine_interest true, "cold" = Follow Up with genuine_interest false - Objections come ONLY from Notes of Not Interested rows — group similar reasons, and where the note explains WHY they dropped off, preserve that reasoning in the example field - Priorities must be specific and actionable, not generic - All numbers integers except the two _pct fields - Trade names MUST be strictly normalized to Title Case (e.g., "Plumbing", "Electrical", "Roofing", "HVAC", "Handyman"). Standardize any spelling variations or suffixes (e.g. "plumb", "plumber" -> "Plumbing"; "electrician", "electric" -> "Electrical"). - Return the JSON object as described above. AFTER the JSON, on a new line, if any row had a follow-up mention that was too ambiguous to confidently convert to a date (e.g. "call back soon", "maybe next week"), add one line starting with "NOTE:" describing which leads had unclear follow-up timing so the user can manually check. If nothing was ambiguous, omit this line entirely.
2Paste JSON into the box above
Copy everything Gemini returns above the "NOTE:" line if present, including the outer braces. Paste into the box at the top of this page → Load Session.
3Check Home daily, Deep Dive weekly
Home gives you the daily read. Deep Dive is where patterns show up — check it once a week, not every day.
// Month
Sun
Mon
Tue
Wed
Thu
Fri
Sat
Interest rate over time
// AWAITING DATA
All-time totals
// Session log
Pickup rate by hour of day
Pickup rate by day of week
Interest rate by license age at time of call
How many days after getting licensed did you call them, and did it matter?
Trade performance breakdown
Trade Calls Made No Pickup Pickup Rate Showed Interest Interest Rate
Trade Intelligence & Insights
Objections — all-time
Export for Claude
Pulls your aggregated history — totals, trends, time patterns, objections, and your starred session notes — into one clean text block. Copy it and paste straight into Claude for coaching.