Executive
Executive Daily Management Report
Marketing
Marketing
Call Management
Membership
Membership
Mass Maintenance / Building
Accounting
Payroll
Inventory
Inventory & Operations
Purchasing
Warranty Tracking
Return for Repair
Executive Daily Management Report

Last 30D · All Business Units · Live IgniteIQ data

18-Month Trend

Loading trend...

Billable Efficiency toggle is shown but disabled - mart_billable_vs_paid_hours doesn't currently expose a monthly time dimension the same way fact_jobs does. This chart intentionally always shows a fixed trailing 18 months regardless of the date filter above - that's a deliberate exception, not an oversight, since a trend chart needs a consistent window to be meaningful.

Business Performance(click a metric to see it by business unit)Manage goals in Settings
Billable Efficiency, Sold Hours, and Hours Worked reflect the current month's totals, not Last 30D - technician hours data isn't available at daily/weekly grain in IgniteIQ.

Loading live data...

Mass maintenance revenue is attributed by completed date, per your confirmation.

Technician Performance Overview(company-wide, across active field technicians - hours & rev/hour show current month, not Last 30D)

Loading live data...

Technician Scorecards(management/billing accounts shown grayed out - click a row to see their jobs, click a tile above to sort by that metric)
Export scope: summary only (0 technician rows, no job detail).
Rev/Hour column reflects the current month's totals - technician hours data isn't available at daily/weekly grain in IgniteIQ.

Loading live data...

Job drill-down uses a two-step live lookup (fact_job_technician, then fact_jobs) since IgniteIQ has no single-query join path between them. Revenue, Rev/Hour, Avg Ticket, Callback Rate, and Sold Hours aren't available at the individual job level (those columns are named here only to keep this table's columns lined up with the Scorecards table above) - Split % and Attributed Revenue are the only two real per-job values IgniteIQ exposes. Estimates-presented-to-sold conversion still isn't wired.

Exceptions Requiring Action(Last 30D - Data Quality and AR now respect the date filter above)...
Data Quality Findings
...
CheckSeverityDays OpenCount
Loading...
AR Not Collected
...

Jobs Not Completed/On Hold/Paused, Unassigned Jobs, Second Appointment, and Follow-Up-Past-Due sub-sections aren't wired yet - they need job_status and follow-up-date filtering we haven't confirmed field-by-field. Flagging rather than guessing at filter values.

Marketing
Lead Source Performance(all-time, live - grouped by campaign)
This table always shows all-time totals and does not respond to the Last 30D filter above - IgniteIQ's mart_lead_source_performance dataset has no date field defined at all (confirmed via schema), so there's nothing to filter by yet. Flagged to IgniteIQ as a new gap.

Loading live data...

Calls Ran breakdown (demand/membership/non-member, with prior-year comparison) isn't available - pace_daily is confirmed empty for this account. Per IgniteIQ (Feedback Log #1), this isn't a ServiceTitan-side setting - IgniteIQ holds the job-type-to-bucket configuration and needs Comfort Caddies to supply the classification list (which job types count as Demand, Membership Check, and Non-Member Check) before it can populate. This table is grouped by Campaign rather than Lead Source because lead_source is confirmed "Unknown" on every row (IgniteIQ mapping bug, Feedback Log #3) while campaign_name is real and populated. Attributed Revenue still shows $0 for every campaign - confirmed by IgniteIQ as a separate issue: only 133 of 154,564 jobs are currently linked to a booking, so revenue can't trace back to a lead. Both fixes are in IgniteIQ's queue, not something wrong with this query.

Call Management
Calls by Employee(structure ready - no telephony data source exists yet)
EmployeeCalls TakenCalls BookedBooking Rate
No data available - confirmed no dataset anywhere in IgniteIQ tracks calls as events independent of a job or lead record (see IgniteIQ gap list, item #6). Structured to group by the employee who took the call once a telephony/call-tracking integration exists.
Abandoned / No Ownership(calls with no employee ownership - structure ready)
DatePhone NumberCustomerCampaign
No data available - same underlying gap as above. This table is specifically for calls that abandoned or were never assigned to an employee, once that distinction is available in the data.
Membership
Membership Revenue(not available)

Confirmed via direct query: zero membership invoices exist anywhere in this account's full invoice history (checked across the last full year and all-time), and the mart built specifically for this metric (pace_daily) is empty for the same reason as Marketing's Calls Ran data - the ServiceTitan job-type-to-bucket configuration hasn't been set up for this tenant.

This isn't a placeholder or a query bug - it's a confirmed gap in the underlying data. % of overall revenue by member, revenue attributed to membership sales, and maintenance business unit revenue will all become available once membership plans are actively sold and invoiced in ServiceTitan, and once the pace bucket configuration is completed on IgniteIQ's side.

Payroll
Payroll % by Department(not available)

Payroll wages and PTO tracking are confirmed not present anywhere in IgniteIQ's 35 datasets. This report needs a source system - most likely your payroll provider (Praxis, per Jim's earlier notes) - before it can be built with real numbers.

Inventory & Operations
Sold Estimates below now respects the Last 30D filter above. Purchase Orders, Office Estimate Needed, and Extended Labor Warranty Registration do not - they're built from ServiceTitan tags, which carry no date field at all (confirmed, see IgniteIQ gap list #9), so those three stay all-time until IgniteIQ publishes real dated records (in progress, Feedback Log #8).
Purchase Orders
...
Loading...

Click any status row to see the individual jobs behind it. This is still a status count from tags your team applies in ServiceTitan, not a per-PO table - there's no vendor, PO number, or dollar amount tied to an individual purchase order anywhere in the data (see IgniteIQ gap list, item #8).

Sold Estimates (Not Booked)
...
Office Estimate Needed Jobs
...
Extended Labor Warranties Registration Needed
...
Replenishment Report
Aggregate Inventory Stock Report
Purchasing
Purchase Orders(by status, live from tags)
This report always shows all-time totals and does not respond to the Last 30D filter above - ServiceTitan tags carry no date field at all (confirmed, see IgniteIQ gap list #9), so there's no date to filter by until IgniteIQ publishes the real purchase order records (in progress, Feedback Log #8).

Loading live data...

Delivery Tracking(structure ready - awaiting per-PO vendor/date/location fields from IgniteIQ)
PO #Delivery TypeDelivery LocationVendor ConfirmedRequired Date
No per-PO records available yet - IgniteIQ only exposes status counts from tags right now, not individual PO number, vendor, delivery location, or required date (see IgniteIQ gap list, item #8). This table is structured and ready to populate once that data exists.

Overdue definition locked in: any PO on or past its required date that is not in Received status. Click any column header above to sort. Will-Call and Warehouse Delivery will appear as rows in the same table with a Delivery Location column, once per-PO location data is available.

Warranty Tracking
Every card below shows all-time totals and does not respond to the Last 30D filter above - ServiceTitan tags carry no date field at all (confirmed, see IgniteIQ gap list #9), so there's no date to filter by yet.
1st Year Warranty
...
Parts Warranty
...
Parts & Labor Warranty
...
2 Year CC Labor Warranty
...
Extended Labor Warranty
...
Warranty Filing Status(company-wide totals)
Parts Filed - Complete
Labor Filed - Complete
Parts Filed - Complete Jobs
...
Labor Filed - Complete Jobs
...
Returns / Pending Credits(not yet built)
Structure planned as its own section, separate from AR - tracking returns, pending credits, and paid-vs-reimbursed amounts. Needs investigation into ServiceTitan's return-type data before this can be wired with real numbers.
Extended Warranties Sold(waiting on cost/vendor list from your team)
Structure ready - Job #, Customer, Vendor, Cost, Sold Date. Waiting on Jim's team to supply the list of extended warranties sold before this can be populated.
Return for Repair (Unassigned)
Unassigned Return-for-Repair Jobs(open jobs with no technician assigned)
This list intentionally ignores the Last 30D filter above - it shows every currently open, unassigned job regardless of when it was created. Applying a date filter here would hide older stuck jobs (exactly the ones most worth seeing), so this card is a deliberate exception rather than an oversight.

Loading live data...

"Days Outstanding" is measured from job_date (when the job was created), not from when a tag was applied - bridge_entity_tag has no date field at all (see IgniteIQ gap list, item #9). "Unassigned" is determined live by checking whether any technician record exists for the job in fact_job_technician.

Mass Maintenance / Building Reports
Mass Maintenance Filters(live, Last 30D - filtered to Mass business units, click a row for individual jobs)

Loading live data...

Uses your existing date range and business unit filters at the top of the page - "Mass" matches HVAC-Mass Install, HVAC-Mass Service, and HVAC-Mass Maintenance. Since specific filter criteria weren't finalized, this shows every Mass job in range - let me know if you want it narrowed further (e.g. only unresolved, or a specific sub-type). Click any row to see the individual jobs behind it.

Building Summary(live, Last 30D - grouped by location, click a row for individual jobs)

Loading live data...

Uses dim_location.location_name as the building/property identifier - this is real, live data (confirmed via direct query), not address-based. Building-location custom field decision is still on hold; this uses what's already available in ServiceTitan location records. Click any building row to see the individual jobs behind it.