a. Go to Settings > Invoicing > Tax Zones. Create zones for each jurisdiction where you operate by clicking Add Tax Zone. Enter a name, set the tax rate, and assign zip codes to map locations to the correct zone.
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 Set Tax Zones to apply the mappings to your customer locations.
⚠︎ 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.
⚠︎ 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.
⚠︎ For commercial projects with multiple service locations under one customer, verify that each location has the correct tax zone assigned. Tax is calculated per location, not per customer — a single customer with locations in different jurisdictions will have different tax rates on different jobs.
⚠︎ Avalara requires account configuration by ServiceTitan. Contact Technical Support to enable the integration before attempting setup.
a. Go to Settings > Integrations > Avalara. Enter your Avalara account number, license key, company code, and select a cutoff date. Map the integration to the relevant business units. Click Test Connection to verify, then click Save.
b. Assign Avalara tax codes to your pricebook items at the item, subcategory, or category level. Avalara evaluates tax codes in that order — item first, then subcategory, then category. If no code is assigned at any level, Avalara returns $0 tax.
⚠︎ If pricebook items do not have Avalara tax codes assigned (at any level), Avalara returns $0 tax. Check item, subcategory, and category levels.
c. If you use Application for Payment (progress billing), you must enable Avalara separately for AFP. Go to Settings > Accounting > Application for Payment and enable "Use Avalara to calculate sales tax." You can also enable this per-project in the AFP Settings tab within each project's Continuation Sheet.
⚠︎ When Avalara is enabled for AFP, the Application for Payment preview is not available — but sales tax will appear when you print the document. This is a known limitation.
⚠︎ Manual tax zone overrides can cause double-taxation on recurring service visits. Best practice: create non-taxable visit SKUs instead of overriding zones.
a. Create "Permit Fee" material items in your pricebook for each permit type (e.g., "Permit — Mechanical," "Permit — Electrical," "Permit — Building"). Set the cost to your average permit cost and the sell price to whatever you pass through to the GC or owner. Assign the items to a dedicated "Permits & Fees" category.
b. For projects using progress billing, include permit fees as line items on the estimate so they flow into the Schedule of Values (SOV). This ensures permit costs appear on Applications for Payment and are recoverable through the billing cycle — rather than being absorbed as overhead.
⚠︎ If you use membership or category-based discounts, ensure your "Permits & Fees" category is excluded from discount rules. Permit fees should never be discounted.
⚠︎ For QuickBooks Desktop/Online integrations, permit fee item names are limited to 31 characters. Use abbreviated naming (e.g., "Permit-Mech-Commercial").
a. Create custom fields on the Project scope to capture permit data. Go to Settings > Operations > Custom Fields. Recommended fields: Permit Number (Text) — the jurisdiction-issued permit ID; Permit Status (Dropdown) — values like "Not Required," "Application Submitted," "Approved," "Inspection Scheduled," "Inspection Passed," "Inspection Failed"; Permit Jurisdiction (Text or Dropdown) — the issuing authority; Inspection Date (Date) — when the inspection is scheduled.
b. Create tags for quick dispatch-board visibility: Permit Required — applied at booking or project creation; Permit Pulled — applied when the office confirms the permit is in hand; Inspection Pending — applied after work is complete, awaiting inspector; Inspection Passed — final state, clears for closeout.
c. For commercial projects, use Task Management to create permit milestone tasks on the project record. Open the project, go to the Task Management section, and click Create Task. Create tasks for each permit phase: Submit permit application — assign to the PM or office coordinator with a due date; Receive permit approval — blocks mobilization until marked complete; Schedule inspection — linked to the relevant job within the project; Pass final inspection — required before project can move to closeout status. This creates a permit audit trail within the project record.
⚠︎ Permit status must be managed manually through custom fields, tags, and tasks. There is no automatic gate that prevents work from starting without a permit — enforcement comes from process (forms, task completion gates) or dispatcher/PM vigilance (tags).
⚠︎ The project cannot be closed until all tasks — including permit inspection tasks — are marked complete. Use this as a natural enforcement mechanism for permit closeout.
a. Create a "Permit & Inspection Readiness" form in Settings > Operations > Forms. 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); "Photo of posted permit" (Photo — proof for your records and the inspector).
b. Set the form trigger to fire on the relevant Job Types. For commercial projects, use a "Mobilization" or "Site Readiness" job type and set the trigger to "Required for Job Completion." This gates the mobilization phase — the foreman cannot mark the mobilization job complete until permits, site access, and safety checks are all confirmed.
c. Add conditional logic and auto-tagging: IF "Is a permit required?" = Yes AND "Has the permit been pulled?" = No → auto-apply the Permit Required tag and show: "STOP — Do not begin work until the permit is confirmed. Contact the office." IF "Has the permit been pulled?" = Yes → auto-apply the Permit Pulled tag.
⚠︎ 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.
a. Create a "Completed Form" alert filtered to your Permit & Inspection Readiness form. Route this to the PM or Permit Coordinator so they are notified when a foreman submits permit data from the field.
b. Create a "Task Used" alert for your Permit Fee pricebook items. When a permit fee is added to an invoice or estimate, the alert notifies the office that a permit-related job is in progress.
c. (Optional) For projects requiring AHJ (Authority Having Jurisdiction) approval — common in mechanical, electrical, and fire protection work — create additional "Task Used" alerts for specific pricebook items that trigger regulatory sign-off requirements.
⚠︎ Alert logic uses strict AND matching — all conditions must be met. Start broad and narrow down only if alert volume is too high.
a. Create specific pricebook material items for each refrigerant type (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.
b. When technicians add refrigerant to an invoice, they enter the quantity (pounds) used. To track cylinder serial numbers — required for full EPA chain-of-custody — use one of two approaches: Custom fields on the material item — add a "Cylinder Serial #" custom field so techs enter the serial number at the point of use; or Form-based capture (recommended) — create a "Refrigerant Usage Log" form with fields for type (dropdown), quantity (number), cylinder serial (text), and a photo of the cylinder label. Trigger it on HVAC job types for a richer audit trail.
⚠︎ ServiceTitan does not have a dedicated EPA refrigerant tracking module. You must build a custom Invoice Items report filtered by refrigerant SKU codes. Cylinder-level tracking requires custom fields or a form-based workflow.
⚠︎ 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.
c. Set up a "Task Used" alert for your refrigerant pricebook items — especially R-22. Route to your Safety Officer or Operations Manager.
d. To generate EPA-ready usage reports, go to Reports > Create Report, select the Invoice Items template, and filter by your Refrigerant subcategory. Include: Item Name, Quantity, Customer Name, Location Address, Job Date, and Technician.
⚠︎ For HVAC companies handling R-22 recovery, create separate "R-22 Recovery" and "R-22 Charge" SKUs. EPA reporting requires both directions.
a. Set up custom fields on the Technician entity to store certification data. Go to Settings > Operations > Custom Fields. Create fields for each license type: License Number (Text) — the state or jurisdiction-issued ID; License Type (Dropdown) — e.g., "Journeyman Electrician," "Master Plumber," "EPA 608 Universal," "Medical Gas Installer"; Issue Date (Date); Expiration Date (Date); Issuing Authority (Text) — the licensing body or state board. For commercial trades with multiple required certifications, create a separate field group for each.
b. Build proactive expiration monitoring reports. Go to Reports > Create Report, select the Technician template, and include your custom certification fields. Create three saved versions: Expiring in 30 days — your "act now" list, schedule weekly; Expiring in 60 days — your planning horizon for renewal paperwork; Expiring in 90 days — early warning for certifications that require classes or testing, schedule monthly.
⚠︎ ServiceTitan does not have a native certification tracking module with built-in expiration alerts. The scheduled report is the only proactive mechanism — if you don't build and schedule it, expirations will be missed.
c. Use Technician Skills (a Core dispatch feature) to reflect certification status in dispatch. Map certifications to skills — for example, create a "Backflow Certified" or "Medical Gas" skill and assign it to qualified techs. Configure job types requiring that work to require the skill. The dispatch system will only suggest or assign those jobs to techs with the matching skill, preventing compliance violations at the scheduling level.
⚠︎ If a technician's certification expires, removing their corresponding Skill is a manual step. There is no automatic sync between custom field expiration dates and skill assignments.
⚠︎ For prevailing wage or government projects requiring certified payroll, use Configurable Payroll to set up union/prevailing wage pay rules. Certification tracking (this section) addresses trade licenses; wage compliance is a separate payroll configuration.
a. Verify the service location has a valid, Google-verified address with a mapped tax zone. Go to Settings > Invoicing > Tax Zones and confirm the location's zip code is included in a zone. If you recently created or edited zones, confirm you clicked Set Tax Zones to apply changes.
b. If using Avalara, confirm the integration is active at Settings > Integrations > Avalara and verify pricebook items have Avalara tax codes assigned. If using manual tax zones, verify the rate and that the pricebook item is marked as Taxable.
c. For progress billing invoices: if tax shows $0 on an Application for Payment, verify that "Use Avalara to calculate sales tax" is enabled in the AFP settings (either global or per-project). This is a separate setting from the main Avalara integration.
⚠︎ A common cause: the pricebook item's "Taxable" checkbox is not selected. Even with correct tax zones, non-taxable items show $0 tax.
⚠︎ Tax zone "drift" — if 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.
a. Confirm that permit-related tags are created and active. Tags must be applied to the Job entity (not Customer or Location) to appear on the dispatch board.
b. If using form-based auto-tagging, verify the conditional logic targets the correct entity (Job, not Location). Test by submitting the form on a test job.
⚠︎ Auto-tags applied by conditional logic are permanent once the form is submitted. If permit status changes, the old tag must be manually removed and the new tag applied — forms do not remove previously applied tags.
a. Verify technicians are using the correct, specific refrigerant SKUs rather than a generic item or miscellaneous charge.
b. If using form-based cylinder tracking, confirm the form is assigned to Jobs (not just Locations) and the trigger fires on the correct Job Types.
a. Confirm custom fields are created at the correct scope (Technician entity) and data has been entered. Blank fields won't appear in filtered reports.
b. Verify you're using the Technician report template (not Employee). Check that your date filter is correct.
⚠︎ If the report returns zero results, it likely means no expiration dates fall within your filter range. Widen the range to confirm data exists.