| Date | Time | CSR | Location | Outcome | Opportunity | Notes | Next Contact | Source |
|---|
🔀 Combine Call Log Files
Pick any two call log CSVs to merge into one deduplicated living log. Doesn't affect your current session.
☁ Cloud Sync Setup
Connect to Google Sheets so every logged call is automatically saved to the cloud — accessible by all CSRs, no file sharing needed.
Upload your reports below to get started. Each file unlocks a different section of the tool.
Dig into a specific location's history. Search by name, upload an invoice report for trend analysis, and see recurring issues pulled from tech notes.
A quick reference for anyone new to the tool — what each section means, how calls are sorted into tiers, and what the settings actually do.
Pull these two reports from ServiceTitan each morning and upload them to run the tool. Click the links below to open them directly.
Upload your Job Follow-Up Report from ServiceTitan — this is the daily export of completed jobs. The tool looks at every job completed on the selected Work Done On date and groups locations by their call history to determine which tier they land in.
Upload the Location Data / LTV Report to unlock the At-Risk tab, Overdue Recurring section, and LTV badges on the call list. Upload the Invoice Report to unlock the Research tab, callback trends, and — critically — the Best Angle column. The more reports loaded, the smarter the call list becomes.
The Best Angle column synthesizes data from all three uploaded reports into a single, actionable call objective for every row. Rather than leaving the CSR to interpret badges and history, it tells them exactly what the call is for before they dial. Hover any badge to see the specific reason it was triggered and a suggested pitch line.
| 🏢 Property Walk | 75+ unit property with no agreement, high lifetime value with no plan, or invoice history spanning both plumbing and HVAC. Goal: book the estimator visit. The walk closes at a much higher rate than any phone pitch. |
| 📋 Pitch Agreement | Repeat customer with no recurring plan, or the same issue type has appeared 2+ times in invoice history. The pitch is data-driven — use the specific reason shown in the badge. |
| 🔄 Cross-sell | Already on a plan for one trade (plumbing or HVAC). The objection to maintenance is already handled — just ask about the other side. Easiest conversation on the list. |
| ⚠️ Satisfaction First | Prior callbacks on record. Lead with genuine care and do not pitch until satisfaction is clearly confirmed. If there's an active issue, making it right is the only objective today. |
| 🤝 Check In | No strong signal yet. New or limited relationship — listen first, plant the seed, leave a great impression. The second call will have more data to work with. |
What it means: No prior job record for this location in the 90-day report window. This may be a brand new customer, or one who hasn't called in over 90 days. Either way, the approach is the same.
Why it matters: These are your highest-leverage calls. The habit hasn't formed yet — which means you can shape it. Confirm satisfaction, then follow your Best Angle.
Tone: Professional and warm. You're introducing yourself as a partner, not just the company that did the job.
What it means: They've used us before, and enough time has passed that a follow-up makes sense. They're a returning customer but not yet on a consistent rhythm.
Why it matters: This customer already trusts us — they came back. The goal is to deepen that and formalize the relationship. Follow your Best Angle to find the right opening.
Tone: Familiar but still professional. You know them — reference the history.
Qualifier: Prior job exists, and the most recent prior job was 7 or more days ago.
What it means: Active, high-frequency account. We've been out recently and regularly.
Why it matters: These are our best customers. The call is shorter and warmer — more of a check-in than a pitch. The Best Angle still matters here: cross-sell and property walk angles apply even to frequent accounts.
Tone: Casual and direct. They know you. Match that energy.
Qualifier: Prior job exists, and the most recent prior job was 3–6 days ago.
What it means: Jobs where the total was $0 and no estimate was left behind. These are typically warranty returns, callbacks on prior work, or no-charge visits.
Why it matters: Even $0 jobs are a customer touchpoint. A quick call confirms the issue was resolved and keeps the relationship warm.
Qualifier: Job total = $0 AND no open estimate is attached. (If a $0 job has an estimate, it's already in the main call list — the estimate is the opportunity.) Toggle Hide $0 with estimates in settings to control this behavior.
What it means: This location is on a recurring service plan, and their next scheduled service date is coming up within 30 days — or is already past due.
Why it matters: These customers are already committed to us. Reaching out before or right at their service date prevents them from forgetting and ensures we don't lose the visit. It also surfaces upsell opportunities during the scheduling call.
Qualifier: Next R.S. Date in the LTV file is within 30 days of today (including dates already past). Location must not be in the current job log (if they already had a visit today, they're in the main call list instead).
What it means: A high-value location that hasn't shown up in the recent job log. They've spent significant money with us but have gone quiet.
Why it matters: Losing a $10k or $50k lifetime customer to a competitor is a big deal. A proactive check-in — even without a recent job — can re-engage them before they stop calling us altogether.
Qualifier: Lifetime revenue ≥ $5,000 in the LTV file, AND the location does not appear in the current 90-day job report at all. These are accounts that matter — they just haven't been in recently.
What it means: These locations appeared in the job report but were filtered out before reaching the call list.
Common reasons a location gets skipped:
• Cooldown: A prior job at this location was completed within the cooldown window (default: 3 days). We don't want to call a customer we just called two days ago.
• Min Job Total: The job total was below the minimum dollar threshold set in the filter.
• Job Type Filter: The job type was manually excluded via the job type filter panel.
• Customer Type Filter: A residential/commercial filter was active and this location didn't match.
| Work Done On | Which day's completed jobs to pull. Defaults to yesterday. Change this to run a report for a prior date. |
| Cooldown (days) | How recently a prior job must have occurred to skip the location. Default is 3 days. Increase it to cast a wider net; decrease it for high-volume operations that need tighter follow-up. |
| Min Job Total ($) | Filters out jobs below a dollar threshold. Use this to focus on meaningful revenue jobs and ignore small service calls that don't warrant a follow-up. |
| Hide $0 with Estimates | When checked, $0 jobs that have an open estimate are moved into the main call list instead of the $0 section. The estimate is the opportunity — treat it like a paid job. |
| Customer Type | Filter to show only Residential or Commercial accounts. Leave blank to show all. |
| Job Type Filter | Expand this panel to check or uncheck specific job types. Use "Reset to Defaults" to re-apply the standard auto-exclusions (internal, warranty, etc.). |
After each call, mark the result using the dropdown in the call list. This helps track what's happening across the list and is captured in the PDF and Excel exports.
| No Opportunity | Call made, customer satisfied, nothing to follow up on. The relationship was touched — that's the win. |
| Opportunity — Estimator | Customer has a secondary need that warrants a site visit. Book a new Opportunity in ServiceTitan for an estimator to go out. |
| Opportunity — Account Manager | Commercial or high-value account that would benefit from an Account Manager introduction or site visit. Create an Opportunity in ServiceTitan and notify the AM via Slack. |
| Call Back Scheduled | Couldn't reach them or they asked you to call back. Note the time and put it in your calendar. |
When the LTV and Invoice files are loaded, each row shows badges inside the location cell and a Best Angle column. Here's what each indicator means:
| 💰 $50k+ lifetime | Highest-value account — treat with extra care and prioritize follow-up. |
| 💵 $5k+ lifetime | Established customer worth nurturing. Lifetime revenue $5k–$50k. |
| 📅 Recurring | Recurring services on account (historical count). Only truly Active if a future Next RS Date exists. If no future date, the agreement may have lapsed — check Research tab for detail. |
| 🔁 Cross-sell [Trade] | Already on a plan for one trade — shift the pitch to the other. Hover the badge for the specific trade to bring up and the suggested opener line. They already believe in regular maintenance; this is a warm ask. |
| 📋 Open estimates | One or more unaccepted estimates on file. Audit the estimate age before calling — recent ones warrant follow-up; old ones are handled by the dedicated estimates team. Use the filter to hide these if you want a clean call list. |
| 👤 Acct Manager | An Account Manager is assigned. Loop them in on any opportunities — don't send an estimator cold without giving the AM a heads-up first. |
| ✨ New Customer | Fewer than 2 completed jobs in LTV — first impression still being formed. Prioritize satisfaction and relationship-building over pitching. |
The Proactive tab is a separate call list that runs independently of the daily jobs report. Where the Call List tab is reactive — triggered by yesterday's completed jobs — the Proactive tab is calendar-driven. It pulls directly from your LTV report and surfaces customers based on how long it's been since their last service and their second money potential.
Who appears here: Any location in the LTV file that hasn't had a job in the last 30 days AND doesn't already appear on today's reactive call list. Customers on today's list are already covered — the Proactive tab handles everyone else.
The goal is second money — service agreements and property walks, not following up on service calls. Every row is ranked by how likely a conversation will convert to an agreement or estimator visit.
| Score | Angle | Triggers |
|---|---|---|
| 🏢 5 | Property Walk | 75+ unit property with no active agreement, OR both trades in invoice history with 3+ jobs and no plan, OR $15k+ lifetime revenue with no plan. |
| 📋 4 | Pitch Agreement | Same issue type 2+ times in invoice history, OR 3+ completed jobs, OR $5k+ lifetime revenue — all with no current plan. |
| 🔁 3 | Cross-sell | On a plan for one trade but invoice history shows only plumbing OR only HVAC. Ask about the other side — they already believe in maintenance. |
| 🤝 2 | Warm Check-in | Last service was 30–365 days ago with no stronger signal. Good relationship touch — plant the seed, listen for openings. |
| 💤 1 | Reactivate | More than 12 months since last service. Long-lapsed — a low-pressure "just checking in" call. |
Filters: Use the All angles dropdown to focus on one score type — e.g. only Property Walk candidates for the estimator pipeline. Use the time gap filter to work a specific window: 30–90 days for recently-serviced customers, 90–180 for ones due for outreach, 180–365 for overdue.
Last Call column shows the most recent logged call for that location. If a row was already worked this session or loaded from a prior day's living log, the outcome shows before you dial — no double-calling.
The call log captures every call made from either tab and builds into a living log that carries history forward from session to session. It's how the tool knows who's been called and what happened — across multiple CSRs and multiple days.
Logging a call: Click 📞 Log Call on any row. The modal captures call status, opportunity, notes, and an optional next contact date. After saving, the row's dropdowns sync automatically and the button changes color to show the outcome at a glance: ✅ Reached 📱 VM Left 📵 No Answer 📞 CB Set
Viewing the log: Click 👁 View Log in the toolbar at any time to browse all logged calls in a searchable table — searchable by location, CSR, notes, or outcome. Each entry shows whether it was loaded from history or added today.
| Daily workflow step | What to do |
|---|---|
| ⬆ Load Living Log | At the start of each session, load your master CSV from the prior day. All previous call history loads in — prior outcomes appear on rows immediately so you know who's been called. |
| Work the list | Log calls as you go. The toolbar badge shows X history loaded · Y new today so you always know the split between prior history and today's new entries. |
| ⬇ Export Today | Downloads only this session's new calls. Useful for archiving the day or sending to a manager. |
| 💾 Save Living Log | Downloads everything — all loaded history plus today's calls merged into one file. This is tomorrow's living log. Replace your master CSV with this file at end of day. |
Multi-CSR teams: If two CSRs are calling on the same day, each exports their session log (Export Today). A manager then uses 🔀 Combine Files to merge both CSVs into one deduplicated living log for the next morning. Duplicate entries (same timestamp + location) are automatically removed.
Use these as a starting point — the best calls are conversations, not recitations. Pull up the customer in ServiceTitan before you dial so you know their history and can make it personal.
Customers not on today's call list — ranked by second money potential. Requires LTV report.
📞 Log This Call
—