---
title: "Stay Compliant with Permits & Regulations"
slug: "stay-compliant-with-permits-regulations"
updated: 2026-05-11T18:45:39Z
published: 2026-05-11T18:45:39Z
---

> ## Documentation Index
> Fetch the complete documentation index at: https://help.servicetitan.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Stay Compliant with Permits & Regulations

<editor360-custom-block data-preprocessing="true" data-sanitizationtags="b,svg,polyline,style"><div class="sc" style="max-width:960px;margin:0 auto;padding:0 0 3rem;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;color:#1a1a1a"><div style="border-radius:12px;overflow:hidden;background:linear-gradient(135deg,#0d1b35 0%,#162a4a 60%,#0f2040 100%);padding:32px 32px 28px;margin:0 0 16px;border-top:3px solid #3892F3;position:relative;"><div style="position:absolute;top:-60px;right:-60px;width:320px;height:320px;background:radial-gradient(circle,rgba(2,101,220,0.18) 0%,transparent 70%);pointer-events:none;"></div><div style="position:absolute;inset:0;background-image:linear-gradient(rgba(255,255,255,0.02) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,0.02) 1px,transparent 1px);background-size:32px 32px;pointer-events:none;border-radius:12px;"></div><div style="position:relative;display:inline-flex;align-items:center;gap:6px;padding:4px 14px;border-radius:20px;background:rgba(2,101,220,0.18);border:1px solid rgba(56,146,243,0.4);margin:0 0 16px"><span class="hb">SERVICETITAN · COMPLIANCE</span></div><div style="position:relative;font-size:24px;font-weight:800;color:#ffffff;line-height:1.25;margin:0 0 10px;max-width:520px;letter-spacing:-0.01em">Stay Compliant with Permits &amp; Regulations</div><p style="position:relative;font-size:13.5px;color:#B5DEFF;margin:0;line-height:1.65;max-width:540px;opacity:0.85">Configure tax zones, track permits, monitor refrigerant usage, and manage technician certifications to stay compliant with local and federal regulations.</p></div><div style="display:flex;align-items:center;gap:8px;margin:0 0 16px;flex-wrap:wrap"><span style="font-size:11px;color:#6A7A85;font-weight:500">Jump to:</span><a href="/docs/stay-compliant-with-permits-regulations#p1" class="jp" rel="noopener">Tax &amp; Compliance Setup </a><a href="/docs/stay-compliant-with-permits-regulations#p2" class="jp" rel="noopener">Permit Tracking </a><a href="/docs/stay-compliant-with-permits-regulations#p3" class="jp" rel="noopener">Refrigerant &amp; Certification Tracking </a><a href="/docs/stay-compliant-with-permits-regulations#p4" class="jp" rel="noopener">Troubleshoot </a><a href="/docs/stay-compliant-with-permits-regulations#kpi" class="jp" rel="noopener">Measure Impact </a></div><div id="p1" style="margin:20px 0 8px;padding:10px 14px;background:#E3FCFF;border-radius:8px;border-left:4px solid #038299"><div style="font-size:14px;font-weight:700;color:#038299">Tax &amp; Compliance Setup</div></div><div style="display:flex;flex-direction:column;gap:6px"><div class="st" style="border:1px solid #D0D8DD;border-radius:8px;padding:10px 14px"><div style="display:flex;align-items:flex-start;gap:10px"><div class="sn" style="min-width:24px;height:24px;border-radius:6px;background:#E3FCFF;color:#038299;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;flex-shrink:0"></div><div style="flex:1"><div style="font-size:13.5px;font-weight:600;color:#1a1a1a;margin:0 0 1px">Set up your tax zones and rates</div><div style="font-size:13px;color:#374151;line-height:1.7;margin:6px 0 0;padding-left:1em"><p style="margin:0 0 2px"><b>a.</b> Go to <b>Settings</b> &gt; <b>Invoicing</b> &gt; <b>Tax Zones</b>. Create zones for each jurisdiction where you operate by clicking <b>Add Tax Zone</b>. Enter a name, set the tax rate, and assign zip codes to map locations to the correct zone.</p><p style="margin:0 0 2px"><b>b.</b> Assign tax rates to each zone. Tax is calculated automatically based on the service location's address and mapped tax zone. After creating all zones, click <b>Set Tax Zones</b> to apply the mappings to your customer locations.</p><div style="padding:5px 10px;background:#EAEFF2;border-left:3px solid #8C9CA5;border-radius:6px;margin:4px 0 4px"><p style="font-size:12px;color:#4B5563;margin:0;line-height:1.5">⚠︎ You must click "Set Tax Zones" after creating or editing zones — changes do not apply automatically. Locations without a mapped zone will not have tax calculated.</p></div><div style="padding:5px 10px;background:#EAEFF2;border-left:3px solid #8C9CA5;border-radius:6px;margin:4px 0 4px"><p style="font-size:12px;color:#4B5563;margin:0;line-height:1.5">⚠︎ If you export to QuickBooks or Intacct, your ServiceTitan tax zone names must match your accounting software's tax item names exactly. Mismatches cause export failures or incorrect tax reporting.</p></div></div><div style="margin:6px 0 0;padding-top:5px;border-top:1px solid #DFE0E1"><a href="/v1/docs/set-up-sales-tax-in-servicetitan" target="_self" translate="no" class="sl" rel="noopener"><u>Set up sales tax in ServiceTitan</u></a></div></div></div></div><div class="st" style="border:1px solid #D0D8DD;border-radius:8px;padding:10px 14px"><div style="display:flex;align-items:flex-start;gap:10px"><div class="sn" style="min-width:24px;height:24px;border-radius:6px;background:#E3FCFF;color:#038299;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;flex-shrink:0"></div><div style="flex:1"><div style="font-size:13.5px;font-weight:600;color:#1a1a1a;margin:0 0 1px">(Optional) Connect Avalara for automatic tax calculation</div><div style="font-size:13px;color:#374151;line-height:1.7;margin:6px 0 0;padding-left:1em"><p style="margin:0 0 2px"><b>a.</b> Go to <b>Settings</b> &gt; <b>Integrations</b> &gt; <b>Avalara</b>. Enter your Avalara account number, license key, company code, and select a cutoff date. Click <b>Test Connection</b> to verify, then click <b>Save</b>.</p><div style="padding:5px 10px;background:#EAEFF2;border-left:3px solid #8C9CA5;border-radius:6px;margin:4px 0 4px"><p style="font-size:12px;color:#4B5563;margin:0;line-height:1.5">⚠︎ Avalara requires account configuration by ServiceTitan. Contact Technical Support to enable the integration before attempting setup.</p></div><p style="margin:0 0 2px"><b>b.</b> Once connected, Avalara calculates tax rates automatically based on the exact service address — no manual tax zone mapping needed. You must also assign Avalara tax codes to your pricebook items (at the item, subcategory, or category level) for tax to calculate correctly.</p><div style="padding:5px 10px;background:#EAEFF2;border-left:3px solid #8C9CA5;border-radius:6px;margin:4px 0 4px"><p style="font-size:12px;color:#4B5563;margin:0;line-height:1.5">⚠︎ If pricebook items do not have Avalara tax codes assigned (at any level), Avalara returns $0 tax. Check item, subcategory, and category levels.</p></div><div style="padding:5px 10px;background:#EAEFF2;border-left:3px solid #8C9CA5;border-radius:6px;margin:4px 0 4px"><p style="font-size:12px;color:#4B5563;margin:0;line-height:1.5">⚠︎ Manual tax zone overrides can cause double-taxation on recurring service visits. Best practice: create non-taxable visit SKUs instead of overriding zones.</p></div></div><div style="margin:6px 0 0;padding-top:5px;border-top:1px solid #DFE0E1"><a href="/v1/docs/avalara-integration-guide" target="_self" translate="no" class="sl" rel="noopener"><u>Avalara integration guide</u></a></div></div></div></div></div><div id="p2" style="margin:20px 0 8px;padding:10px 14px;background:#E0F2FF;border-radius:8px;border-left:4px solid #004491"><div style="font-size:14px;font-weight:700;color:#004491">Permit Tracking</div></div><div style="display:flex;flex-direction:column;gap:6px"><div class="st" style="border:1px solid #D0D8DD;border-radius:8px;padding:10px 14px"><div style="display:flex;align-items:flex-start;gap:10px"><div class="sn" style="min-width:24px;height:24px;border-radius:6px;background:#E0F2FF;color:#004491;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;flex-shrink:0"></div><div style="flex:1"><div style="font-size:13.5px;font-weight:600;color:#1a1a1a;margin:0 0 1px">Add permit fees to your pricebook</div><div style="font-size:13px;color:#374151;line-height:1.7;margin:6px 0 0;padding-left:1em"><p style="margin:0 0 2px"><b>a.</b> Create a "Permit Fee" material item in your pricebook for each permit type your business commonly pulls (e.g., "Permit — Mechanical," "Permit — Electrical," "Permit — Plumbing"). Set the cost to your average permit cost and the sell price to whatever you pass through to customers. Assign the items to a dedicated "Permits &amp; Fees" category.</p><p style="margin:0 0 2px"><b>b.</b> Bundle permit fees into Item Groups for common jobs. For example, create a "Water Heater Installation Package" Item Group that includes the labor service, equipment, expansion tank, and permit fee. The customer sees one total price — no line-item vetoing on the permit charge — while the system retains the individual components for job costing and reporting.</p><div style="padding:5px 10px;background:#EAEFF2;border-left:3px solid #8C9CA5;border-radius:6px;margin:4px 0 4px"><p style="font-size:12px;color:#4B5563;margin:0;line-height:1.5">⚠︎ If you use membership discounts, be careful with "All Services" discount rules — they will discount permit fees too. Best practice: use Category-Based discounts so you discount Repairs but not the Permits &amp; Fees category.</p></div><div style="padding:5px 10px;background:#EAEFF2;border-left:3px solid #8C9CA5;border-radius:6px;margin:4px 0 4px"><p style="font-size:12px;color:#4B5563;margin:0;line-height:1.5">⚠︎ For QuickBooks Desktop/Online integrations, permit fee item names are limited to 31 characters. Use abbreviated naming (e.g., "Permit-Mech-Residential").</p></div></div><div style="margin:6px 0 0;padding-top:5px;border-top:1px solid #DFE0E1"><a href="/v1/docs/edit-pricebook-items" target="_self" translate="no" class="sl" rel="noopener"><u>Edit pricebook items</u></a></div></div></div></div><div class="st" style="border:1px solid #D0D8DD;border-radius:8px;padding:10px 14px"><div style="display:flex;align-items:flex-start;gap:10px"><div class="sn" style="min-width:24px;height:24px;border-radius:6px;background:#E0F2FF;color:#004491;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;flex-shrink:0"></div><div style="flex:1"><div style="font-size:13.5px;font-weight:600;color:#1a1a1a;margin:0 0 1px">Track permit status with custom fields and tags</div><div style="font-size:13px;color:#374151;line-height:1.7;margin:6px 0 0;padding-left:1em"><p style="margin:0 0 2px"><b>a.</b> Create custom fields on the <b>Job</b> or <b>Project</b> scope to capture permit data. Go to <b>Settings</b> &gt; <b>Operations</b> &gt; <b>Custom Fields</b>. Recommended fields: <b>Permit Number</b> (Text) — the jurisdiction-issued permit ID; <b>Permit Status</b> (Dropdown) — values like "Not Required," "Application Submitted," "Approved," "Inspection Scheduled," "Inspection Passed," "Inspection Failed"; <b>Permit Jurisdiction</b> (Text or Dropdown) — the issuing authority (city, county); <b>Inspection Date</b> (Date) — when the inspection is scheduled.</p><p style="margin:0 0 2px"><b>b.</b> Create tags for quick dispatch-board visibility. Suggested tags: <b>Permit Required</b> — applied at booking when the CSR identifies a permit need; <b>Permit Pulled</b> — applied when the office confirms the permit is in hand; <b>Inspection Pending</b> — applied after work is complete, awaiting inspector; <b>Inspection Passed</b> — final state, clears the job for closeout. Tags are visible on the dispatch board and in the technician's mobile view, so dispatchers and techs know at a glance whether a job is cleared to proceed.</p><div style="padding:5px 10px;background:#EAEFF2;border-left:3px solid #8C9CA5;border-radius:6px;margin:4px 0 4px"><p style="font-size:12px;color:#4B5563;margin:0;line-height:1.5">⚠︎ Permit status must be managed manually through custom fields and tags. There is no automatic gate that prevents a technician from starting work on a job without a permit — enforcement comes from process (forms) or dispatcher vigilance (tags).</p></div></div><div style="margin:6px 0 0;padding-top:5px;border-top:1px solid #DFE0E1"><a href="/v1/docs/manage-tags" target="_self" translate="no" class="sl" rel="noopener"><u>Manage tags</u></a><a href="/v1/docs/use-custom-fields" target="_self" translate="no" class="sl" rel="noopener"><u>Use custom fields</u></a></div></div></div></div><div class="st" style="border:1px solid #D0D8DD;border-radius:8px;padding:10px 14px"><div style="display:flex;align-items:flex-start;gap:10px"><div class="sn" style="min-width:24px;height:24px;border-radius:6px;background:#E0F2FF;color:#004491;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;flex-shrink:0"></div><div style="flex:1"><div style="font-size:13.5px;font-weight:600;color:#1a1a1a;margin:0 0 1px">Use forms to enforce permit verification before work begins</div><div style="font-size:13px;color:#374151;line-height:1.7;margin:6px 0 0;padding-left:1em"><p style="margin:0 0 2px"><b>a.</b> Create a "Permit &amp; Inspection Readiness" form in <b>Settings</b> &gt; <b>Operations</b> &gt; <b>Forms</b>. Include fields such as: "Is a permit required for this job?" (Radio: Yes / No), "Has the permit been pulled?" (Radio: Yes / No), "Permit number" (Text — confirms the permit is in hand), and "Photo of posted permit" (Photo — proof for your records and the inspector).</p><p style="margin:0 0 2px"><b>b.</b> Set the form trigger to fire on the relevant Job Types (e.g., Install, Replacement, Panel Upgrade). Choose the trigger event based on your enforcement strategy: <b>"On Arrival"</b> — the tech sees the form immediately and must confirm permit status before proceeding (best for residential installs); or <b>"Required for Job Completion"</b> — the tech can start work but cannot close the job until the form is submitted (best for multi-day projects where the permit may arrive mid-job).</p><p style="margin:0 0 2px"><b>c.</b> Add conditional logic and auto-tagging to the form: IF "Is a permit required?" = Yes AND "Has the permit been pulled?" = No → auto-apply the <b>Permit Required</b> tag to the Job and show a warning section: "STOP — Do not begin work until the permit is confirmed. Contact the office." IF "Has the permit been pulled?" = Yes → auto-apply the <b>Permit Pulled</b> tag to the Job.</p><div style="padding:5px 10px;background:#EAEFF2;border-left:3px solid #8C9CA5;border-radius:6px;margin:4px 0 4px"><p style="font-size:12px;color:#4B5563;margin:0;line-height:1.5">⚠︎ Never mark a form field as "Required" if its section can be hidden by conditional logic. This causes the form to freeze and the technician cannot submit it.</p></div></div><div style="margin:6px 0 0;padding-top:5px;border-top:1px solid #DFE0E1"><a href="/v1/docs/use-form-triggers" target="_self" translate="no" class="sl" rel="noopener"><u>Use form triggers</u></a><a href="/v1/docs/use-conditional-logic-in-forms" target="_self" translate="no" class="sl" rel="noopener"><u>Use conditional logic in forms</u></a><a href="/v1/docs/add-tags-using-conditional-logic-in-forms" target="_self" translate="no" class="sl" rel="noopener"><u>Auto-tagging via forms</u></a></div></div></div></div><div class="st" style="border:1px solid #D0D8DD;border-radius:8px;padding:10px 14px"><div style="display:flex;align-items:flex-start;gap:10px"><div class="sn" style="min-width:24px;height:24px;border-radius:6px;background:#E0F2FF;color:#004491;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;flex-shrink:0"></div><div style="flex:1"><div style="font-size:13.5px;font-weight:600;color:#1a1a1a;margin:0 0 1px">Set up alerts for permit-related jobs</div><div style="font-size:13px;color:#374151;line-height:1.7;margin:6px 0 0;padding-left:1em"><p style="margin:0 0 2px"><b>a.</b> Create a <b>"Completed Form"</b> alert filtered to your Permit &amp; Inspection Readiness form. Route this to the Office Manager or Permit Coordinator so they are notified the moment a technician submits permit data from the field.</p><p style="margin:0 0 2px"><b>b.</b> Create a <b>"Task Used"</b> alert for your Permit Fee pricebook items. When a technician adds a permit fee to an invoice, the alert notifies the office that a permit-related job is in progress and may need inspection scheduling.</p><p style="margin:0 0 2px"><b>c.</b> (Optional) If your jurisdiction requires specific materials to be documented (e.g., solar panel installs requiring AHJ approval), create an additional "Task Used" alert for those specific pricebook items to flag jobs that will need regulatory sign-off.</p><div style="padding:5px 10px;background:#EAEFF2;border-left:3px solid #8C9CA5;border-radius:6px;margin:4px 0 4px"><p style="font-size:12px;color:#4B5563;margin:0;line-height:1.5">⚠︎ Alert logic uses strict AND matching — all conditions must be met. Start broad (just the form or task trigger) and narrow down only if alert volume is too high. Over-filtering causes missed notifications.</p></div></div><div style="margin:6px 0 0;padding-top:5px;border-top:1px solid #DFE0E1"><a href="/v1/docs/use-alerts" target="_self" translate="no" class="sl" rel="noopener"><u>Use alerts</u></a></div></div></div></div></div><div id="p3" style="margin:20px 0 8px;padding:10px 14px;background:#F1EDFF;border-radius:8px;border-left:4px solid #4F3A9E"><div style="font-size:14px;font-weight:700;color:#4F3A9E">Refrigerant &amp; Certification Tracking</div></div><div style="display:flex;flex-direction:column;gap:6px"><div class="st" style="border:1px solid #D0D8DD;border-radius:8px;padding:10px 14px"><div style="display:flex;align-items:flex-start;gap:10px"><div class="sn" style="min-width:24px;height:24px;border-radius:6px;background:#F1EDFF;color:#4F3A9E;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;flex-shrink:0"></div><div style="flex:1"><div style="font-size:13.5px;font-weight:600;color:#1a1a1a;margin:0 0 1px">Track refrigerant usage for EPA compliance</div><div style="font-size:13px;color:#374151;line-height:1.7;margin:6px 0 0;padding-left:1em"><p style="margin:0 0 2px"><b>a.</b> Create specific pricebook material items for each refrigerant type your technicians handle (e.g., "R-410A — per lb," "R-22 — per lb," "R-454B — per lb"). Set accurate costs and assign them to a dedicated "Refrigerants" subcategory. A generic "Refrigerant" SKU won't satisfy EPA Section 608 reporting, which requires tracking by type.</p><p style="margin:0 0 2px"><b>b.</b> When technicians add refrigerant to an invoice in the field, they enter the quantity (pounds) used. To track cylinder serial numbers — required for full EPA chain-of-custody documentation — use one of two approaches: <b>Custom fields on the material item</b> — add a "Cylinder Serial #" custom field to your refrigerant pricebook items (techs enter the serial number at the point of use); or <b>Form-based capture (recommended)</b> — create a "Refrigerant Usage Log" form with fields for refrigerant type (dropdown), quantity (number), cylinder serial number (text), and a photo of the cylinder label, then trigger the form on Job Types where refrigerant use is expected (e.g., "HVAC Repair," "System Charge"). This creates a richer audit trail than custom fields alone.</p><p style="margin:0 0 2px"><b>c.</b> Set up a <b>"Task Used" alert</b> for your refrigerant pricebook items — especially R-22, which is phased out under EPA regulations and commands premium pricing. Route the alert to your Safety Officer or Operations Manager.</p><p style="margin:0 0 2px"><b>d.</b> To generate EPA-ready usage reports, go to <b>Reports</b> &gt; <b>Create Report</b>, select the <b>Invoice Items</b> template, and filter by your Refrigerant subcategory. Include these columns: Item Name, Quantity, Customer Name, Location Address, Job Date, and Technician.</p><div style="padding:5px 10px;background:#EAEFF2;border-left:3px solid #8C9CA5;border-radius:6px;margin:4px 0 4px"><p style="font-size:12px;color:#4B5563;margin:0;line-height:1.5">⚠︎ ServiceTitan does not have a dedicated EPA refrigerant tracking module or a push-button EPA compliance report. You must build a custom Invoice Items report filtered by refrigerant SKU codes.</p></div><div style="padding:5px 10px;background:#EAEFF2;border-left:3px solid #8C9CA5;border-radius:6px;margin:4px 0 4px"><p style="font-size:12px;color:#4B5563;margin:0;line-height:1.5">⚠︎ If you use the form-based approach, ensure the form is assigned to Jobs (not just Locations) — forms assigned only to Locations do not appear in the Form Submissions report, which breaks your audit trail.</p></div><div style="padding:5px 10px;background:#EAEFF2;border-left:3px solid #8C9CA5;border-radius:6px;margin:4px 0 4px"><p style="font-size:12px;color:#4B5563;margin:0;line-height:1.5">⚠︎ For HVAC companies handling R-22 recovery, consider creating separate "R-22 Recovery" and "R-22 Charge" SKUs to distinguish between refrigerant added and refrigerant removed. EPA reporting requires both directions.</p></div></div><div style="margin:6px 0 0;padding-top:5px;border-top:1px solid #DFE0E1"><a href="/v1/docs/create-custom-reports" target="_self" translate="no" class="sl" rel="noopener"><u>Create custom reports</u></a><a href="/v1/docs/use-alerts" target="_self" translate="no" class="sl" rel="noopener"><u>Use alerts</u></a><a href="/v1/docs/create-a-form-in-servicetitan" target="_self" translate="no" class="sl" rel="noopener"><u>Create a form in ServiceTitan</u></a><a href="/v1/docs/use-form-triggers" target="_self" translate="no" class="sl" rel="noopener"><u>Use form triggers</u></a></div></div></div></div><div class="st" style="border:1px solid #D0D8DD;border-radius:8px;padding:10px 14px"><div style="display:flex;align-items:flex-start;gap:10px"><div class="sn" style="min-width:24px;height:24px;border-radius:6px;background:#F1EDFF;color:#4F3A9E;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;flex-shrink:0"></div><div style="flex:1"><div style="font-size:13.5px;font-weight:600;color:#1a1a1a;margin:0 0 1px">Track technician licenses and certifications</div><div style="font-size:13px;color:#374151;line-height:1.7;margin:6px 0 0;padding-left:1em"><p style="margin:0 0 2px"><b>a.</b> Set up custom fields on the <b>Technician</b> entity to store certification data. Go to <b>Settings</b> &gt; <b>Operations</b> &gt; <b>Custom Fields</b>. Create fields for each license type relevant to your trade: <b>License Number</b> (Text) — the state or jurisdiction-issued ID; <b>License Type</b> (Dropdown) — e.g., "Journeyman Electrician," "Master Plumber," "EPA 608 Universal," "NATE Certified"; <b>Issue Date</b> (Date) — when the license was issued; <b>Expiration Date</b> (Date) — when the license expires; <b>Issuing Authority</b> (Text) — the licensing body or state board.</p><p style="margin:0 0 2px"><b>b.</b> Build a proactive expiration monitoring report. Go to <b>Reports</b> &gt; <b>Create Report</b>, select the <b>Technician</b> report template, and include your custom certification fields. Create three saved versions: <b>Expiring in 30 days</b> — your "act now" list (schedule weekly); <b>Expiring in 60 days</b> — your planning horizon for renewal paperwork; <b>Expiring in 90 days</b> — your early warning for certifications that require classes or testing (schedule monthly).</p><p style="margin:0 0 2px"><b>c.</b> Use <b>Technician Skills</b> (a Core dispatch feature) to reflect certification status in dispatch. Map certifications to skills — for example, create a "Backflow Certified" skill and assign it to qualified techs. Then configure job types that require backflow work to require that skill. The dispatch system will only suggest or assign backflow jobs to techs with the matching skill, preventing compliance violations at the scheduling level.</p><div style="padding:5px 10px;background:#EAEFF2;border-left:3px solid #8C9CA5;border-radius:6px;margin:4px 0 4px"><p style="font-size:12px;color:#4B5563;margin:0;line-height:1.5">⚠︎ ServiceTitan does not have a native certification tracking module with built-in expiration alerts. There is no automatic notification when a certification is about to expire. The scheduled report is the only proactive mechanism — if you don't build and schedule it, expirations will be missed.</p></div><div style="padding:5px 10px;background:#EAEFF2;border-left:3px solid #8C9CA5;border-radius:6px;margin:4px 0 4px"><p style="font-size:12px;color:#4B5563;margin:0;line-height:1.5">⚠︎ If a technician's certification expires, removing their corresponding Skill in the dispatch system is a manual step. There is no automatic sync between custom field expiration dates and technician skill assignments. Your Operations Manager must update both.</p></div></div><div style="margin:6px 0 0;padding-top:5px;border-top:1px solid #DFE0E1"><a href="/v1/docs/add-and-manage-technician-profiles" target="_self" translate="no" class="sl" rel="noopener"><u>Add and manage technician profiles</u></a><a href="/v1/docs/create-custom-reports" target="_self" translate="no" class="sl" rel="noopener"><u>Create custom reports</u></a><a href="/v1/docs/manage-skills-for-technicians-and-job-types" target="_self" translate="no" class="sl" rel="noopener"><u>Manage skills for technicians and job types</u></a></div></div></div></div></div><div id="p4" style="margin:20px 0 8px;padding:10px 14px;background:#FEF3E2;border-radius:8px;border-left:4px solid #8B5E0F"><div style="font-size:14px;font-weight:700;color:#8B5E0F">Troubleshoot</div></div><div style="display:flex;flex-direction:column;gap:6px"><div class="st" style="border:1px solid #D0D8DD;border-radius:8px;padding:10px 14px"><div style="display:flex;align-items:flex-start;gap:10px"><div class="sn" style="min-width:24px;height:24px;border-radius:6px;background:#FEF3E2;color:#8B5E0F;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;flex-shrink:0"></div><div style="flex:1"><div style="font-size:13.5px;font-weight:600;color:#1a1a1a;margin:0 0 1px">Tax not calculating</div><div style="font-size:13px;color:#374151;line-height:1.7;margin:6px 0 0;padding-left:1em"><p style="margin:0 0 2px"><b>a.</b> Verify the service location has a valid, Google-verified address with a mapped tax zone. Go to <b>Settings</b> &gt; <b>Invoicing</b> &gt; <b>Tax Zones</b> and confirm the location's zip code is included in a zone. If you recently created or edited zones, confirm you clicked <b>Set Tax Zones</b> to apply changes.</p><p style="margin:0 0 2px"><b>b.</b> If using Avalara, confirm the integration is active at <b>Settings</b> &gt; <b>Integrations</b> &gt; <b>Avalara</b> and verify pricebook items have Avalara tax codes assigned. If using manual tax zones, verify the rate is set correctly for the location's zone and that the pricebook item is marked as <b>Taxable</b>.</p><div style="padding:5px 10px;background:#EAEFF2;border-left:3px solid #8C9CA5;border-radius:6px;margin:4px 0 4px"><p style="font-size:12px;color:#4B5563;margin:0;line-height:1.5">⚠︎ A common cause: the pricebook item's "Taxable" checkbox is not selected. Even with correct tax zones, non-taxable items will show $0 tax.</p></div><div style="padding:5px 10px;background:#EAEFF2;border-left:3px solid #8C9CA5;border-radius:6px;margin:4px 0 4px"><p style="font-size:12px;color:#4B5563;margin:0;line-height:1.5">⚠︎ Tax zone "drift" — if dispatchers or office staff manually override the tax zone on individual invoices instead of fixing the Location's master data, the error repeats on every future job at that address. Fix the Location, not the invoice.</p></div></div><div style="margin:6px 0 0;padding-top:5px;border-top:1px solid #DFE0E1"><a href="/v1/docs/set-up-sales-tax-in-servicetitan" target="_self" translate="no" class="sl" rel="noopener"><u>Set up sales tax in ServiceTitan</u></a></div></div></div></div><div class="st" style="border:1px solid #D0D8DD;border-radius:8px;padding:10px 14px"><div style="display:flex;align-items:flex-start;gap:10px"><div class="sn" style="min-width:24px;height:24px;border-radius:6px;background:#FEF3E2;color:#8B5E0F;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;flex-shrink:0"></div><div style="flex:1"><div style="font-size:13.5px;font-weight:600;color:#1a1a1a;margin:0 0 1px">Permit status not visible on dispatch board</div><div style="font-size:13px;color:#374151;line-height:1.7;margin:6px 0 0;padding-left:1em"><p style="margin:0 0 2px"><b>a.</b> Confirm that your permit-related tags (e.g., "Permit Required," "Permit Pulled") are created and active. Tags must be applied to the <b>Job</b> entity (not Customer or Location) to appear on the dispatch board next to the job.</p><p style="margin:0 0 2px"><b>b.</b> If you're using form-based auto-tagging, verify that the conditional logic rules are configured correctly: the IF condition matches the expected form answer, and the THEN action applies the tag to the correct target (Job, not Location). Test by submitting the form on a test job and checking whether the tag appears.</p><div style="padding:5px 10px;background:#EAEFF2;border-left:3px solid #8C9CA5;border-radius:6px;margin:4px 0 4px"><p style="font-size:12px;color:#4B5563;margin:0;line-height:1.5">⚠︎ Auto-tags applied by conditional logic are permanent once the form is submitted. If a permit status changes (e.g., from "Required" to "Pulled"), the old tag must be manually removed and the new tag applied — forms do not remove previously applied tags.</p></div></div></div></div></div><div class="st" style="border:1px solid #D0D8DD;border-radius:8px;padding:10px 14px"><div style="display:flex;align-items:flex-start;gap:10px"><div class="sn" style="min-width:24px;height:24px;border-radius:6px;background:#FEF3E2;color:#8B5E0F;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;flex-shrink:0"></div><div style="flex:1"><div style="font-size:13.5px;font-weight:600;color:#1a1a1a;margin:0 0 1px">Refrigerant report showing incomplete data</div><div style="font-size:13px;color:#374151;line-height:1.7;margin:6px 0 0;padding-left:1em"><p style="margin:0 0 2px"><b>a.</b> Verify that technicians are using the correct, specific refrigerant SKUs (e.g., "R-410A — per lb") rather than a generic "Refrigerant" item or a miscellaneous charge. Generic items won't appear when you filter by refrigerant category.</p><p style="margin:0 0 2px"><b>b.</b> If using the form-based cylinder tracking approach, confirm the Refrigerant Usage Log form is assigned to <b>Jobs</b> (not just Locations) and that the form trigger is set to fire on the correct Job Types. Forms assigned only to Locations do not appear in the Form Submissions report.</p></div></div></div></div><div class="st" style="border:1px solid #D0D8DD;border-radius:8px;padding:10px 14px"><div style="display:flex;align-items:flex-start;gap:10px"><div class="sn" style="min-width:24px;height:24px;border-radius:6px;background:#FEF3E2;color:#8B5E0F;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;flex-shrink:0"></div><div style="flex:1"><div style="font-size:13.5px;font-weight:600;color:#1a1a1a;margin:0 0 1px">Certification report missing technicians</div><div style="font-size:13px;color:#374151;line-height:1.7;margin:6px 0 0;padding-left:1em"><p style="margin:0 0 2px"><b>a.</b> Confirm that custom fields are created at the correct scope (Technician entity) and that data has been entered for each technician. Custom fields with blank values won't appear in filtered reports.</p><p style="margin:0 0 2px"><b>b.</b> Verify you are using the <b>Technician</b> report template (not the Employee template). Include all relevant custom field columns and check that your date filter range is correct — filtering for "next 30 days" from today's date.</p><div style="padding:5px 10px;background:#EAEFF2;border-left:3px solid #8C9CA5;border-radius:6px;margin:4px 0 4px"><p style="font-size:12px;color:#4B5563;margin:0;line-height:1.5">⚠︎ If the report returns zero results, it likely means no expiration dates fall within your filter range — not that the report is broken. Widen the date range to confirm data exists.</p></div></div></div></div></div></div><div id="kpi" style="margin:24px 0 12px"><div style="display:flex;align-items:center;gap:8px;margin:0 0 12px"><svg width="15" height="15" viewbox="0 0 24 24" fill="none" stroke="#004491" stroke-width="2.5"><polyline points="23 6 13.5 15.5 8.5 10.5 1 18"></polyline><polyline points="17 6 23 6 23 12"></polyline></svg><div style="font-size:13px;font-weight:700;color:#004491;text-transform:uppercase;letter-spacing:0.06em">Measure the impact</div></div><div style="display:grid;grid-template-columns:1fr 1fr;gap:8px"><div style="padding:14px 16px;border-radius:10px;background:#fff;border:1px solid #DFE0E1;border-top:3px solid #0265DC;"><div style="font-size:11px;font-weight:700;color:#0265DC;text-transform:uppercase;letter-spacing:0.06em;margin:0 0 6px">Accuracy</div><div style="font-size:12.5px;font-weight:600;color:#1a1a1a;margin:0 0 4px">Tax calculation accuracy</div><div style="font-size:11.5px;color:#6A7A85;line-height:1.55;margin:0 0 8px">Run an Invoice Items report with Tax Amount, Tax Zone, and Business Unit columns. Compare line-item tax totals to your filed returns — discrepancies signal zone mapping or rate issues.</div><a href="https://go.servicetitan.com/#/new/reports/new" target="_blank" class="sl" rel="noopener">Reports &gt; Create Report &gt; select "Invoice Items" template ↗</a></div><div style="padding:14px 16px;border-radius:10px;background:#fff;border:1px solid #DFE0E1;border-top:3px solid #0265DC;"><div style="font-size:11px;font-weight:700;color:#0265DC;text-transform:uppercase;letter-spacing:0.06em;margin:0 0 6px">Compliance</div><div style="font-size:12.5px;font-weight:600;color:#1a1a1a;margin:0 0 4px">Technician certification coverage</div><div style="font-size:11.5px;color:#6A7A85;line-height:1.55;margin:0 0 8px">Track the percentage of technicians with current, unexpired licenses. 100% coverage is required for compliance — a single expired license can halt permitted work and trigger fines.</div><a href="https://go.servicetitan.com/#/new/reports/new" target="_blank" class="sl" rel="noopener">Reports &gt; Create Report &gt; select "Technician" template ↗</a></div><div style="padding:14px 16px;border-radius:10px;background:#fff;border:1px solid #DFE0E1;border-top:3px solid #0265DC;"><div style="font-size:11px;font-weight:700;color:#0265DC;text-transform:uppercase;letter-spacing:0.06em;margin:0 0 6px">Tracking</div><div style="font-size:12.5px;font-weight:600;color:#1a1a1a;margin:0 0 4px">Refrigerant reporting accuracy</div><div style="font-size:11.5px;color:#6A7A85;line-height:1.55;margin:0 0 8px">Compare ServiceTitan usage records to physical cylinder inventory. Accurate tracking is required for EPA Section 608 audits.</div><a href="https://go.servicetitan.com/#/new/reports/new" target="_blank" class="sl" rel="noopener">Reports &gt; Create Report &gt; select "Invoice Items" template ↗</a></div><div style="padding:14px 16px;border-radius:10px;background:#fff;border:1px solid #DFE0E1;border-top:3px solid #0265DC;"><div style="font-size:11px;font-weight:700;color:#0265DC;text-transform:uppercase;letter-spacing:0.06em;margin:0 0 6px">Process</div><div style="font-size:12.5px;font-weight:600;color:#1a1a1a;margin:0 0 4px">Permit compliance rate</div><div style="font-size:11.5px;color:#6A7A85;line-height:1.55;margin:0 0 8px">Track the percentage of permit-required jobs where the permit was confirmed before work began. Measures how well the form-and-tag workflow is being followed.</div><a href="https://go.servicetitan.com/#/new/reports/new" target="_blank" class="sl" rel="noopener">Reports &gt; Create Report &gt; select "Jobs" template ↗</a></div><div style="padding:14px 16px;border-radius:10px;background:#fff;border:1px solid #DFE0E1;border-top:3px solid #0265DC;"><div style="font-size:11px;font-weight:700;color:#0265DC;text-transform:uppercase;letter-spacing:0.06em;margin:0 0 6px">Timeliness</div><div style="font-size:12.5px;font-weight:600;color:#1a1a1a;margin:0 0 4px">Expiring certifications flagged early</div><div style="font-size:11.5px;color:#6A7A85;line-height:1.55;margin:0 0 8px">Track how many certifications are identified before expiration vs. discovered after the fact. Early identification prevents compliance gaps and work stoppages.</div><a href="https://go.servicetitan.com/#/new/reports/new" target="_blank" class="sl" rel="noopener">Reports &gt; Create Report &gt; select "Technician" template ↗</a></div><div style="padding:14px 16px;border-radius:10px;background:#fff;border:1px solid #DFE0E1;border-top:3px solid #0265DC;"><div style="font-size:11px;font-weight:700;color:#0265DC;text-transform:uppercase;letter-spacing:0.06em;margin:0 0 6px">Financial</div><div style="font-size:12.5px;font-weight:600;color:#1a1a1a;margin:0 0 4px">Permit fee recovery rate</div><div style="font-size:11.5px;color:#6A7A85;line-height:1.55;margin:0 0 8px">Track whether permit fees are being consistently added to invoices for permitted work. Missing permit fees mean the business is absorbing costs that should be passed to customers.</div><a href="https://go.servicetitan.com/#/new/reports/new" target="_blank" class="sl" rel="noopener">Reports &gt; Create Report &gt; select "Invoice Items" template ↗</a></div></div></div><style> .sc { counter-reset: step } .sn { counter-increment: step } .sn::before { content: counter(step) } .hb { font-size: 10.5px; font-weight: 700; color: #78BBFA; letter-spacing: 0.08em } .jp { font-size: 11.5px; font-weight: 600; color: #374151; text-decoration: none; padding: 5px 13px; background: #fff; border: 1px solid #D0D8DD; border-radius: 20px; transition: all 0.15s } .jp:hover { background: #E0F2FF; border-color: #B5DEFF; color: #004491 } .st { transition: box-shadow 0.15s, border-color 0.15s } .st:hover { border-color: #B5DEFF !important; box-shadow: 0 2px 12px rgba(2, 101, 220, 0.07) } .sl { font-size: 10.5px; color: #0265DC; text-decoration: none; margin-right: 6px } .sl:hover { text-decoration: underline } .sl+.sl::before { content: "· "; color: #D0D8DD } p[data-block-id] { font-size: 1rem; } ul li p[data-block-id] { margin-bottom: 0; } ul[data-type="taskList"] li div p[data-block-id] { margin-bottom: 0; } ol li p[data-block-id] { margin-bottom: 0; } table tbody th p[data-block-id] { margin-bottom: 0; } blockquote p[data-block-id] { margin-bottom: 0 !important; } p[data-block-id]:empty::after { content: "\00A0"; } </style></div></editor360-custom-block>
