Documentation

SepticCycle User Guide

Everything you need to set up and run your septic business on SepticCycle — from first login to daily field operations.

Getting Started

SepticCycle is a web-based management platform built specifically for septic, grease trap, and waste hauling businesses. It runs entirely in your browser — no software installation required — and manages customers, properties, tanks, contracts, invoices, jobs, compliance, and payments all in one place.

Accessing SepticCycle

Open any modern web browser (Chrome, Edge, Firefox, or Safari) and navigate to:

https://www.septiccycle.com

SepticCycle is optimized for desktop use. The desktop dashboard is the primary interface for office staff and administrators. A separate mobile-optimized app exists for field technicians — see Section 19.

Creating Your Account — First-Time Setup

If your company is new to SepticCycle, one person should complete the initial account setup. This creates both your user account and your company's workspace.

  1. 1Navigate to septiccycle.com and click Sign Up.
  2. 2Enter your email address and create a strong password.
  3. 3Enter your Company Name. This appears on invoices, contracts, and customer-facing documents — enter it exactly as you want customers to see it.
  4. 4Click Create Account. You are taken directly to your dashboard. No email verification is required to begin.
  5. 5Complete your company profile: navigate to Settings and fill in your company address, phone number, and logo. These appear on all printed documents.

Logging In

  1. 1Navigate to your SepticCycle URL.
  2. 2Enter your email address and password.
  3. 3Click Sign In. You are taken directly to your dashboard.
  4. 4To sign out, click your initials at the bottom of the left sidebar and select Sign Out.

SepticCycle uses a persistent sidebar on the left side of every page. The sidebar is icon-based when collapsed (64px wide) and expands on hover to show labels and sub-links. The active section is highlighted. On mobile, the sidebar becomes a bottom navigation bar.

The Dashboard

After logging in you land on the main dashboard — your command center showing real-time information across your entire operation.

Quick Stats Bar (Top of Page)

  • Customers: Total active customer records.
  • Properties: Total service locations on file.
  • Septic Systems: Total tanks and systems tracked.
  • Services Due: Properties with service overdue or due within the next 30 days.
  • Active Contracts: Contracts currently in force.
  • Renewals Soon: Contracts expiring within 90 days.

Services Due Widget

Lists properties with upcoming or overdue service. Each row shows the property address, customer name, and how many days until (or since) service was due. Click Add to Calendar to schedule a job directly from this widget.

Upcoming Renewals Widget

Shows contracts expiring soon with toggles for 30, 60, or 90 day windows. Click any contract to open its detail page and initiate renewal.

County Deadlines Widget

Displays pending county compliance submissions that need attention. Each entry shows the county name, contract, and days until the deadline.

First-Time Company Setup

Before adding customers or scheduling jobs, work through this checklist. The settings below are prerequisites for specific features — skip them and those features simply won't work as expected. Plan for about 20–30 minutes to complete everything on your first login.

💡 Tip: Steps marked Required block a specific feature until completed. Steps marked Recommended have a direct impact on daily operations. Steps marked Optional can be done any time.

Step 1 — Company Profile Required

Settings › /dashboard/settings

Your company name, address, and logo appear on every invoice, contract, and customer-facing document. Set these before creating any records.

  1. 1Navigate to Settings in the left sidebar.
  2. 2Enter your Company Name exactly as it should appear on documents.
  3. 3Enter your Address, City, State, and ZIP.
  4. 4Enter your Phone Number and Email.
  5. 5Upload your Company Logo — appears on invoices, contracts, and the customer portal. PNG or JPG, recommended 400×200px or wider.
  6. 6Click Save.

Step 2 — Invoice Settings Required

Settings › Invoices tab

Invoice numbering must be configured before your first invoice is created. Once invoices exist, changing the prefix or starting number does not renumber existing invoices.

  1. 1Click the Invoices tab within Settings.
  2. 2Fill in the Invoice Header section at the top: enter your Business Phone, OSSF License Number, and Company Address (Street, City, State, ZIP). These print on every invoice PDF and are required by state regulations.
  3. 3Set your Invoice Prefix (e.g., INV).
  4. 4Set your Starting Invoice Number. If migrating from another system, set this one above your last invoice number to avoid gaps.
  5. 5Set your default Payment Terms (e.g., Net 30).
  6. 6Add any standard Invoice Notes or Footer Text you want on every invoice.
  7. 7Click Save.

Step 3 — Contract Settings Required

Settings › Contracts tab

Two fields here are required for contracts to work correctly: the contract number prefix, and the representative name used in the in-person signing modal.

  1. 1Click the Contracts tab within Settings.
  2. 2Set your Contract Number Prefix (e.g., SC) and starting number.
  3. 3Enter your Representative Name and Email — this pre-fills the company signature block every time you countersign a contract in the office.
  4. 4Enter your standard Terms & Conditions text. Pre-fills on every new contract.
  5. 5Click Save.

Step 4 — Define Your Counties Required for Contracts & Compliance

Sidebar › Contracts › County Requirements › /dashboard/contracts/county-requirements

County records must exist before you can assign a county to a contract or generate compliance reports. The county dropdown on new contracts will be empty until at least one county is configured here.

  1. 1Navigate to Contracts › County Requirements in the sidebar.
  2. 2Click Add County for each county you service.
  3. 3For each county, set the submission frequency, submission method, deadline, and any contact information or portal URL.
  4. 4Save each county. They will now appear in the county dropdown when creating or editing contracts.

Step 5 — Add Technicians Required for Jobs

Sidebar › Jobs › Technicians › /dashboard/technicians

Jobs cannot be assigned without technician records. The auto-scheduler also requires technicians to exist before it can dispatch any work. Add at least one before scheduling your first job.

  1. 1Navigate to Technicians in the sidebar.
  2. 2Click Add Technician and enter their name, phone, and email.
  3. 3Set their status to Active.
  4. 4Repeat for each field technician on your team.

Step 6 — Scheduling Settings Required for Auto-Scheduler

Settings › Scheduling tab

The automated job scheduler runs daily and uses your business hours and timezone to determine when jobs can be created. Without these set correctly, the scheduler may create jobs at wrong times or not at all.

  1. 1Click the Scheduling tab within Settings.
  2. 2Set your Company Timezone — this affects all timestamps, notifications, and the auto-scheduler.
  3. 3Set your Business Hours start and end time.
  4. 4Toggle your Working Days.
  5. 5Set the Default Job Duration in minutes and any Buffer Time between jobs.
  6. 6Click Save.

Step 7 — Connect Stripe for Online Payments Required for Online Payments & Sign & Pay

Settings › Billing & Payments tab

Stripe must be connected before customers can pay invoices online, before the Send for Payment email flow works, and before the Sign & Pay public portal can be activated. Without Stripe, all payment processing is manual.

  1. 1Click the Billing & Payments tab within Settings.
  2. 2Click Connect with Stripe and complete the Stripe onboarding flow.
  3. 3Once connected, a green Stripe Active indicator appears.
  4. 4Configure the Credit Card Processing Fee: set the percentage fee (default 3%), flat fee (default $0.32), and label. Toggle Pass to Customer on to add the surcharge to card payments, or off to absorb the cost.
  5. 5Click Save.

Step 8 — Add Trucks & Disposal Sites Required for Manifests

Waste manifests require both a truck and a disposal site to be selected. Neither field can be left blank. If you use manifests, add these before creating your first manifest.

Sidebar › Jobs › Trucks › /dashboard/trucks
  1. 1Navigate to Trucks in the sidebar and click Add Truck.
  2. 2Enter the vehicle name/number, make, model, tank capacity, and status.
  3. 3Save. Repeat for each vehicle.
  4. 4Navigate to Disposal Sites in the sidebar and click Add Disposal Site.
  5. 5Enter the facility name, address, accepted waste types, and fee schedule.
  6. 6Save. Repeat for each disposal facility you use.

Step 9 — Route Optimization Home Base Required for Route Optimization

Settings › Route Optimization tab

Route optimization cannot calculate any routes without a starting point. Set your home base address, then geocode your existing properties so the optimizer has accurate coordinates for every stop.

  1. 1Click the Route Optimization tab within Settings.
  2. 2Enter your Home Base Address (office or yard) and click Save & Locate.
  3. 3Click Geocode All Properties to batch-convert all property addresses to GPS coordinates. This is a one-time operation — new properties geocode automatically going forward.
  4. 4Click Save.

Step 10 — Create at Least One Contract Template Required for Sign & Pay Portal

Sidebar › Contracts › Templates › /dashboard/contracts/templates

The Sign & Pay public booking portal cannot be activated until at least one contract template exists and is marked as publicly visible. Templates also speed up contract creation for your office staff.

  1. 1Navigate to Contracts › Templates in the sidebar.
  2. 2Click New Template and configure your most common service plan — services, pricing, duration, and terms.
  3. 3Toggle Public Visible on if you want this template to appear on the Sign & Pay portal.
  4. 4Save.

Step 11 — Notifications & SMS Optional

Settings › Notifications tab

Email notifications are on by default. SMS requires explicitly enabling the toggle. Neither blocks other features but both significantly improve the customer experience once configured.

  1. 1Click the Notifications tab within Settings.
  2. 2Review and adjust which events trigger customer emails.
  3. 3To enable SMS: toggle SMS Enabled to ON.
  4. 4Customize the five SMS templates to match your company voice.
  5. 5To show your business number on outbound texts instead of a shared number, click Port Number — see Section 13.10 for full porting instructions.
  6. 6Click Save.

Step 12 — Invite Team Members Optional

Sidebar › Team
  1. 1Navigate to the Team section in the sidebar.
  2. 2Click Invite Member.
  3. 3Enter their email and assign a role: Admin (full access including Settings), Office (no Settings, billing, or team management), or Technician (mobile app only).
  4. 4They receive an email invite and set their own password on first login.

✅ Setup complete — you're ready to go!

With these steps done, every feature in SepticCycle will work as intended. Start by adding your first customer, property, and tank — then create your first contract and schedule a job. The rest of this guide covers each area in detail.

Customer Management

Customers are the foundation of SepticCycle. Every property, contract, job, invoice, and compliance record is linked to a customer. The hierarchy is: Customers → Properties → Tanks/Systems.

Viewing the Customer List

Sidebar › Customers
  • Search: Type any part of a name, email address, or phone number to filter the list in real time.
  • Add Customer: Click the + Add Customer button in the top right corner.
  • Export: Click the Export button to download the currently filtered customers as a ZIP of CSV files. If filters are active, only the visible customers are exported. Clear all filters first to export your entire customer list. See Exporting Customer Data below for full details.

Adding a New Customer

Sidebar › Customers › New Customer › /dashboard/customers/new

Customer Information

  • Customer Name (required): Full name of the individual or business. Appears on all documents.
  • Email Address: Primary contact email. Invoice emails and appointment reminders are sent here.
  • Phone Number: Primary phone number.
  • Status: Active (default), Inactive, Bad Debt, or Do Not Service. Status affects how the customer appears in the dashboard and whether jobs can be scheduled.

Billing Address

Enter Street, City, State, Zip. This is separate from the service/property address and used on invoices.

Additional Contacts

Click + Add Contact to add secondary contacts (property manager, spouse, emergency contact, etc.). For each contact enter Name, Role (Owner, Property Manager, Tenant, Spouse, Emergency, Billing, or Other), Email, Phone, and whether they are the Primary Contact. There is no limit on additional contacts.

Customer Detail Page

Click any customer name to open their full profile. The page uses a tabbed layout with eight tabs.

Header Area

Always visible: customer name, status badge (color-coded), email, phone, and billing address. Quick action buttons: New Job, New Contract, and Edit.

Info Tab

  • Left column: Email, phone, billing address, customer since date, and all additional contacts. If the customer has the Requires Advance Notice flag set, an amber 🚩📞 banner appears at the top of this column with any instructions entered for the dispatcher or technician.
  • Right column: Six stat tiles (Properties, Tanks, Active Contracts, Jobs Done, Total Paid, Open Issues), outstanding balance callout, next scheduled job, and next contract renewal date.

Properties Tab

Card grid of all properties. Click the property address to open the read-only property detail page. Use the pencil icon on the card to go directly to the edit page. Each card shows the address, county, permitting authority (if set), property type, parcel number, all tanks with their custom name or type, status and last service date, and photo thumbnails.

Jobs, Service History, Contracts, Invoices, Issues, and Notes Tabs

Separate tabs give you a full history table for each record type linked to this customer. The Notes tab is a communication log where you can add timestamped notes categorized as Phone Call, Email, In-Person, Voicemail, Text Message, Site Visit, Complaint, Follow Up, Reminder, or General Note.

Service History Tab — Checklist Download [New in v47]

The Service History tab lists every completed service visit. For any visit that has at least one completed checklist attached, a clipboard icon (📋) appears in a dedicated Checklist column on the right side of the row. Click the icon to instantly download a Service Checklist Report PDF for that visit — no need to navigate to the job detail page. The PDF includes the tank name and all inspection data exactly as filled out by the technician. While the PDF is generating a spinner replaces the icon. If an error occurs, a red error banner appears below the table with a description. Rows without a completed checklist show a dash in that column.

Service History Tab — Inspection Numbers [New in v61]

Inspection-type service records display a system-generated inspection number below the service date in small gray monospace text (e.g., INSP-1042). The number is assigned automatically when an inspection-type service job is completed, or when such a record is created via CSV import. Non-inspection records (septic pumping, filter cleaning, etc.) do not show a number. See Service Types & Pricing Mode in Settings for configuring which service types qualify as inspections.

Service History Tab — Click Any Row for Detail & Editing [New in v61]

Clicking anywhere on a service history row (except on the inner Checklist icon, Property link, or Photos icon) opens the Service Record Detail modal. Admins and office users can edit every field. Technicians see the record in view-only mode. See the Service Record Detail & Edit Modal subsection below for the full field-by-field walkthrough.

Exporting Customer Data [New in v48]

Customer List › Export button | Customer Detail › Export button

The Export button appears in the top-right action bar on both the customer list page and each customer detail page. It is visible to admin and office roles only. Clicking it opens a modal where you select which data sections to include, then downloads a ZIP archive of CSV files — one file per selected section.

From the Customer List

The export is filter-aware. If you have applied a search term, status filter, or zone filter, only the currently visible customers are included. To export all customers, clear all filters first. Filename: customers-export-YYYY-MM-DD.zip. Every row in every CSV includes the Customer Name column for cross-referencing between sheets.

From a Customer Detail Page

The export is pre-scoped to that single customer. The Photos & Files option is only available on single-customer exports (it downloads binary image files into subfolders, which is impractical for bulk). Filename: CustomerName-export-YYYY-MM-DD.zip.

Section Picker

Basic Information is always included and cannot be deselected. All other sections are optional checkboxes that reset to their defaults each time the modal opens:

  • Basic Information (always on): Name, email, phone, billing address, status, customer type, company name, requires-advance-notice flag, customer since date.
  • Properties & Tanks: One row per tank. Includes property address, county, property type, tank custom name, tank type (human-readable label, e.g. ATU or Conventional), capacity, system status, last pump date, and permit number. Properties with no tanks still appear with a single row and blank tank columns.
  • Contacts: All additional contacts with name, role, email, phone, and primary contact flag.
  • Contracts: Contract number, type, status, start/end dates, total price, service frequency, and linked property address.
  • Jobs: Job number, title, status, priority, scheduled date, completed date, quoted price, final price, property address, and assigned technician.
  • Service History: Service date, service type, gallons pumped, tank condition, notes, property address, and technician.
  • Invoices: Invoice number, status, total, amount paid, balance due, due date, and invoice date.
  • Issues: Issue title, category, severity, status, estimated cost, and reported date.
  • Notes: Note type, visibility (internal/customer/county), content, and date.
  • Photos & Files (single customer only): Downloads all job photos and property photos as binary files into photos/jobs/ and photos/properties/ subfolders inside the ZIP, plus a photo-manifest.csv index file. Disabled for bulk exports from the list page. Customers with many photos will produce a large file and may take longer to generate.

💡 Tip: Open the ZIP in a file manager and then open any CSV in Excel or Google Sheets. Use Excel's Data › From Text/CSV if columns do not auto-separate. All values are properly quoted so commas and line breaks inside notes or descriptions import cleanly.

Service Record Detail & Edit Modal [New in v61]

Customer Detail Page › Service History Tab › Click any row

The Service Record Detail modal opens when you click a service history row. It surfaces the full record, including fields that are not shown in the service history table, and lets admins and office users edit most of them without leaving the customer page.

Opening the Modal

Click anywhere on a service history row to open the modal. Three specific icons or controls within the row trigger their own actions and do NOT open the modal: the Checklist icon (downloads the checklist PDF), the Property link (opens the property detail page or lets you link an unlinked record), and the Photos icon (expands the inline photo panel below the row). Clicking any other area of the row, such as the date, service type, technician name, gallons, condition, or empty space, opens the detail modal.

View-only vs. Edit Mode

  • Admin or Office roles: Every editable field is an active input. A Save Changes button appears in the footer.
  • Technician role: The modal opens in view-only mode. All inputs are disabled (shown with a gray background), no Save Changes button is visible, and an amber banner below the title reads: View-only. Editing requires admin or office role.

Modal Sections

Fields are organized into six sections, top to bottom:

1. Basic Info (three columns)

  • Service Date (date picker): The date the service was performed. Required.
  • Service Type (text input): The type of service (e.g., Camera Inspection, Septic Pumping). Required.
  • Technician Name (text input): The field technician who performed the service. For records with a linked technician entity (most job-completion records), this field is read-only and shows the FK-joined name (e.g., John Spencer) with a note that reads: Linked to a technician record. Reassign via the originating job. For records without a linked technician (CSV-imported records), the field is editable.

2. Service Details (five columns)

  • Tank Type (dropdown or read-only): Either Conventional (septic) or ATU (aerobic). For records with a linked tank entity, this field is read-only and shows the linked tank's type with the note: Linked tank. Edit the tank itself to change. For records without a linked tank (CSV-imported historical records), the field is an editable dropdown.
  • Condition (dropdown): Good, Fair, Poor, or blank. Reflects the technician's assessment of tank condition at service time.
  • Gallons Pumped (number input): Integer. Leave blank for non-pumping services.
  • Sludge (in.) (number input, 0.1 step): Sludge depth in inches.
  • Scum (in.) (number input, 0.1 step): Scum depth in inches.

3. Work Notes (stacked)

  • Notes (textarea): Free-form notes about the visit. Shown on the customer profile, not on customer-facing invoices.
  • Work Performed (textarea): Description of the work done. Appears on compliance reports.
  • Recommendations (textarea): Recommendations for the customer (e.g., Follow up in 6 months).

4. Follow-up (three columns)

  • Follow-up needed (checkbox): When checked, flags this record for follow-up.
  • Follow-up Date (date picker, nullable): When the follow-up should happen. Leave blank if no date is set.
  • Next Service Date (date picker, nullable): When the next service is scheduled. If blank on completion, the system projects a date based on the contract frequency.

5. Costs (three columns, $ prefix)

  • Labor (number, 0.01 step): Labor portion of the total.
  • Parts (number, 0.01 step): Parts/materials portion.
  • Total (number, 0.01 step): The invoice total. Not auto-computed from Labor + Parts; you can enter a different total (e.g., a discounted flat rate). A small gray hint below the row shows the computed Labor + Parts sum as guidance only.

6. System Info (read-only, two columns)

  • Inspection Number: System-generated inspection number (e.g., INSP-1042) for inspection-type records. Dash for non-inspection records. Not editable from this modal.
  • Created At: Date the record was created in the system. Not editable.
  • Linked Property: The service property's address (e.g., 555 N Collins Rd) for records linked to a property. Shows Not linked for unlinked records. To relink, close the modal and use the + Link property button on the service history row.
  • Linked Tank: For records with a linked tank, shows the tank's custom name and type in parentheses (e.g., Backyard ATU (aerobic)). Shows just the name or just the type if only one is available. Shows Not linked for unlinked records.

Saving

After editing any field, a subtle Unsaved changes indicator appears in the footer. The Save Changes button becomes enabled. Click Save Changes to write the updates to the database. The modal closes and the service history table refreshes to reflect the changes.

📌 Note: The save payload intentionally omits Tank Type and Technician Name for records that are FK-linked to a tank or technician entity. Editing the text columns on a linked record would be invisible since the FK-joined value wins in the display. This is why those fields are rendered read-only when a link exists.

Canceling

Click Cancel or the X icon to close the modal. If you have unsaved changes, a browser confirmation dialog asks: Discard unsaved changes? Click OK to discard and close, or Cancel to keep the modal open. Clicking outside the modal on the dark overlay has the same effect as Cancel.

Common Edit Scenarios

  • Correcting a typo in notes or work performed: Click the row, update the text, Save.
  • Adjusting recorded gallons or depths after the fact: Click the row, enter the correct numeric value, Save.
  • Setting a follow-up date you forgot to capture at completion: Click the row, check Follow-up needed, pick a date, Save.
  • Editing tank type on a historical CSV-imported record: Click the row, select Conventional or ATU from the dropdown, Save. This updates the text fallback column, which is displayed because the record has no linked tank.

Editing Restrictions

  • You cannot reassign a record to a different property or tank from this modal. Use the + Link property button on the service history row instead.
  • You cannot change the inspection number. These are system-generated and must remain stable for audit trails.
  • You cannot change the job ID or created-at timestamp. These are historical linkages.

Customer Status Codes

  • Active: Normal, currently-serviced customer. Appears in all standard lists.
  • Inactive: Not currently being serviced. Hidden from most active-customer views.
  • Bad Debt: Has outstanding invoices deemed uncollectable. Flagged on the receivables dashboard.
  • Do Not Service: Jobs cannot be scheduled. Used for customers who have been terminated.

Merging Duplicate Customers

Sidebar › Customers › Merge › /dashboard/customers/merge

Merging moves all properties, contacts, contracts, invoices, and history from the source customer into the target customer. The source record is then deleted.

  1. 1Navigate to Customers › Merge.
  2. 2Search for and select the customer you want to keep (Target Customer).
  3. 3Search for and select the duplicate customer to merge in (Source Customer).
  4. 4Review the merge preview showing what will be transferred.
  5. 5Click Merge Customers to complete.

Bulk Customer Import

Sidebar › Customers › Import › /dashboard/customers/import

The import wizard guides you through bringing customers from another system into SepticCycle. It supports Excel (.xlsx) and CSV files and automatically maps fields based on your source software.

Step 1 — Select your source software

  • SAFE (mysafesoftware.com) — fully automated field mapping, no column matching required.
  • Other / Generic CSV — Jobber, ServiceTitan, FieldPulse, or any custom spreadsheet. You will map columns manually in Step 3.

Step 2 — Upload your file

Drag and drop your file or click to browse. Both Excel (.xlsx) and CSV (.csv) are accepted. The file is parsed in your browser and never uploaded as a raw file to the server.

Step 3 (SAFE) — Review the import preview

SepticCycle classifies every row automatically. The preview shows counts for each category, non-standard inspection frequency mappings, and a list of every inactive record to follow up on after the import.

  • Active — customers with contact info, imported as active with full details.
  • No contact info — real customers with name and address only, imported as active.
  • New Owner placeholders — imported as inactive so you can update them when contact info is available.
  • Builder / commercial (no contact) — imported as inactive with address only.
  • Blank rows / no address — skipped entirely.

Step 3 (Other) — Map your columns

SepticCycle auto-detects obvious columns (Name, Email, Phone, Address). Use the dropdown next to each column header to match remaining columns to SepticCycle fields. A five-row preview shows your data with the current mapping applied. The Start Import button stays disabled until at least one name column is mapped.

Duplicate Customer ID warning

If any customer in your file shares a Customer ID with an existing customer in SepticCycle, an amber warning lists each conflict and tells you the next available Customer ID to start from if you need to renumber your spreadsheet. You can cancel and fix the file, update the existing customer's ID in SepticCycle, or acknowledge the duplicates and proceed.

Step 4 — Import with progress bar

The import runs in batches of 50 rows. A progress bar updates after each batch. For SAFE imports, Phase 1 creates all customers and Phase 2 creates their properties, tanks, contracts, and notes. Keep the window open until complete. The completion screen shows counts for customers imported, records imported, rows skipped, and any errors.

SAFE field mapping

  • ID → Customer ID (integer, auto-increments MAX+1 for new customers)
  • Commercial → Customer Type (TRUE = Company, FALSE = Individual)
  • Name fields → Customer name
  • Email, CellPhone, Owner Phone → Customer contact and secondary contacts
  • MailStreet/City/State/Zip → Billing address (only when different from service address)
  • DoNotService → Customer status set to Do Not Service
  • Service address → Property address, city, state, zip, county
  • SiteGPSLa/Lo → Property and tank latitude/longitude
  • Instructions → Property notes
  • TreatmentType → Tank type (Aerobic/Drip/Spray = aerobic, all others = septic)
  • Brand, AeratorModel, AeratorSerialNo, DischargePumpModel/SerialNo → Tank equipment fields
  • PermitNo, PermitDate, Installer, InstallDate → Tank permit and installer fields
  • DisposalType → Distribution method (Surface Application maps to Other)
  • InspPerYear → Contract service frequency (3=quarterly, 12=monthly, 6=custom bi-monthly, 4=custom, 2=semi-annual)
  • Contract Starts/Ends → Contract start and end dates
  • Next Insp → Contract next service date
  • DateToCounty → Contract county submission date
  • MComments + Instructions → Internal legacy note on the property

Bulk Service Record Import (CSV) [New in v61]

Customer Detail Page › Service History Tab › Import Records button

The Import Records button on any customer's Service History tab lets you bulk-load historical service records via CSV. This is useful when migrating past service history from another system or spreadsheet into SepticCycle. Supports one customer at a time: all imported records are automatically linked to the customer whose page you're on.

Downloading the Template

Click Import Records, then click Download template CSV to get a starter file with the correct header row. The template includes every supported column so you can see the full shape. Columns you don't need can be left blank in your rows, but the header row must be preserved.

Required Columns

  • service_date: The date the service was performed. Format: YYYY-MM-DD (e.g., 2024-03-15). SepticCycle also accepts M/D/YYYY and MM-DD-YYYY and converts them automatically.
  • service_type: The name of the service type (e.g., Camera Inspection, Septic Pumping). Must match the name of a service type configured in your Settings, case-sensitive, for inspection-type records to be auto-numbered (see below).

Optional Columns and What They Do

  • property_address: The service property's address. SepticCycle fuzzy-matches this against the customer's existing properties. If a match is found, the record is linked to that property (and its first tank). If no match is found, the record imports with no property link, shown as + Link property in the service history, which you can click later to link manually.
  • tank_type: The tank type for this historical record. Accepts aerobic, ATU, ATU System, aerobic system (stored as aerobic); septic, conventional, conventional system, traditional (stored as septic). Anything else is stored as blank. Displayed in the TANK column of service history only when the record has no linked tank entity (historical-only fallback).
  • technician_name: Free-text name of the technician who performed the service. Displayed in the TECHNICIAN column when the record isn't FK-linked to a technician record.
  • gallons_pumped: Integer number of gallons removed (for pumping services).
  • tank_condition: Text: good, fair, or poor.
  • notes: Free-form notes about the visit.
  • work_performed: Description of the work done.
  • sludge_depth_inches: Decimal number.
  • scum_depth_inches: Decimal number.
  • recommendations: Free-form recommendations.
  • follow_up_needed: Boolean as true, false, 1, or 0.
  • follow_up_date: Date (YYYY-MM-DD). Malformed values are silently converted to blank.
  • next_service_date: Date (YYYY-MM-DD). Malformed values are silently converted to blank.
  • labor_cost: Decimal number (dollars).
  • parts_cost: Decimal number.
  • total_cost: Decimal number.

Step-by-Step Import Procedure

  1. 1Navigate to the customer's profile, then click the Service History tab.
  2. 2Click the green Import Records button in the top right.
  3. 3In the modal, make sure the CSV — Service Records tab is active.
  4. 4Drag and drop your CSV file, or click to browse.
  5. 5Review the preview table. Any rows with errors are flagged. Unmatched property addresses are shown with a warning icon and an X address not found summary. These rows will still import, just without a property link.
  6. 6Click the green Import X Records button to proceed.
  7. 7When the import completes, a confirmation screen shows the count of successful and failed records. Click Done.
  8. 8The service history refreshes to show the new rows.

Automatic Inspection Numbering

If any imported rows have a service_type that matches a Service Type in your settings flagged as Inspection (is_inspection = true), those rows receive an automatic INSP-XXXX inspection number. The system allocates a contiguous block of numbers for the batch, so if you import 5 inspection rows starting from counter 1042, they receive INSP-1042, INSP-1043, INSP-1044, INSP-1045, INSP-1046 in CSV order. Non-inspection rows in the same import get no number (displayed as blank in the Inspection Number column). The counter advances only for successfully-imported records; a failed import does not waste numbers.

Common Import Issues

  • "5 address not found" warning: Your CSV's property_address values didn't match any of this customer's existing properties. The records will still import, but you'll need to click + Link property on each row after import if you want them linked.
  • Misaligned CSV columns: If your CSV rows have different comma counts (common when exporting from Excel after manual edits), values can shift into the wrong columns. Date fields that receive unexpected text (like the literal string "FALSE") are safely coerced to blank rather than causing the import to fail with a database error. Always preview before importing and confirm service_date, service_type, and cost columns look correct.
  • No inspection numbers appearing: Check Settings → Service Types and confirm that the service type(s) in your CSV are flagged as Inspection. The is_inspection flag is what drives numbering.

Property Management

Properties are the physical service locations where your crews perform work. One customer can have multiple properties, and each property can have multiple tanks tracked individually. Properties store the service address, GPS coordinates, access instructions, photos, and complete service history.

Adding a Property

Customer Detail Page › Properties Tab › + Add Property
  1. 1Open the customer record and click the Properties tab.
  2. 2Click + Add Property.
  3. 3If the service address matches the billing address, check Same as Billing Address to auto-fill.
  4. 4Enter Street, City, State, Zip, and County (free-text county name).
  5. 5Enter the Parcel Number if applicable (used for compliance reports).
  6. 6Enter the Permitting Authority (optional) — the regulatory agency responsible for this system, e.g., "Hill County Environmental Health." This is separate from the County field and appears on the property detail page.
  7. 7Set the Service Zone / Route (optional) — assign this property to one of your configured service zones. The dropdown is populated from zones defined in Settings › Scheduling › Zone Scheduling. Used by zone scheduling to determine which month to create jobs, and appears in auto-filled contract PDF fields. If no zones are configured this field is hidden.
  8. 8Set the Property Type: Residential, Commercial, or Industrial.
  9. 9Enter Access Instructions (e.g., "Use the gate on the south side") and a Gate Code if applicable. Technicians see these in the mobile app.
  10. 10Add any property notes, then click Save Property.

Property Photos

Each property can have a full photo gallery. Photos are visible to technicians in the mobile app and help with site identification, access documentation, and before/after comparisons.

  1. 1Open the property detail page from the customer record.
  2. 2Scroll to the Property Photos section.
  3. 3Click the upload area or drag and drop image files (JPG, PNG, HEIC supported).
  4. 4Multiple photos can be uploaded at once. Each uploads immediately in the background.
  5. 5Optionally add a caption to each photo by clicking the caption field below the thumbnail.

On the customer detail page (Properties tab), each property card shows photo thumbnails. Click any thumbnail to open the full gallery viewer with navigation between photos and download options.

Property Diagrams

In addition to photos, you can upload site diagrams showing tank locations, drain field layout, and access points. Diagrams display in their own section on the property page and are visible to technicians in the mobile app.

Checklist History

Below the tanks section on a property detail page, the Checklist History panel shows all completed inspection checklists for that property. Each entry shows the checklist template name, the service date, the technician who completed it, and links to the job record and full checklist responses.

GPS Coordinates & Mapping

Each property stores GPS coordinates (latitude and longitude) for route optimization and map display. Coordinates are set in two ways:

  • Automatic geocoding: Use the Geocode All button in Settings › Route Optimization to batch-geocode all properties from their addresses.
  • Manual entry: Enter GPS coordinates directly on the property form — useful for rural properties where the address doesn't geocode accurately.

The property's Google Maps and Directions links use these stored coordinates for pinpoint accuracy rather than relying on address lookup at the time of navigation.

Tank & Septic System Management

Each property can have multiple tanks tracked individually. SepticCycle records each tank as its own entity with its own GPS coordinates, photos, service history, and maintenance records — a key differentiator from systems that treat a property as having a single generic system.

Adding a Tank

Customer Detail › Properties Tab › Property Card › Add Tank

Click Add Tank from a property card. The tank form is organized into sections:

Basic Identification

  • Custom System Name (optional): A short custom label like "North System" or "Front ATU." When set, the tank displays as "North System (ATU)" throughout the app — on the property detail page, in job and contract dropdowns, and in the technician mobile view. Leave blank to use the auto-generated label (e.g., "ATU #1" for the first ATU on a property).
  • Tank Type: Septic, Holding, Aerobic, ATU (Aerobic Treatment Unit), Biogenerator, Grease Trap, Dosing Chamber, Pump Chamber, or Other.
  • Status: Active (being serviced), Inactive (out of service), or Abandoned (decommissioned).
  • Capacity: For standard tank types, this is in gallons (250–30,000 gal). When ATU or Biogenerator is selected, the field switches to GPD (gallons per day) with options from 500 to 5,000 GPD, reflecting the daily treatment capacity of aerobic systems.

Installation & Identification

  • Install Date: When the tank was installed. Used to calculate tank age.
  • Manufacturer and Model: The tank maker and model number if known.
  • Serial Number: Manufacturer serial number if available.
  • Material: Concrete, Fiberglass, Plastic, Steel, or Other.
  • Shape: Rectangular or Cylindrical.

Physical Location

  • Location Description: Written description of where the tank is (e.g., "20 feet behind garage, beneath the large oak tree").
  • GPS Coordinates: Exact GPS location of the tank — not just the property. Allows pinpoint mapping for multi-tank properties.
  • Depth to Lid (inches): How far below ground the tank lid is located.

Access Information

  • Lid Type: Single, Double, or Triple compartment lids.
  • Lid Material: Concrete, Cast Iron, Plastic/HDPE, or Fiberglass.
  • Lid Count: Number of lids on this tank.
  • Riser Installed: Yes or No.
  • Riser Material: Concrete, Plastic, or Fiberglass if applicable.
  • Access Notes: Notes for technicians (e.g., "Lid is offset 6 inches to the right").

Technical Specifications

  • Number of Compartments.
  • Inlet / Outlet Depth (inches): Depth from lid to each baffle.
  • Baffle Type: Tee, Sanitary, Effluent Filter, or None.
  • Effluent Filter Brand: For ordering replacement filters.

Alarm & Control Systems

  • Alarm System: Whether an alarm is installed (Yes/No).
  • Alarm Type: Float, Pressure, or Electronic.
  • Control Panel Location: Where the alarm control panel is mounted.
  • Last Alarm Date: Date of most recent alarm activation.

Pump System

  • Pump Installed: Yes/No.
  • Pump Type: Effluent, Grinder, or Submersible.
  • Pump Brand, Model, Horsepower, and Voltage.
  • Last Pump Replacement Date.

Drain Field & Disposal

  • Drain Field Type: Conventional, Mound, Chamber, Drip, or None.
  • Distribution Method: How effluent is distributed within the drain field. Options: Conventional (gravity), Spray (sprinkler heads — enter sprinkler count, radius, and field condition), LPD — Low Pressure Dosing (enter number of lateral lines), Drip Irrigation (enter emitter spacing, zone count, and filter details), or Other. Selecting Spray or LPD reveals additional fields specific to that method.
  • Drain Field Size (sq ft).
  • Distribution Box Present: Yes/No.
  • Soil Type: Sandy, Clay, Loam, Gravel, or Other. Affects service frequency recommendations.

Service Schedule

  • Service Interval (months): How often this specific tank should be serviced. Default is 36 months. A restaurant grease trap might be 1 month.
  • Last Service Date: Auto-populated from service records, or set manually when entering an existing customer's history.
  • Next Service Due: Calculated automatically as Last Service Date + Service Interval. Appears on the dashboard Services Due widget.
  • Recommended Next Service: Technician's recommended date from the most recent service.

Condition & Notes

  • Current Condition: Good, Fair, Poor, or Critical. Updated during each service visit.
  • Tank Notes: Persistent notes visible on every future job (e.g., "Roots in outlet pipe — monitor closely").

Tank Service History

Each tank displays its complete service history on the property page. The history shows every service visit with date, service type, gallons pumped, sludge depth, scum depth, tank condition recorded, technician, and any notes. Service records are created automatically when a job is completed.

Editing a Tank

Click the Edit button on any tank card to update any field. Changes are saved immediately. Editing a tank does not affect historical service records — those are permanent.

Contract Management

Contracts are service agreements between your company and customers. They define scope, duration, pricing, and terms. SepticCycle tracks the full contract lifecycle from creation through signing, active service, and renewal.

Creating a Contract

Sidebar › Contracts › + New Contract › /dashboard/contracts/new

⚠️ Prerequisites: A Customer and Property must exist before a contract can be created. If you use county compliance reporting, counties must be defined first (Contracts › County Requirements) or the county dropdown will be empty. Contract numbering should be configured in Settings › Contracts before your first contract.

  • Customer & Property: Type to search and select.
  • Contract Type: Annual Service, Multi-Year, One-Time, or Maintenance Agreement.
  • Template (optional): Pre-fills services, pricing, and terms. Everything is still customizable after selecting.
  • Start Date, End Date, and Renewal Date.
  • Service Frequency: Monthly, Every 2 Months, Every 4 Months, Quarterly, Tri-Annual (3× per year), Semi-Annual, Annual, Every 2 Years, As Needed, or Custom.
  • Services Included: Add each line item with description, quantity, and price.
  • Billing Frequency: For auto-invoicing — Monthly, Quarterly, Semi-annually, or Annually.
  • Next Billing Date: The date the first auto-invoice should generate. The system advances this after each invoice is created.
  • Custom Terms and Conditions.
  • County Requirements: Enable to link this contract to county compliance reporting.

Click Save Contract to create in Draft status.

Contract Statuses

DraftActiveSignedExpiredCancelledRenewed

Contract Templates

Sidebar › Contracts › Templates › /dashboard/contracts/templates

Templates create reusable service package definitions so you don't re-enter the same information for every new contract. SepticCycle comes pre-loaded with 24 templates for common septic services.

  1. 1Click + New Template.
  2. 2Enter the Template Name (internal use, e.g., "Annual Residential Pumping").
  3. 3Set the Default Duration, Default Price, and Services Included.
  4. 4Add any standard terms and conditions to pre-fill on new contracts.
  5. 5Toggle Active to make the template available for selection.
  6. 6Click Save Template.

💡 Tip: Templates can also be marked Public Visible so customers can self-select plans on the Sign & Pay portal.

Bulk Contract Import

Sidebar › Contracts › Import › /dashboard/contracts/import

The unified import page auto-detects whether you're uploading a CSV or PDF and routes you through the appropriate workflow.

CSV Import

  • Download the template CSV, prepare your data, and upload.
  • Each row is color-coded: green = customer and property matched, yellow = customer matched only, red = no match. Use dropdowns on red rows to manually assign.
  • Click Import to create all matched contracts.

PDF Import

  • Upload one or more PDF contract files.
  • The system extracts text and auto-detects customer name, contract type, dates, value, and property address.
  • Review extracted details on each card. Manually assign any PDFs that couldn't be auto-matched.
  • Click Import. Original PDFs are stored alongside the contract records.

Electronic Signatures

⚠️ Prerequisites: For in-person signing, your Representative Name and Email should be set in Settings › Contracts — these pre-fill the company signature block automatically. For remote signing, the customer can pay by card (requires Stripe) or by any offline method you have enabled in Settings › Billing & Payments.

  • In-Person Signing: Open the contract detail page and click Sign Contract. The customer draws or types their signature on a tablet or touchscreen. Your company representative's name and email pre-fill from Settings.
  • Remote Signing: Click Send for Signature. The customer receives a secure email link, reviews the contract, selects a payment method, and signs — no account required.

All signatures are timestamped and IP-logged. Signed contracts can be downloaded as PDFs from the contract detail page.

Remote Signing — Payment Step

When a contract has an invoice attached, the signing page includes a payment step before the customer can sign. The payment method buttons shown to the customer are drawn directly from your Accepted Payment Methods setting (Settings › Billing & Payments).

  • Credit Card (online): Only shown if Stripe Connect is active. The invoice summary displays the base amount plus any card processing fee (percentage + flat fee) as a separate line item — exactly as it appears on invoices. The customer pays, then proceeds to signature automatically.
  • Check, Cash, ACH, Venmo, Zelle (offline): The customer selects their method, sees relevant payment instructions from your settings, and clicks Continue to Sign. No card fee is added. The customer is not blocked from signing.
  • Already paid: If you have already recorded payment on the linked invoice in the dashboard, the signing page detects this automatically and skips the payment step entirely, dropping the customer straight to the signature.

Owner Notification Email

Once the customer completes signing, all admin users and your company email receive a notification. The email adapts to the payment method: a green "Contract Paid & Signed" email is sent for card payments; a blue "Contract Signed — Payment Pending" email is sent for offline methods, clearly showing the method (e.g., Check — Pending Collection) so you know to confirm receipt before countersigning.

SMS Opt-In During Contract Signing [New in v35]

The signing page includes an optional SMS opt-in section below the agreement checkbox. The customer sees a clearly labeled Optional — Text Message Notifications box with an unchecked checkbox and full disclosure language: their company name, message frequency (1–5 per service event), msg & data rates disclosure, and STOP/HELP instructions. If the customer checks the box, they may also enter a mobile number; if left blank, the phone number on their customer record is used. Checking the box writes sms_consent = true and a timestamp to their customer record. This box is never pre-checked, never required for service, and completely separate from the service agreement. No staff member can check this box on the customer's behalf.

Customer Choice Add-Ons and the Invoice

When a customer selects a paid Customer Choice option during signing, the add-on is automatically reflected in the linked invoice. A separate line item is added for each selected add-on (e.g., Add-on: Service Plan Upgrade — Option 2), and the invoice subtotal, total, and balance due are updated to match the agreed amount. For card payments, Stripe charges the adjusted total. For offline payments (cash, check, etc.), the invoice is updated to show the correct amount due so you collect the right figure when payment arrives.

Extras Paid in Full When Monthly Billing Is Selected [New in v36]

When a customer selects the Monthly Installment payment option and also chooses paid add-ons, the add-on total is always collected in full at signing — it is never divided across monthly installments. Only the base contract price is split into monthly payments. This protects the company when supplies are purchased up front for a customer who later cancels their monthly plan. The signing page shows a clear breakdown: installment per month (base only), add-ons due today in full, and a Due Today total combining both. The invoice reflects the same split with separate line items.

Offline Payment Instructions [New in v36]

When a customer selects an offline payment method (Check, Cash, ACH, Venmo, or Zelle) on the contract signing page, detailed instructions are now shown automatically. Configure them in Settings → Billing → Offline Payment Instructions. Check and Cash show payable-to name and mailing address. ACH shows bank name, routing number, account number, and account type. Venmo shows the company handle. Zelle shows the registered email or phone. Each block ends with a confirmation that the contract will be activated once payment is received.

Renewal Management

Sidebar › Contracts › Renewals › /dashboard/contracts/renewals

The Renewals page is your central command for managing expiring service contracts. Every active or signed contract with an end date within 90 days — or already past its end date — appears here, sorted into four color-coded urgency buckets. You can send individual reminder emails, generate individual renewal contracts, or use the Batch Renewal panel to process dozens of contracts in a single action.

Urgency Buckets

The four bucket cards at the top of the page are clickable filters. Click a bucket to show only those contracts. Click again to return to All Expiring. The red At-Risk Value banner totals the combined contract value of Expired and 0–30 Day contracts.

  • Expired (red): Contracts past their end date. Immediate action required.
  • 0–30 Days (orange): Expiring within 30 days. High urgency.
  • 31–60 Days (yellow): Expiring in 31–60 days. Moderate urgency.
  • 61–90 Days (green): Expiring in 61–90 days. Plan ahead.

Contracts that already have a renewal created are automatically excluded — you will never be asked to renew the same contract twice.

Individual Contract Actions

  • ✉ Remind: Sends a renewal reminder email immediately. If the contract has already been renewed, the email includes a green Review, Pay & Sign Your Renewal button linking to the new contract's signing page. Last Contacted updates automatically.
  • Renew: Opens the Renewal Options modal. Set the term (6–36 months), price adjustment (% or $), and draft vs. active status, then click Generate Renewal. The original contract is marked renewed and disappears from the list.
  • + Log contact: Records an outreach note (date + free text) in the Last Contacted column, stored in your browser locally.

Batch Renewal Panel

Select contracts using the row checkboxes, then click Batch Renew N Contracts to open the panel.

Batch Settings

  • Renewal Term: 6, 12, 24, or 36 months. Each customer's new start date is calculated from their own current end date — not a shared calendar date.
  • Price Adjustment: Enter a number and choose % or $. Use the 0% / +3% / +5% preset buttons for quick CPI-style increases. The preview table updates in real time.
  • Service Frequency: Keep current (default) or change all selected contracts to a new schedule.
  • Contract Type: Keep current (default) or standardize all selected to a new type.
  • New Status: Draft (review first) or Active (auto-activate). Contracts sent for customer signing are automatically set to Sent so the signing page accepts the token.
  • Email customers: Checkbox controlling whether notification emails fire when you click Generate & Notify.

Batch Note

Optional text appended to the Notes field of every new contract created in the batch. Use it to tag renewal campaigns for later reporting — for example: 2026 Renewal Campaign – 3% CPI increase.

Preview Table

Before taking any action, review the preview table. Each row shows: Customer, Property, Old End Date, New Period (calculated live as you adjust the term), Old Price, New Price (green = increase, red = decrease), and an Email indicator (✓ = email on file, ⚠ = no email — will be skipped for notifications and auto-logged as No email — manual follow-up needed).

Action Buttons

  • Send Notifications Only (N with email): Emails each selected customer who has an address on file. No new contracts created. If a contract was already renewed, the email includes the sign link to the existing renewal.
  • Generate & Notify (N contracts): Creates a new renewal contract and invoice for every selected contract, then emails customers if the Email customers checkbox is on. Payment is required before the customer can sign.

Both buttons show a confirmation dialog before executing. A spinner banner appears during processing. Emails are sent one at a time with a short delay to respect rate limits — expect roughly 600ms per contract.

What the Customer Receives

When a renewal contract exists, the email subject reads: Your Renewal is Ready — [Contract #] — Review, Pay & Sign. The email includes a contract details card and a large green Review, Pay & Sign Your Renewal → button. Clicking it opens a three-step signing flow: Review contract terms, Pay the renewal invoice, then Sign electronically. Payment is required before signing is allowed.

When no renewal contract exists yet (notification-only emails), the subject reads: Contract Renewal Reminder — [Contract #] expires [Date] with no sign button.

Auto-Renew Section

Contracts with the auto-renew flag appear in the Auto-Renew Enabled section at the bottom of the page. You can still manually generate renewals for these from the table above.

County Requirements

Sidebar › Contracts › County Requirements › /dashboard/contracts/county-requirements

⚠️ Prerequisites: County records must be created here before they appear in the county dropdown on contracts or in the Compliance dashboard. The county field on new contracts will be empty until at least one county is defined.

Configure county-specific compliance reporting requirements. For each county, set:

Each county can also be configured with Report Format (PDF, CSV, or both) and a CSV Fields list. These control the default output options when generating compliance reports for that county. For per-report-type field configuration, use the Report Settings page (see below).

  • Submission Frequency: Per service, Monthly, Quarterly, Semi-annual, or Annual.
  • Submission Method: Email, portal, mail, fax, or in-person.
  • County Contact Information and portal URL.
  • Deadline Days: How many days after the period ends to submit.
  • Notes: Any special requirements for this county.

PDF Contract Template Upload

Sidebar › Contracts › Templates › Upload PDF › /dashboard/contracts/templates/pdf/upload

SepticCycle allows you to upload your existing PDF contracts and convert them into smart, auto-filling templates. The editor detects text fields in the PDF and lets you configure how each one fills — automatically from customer data, by customer choice at signing, or manually by your office. Once activated, the template generates a filled PDF every time you issue a contract.

💡 Tip: The PDF upload system works best with text-based PDFs rather than scanned images. If your contract is a scan, add a text layer using a PDF editing tool before uploading.

Step 1 — Upload Your PDF

  1. 1Navigate to Contracts › Templates in the sidebar and click Upload PDF Template.
  2. 2Select your PDF file and click Upload. SepticCycle analyzes the document and detects fillable blanks.
  3. 3The template editor opens automatically when processing is complete.

Step 2 — Review and Configure Each Field

The editor uses a split-screen layout: the PDF is displayed on the left with numbered field badges overlaid at each detected position, and the field configuration panel is on the right. Work through each field and set:

  • Display Label: The name shown to customers on the signing page (e.g., "Customer Name").
  • Field Type: Controls how the field is filled — see the Field Type Reference below.
  • Auto-fill Source: Appears when Field Type is Auto-filled (System). Choose the data point to inject.
  • Helper Text: Optional hint shown to the customer for Company Fill and Customer Choice fields.

Drag any field badge on the PDF to reposition it. Use the resize handles to adjust its size. Each field can also be positioned precisely using the X, Y, W, H numeric inputs in the configuration panel.

Configuring Customer Choice Options

When a field is set to Customer Choice, expand the field in the right panel to configure its options. Click + Add Option for each choice the customer can make. For each option set:

  • Option Label: The text shown to the customer on the signing page (e.g., "Septic Additive").
  • Add-on Price: Added to the contract base price when this option is selected. Leave at $0.00 for no-charge options.
  • PDF Fill Value: The text written into the PDF blank when this option is chosen.
  • Helper Text (optional): A short description shown below the option label on the customer signing page.

To give customers a clear way to decline an add-on, check the "Include No Thanks option" toggle in the Customer Options panel header. This automatically appends a "No Thanks" radio button at the bottom of the options list. When selected, no price is added and the PDF field is left blank. The toggle must be enabled and the template saved for the button to appear on the customer signing page.

📌 Note: Customer Choice fields must have at least one option defined. If you want customers to be able to decline, use the "Include No Thanks option" toggle rather than leaving the field with a single option.

Field Type Reference

  • Auto-filled (System): Populated automatically from job data — customer name, property address, start date, permit number, company name, and more. No customer input required.
  • Customer Choice: The customer selects from a set of options you define (e.g., service add-ons). Each option can carry a price delta that adjusts the contract total. See Configuring Customer Choice Options below for setup details.
  • Company Fills: Your office enters this value before the contract is sent. Useful for custom notes, special terms, or fields unique to each job.
  • Company Date: A date field filled by your office, formatted consistently across all contracts.
  • Company Signature / Customer Signature: Signature image blocks for each party. These fields are not auto-detected by the PDF parser and must be added manually using + Add Field. Place the Company Signature badge over your company's signature line and the Customer Signature badge over the client signature line. Drag and resize each badge so it fits precisely within the underline. The correct signature image is drawn automatically at the positioned location when the final PDF is generated after countersigning. If these fields are not added and positioned, signatures will not appear in the final PDF.
  • Date (auto): Inserts today's date automatically when the contract is generated.
  • Ignore: Marks a detected field as not used. Ignored fields are skipped entirely during fill and do not appear on the signing page.

Step 3 — Add Fields Manually

If a blank was missed by auto-detection, click + Add Field in the action bar, then click anywhere on the PDF to place a new field badge. Configure it in the right panel and drag it to the exact position.

Step 4 — Preview the Filled PDF

Click Preview Filled PDF at any time to see the contract populated with sample data (dummy customer name, address, today's date, etc.). The preview auto-saves your current field configuration first, so what you see always reflects your latest changes. The preview opens in a new browser tab as a live PDF.

⚠️ Always preview before activating. Verify that every field lands inside its underline or box, that text is not clipped or overflowing, and that signature blocks are correctly positioned over the signature lines. Use the W (width) and H (height) inputs on each field badge to resize, and drag to reposition. Click Save Draft and re-preview after any adjustments until the layout is correct.

Step 5 — Save and Activate

Click Save Draft to save your progress without making the template available. When all fields are configured and reviewed, click Activate Template to publish it. Active PDF templates appear in the template list and can be assigned to contracts.

📌 Note: Customer Choice fields must have at least one option defined before activation is allowed.

Once a contract has been fully signed and countersigned, the contract detail page shows a Final Contract PDF section with an Open PDF button. A ↺ Re-generate button appears alongside it — use this to rebuild the filled PDF at any time after making template corrections or adding missing signature fields to an already-signed contract.

Monthly Installment Billing [New in v33]

Monthly installment billing lets customers spread the cost of a service contract across equal monthly payments. The system handles automatic charging, invoice generation, progress tracking, and early payoff.

Setting Up

When creating or editing a contract, set Allowed Payment Options to Customer Choice, Monthly Only, or One-Time Only. Set Duration Months to the number of installments. The installment amount is calculated at signing as Total Contract Value divided by Duration Months.

Customer Signing Experience

On the signing page, customers with a monthly-enabled contract see a payment selection card:

  • Pay in Full: Full contract value charged today.
  • Monthly Installments: First installment charged today. Subsequent installments billed automatically each month. Customer sees per-installment amount and duration.

If the contract start date is in the future, an amber notice informs the customer that payment is collected today to reserve their slot.

Auto-Charge vs. Manual Pay

  • Auto-Charge (default): Card saved at signing is charged automatically each month. Customer receives a receipt email after each successful charge.
  • Manual Pay (opted out): Customer checks 'I prefer to pay each monthly invoice manually' during signing. SepticCycle generates and emails an invoice each month with a Pay Now link. No automatic charge occurs.

Monthly Billing Plan Panel

On any active monthly contract detail page, the Pricing & Payment card shows a Monthly Billing Plan section with: In Progress / Complete badge, installment amount per month, progress counter (e.g., 3 of 12 paid), next billing date, auto-charge status, and a progress bar.

Early Payoff

Click Pay Off Balance in the contract action bar (visible for active monthly contracts with remaining installments). A modal shows the payoff summary. Click Send Payoff Link to create a single invoice for the remaining balance and email the customer a direct Pay Now link. The contract is not re-signed — the customer simply pays the invoice.

Contract PDF

The downloaded PDF for monthly contracts shows Payment Terms as Monthly Installments, the per-installment amount and duration, and auto-charge status. One-time contracts are unaffected.

Deposits and Initial Payments [New in v68]

Deposits let companies collect a portion of the contract value upfront at signing, with the remainder invoiced after service begins. Common use cases include high-value contracts requiring upfront material purchases, long-duration contracts where partial payment improves cash flow, and contracts where the customer commits significant resources at the start.

Configuring a Deposit on a Contract Template

Open the template editor at Settings, Contract Templates, Edit. Scroll to the Default Deposit card. Choose one of three options:

  • None (full payment): The full contract value is collected at signing. This is the default for all new templates.
  • Percentage of total: A percentage of the contract value, from 1 to 100. Type the percentage in the input field (for example, enter 25 for 25%).
  • Fixed amount: A specific dollar amount due at signing. Type the amount in the input field (for example, 500.00).

Save the template. Future contracts created from this template will inherit the deposit configuration.

Configuring a Deposit on a PDF Template

For PDF contract templates, open the PDF template editor at Settings, Contract Templates, PDF Templates, Edit. The Default Deposit card appears alongside the other template configuration cards. The three options match regular templates (None, Percentage of total, Fixed amount). The PDF template editor saves changes automatically as you type.

Overriding the Deposit on a Specific Contract

After a contract is created from a template, the deposit can be edited on the contract detail page. Open Dashboard, Contracts, click the contract, and click the Edit link next to the Deposit row in the Pricing and Payment card. The edit affordance is available while the contract is in Draft, Sent, Viewed, or Pending Approval status. After the contract is signed, the deposit becomes part of the customer agreement and cannot be changed.

Customer Signing Experience

When a customer opens a signing link for a contract with a deposit configured, they see a deposit breakdown on the Options page (step 2). It shows the deposit amount due today and the remainder invoiced later, with a note that they can choose to pay the full contract amount on the next step if they prefer.

On the Pay page (step 3), three payment options appear:

  • Pay Deposit: The deposit amount is due today. The remainder is invoiced later. This is the default for deposit contracts.
  • Pay Full Contract: The full contract amount is due today. Selecting this upgrades the deposit invoice to the full contract value before payment processing.
  • Monthly Installments: The full contract value is divided across the contract duration with the first installment due today.

The yellow banner at the top of the Pay page indicates the exact amount due today and any remainder to be invoiced later. The amounts update automatically when the customer switches between payment options.

Deposit Display on the Filled Contract PDF

If the PDF template was configured with deposit field types, the generated PDF shows the deposit context wherever those fields were placed:

  • Deposit Amount: The dollar amount due at signing (for example, $250.00 for a 25 percent deposit on a $1,000 contract).
  • Deposit Type Label: A customer-friendly description such as 25% deposit, $500.00 deposit, or Full payment.
  • Deposit Remainder: The dollar amount invoiced after signing (for example, $750.00 in the case above).
  • Payment Summary: A multi-line summary combining the above plus payment schedule context.

These fields are managed from the PDF template editor by adding system_auto fields with the Deposit source group.

Remainder Invoice

After the customer pays the deposit invoice, the remainder invoice is created from the deposit invoice detail page. Open the paid deposit invoice, click the Next Installment button, and the system creates a new invoice for the remainder amount. The remainder invoice is linked to the original deposit invoice through the Series Invoices panel visible on either invoice. Send the remainder invoice to the customer when service is ready to start.

Switching Between Deposit Types on a Template

When editing a template, switching between Percentage and Fixed deposit types preserves typed values across the toggle. Switch to None to disable deposits. Saved values for the inactive deposit type are remembered across reloads if you later switch back to the same type. This makes it easy to compare different deposit configurations without losing your work. Contract detail page edits do not preserve inactive type values because individual contracts require strict deposit configuration once they are saved.

Annual Split Billing [New in v69]

Annual split billing lets companies divide a multi-year contract's total value into equal annual invoices rather than collecting one upfront payment. Common use cases include multi-year service agreements where the customer prefers predictable yearly billing, contracts longer than 12 months where one upfront payment would be a barrier to signing, and accounts where annual billing aligns with the customer's own fiscal year.

Configuring Annual Split on a Contract Template

Open the template editor at Settings, Contract Templates, Edit. Scroll to the Payment Schedule card. Choose one of two options:

  • One payment at signing (current): The full contract value is collected up front. This is the default for all new templates.
  • Annual (1 invoice per year): The total is divided evenly across the contract years. Year 1 is invoiced at signing. Years 2 through N are invoiced on each anniversary by an automatic process (planned for a future release, not yet shipped).

Save the template. Future contracts created from this template will inherit the annual schedule.

Annual Split is Mutually Exclusive With Deposits

A contract cannot have both a deposit and an annual split at the same time. The template editor surfaces an inline warning if you select an annual schedule on a template that also has a deposit configured, and saving the template will clear the deposit. On the contract detail page, the affordances mirror this rule: setting one option grays out the other.

Configuring Annual Split on a PDF Template

For PDF contract templates, the Payment Schedule card appears alongside the other configuration cards in the PDF template editor at Settings, Contract Templates, PDF Templates, Edit. The two options match regular templates. PDF templates save changes automatically as you type.

Year 1 Invoice Amount

When a customer signs a contract with annual split enabled, the year 1 invoice is created at the total contract value divided by the number of years. The number of years is computed by dividing the contract duration in months by 12 and rounding up, so a 13-month contract has 2 years and a 24-month contract also has 2 years. For example: a $1,000 contract over 24 months creates a $500 year 1 invoice. A $1,000 contract over 36 months creates a $333.33 year 1 invoice (the final year picks up the leftover cent). The invoice line item reads "Year 1 of N annual installments: SC-XXXX-XXXX" and the invoice notes capture the remaining amount and the years it covers.

Customer Signing Experience

When a customer opens a signing link for a contract with an annual split, they see the year 1 amount on the Options page (step 2), labeled as "Due today (Year 1 of N)". On the Pay page (step 3), three payment options appear:

  • Pay Year 1: The year 1 amount is due today. The remaining years are invoiced on each anniversary. This is the default for annual split contracts.
  • Pay Full Contract: The full contract amount is due today. Selecting this upgrades the year 1 invoice to the full contract value before payment processing, and clears the annual schedule so no future invoices are generated.
  • Monthly Installments: The full contract value is divided across the contract duration in months with the first installment due today.

The yellow banner at the top of the Pay page indicates the exact amount due today and which year is being paid. The wording adjusts based on the number of years. For a 2-year contract: "Year 1 of 2 annual installments. $500 due today, $500 due in year 2." For a 3 or more year contract: "Year 1 of 3 annual installments. $333.33 due today, $666.67 due across years 2 through 3."

Email Notifications

The contract email sent at signing identifies the amount as "Year 1 of N" and includes a Total Contract row so the customer can see the full multi-year value alongside the amount currently due. When the year 1 payment is received, the receipt email includes a Next Annual Installment card that shows the date the next year's invoice will be generated, computed from the contract start date plus one year. After the final year is paid, the receipt email shows a completion message instead of the next-installment card.

Pay Full Contract Behavior

If a customer chooses Pay Full Contract during signing on an annual split contract, the year 1 invoice is upgraded to the full contract amount, and the contract row is updated to clear the annual schedule. This prevents the future-anniversary process from generating additional invoices on a contract that has already been paid in full. The Series Invoices panel on the invoice shows the original year 1 amount and the upgrade event in its history.

Years 2 Through N (Automatic Anniversaries)

The automatic anniversary process is planned for a future release. Until it ships, year 2 and later invoices for annual split contracts can be created manually from the previous year's paid invoice using the Next Installment button, similar to the deposit remainder workflow. Once the anniversary process is live, this manual step will no longer be required.

Switching Between Payment Schedules on a Template

When editing a template, switching from One payment at signing to Annual (and back) only affects contracts created from that template AFTER the change. Existing contracts retain their original schedule. To change an existing contract's schedule, edit the contract directly on its detail page while it is still in Draft, Sent, Viewed, or Pending Approval status. After the contract is signed, the payment schedule becomes part of the customer agreement and cannot be changed (except via the Pay Full Contract option above).

Invoicing

SepticCycle includes a complete invoicing system for creating, editing, sending, and tracking payment. Invoices can be created manually, generated from contracts, or auto-generated on a recurring schedule.

Creating an Invoice

From a Contract

On any active contract detail page, click Generate Invoice. This pre-fills the customer, property, line items, and pricing from the contract — the fastest way to create invoices for contracted customers.

Standalone Invoice

Sidebar › Invoices › + New Invoice › /dashboard/invoices/new
  • Select a customer, then select the property.
  • Set the Invoice Date and Due Date (defaults from Settings › Billing and Payments).
  • Add Line Items: Service Type, Description, Quantity, and Unit Price.
  • Payment Method: When Credit Card is selected, the card processing fee from Company Settings is automatically calculated and added as a surcharge. The fee includes both the percentage (e.g., 3%) and flat fee (e.g., $0.32), ensuring your company receives the full invoice amount after Stripe processing costs.
  • Discount: Apply a dollar amount or percentage discount.
  • Invoice Notes: Customer-facing notes on the invoice.
  • Internal Notes: Staff-only notes not shown to the customer.

Click Save Invoice to create in Draft status.

Invoice Statuses

DraftSentViewedPendingPaidPartialOverdueVoid
  • Draft: Invoice created but not yet sent to the customer.
  • Sent: Invoice emailed to the customer. Awaiting payment.
  • Viewed: Customer opened the payment portal link.
  • Pending: Customer has indicated via the payment portal that they will pay by an offline method (Check, Cash, ACH, Venmo, or Zelle). Payment has not yet been collected. Use Record Payment on the invoice detail page once you receive it. The Resend button remains available on Pending invoices.
  • Paid: Payment recorded in full.
  • Partial: A partial payment has been recorded; a balance remains.
  • Overdue: Payment terms have passed without full payment.
  • Void: Invoice cancelled and removed from receivables.

Sending Invoices

Click Send Invoice on any draft or saved invoice. SepticCycle emails the invoice directly to the customer. The email includes your company branding and contact information, a formatted invoice with all line items, and a direct Pay Now link to the Customer Payment Portal (no login required). The invoice status updates to Sent and delivery is logged in the Email Log.

  • Resend: Open any already-sent invoice and click Resend Invoice to send a fresh copy to the customer with the same payment link — useful if a customer reports not receiving the original.
  • Bulk Send: From the Invoices list page, select multiple invoices using the checkboxes and click Bulk Send to email all selected invoices in one action. Ideal for end-of-month billing runs.

Automatic Overdue Reminders

The system automatically sends email reminders for unpaid invoices:

  • 7 days overdue: First reminder email.
  • 14 days overdue: Second reminder email.
  • 30 days overdue: Final reminder email.

Each reminder includes invoice details, outstanding balance, and a direct payment link. Reminders run at 8 AM UTC daily and stop automatically once the invoice is paid or voided.

Recording Payments [Updated in v23]

Open any sent invoice and click Record Payment. Enter:

  • Amount: Click Pay Full Balance to auto-fill the remaining balance.
  • Payment Method: Check, Cash, Credit Card, or ACH / Bank Transfer.
  • Reference Number: Check number, transaction ID, or other reference.
  • Notes: Optional notes about this payment.

Partial payments are fully supported. The invoice status changes to Partial and the remaining balance is displayed prominently.

Automatic Job Status Sync [New in v23]

When an invoice is marked as Paid — whether through manual payment recording, Stripe online payment, or any other path — SepticCycle automatically updates the linked job's status from "invoiced" to "paid." A status history entry is created noting the payment amount and method. If a previous payment attempt failed to sync the job status, opening the invoice detail page triggers an automatic reconciliation that corrects the job status and logs the correction in status history.

Online Payment Portal

Customers can pay invoices online without logging in. Each invoice has a unique payment URL: yourdomain.com/pay/[invoiceId]

When a customer opens the link they see your company branding, all invoice line items and totals, and their available payment options.

Credit / Debit Card (Online)

  • Shown when Stripe Connect is active.
  • The customer's card is charged through your connected Stripe account.
  • With default fee settings (3% + $0.32 flat), processing costs are passed to the customer as a surcharge. Your company receives the full invoice amount.
  • SepticCycle automatically records the payment and updates the invoice status to Paid.
  • You receive the funds directly — SepticCycle never holds your money.

Offline Payment Methods (Check, Cash, ACH, Venmo, Zelle) [Updated in v39]

If you have enabled offline payment methods in Settings › Billing & Payments, those options appear as buttons on the payment portal. When a customer clicks a method, the portal immediately shows the payment instructions for that method (mailing address, bank details, etc.) with a ← Change method link. The customer then confirms their selection:

  • The invoice status changes to Pending.
  • A timestamped note is written to the invoice's Internal Notes confirming which method they selected (e.g., "Customer indicated payment by Check via the payment portal. Pending collection.").
  • You collect the payment in person or by mail, then use Record Payment on the invoice detail page to mark it Paid.
  • The Resend button is available on Pending invoices to follow up with the customer.

💡 Tip: Configure per-method instructions in Settings › Billing & Payments › Offline Payment Instructions. Check and Cash show payable-to name and address. ACH shows bank name, routing, and account number. Venmo shows the company handle. Zelle shows the registered email or phone. Only enabled methods appear on the portal.

Saved Payment Methods (Cards on File)

Customers can save their card for future payments when paying via the portal. Saved cards are securely stored by Stripe and enable one-click future payments, automatic monthly installment billing, and automatic payment retry when a charge fails. The full card number is never accessible to SepticCycle — only the card brand and last four digits are stored.

SepticCycle supports multiple cards per customer, organized into two tiers:

  • Customer Default: The card used for any property that does not have its own card on file. Marked with a gold star badge. Use the Set Default button to promote any customer-level card to default.
  • Property Card: An override card saved against a specific property. Marked with a blue "Property override" badge. When a contract's property has its own card, that card is always charged first. If no property card exists, billing falls back to the customer default.

To manage cards, open the customer profile and click the Payment Methods tab. The tab shows the Customer Default section at the top and a separate section for each of the customer's properties below it. Use + Add Card within any section to attach a card to that scope. To send the customer a self-service link to add their own card, click Request Payment Method at the top of the tab.

Automatic Invoice Generation (Auto-Invoicing)

⚠️ Prerequisites: Auto-invoicing only triggers on contracts that have a Billing Frequency set (e.g., Monthly, Annual). Contracts without a billing frequency are ignored by the auto-invoicing cron. Invoice prefix and starting number should also be configured in Settings › Invoices before the first invoice generates.

Contracts with a billing frequency set automatically generate invoices on a recurring schedule. A daily process runs at 6 AM UTC and checks all active contracts. When a contract's Next Billing Date is today or earlier:

  • A new invoice is created with line items matching the contract's services and pricing.
  • The invoice is created in Draft status (configurable to send automatically in Settings).
  • The contract's Last Invoice Date is updated and the Next Billing Date is advanced by the billing frequency.

Setting Up Auto-Invoicing

  1. 1Open the contract you want to auto-invoice.
  2. 2Set the Billing Frequency: Monthly, Quarterly, Semi-annually, or Annually.
  3. 3Set the Next Billing Date to when the first auto-invoice should generate.
  4. 4Save the contract.

Automatic Payment Retry (Failed Charge Recovery)

When an automatic invoice charge fails (e.g., a saved card is declined), SepticCycle automatically retries the payment:

  • Stripe notifies SepticCycle via webhook that the payment failed.
  • If the customer has a saved payment method on file, the invoice enters the retry queue.
  • The system retries on a schedule: Day +1, Day +3, and Day +7 after the initial failure (three attempts total).
  • If a retry succeeds, the invoice updates to Paid and the customer receives a confirmation email.
  • If all three retries fail, the invoice is marked payment_failed, the contract is flagged for review, and you receive a notification to follow up manually.

Receivables Dashboard

Sidebar › Invoices › Receivables › /dashboard/invoices/receivables
  • KPI Cards: Total Outstanding, Total Collected, Collection Rate, Average Days to Pay.
  • A/R Aging: Receivables grouped as Current, 1–30 Days, 31–60 Days, 61–90 Days, and 90+ Days. Each bucket is expandable to see individual invoices.
  • Overdue Follow-Up: Past-due invoices sorted by most overdue first.
  • By Customer: Outstanding balances grouped by customer.
  • Monthly Trends: Last 6 months of invoiced vs. collected amounts as a bar chart.

Invoice Tags

Invoice tags let you categorize invoices by service type for filtering and reporting. Tags are optional and can be applied when creating or editing any invoice. An invoice can carry one tag at a time.

Available Tags

  • Contracts: Invoices for contract-related work or setup fees.
  • Inspection: Invoices for inspection services.
  • Installation: Invoices for new system installations.
  • Porta-Johns: Invoices for portable restroom rental and service.
  • Pumping: Invoices for routine septic pumping services.
  • Repairs: Invoices for repair work on existing systems.

Tags appear on the invoice list, invoice detail page, the Receivables dashboard, and in Reports — allowing you to filter and compare revenue by service category.

Monthly Installment Auto-Billing [New in v33]

When a contract uses monthly installment billing, SepticCycle generates and processes installment invoices automatically each month. The auto-billing cron runs daily at 6:00 AM UTC. If a Monthly Billing Surcharge is configured in Settings → Billing, it is added as a separate "Monthly Billing Fee" line item on installments 2 through N. Installment 1 is collected at signing and does not include the surcharge. [New in v36]

Invoice Format

  • Line item 1: 'Installment N of M — CONTRACT-NUMBER' for the installment amount.
  • Line item 2 (card payments only): 'Credit Card Processing Fee' for the surcharge.
  • Invoice notes: 'Installment N of M — Monthly billing plan'.

Auto-Charge Path

For contracts with a card on file and auto-charge enabled: the cron creates a Stripe payment intent off-session. On success, the invoice is marked Paid, a receipt email is sent breaking out Service Charge and Credit Card Processing Fee separately, and remaining installments decrements by one. On failure, the invoice enters the Failed Charge Recovery queue.

Manual Pay Path

For opted-out contracts or those with no saved card: the cron generates an invoice and sends a Monthly Installment Due email with a Pay Now link. The next billing date advances immediately at generation time so the schedule stays on track regardless of when the customer pays.

Final Installment

When the last installment is paid, a system note is written: "Final installment paid — contract is now fully paid. All N installments complete." The billing plan panel shows a Complete badge and the progress bar fills to 100%.

Estimates

Overview [New in v44]

Estimates let you quote a scope of work and pricing to a customer before any job or invoice is created. An estimate moves through a simple lifecycle from draft to accepted, and can be converted directly into a job, an invoice, or both. Every estimate is linked to a customer and can optionally be tied to a specific property and an existing job.

  • Multi-Option Quotes: Present up to several pricing options on a single estimate. Each option has its own line items, title, and description. The customer selects one, and only that option's line items carry forward when converting.
  • Pricebook Integration: Pull items directly from your Items Catalog into any estimate option with the Pricebook button.
  • Cost Basis Tracking: Record internal cost and markup per line item without exposing those figures to the customer.
  • Pipeline View: The Estimates list page shows pipeline value, accepted value, and open count summary cards with one-click filtering by status.
Sidebar › Estimates

Creating an Estimate

Sidebar › Estimates › + New Estimate
  1. 1Search for and select a Customer. The estimate title auto-fills with the customer name.
  2. 2If the customer has multiple properties, select the Location / Property.
  3. 3Set an Estimate Title and Expiration Date (required). Expiration defaults to 30 days from today.
  4. 4Optionally enter a Reference (PO number or work order) and Commission Recipient.
  5. 5Use the Link To toggle to link the estimate to an existing job, or leave it set to None.
  6. 6Toggle Save As Estimate Template if you want to reuse this structure for future quotes.
  7. 7Add line items in the first estimate option tab.
  8. 8Add Tags as needed using the tag input.
  9. 9Fill in any Additional Fields (Instructions, Contract Status).
  10. 10Add Estimate Notes (customer-visible) or Internal Notes (office only) in the notes tabs.
  11. 11Adjust the Tax rate using the number input in the Summary panel. To add a surcharge or discount, click Add Surcharge or Add Discount — each opens an inline form with an Amount and optional Description field. Enter the value and click Add. Click Add Credit Card Fee to toggle the card processing fee on or off.
  12. 12Click Save as Draft to save without sending, or Save & Send to send immediately.

Estimate Options (Multi-Option Quotes)

Each estimate can present the customer with multiple pricing options — for example, a basic package and a premium package. Options appear as tabs on the line item section.

  • Click + Add Estimate Option to add a new option tab. Each option has its own title, description, and independent set of line items.
  • Use Add Item to add a blank line item, Pricebook to insert from the Items Catalog, or Add Grouping to insert a section header row.
  • Click % Apply Markup/Margin to apply a uniform markup percentage to all line items in the active option at once. An inline panel appears below the action row — enter the percentage and click Apply (or press Enter). Items with a cost basis set use that as the base; all other items use their current unit price.
  • The option subtotal is shown below each option's line items.
  • Click the next to an option tab to remove it (not available when only one option exists).
  • The first option is selected by default. When converting an estimate to a job or invoice, the selected option's line items are used.

💡 Tip: Option titles default to "Option 1", "Option 2", etc. Replace these with descriptive names like "Standard" and "Premium" to make the customer-facing estimate clearer.

Estimate Statuses

DraftSentViewedAcceptedDeclinedExpired
  • Draft: Saved but not yet sent. Fully editable.
  • Sent: Emailed to the customer. Still editable.
  • Viewed: Customer has opened the estimate link. Still editable.
  • Accepted: Customer approved the estimate. Edit button is hidden. Conversion buttons appear.
  • Declined: Customer rejected the estimate. Can be deleted.
  • Expired: Expiration date has passed with no customer decision. SepticCycle auto-sets this status when you open an estimate whose expiration date is in the past.

📌 Note: You can manually mark any estimate as Accepted or Declined using the action buttons at the top of the detail page, regardless of whether the customer has interacted with it.

Sending an Estimate

Click Send Estimate on any draft estimate. A modal opens showing the recipient email address (pre-filled from the customer record), a preview of the email subject and body, and an optional personal message field. You can edit the recipient email before sending — the email goes to whatever address is in the field, not necessarily the stored customer email. The personal message, if provided, renders as a highlighted callout above the estimate details in the customer's email.

To resend an already-sent estimate, click Resend from the detail page. The modal opens with the latest customer email pre-filled and the previous personal message cleared. This generates a fresh email — you can change the recipient or add a new note before sending.

Accept & Pay (Customer Flow) [New in v65]

When a customer opens the link to a sent estimate, the public estimate page shows three buttons: Accept & Pay, Accept & Pay Later, and Decline.

  • Accept & Pay: charges a credit card via Stripe and converts the estimate into a paid invoice automatically. The customer reviews the estimate, picks an option (if multi-option), then enters their card details on the same page. After Stripe confirms the payment, the customer sees a "Payment Received" confirmation and your office receives a "Schedule the job" notification email. An invoice is automatically created from the selected option and marked Paid. The customer also receives a payment receipt email.
  • Accept & Pay Later: marks the estimate accepted but defers payment. The customer sees an "Accepted — Pay Later" confirmation telling them you will be in touch with payment instructions. Your office still receives the notification email, marked as offline. No invoice is created automatically — you create the invoice and record payment manually using the Convert to Invoice and Record Payment flows on the dashboard estimate detail page when the customer pays by cash, check, or other means.
  • Decline: marks the estimate declined. No further automation; the customer sees a confirmation that they declined.

For multi-option estimates, the customer must pick one option using the radio selector before any of the three buttons enable. The total on the Accept & Pay button updates to reflect the selected option.

💡 Tip: After an Accept & Pay completes, the dashboard shows a new Jobs Pending Schedule KPI card with the count of accepted-and-paid estimates that have not yet been converted to a job. Click the card to see the list — until you create the job, the customer is waiting to be scheduled.

📌 Note: The "Schedule the job" notification email goes to the estimate creator, the Primary Notification Email (Settings › Notifications), and the Notification CC, deduplicated. If none of those three addresses are populated, the email falls back to all admin users for your company.

Converting an Estimate to a Job

When an estimate is in Accepted status and has not yet been converted, the 🔧 Convert to Job button appears in the action bar. Clicking it opens a modal where you can:

  • Edit the Job Title (pre-filled from the estimate title).
  • Set a Scheduled Date for the new job (optional).
  • Add any Additional Notes for the technician.

Clicking Create Job creates a new job pre-populated with the customer, property, estimate total as quoted price, and a summary of the selected option's line items in the description. The estimate is stamped with the new job ID and its status is set to Accepted. You are redirected to the new job detail page to continue setup (assign technician, finalize scheduling, etc.).

💡 Tip: After converting to a job, the Convert to Job button is replaced by a 🔧 View Job link. The Convert to Invoice button remains available so you can also create an invoice independently.

Converting an Estimate to an Invoice

When an estimate is in Accepted status and has not yet been converted to an invoice, the 💵 Convert to Invoice button appears. Clicking it opens a modal showing:

  • A line item preview from the selected estimate option, with descriptions and totals.
  • Invoice Date (defaults to today).
  • Due Date (optional — leave blank to use your company's default due-day setting).
  • Invoice Notes (optional — leave blank to carry over the estimate notes automatically).

Clicking Create Invoice creates a new Draft invoice carrying the estimate's subtotal, tax, fees, and discounts, with line items from the selected option. If the estimate was already converted to a job, the invoice is automatically linked to that job. The estimate is stamped with the invoice ID and you are redirected to the invoice detail page to review and send.

📌 Note: Both conversions can coexist. You can Convert to Job first and Convert to Invoice separately. The estimate tracks both linked records in the Activity sidebar and shows View Job and View Invoice links once both exist. Estimates that were paid via Accept & Pay already have an invoice — the Convert to Invoice button hides for those.

Quoting from an Issue [New in v65]

The Issues page tracks customer-reported problems before they become work. Each issue has a Quote button. Clicking it opens the new-estimate page with the customer, title, line item description, and unit price pre-filled from the issue (uses the issue's quoted price if set, otherwise its estimated cost). Save the estimate normally — the source issue is automatically updated to Quoted status with the estimate total recorded as its quoted price.

The estimate detail page shows a "From Issue" badge in the header linking back to the originating issue, so the office can always retrace why the estimate exists. This replaces the older Quick Quote modal flow.

Estimate Tabs

The estimate detail page has six tabs:

  • Info: Customer details, option line items, grand total, notes, and the activity/details sidebar.
  • Cost Basis: Internal view showing cost basis, markup %, gross profit, and margin % per line item. Not visible to customers.
  • Comments: Internal comment thread. Each comment shows the author and timestamp. Use for internal coordination on the estimate.
  • Payments: Record deposits or partial payments received against the estimate before it becomes a job or invoice. Payments appear as a running total.
  • Files: Attach reference documents (PDFs, images, Word docs, spreadsheets) up to 10 MB each. Files are stored privately and accessible only to your company.
  • Purchase Orders: Log POs from vendors related to the estimate. Each PO tracks a number, vendor, amount, and status (Pending, Received, Cancelled). Mark POs received inline when materials arrive.

Estimate Numbering Settings

Sidebar › Settings › Invoices Tab › Estimate Numbering

Configure your estimate number format in Settings › Invoices Tab under the Estimate Numbering section:

  • Estimate Prefix: The text prepended to every estimate number (default: EST-). Example: EST-1001.
  • Next Estimate Number: The numeric counter for the next estimate. Increments automatically with each new estimate created.

Default Estimate Notes [New in v48]

Settings › Invoices Tab › Default Estimate Notes

The Default Estimate Notes field in Settings › Invoices tab (directly below Estimate Numbering) lets you configure a company-wide disclaimer or standard terms that pre-fill the customer-visible Estimate Notes textarea on every new estimate.

  • Where it appears: The Estimate Notes section at the bottom of the new estimate form, on the Estimate Notes tab. This text is visible to the customer on the estimate document they receive.
  • Editable per estimate: The pre-filled text is a starting value only. You can edit, extend, or completely clear it before saving or sending any individual estimate.
  • Leave blank for empty start: If no default is configured, the Estimate Notes field starts empty on every new estimate — matching the previous behavior.

Common Uses

  • Validity period: "This estimate is valid for 30 days from the date of issue."
  • Deposit requirement: "A 50% deposit is required to schedule work."
  • Scope disclaimer: "Prices are subject to change if site conditions differ materially from those described in this estimate."
  • Payment terms: "Net 30. Late payments subject to a 1.5% monthly finance charge."
  • Standard terms: Full boilerplate terms and conditions your legal team has approved.

📌 Note: The default text is stored in company_settings.estimate_notes_default. It requires a database migration (ALTER TABLE company_settings ADD COLUMN IF NOT EXISTS estimate_notes_default text DEFAULT NULL) before the Settings field and the pre-fill behavior will work.

Jobs & Work Orders

Every field visit is tracked as a job. Jobs link customers, properties, technicians, and tanks into a single work record that flows through scheduling, field execution, completion, and invoicing.

Job Status Workflow [Updated in v23]

ScheduledDispatchedIn ProgressCompletedInvoicedPaid

Additional statuses: On Hold (paused, can resume), Cancelled (terminated), Draft (incomplete, not on calendar), No Access 🔒 (technician could not access property — returns to Scheduled for rescheduling). [Updated in v37]

📌 Note: New in v23: The "Paid" status completes the financial lifecycle. When an invoice linked to a job is paid through any method (manual recording, Stripe checkout, or auto-charge), the job automatically transitions to Paid. Paid jobs display in dark green (#228B22) on the calendar.

Creating a Job

Sidebar › Jobs › + New Job › /dashboard/jobs/new

⚠️ Prerequisites: At least one Technician must exist before a job can be assigned. A Customer and Property must also exist. If scheduling settings (business hours, timezone) are not configured, auto-scheduling may not work correctly.

  • Customer: Search by name. Each customer in the list shows their service address for easy identification. Single-property customers with a tank show: Name — Tank Name — Street, City, State, ZIP. Single-property customers with a property but no tanks (for example, customers migrated from another system) show: Name — Street, City, State, ZIP using the property address directly. Multi-property customers show: Name (N properties) and a property picker appears after selection. Only customers with no property record at all fall back to phone number.
  • Property (multi-property customers only): When you select a customer with more than one property, a Property dropdown appears immediately below. Each option shows the tank's custom name and service address — for example, "Backyard — 579 N Collins Rd, Sunnyvale, TX, 75182". Select the correct property before choosing a site. For single-property customers this step is skipped automatically.
  • Site: A dropdown loads all tanks for the selected customer (or selected property for multi-property customers). Each option shows the tank name and site address (or property address if no site address is set) with tank type and capacity. Selecting a site auto-fills the job's site address. If the selected property has no tanks, the property address is used directly.
  • Service Type: Sorted alphabetically. Each option shows the pricing mode — Flat Rate types display their price (e.g., "Camera Inspection - $275"), while Time & Materials types show "T&M". Selecting a Flat Rate service type auto-fills the Quoted Price. Selecting a T&M service type clears the price and displays a notice that the final price will be calculated from labor hours plus parts used. [Updated in v20]
  • Job Title: Auto-fills from service type. Customize if needed.
  • Scheduled Date and Time, Estimated Duration.
  • Primary Technician: Select the lead staff member from the dropdown. Shows all company users — technicians, office staff, and admins. Non-technician users appear with a "(Staff)" label. Admin and office users can be assigned as primary for single-person companies. [Updated in v21]
  • Additional Technicians: A checklist of remaining active staff appears below the primary dropdown. Check one or more to assign them as supporting technicians on the same job. Additional assignees appear on their own row in Day View and are filterable via the All Staff dropdown on the calendar. [New in v19]
  • Priority: Normal, High, or Emergency. Emergency jobs display with a red border on the calendar and mobile app.
  • Pricing: For Flat Rate service types, the Quoted Price auto-fills from the service type. For T&M service types, an amber notice appears explaining that the final price is calculated from labor and parts — an optional estimated price can be entered. [New in v20]
  • Special Instructions / Notes, Link to Contract.

💡 Tip: Create Job saves with status "Scheduled" and requires a customer and title. Save as Draft requires only a customer — the title defaults to "Draft Job" if blank. Drafts can be promoted to Scheduled at any time from the edit page. [New in v18]

Job Detail Page

/dashboard/jobs/[id]

Assigned Technicians Panel [Updated in v21]

Every job detail page includes an Assigned Technicians panel on the right column listing all staff assigned to the job. The primary technician is shown first with an emerald Primary badge and a click-to-call phone link. Admin or office staff assigned as primary display correctly with their profile name. Each additional assignee is listed below with a gray Additional badge. For jobs that are not yet completed or cancelled, a + Add Tech button lets you assign additional staff inline without leaving the page. Each additional row also has a Remove link to instantly unassign that person.

GPS Check-In / Check-Out [Updated in v21]

Each technician on a multi-tech job checks in and out independently. When a technician clicks Check In, the system records their GPS coordinates, a timestamp, and their distance from the property address (shown in green under 500m, orange warning over 500m with a "View on map" link). Check Out records departure coordinates and distance. On multi-tech jobs, each person sees only their own Check In / Check Out / Pause / Resume buttons and their own billable time breakdown — one tech's check-in does not affect another's.

Time Tracking [New in v21]

A billable time tracker starts automatically when a technician checks in. Controls include Pause (switches timer to amber), Resume (restarts from pause), and Check Out (finalizes the entry). The "My Billable Time" section shows a running counter, individual time segments with start/end times, and a cumulative total. All time entries feed into the itemized cost breakdown at job completion. Each technician's hourly rate is set in their profile under Technicians.

Signatures Panel

  • Arrival Signature: Customer confirms technician arrived. Name pre-fills from the customer record.
  • Completion Signature: Customer acknowledges completed work. Appears after the arrival signature is captured.

Each signature stores the signer name, timestamp, and a preview image. Signatures appear on the printed job summary PDF.

Service Checklists [Updated in v20]

Jobs can have multiple checklists attached. When the job is In Progress, click + Add Checklist to select from available templates. Each checklist appears as a collapsible card showing its name, pricing mode (Fixed or T&M), and status badge (Pending, In Progress, or Completed). Expand a card to fill in inspection fields and manage parts. Default items from the service type's item associations auto-load into the Parts & Materials section. See Section 10 (Checklists & Inspections) for full details.

Legacy jobs created before multi-checklist support display a read-only "Legacy Checklist" card with historical data preserved.

Job Photos

Upload photos from mobile camera, gallery, or drag-and-drop on desktop. Each photo can be categorized as Before, During, After, Issue, or Other.

Issues Found

Click + Add Issue to record problems discovered during service: Title, Category (Structural, Mechanical, Hydraulic, Environmental, Safety, Compliance, or Other), Severity, estimated cost, and the tank where the issue was found. A follow-up job can be created directly from the issue.

Delete Job [New in v23]

A red Delete button appears in the action bar at the top of every job detail page. Before deleting, the system checks six related tables (time entries, photos, checklists, service records, issues, and invoices) for linked records. If any linked records exist, deletion is blocked with a descriptive message listing exactly what needs to be removed first. If no linked records exist, a confirmation modal appears and the job is permanently deleted. This is a hard delete — it cannot be undone.

Post-Completion: Invoice Link [New in v23]

After a job has been completed and invoiced, the Post-Completion section on the right side displays a direct link to the generated invoice. The link shows the invoice number (e.g., "View Invoice — INV-1037") with a color-coded status badge: green for paid, blue for sent, or purple for other statuses. Click the link to navigate directly to the invoice detail page.

Job Files [New in v38]

A Job Files card appears in the left column of every job detail page, between the Notes section and Checklists. Admin and office users can upload reference documents — such as installation drawings, site permits, or manufacturer specs — that technicians may need in the field. Supported formats: PDF, images (JPG, PNG, WEBP), and Word documents (.docx). Maximum file size: 25 MB per file.

  • Uploading: Click the dashed upload area, select a file, and it saves immediately. The card refreshes to show the file with its name, size, and upload date.
  • Opening: Click Open next to any file to view it in a new browser tab. PDFs and images open natively; Word documents download.
  • Deleting: Click Delete and confirm. The file is permanently removed from storage and the job record.
  • Tech access: On the mobile tech view (/tech/[id]), a collapsible Job Files section appears between Property Photos and Customer Notes. Techs can open files but cannot upload or delete them.

Completing a Job [Updated in v34]

Click Complete Job. The system first validates that all technicians have stopped their timers — if any tech has an active time entry, you'll see a named list of who still needs to check out. The completion modal shows an itemized cost breakdown:

  • Labor: Each technician's hours × hourly rate, listed individually (e.g., "Labor — Casey Edge: 2.5 hrs × $45.00/hr = $112.50").
  • Parts & Materials: Items used from the job's checklists, each with quantity × unit price.
  • Fixed Rate: For fixed-price service types, a single line item with the flat rate.
  • Calculated Total: Green bar showing the sum of all labor + parts (or the fixed rate).

Below the breakdown: Final Price (pre-filled but editable for discounts), Next Service Date, Additional Notes, and an optional Issue Report toggle.

Office Staff (admin-only) [New in v61]

When the logged-in user is an admin (not office or technician), an additional Office Staff field appears in the completion modal, positioned above the Additional Notes field. The field is pre-filled with the logged-in admin's full name from their profile. It is editable: an admin can type a different name if another admin processed the job on their behalf. The name is stored separately from the technician name, preserving the distinction between the field worker who performed the service (technician_name) and the admin who processed the completion paperwork (office_staff_name). Both appear on the resulting service record and can be displayed on compliance reports. The field is hidden for office and technician roles.

Payment Method Selector [Updated in v38]

Four payment method buttons appear in a 2×2 grid below the final price: 💳 Card, 💵 Cash, 📝 Check, and 🧾 Bill Left on Site. The selection determines the job and invoice status after completion:

  • Card: Invoice is created with status "sent" and emailed to the customer with a Pay Now link. If the customer has SMS enabled and has opted in, a text message is also sent with a direct link to the online payment page. Job status becomes "invoiced."
  • Cash: Invoice is created with status "paid" and the payment is recorded immediately. Job status becomes "paid." No further collection is needed.
  • Check: Invoice is created with status "sent" and a note reading "Check collected on-site — pending deposit." Job status becomes "invoiced." When Check is selected, a Check # input appears — enter the check number if available (optional). It is appended to the invoice notes (e.g., "Check collected on-site — pending deposit. Check #1042."). If the technician photographed the check on mobile, the photo appears in a dedicated Check Photo section on the job detail page and invoice page. When you deposit the check, open the invoice and click Record Payment to mark it paid.
  • Bill Left on Site [Updated in v39]: Invoice is emailed to the customer with a Pay Now link (if an email is on file) and an SMS pay link is sent if the customer has opted in. A note reads "Bill left on site — paper invoice delivered in person." If no email is on file, an amber warning appears in the modal but the job can still be completed. Job status becomes "invoiced."

Attach Checklist PDF [New in v34, Updated in v47]

When the job has at least one completed checklist, a 📋 Attach Checklist PDF toggle appears in the completion modal and is automatically enabled. When on, a professional Service Checklist Report PDF is generated and attached to the invoice email. The PDF includes a Job Summary box at the top with four rows of key details: Job Title and Service Date, Customer and Property, Technician and Tank Serviced (showing the tank's custom name and type, e.g. "Backyard (ATU)" or "Front Yard (Conventional)"), and a Checklists count. Below that, every checklist section and field response is listed with color-coded Yes/No values, followed by a Parts & Materials table with a parts total per checklist. Toggle off to send the invoice without the checklist attachment.

You can also download the PDF at any time from the job detail page — a Checklist PDF card with a Download PDF button appears below the checklists section for all completed, invoiced, and paid jobs. Admin and office roles only.

Attach Photos to Invoice [New in v34]

When the job has photos, a 📷 Attach Photos to Invoice photo picker grid appears. Tap any photo to select it (emerald border + checkmark overlay). A counter shows how many are selected. Selected photos are embedded in the invoice email body so the customer sees service photos alongside their invoice. Leave all unselected to send without photos.

Receipt Confirmation [New in v34]

After completing, an alert confirms whether the invoice email was sent successfully and to which address — for example, "Invoice sent to customer@email.com" for card, "Receipt sent to customer@email.com" for cash, or "Invoice sent — check collected on-site" for check. If the customer has no email on file, no alert appears.

A blue invoice preview box shows exactly what the customer will be charged, including the card processing fee breakdown (service amount + fee = total). Click Confirm & Invoice to complete. The generated invoice uses your company's invoice prefix and numbering from Settings. This creates a service record, updates the tank's last service date, and calculates the next due date.

Automatic Inspection Numbering [New in v61]

If the job's service type is flagged as Inspection in Settings → Service Types (the is_inspection flag is true), completing the job automatically assigns an inspection number in the format INSP-XXXX (where the prefix is configurable in company settings, defaulting to INSP-, and the numeric portion is the next available sequence value). The assigned number appears on the resulting service record, in the Inspection Number column of the customer's Service History tab, and on any compliance reports that include this record. Non-inspection service types (septic pumping, filter cleaning, pump repair, etc.) receive no number. Inspection numbers never reuse, so gaps in the sequence are normal and expected if a job completion fails partway through. See Service Types & Pricing Mode in Settings for configuring which service types qualify as inspections.

Deleting a Job

Click the 🗑 Delete button in the action bar. The system checks for linked records (time entries, parts, checklists, technician assignments, status history, and invoices). If any exist, a red message lists exactly what must be removed first. If no linked records exist, a confirmation dialog allows permanent deletion. Only admin and office users can delete jobs.

Job Calendar [Updated in v23]

Sidebar › Jobs › Calendar › /dashboard/jobs/calendar

Status Color Legend [Updated in v23]

  • Light Blue = Scheduled
  • Orange = Dispatched
  • Yellow = In Progress
  • Amber = On Hold
  • Light Green = Completed
  • Purple = Invoiced
  • Dark Green = Paid [New in v23]
  • Red = Cancelled
  • Teal = Maintenance Contract visit

Calendar Views

  • Month View: Traditional calendar grid. Job blocks are color-coded by job status. Each job block displays the assigned technician's name and a color dot. Emergency jobs have a red border. Time-off blocks appear with a striped OOTO pattern. Drag a job to another day to reschedule — the target date highlights blue while hovering.
  • Week View: Seven-column time grid (6 AM – 7 PM). An OOTO row shows which technicians are off each day.
  • Day View: Full-detail single-day view with one row per staff member. Route Optimizer panel appears for any technician with 2+ jobs. Jobs without a scheduled time appear as wider blocks with dashed borders and a "No time set" label — drag them to a time slot to assign a start time.

Day View: Auto-Scroll to Current Time [New in v23]

When you open the Day View for today's date, the calendar automatically scrolls horizontally so the current hour is centered in view. You no longer need to manually scroll past the early morning hours to find what's happening now. When viewing a past or future date, the calendar scrolls to 8:00 AM as a sensible default starting position.

Day View: Current Time Indicator [New in v23]

A thin red vertical line with a red dot at the top marks the exact current time on today's Day View. The line spans the full height of the grid across all technician and staff rows, making it easy to see at a glance which jobs are past, current, and upcoming. The indicator only appears when viewing today's date and only within the 6 AM–8 PM grid range.

Day View: Compact Lane Stacking [New in v23]

When multiple jobs overlap in time on the same technician's row, they are automatically arranged into thin horizontal lanes within the row's fixed height. Each lane shows a compact single-line display (time + customer name). Hover over any compact lane to see full details in a tooltip and bring the job to the front. Jobs are guaranteed to stay within their row boundaries — they never bleed into adjacent technician rows.

Filters and Drag-and-Drop

The All Staff filter dropdown includes all company users — technicians and office/admin staff alike. Selecting any staff member filters the calendar to show only their jobs. An "Unassigned" option shows only jobs with no assignment. Drag and drop any job to a different day (Month View) or time slot / technician row (Day View) to reschedule. Time conflicts are detected automatically.

Recurring Job Generation

Sidebar › Jobs › Recurring › /dashboard/jobs/recurring

Active contracts with a recurring service frequency can automatically generate scheduled jobs months in advance.

  • Generate All Jobs: Select how many months ahead (1, 2, 3, 6, or 12) and click Generate All to create jobs for every eligible contract at once.
  • Generate per Contract: Click Generate on a single contract row.
  • The system never creates duplicate jobs. If a job already exists for the same contract and date, it is skipped.
  • Each technician is capped at 8 jobs per day.

Jobs Dashboard Features

Sidebar › Jobs › /dashboard/jobs

The Jobs dashboard is the primary dispatch and tracking view for admins and office staff. It shows every job in the system with real-time filters, bulk management tools, and a live map view.

Filter Chips

Active filters display as color-coded chips above the job table. Each chip shows which filter is active and has an individual ✕ button to remove it. A Clear All button resets every filter at once. The job count at the right of the chip row shows how many jobs match the current combination.

  • Status filter (blue): Filter by job status — Scheduled, Dispatched, In Progress, On Hold, Completed, Invoiced, Paid, Cancelled.
  • Date filter (purple): Show jobs for a specific scheduled date.
  • Technician filter (emerald with color dot): Shows each tech's assigned color dot next to their name for quick identification. Includes an Unassigned option.
  • Search (gray): Free-text search across job number, customer name, property address, and title.

Skeleton Loading

While jobs are loading, the table displays animated pulse rows matching the real column layout so the page never jumps when data arrives.

Alert Banner

A banner appears at the top of the dashboard when unassigned jobs need attention. A red banner fires when there are unassigned jobs today — clicking it sets the technician filter to Unassigned to surface them immediately. An amber banner fires when unassigned jobs exist for tomorrow — clicking it opens the Map View for tomorrow's date so you can visually assess coverage.

Refresh

A refresh button in the top-right reloads jobs without a full page navigation. A spinning indicator shows while loading and a timestamp displays when data was last updated (e.g. "Updated 2:34 PM").

Bulk Actions

Sidebar › Jobs › select jobs › floating action bar

Select multiple jobs using the checkboxes on the left of each row, then use the floating action bar that appears at the bottom of the screen to apply changes to all selected jobs at once.

  • Select All: The checkbox in the header row selects all jobs matching the current filters (not just the visible page). The checkbox shows an indeterminate state when a partial selection exists.
  • Bulk Assign Technician: Assign all selected jobs to a single technician in one click. A dropdown lists all active technicians with their color dots.
  • Bulk Change Status: Move all selected jobs to a new status. Useful for bulk-dispatching a day's jobs or bulk-cancelling postponed work.
  • Selection clears automatically after a bulk action completes.

💡 Tip: Bulk actions only affect the jobs you have selected. Use the date or status filters first to narrow the list, then Select All to target a specific group.

Map View

Sidebar › Jobs › Map button

Click the Map button in the action bar to open a full Leaflet/OpenStreetMap view of all scheduled jobs for the selected date. Pins are color-coded by assigned technician using each technician's calendar color. Each pin displays a sequential number based on the job's scheduled start time (1 = earliest job).

Using the Map

  • Click any numbered pin to open a popup showing customer name, address, scheduled time, technician name, status badge, service type, and a View Job button linking to the job detail page.
  • Use the Prev / Next day buttons or the date picker to navigate to a different date. The map reinitializes for the new date automatically.
  • A Today button snaps back to today's date.
  • A Fit All button zooms the map to show all pins at once.
  • A tech legend above the map shows each technician's color dot and name. Unassigned jobs appear with a gray pin.
  • Jobs without geocoded property coordinates are listed in an amber warning banner with a link to Settings › Route Optimization to geocode them.

💡 Tip: Pin numbers on the map reflect scheduled start time order, not route optimization order. To reorder by geography, open Calendar › Day View for that date, use the Route Optimizer panel to optimize the route, and click Apply Route. The map will then show pins in the optimized order.

Properties Without GPS Coordinates

Jobs at properties that have not been geocoded do not appear as pins on the map. Navigate to Settings › Route Optimization and click Geocode All Properties to batch-geocode every property address in one step. Individual addresses can also be geocoded on the Property detail page.

Automatic Job Scheduling

Runs automatically — API: /api/cron/auto-schedule (5:00 AM UTC daily)

⚠️ Prerequisites: Auto-scheduling requires: Active technicians to assign jobs to, Business hours and timezone configured in Settings › Scheduling, and Active contracts with a service frequency set. Without all three, the scheduler runs but creates no jobs.

SepticCycle includes a fully automated job scheduler that runs every day at 5:00 AM UTC (midnight Central). It creates upcoming service jobs from all active contracts without any manual intervention — ensuring no service date is ever missed.

What the Auto-Scheduler Does

  • 21-day lookahead: Creates jobs for any service due within the next 21 days across all active contracts.
  • Respects working days: If a calculated date falls on a weekend or non-working day, the job moves to the nearest working day based on your Settings › Scheduling configuration.
  • Auto-assigns technicians: Picks the best available technician based on proximity to the property (GPS), current daily workload, and PTO exclusion. Technicians on approved time off are automatically skipped.
  • 8-job daily cap: No technician receives more than 8 auto-scheduled jobs per day. Overflow jobs move to the next available working day (up to 7 days out).
  • Time staggering: Start times are automatically staggered based on estimated service duration plus the scheduling buffer configured in Settings.
  • Duplicate prevention: If a job already exists for the same contract within ±14 days of the calculated service date, the scheduler skips it entirely.
  • Advances next service date: After creating a job, the contract's Next Service Date is updated so future runs don't double-schedule.
  • Customer notification: A scheduling confirmation email is automatically sent to the customer when a new job is auto-created.

💡 Tip: Administrators can still create and override jobs manually at any time. The 8-job daily cap applies only to auto-scheduling, not to jobs you create manually from the dashboard.

Auto-Scheduling Controls

Each of the following settings in Settings › Scheduling is actively enforced by the nightly cron. Changing them takes effect on the next run.

  • Enable Auto-Scheduling: A master on/off toggle for your company. When turned off, the nightly cron skips your company entirely — no jobs are created until you turn it back on. Existing jobs are not affected. Use this during company closures or system transitions.
  • Work Day End Time: Hard cap on the last job start time. When a technician's day is fully booked up to this time, remaining jobs overflow to the next available working day. Set this to match the latest time your technicians work.
  • Send Appointment Reminders: When turned off, jobs are still created but no scheduling confirmation email is sent to the customer. The 7-day and 1-day advance reminders are controlled separately and are unaffected.
  • Company Holidays: Any date added to Settings › Scheduling › Holidays is skipped entirely during scheduling. If a service falls on a holiday it moves to the next available working day. US federal holidays appear on the calendar for reference but do not block scheduling unless added to your company holidays list.

Setup Required

For the auto-scheduler to run effectively, each active contract must have a Next Service Date populated. Navigate to a contract and set this field if it is blank. The scheduler reads this date to know when to create the next job.

Zone Scheduling [Updated in v34]

Cron: /api/cron/zone-schedule (1st of each month, 7:00 AM UTC) | Configured: Settings › Scheduling › Zone Scheduling

Zone Scheduling automatically creates jobs on the 1st of each month for all active contracts whose properties belong to a zone whose service months include the current month. When technicians are assigned to a zone, jobs are automatically assigned to the least-loaded technician in that zone on the target date. If no technicians are assigned to a zone, the job is created unassigned with an internal note prompting manual assignment.

How It Works

  • Zones: Properties are tagged with a zone name via the Service Zone / Route field. Each zone is configured in Settings with a set of months when it should be serviced.
  • Tech auto-assignment [New in v34]: The cron picks the least-loaded technician assigned to that zone on the target date. Tie-breaking: fewest jobs that day → fewest jobs that month → alphabetical by last name.
  • Unassigned fallback: If no technicians are assigned to a zone, the job is still created — it lands unassigned with an internal note reading "No technicians are assigned to the [zone] zone — please assign manually."
  • Eligible contracts: Only active or signed contracts whose property is in an active zone and whose service frequency is in the configured applies-to list are included.
  • Duplicate prevention: If a zone-scheduled job already exists for the same contract in the current month, the run skips it.
  • Status: All zone-generated jobs are created with status Scheduled. They appear on the calendar with no time block, ready for dispatch.
  • Job notes: Each job includes an internal note identifying the zone, month, visit number, and assigned technician (or unassigned warning).

Scheduling Modes

Two modes are available, configured in Settings › Scheduling › Zone Scheduling:

  • Manual: All jobs land on the 1st weekday of the month. Best for companies who prefer full control over their schedule.
  • Smart Spread: Jobs are spread across the month based on each contract's anniversary date (the day-of-month from the contract start date). If a customer signed on the 14th, their job targets the 14th of each service month. If that day is full or a weekend, the system walks outward one day at a time until it finds an available weekday. The Max Jobs Per Day setting caps how many jobs can land on any single day.

💡 Tip: Smart Spread is the recommended mode for companies with 20+ recurring contracts. It prevents the dispatcher from facing a wall of 50 unscheduled jobs on the 1st and distributes the workload naturally across the month. Daily capacity = Max Jobs Per Day × zone technicians working that day-of-week (e.g. 3 techs × 6 = 18 jobs/day). The scheduler fills each technician to their daily max before advancing to the next date, compressing all jobs into the fewest days possible. [New in v36]

Configuration

  • Navigate to Settings › Scheduling and scroll to the Zone Scheduling section.
  • Toggle Enable Zone Scheduling on.
  • Select your Scheduling Mode — Manual or Smart Spread.
  • Set Max Jobs Per Day (Smart Spread only) — the maximum jobs that can be placed on any single working day. Default is 6.
  • Configure which Service Frequencies are eligible. Supported: Monthly, Every 2 Months, Every 4 Months, Quarterly, Tri-Annual, Semi-Annual, Annual, Every 2 Years. As Needed and Custom are not supported.
  • Add and configure Zones — assign a name, color, and which months each zone is serviced.
  • On each Technician record, toggle which zones they cover (Settings › Technicians › Edit). Assigned zones appear as colored badges on the tech card.
  • On each property record, set the Service Zone / Route field to the matching zone name.

Job Scheduling Email Notifications

API: /api/email/send-job-notification | Cron: /api/cron/job-email-reminders (8:30 AM UTC daily)

SepticCycle sends automated emails to customers at four key points in every job's lifecycle:

  • New job scheduled: Sent immediately when a job is created (manually or by the auto-scheduler). Includes scheduled date, time, service type, assigned technician name, and property address.
  • Job rescheduled: Sent automatically when a job's date or time changes. Shows the original scheduled time and the new scheduled time so the customer knows exactly what changed.
  • 7-day advance reminder: Sent one week before the scheduled service date. Includes technician name, date, time, property address, and any pre-service instructions.
  • 1-day advance reminder: Sent the day before service as a final confirmation. Includes all job details and company contact information for any last-minute questions.

All scheduling emails are logged in the Email Log (Settings › Notifications) with full delivery status and timestamps. Reminders stop automatically if the job is cancelled before the reminder date.

📌 Note: Job scheduling emails require the customer record to have a valid email address. No email on file means the job is still created and scheduled — only the notification is skipped.

Advance Notice Flag [New in v37]

Customer Detail › Edit › Scheduling Preferences

Some customers require a phone call before the technician arrives. The Requires Advance Notice flag marks these customers so the office and tech never forget to call ahead.

Setting the Flag

  1. 1Open the customer profile and click Edit.
  2. 2Scroll to Scheduling Preferences (amber background).
  3. 3Check 🚩📞 Requires Advance Notice.
  4. 4Optionally enter instructions (e.g. "Call 30 min before; gate code 1234").
  5. 5Click Save Changes.

Where the Flag Appears

  • Customer Info tab: Amber banner at the top of the Contact Information card.
  • Job detail page (admin): 🚩📞 next to customer name plus an amber instructions banner.
  • Calendar month view: 🚩 prepended to the customer name on the job block.
  • Tech My Jobs & Schedule tab: 🚩📞 shown inline after the customer name on each job card.
  • Tech Job Detail: 🚩📞 in the colored header. An amber "Call Customer Before Arriving" banner with a Call Now button appears in the content area.

📌 Note: The flag is informational only — it does not block scheduling or change job statuses.

No Access [New in v37]

/dashboard/jobs/[id]

When a technician arrives at a property but cannot access it (locked gate, no one home), they mark the job No Access from the job detail page.

Marking No Access

Click the red 🔒 No Access button in the action bar (visible when status is Scheduled, Dispatched, or In Progress). After confirming, the system automatically:

  • Updates job status to No Access with timestamp and reporting user.
  • Writes a system note: "🔒 No Access reported by [Name] on [Date]."
  • Sends an email alert to the company notification address with job details.
  • Sends an SMS alert to the company phone (if SMS enabled).
  • Sends an SMS to the customer (if SMS consent is on file) stating the tech could not access the property and you will be in touch.

After No Access

The job returns to Scheduled so it can be rescheduled. The note and timestamps are preserved as a permanent record of the access attempt.

📌 Note: The No Access button is also available on the mobile technician view (/tech/[id]) — techs can mark No Access directly from their phone without needing to call the office. [New in v38]

Job Files [New in v38]

/dashboard/jobs/[id] — Job Files card | Tech: /tech/[id] — Job Files section

Job Files lets admin and office users attach reference documents directly to a job — installation drawings, permits, site plans, manufacturer specs, or any file a technician may need on-site. Files are stored securely and accessible from both the admin job detail page and the technician mobile view.

Uploading Files

  • Open any job at Dashboard › Jobs › [Job].
  • Scroll to the Job Files card in the left column (between Notes and Checklists).
  • Click the dashed upload area and select a file.
  • Supported types: PDF, JPG, PNG, WEBP, DOCX. Maximum size: 25 MB per file.
  • The file appears immediately in the list with name, size, and upload date.

Technician Access

On the mobile tech view, a collapsible Job Files section appears between Property Photos and Customer Notes. Techs can see the file count badge, expand the section, and tap Open to view any file in a new browser tab. Techs cannot upload or delete files — that is restricted to admin and office users.

Managing Files

  • Open: Opens the file in a new browser tab (PDFs and images preview natively).
  • Delete: Permanently removes the file. Requires confirmation. Cannot be undone.

Issue Tracking

Issues track problems discovered during service visits that need follow-up attention. They bridge the gap between a technician finding a problem in the field and your office scheduling the repair job.

Sidebar › Issues › /dashboard/issues

Issue Fields

  • Title and Description of the problem.
  • Category: Structural, Mechanical, Hydraulic, Environmental, Safety, Compliance, or Other.
  • Severity: Critical, High, Moderate, or Low.
  • Estimated repair cost and quoted price.
  • Linked tank, customer, property, and originating job.
  • Photos: Attach photos to document the issue.

Issue Lifecycle

OpenQuotedApprovedResolvedDeferred

Issues can also be set to Deferred if the customer acknowledges the issue but declines repair at this time. Open issues appear on the customer's Issues tab, in the Info tab summary (Open Issues count), and in the Issues dashboard for all-customer visibility.

Creating a Follow-Up Job

From any open issue, click Create Follow-Up Job. A new job record is created pre-linked to the issue, customer, and property. The issue status updates to Approved once a follow-up is scheduled. When the follow-up job is completed, the issue status advances to Resolved.

Issues List

The Issues page shows all issues across all customers with filtering by status (Open, Quoted, Approved, Resolved, Deferred) and severity (Critical, High, Moderate, Low). Each row displays a color-coded severity indicator, title, category, customer name, property, and any linked follow-up job.

County Compliance Reporting

SepticCycle includes a comprehensive compliance reporting system to meet county submission requirements. Track which contracts need reports, generate professional PDFs, and monitor submission status — all from one dashboard.

Compliance Dashboard

Sidebar › Compliance › /dashboard/compliance

⚠️ Prerequisites: Counties must be defined in Contracts › County Requirements before any compliance data appears here. Contracts must also have a county assigned and must have had at least one completed job recorded against them.

  • Quick Stats: Active contracts requiring submission, pending reports, overdue count, and counties served.
  • Overview Tab: County-by-county summary with pending submissions and upcoming deadlines sorted by urgency.
  • Reports Tab: All generated reports filterable by status and county.
  • Pending Tab: Contracts with unreported services needing attention.

Generating a Compliance Report

Compliance Dashboard › Generate Report › /dashboard/compliance/generate

A three-step wizard guides you through report creation:

  1. 1Select Contract: Choose the report type and contract. County-specific requirements are displayed if configured. The output format (PDF or CSV) defaults to the format configured in Report Settings for that county and report type.
  2. 2Choose Services: Set the reporting period and select which completed service records to include. The period defaults to the previous completed interval based on the county's submission frequency (monthly → previous month, quarterly → previous quarter, semi-annual → previous half-year, annual → previous year). Toggle whether to include technician notes.
  3. 3Review and Generate: See the summary of total services and gallons. Add additional notes. Click Generate Report.

Batch Report Generation

Compliance Dashboard › Batch Generate › /dashboard/compliance/batch

Batch generation lets you produce compliance reports for every contract in a county in one operation. Each contract row shows the customer name, contract number, property address, and a count of pending services not yet included in a report.

  1. 1Select a county from the left panel. All active contracts requiring county submission are listed.
  2. 2Set the Report Period — choose a calendar month using the month picker, or enter a custom start and end date.
  3. 3Select a Report Type (Maintenance Report or Service Summary) and toggle Include Technician Notes.
  4. 4Click Select All or individually check the contracts to include.
  5. 5Click Generate Reports. A progress bar tracks each report as it is created.
  6. 6Review the results screen — successful reports show the report number with a link; contracts with no services in the selected period are flagged.
  7. 7Download individual PDFs from the Compliance dashboard, or download a ZIP file containing one PDF per contract for bulk county submission.

Report Detail, PDF & Submission Tracking

  • Download PDF: Professional PDF formatted for county submission. Includes your company header (name, address, license numbers), service records table with the fields configured in Report Settings, summary statistics, and a Certification Statement with your authorized signature and the report generation date auto-filled.
  • Send via Email: Send the PDF directly to the county submission email on file. The email pre-fills the recipient, subject, and message body. Status automatically updates to Submitted after a successful send.
  • Mark as Submitted: Record the submission method (email, portal, mail, fax, in-person), reference number, and notes.
  • Record Response: Track the county's response: Accepted, Rejected, or Pending, with response date and notes.

Email History & Send to Both [New in v61]

Compliance Dashboard › Report Detail page

The report detail page has been expanded with a persistent Email History panel, a dual-recipient send flow, inline per-recipient retry, and automatic timestamp tracking on every service record included in the report.

Email History Panel

On the report detail page, the Email History section shows a chronological log of when the report was emailed to the agency and/or the customer. Each entry shows the recipient type (Agency or Customer), the email address, the send timestamp, and a status indicator (Delivered / Failed). This panel is always visible so you can quickly see what has been sent without opening a separate dialog.

Recipient Toggle: Agency vs. Customer

Click Send Email to open the email composer. The composer supports two primary recipient types, selectable via a toggle at the top:

  • Send to Agency: Uses the county submission email address configured in County Requirements for this report's county. The subject and body default to the county's agency-submission template.
  • Send to Customer: Uses the customer's email address from their profile. The subject and body default to the customer-facing template.

Toggling between Agency and Customer swaps the default recipient, subject, and body. Any manual edits you have made to the subject or body for the currently-active recipient are preserved when you toggle, so you can prepare an agency email, then optionally also send to the customer without losing your agency-side wording.

Send to Both Recipients

Below the recipient toggle is a checkbox labeled: Also send to [customer/agency] (the label dynamically flips based on which recipient is currently active). When checked, clicking Send performs a sequential agency-first dual-send:

  1. 1First, send to whichever recipient is currently toggled active, using the subject and body you have entered.
  2. 2If that send succeeds, then send to the other recipient using fresh default values (not your manual edits), so each recipient gets an appropriately-tailored message.

The PDF is generated once and reused for both sends, so there is no performance cost to dual-send.

Retry on Partial Failure

If one of the two sends fails (network issue, invalid email address, rate limit), the modal stays open and an inline status panel appears showing per-recipient state: which succeeded (green check), which failed (red X with error message), and which are still in progress. A dedicated Retry button appears next to each failed recipient. Clicking it re-sends to that specific recipient using fresh default values. You can retry as many times as needed until both succeed, then click Done. The modal closes only on full success or when you manually close it.

Timestamp Tracking on Service Records

When a compliance email is sent, SepticCycle automatically timestamps every service record included in that report's reporting period. The stamp reflects the recipient type:

  • Sends to agency stamp agency_emailed_at on each relevant service record with the current date and time.
  • Sends to customer stamp customer_emailed_at on each relevant service record.
  • Both timestamps can be populated on the same record if you have sent the report to both recipients at different times, or used Send to Both.

These timestamps are internal data used for paper trail and audit purposes. They are not surfaced directly in the service history UI but appear in the Email History section of the compliance report itself and can be queried for audit or county-response tracking.

Report Status Workflow

DraftGeneratedSubmittedConfirmedRejected

Rejected reports can have a reason recorded and can be corrected and resubmitted.

Report Settings

Compliance Dashboard › Report Settings › /dashboard/compliance/report-config

Report Settings lets you configure exactly which data fields each county receives in compliance reports, with full control at the global and county level.

  • Global Defaults: Settings that apply to all counties unless overridden. Configure these first to establish a baseline for your entire operation.
  • County Overrides: Select any county from the left panel to configure county-specific settings. An amber banner indicates the county is inheriting from Global Defaults. Making any change creates a blue-badged override. Use Reset to global default to remove the override.
  • Report Type Tabs: Each panel has five tabs (Maintenance Report, Inspection Report, Service Summary, Contract Registration, Installation Report). A blue dot indicates a county-specific override exists for that report type.
  • Output Format: Choose PDF, CSV, or both. When both are configured, the admin selects the format at generation time.
  • Included Fields: Check which data fields to include in CSV exports. Available fields vary by report type. Service reports include service data (customer name, address, tank type, dates, permit, technician, notes, BOD, TSS). Inspection reports add system details. Contract and Installation reports add contract and permit details.
  • Other Fields: Add custom columns this county requires. Each custom field has a Field Name (CSV column header) and a Value. Static values appear as fixed text in every row. Dynamic values are pulled from the record at generation time (tank latitude, longitude, serial number, install date, property county/zip, company license, report date, period dates). Custom fields from Global Defaults appear with a gray global badge in county views and cannot be removed at the county level. A county can override a global custom field by adding a field with the same name.

Compliance Settings

Settings › Compliance › /dashboard/settings?tab=compliance

The Compliance tab in Settings contains configuration that appears on every compliance report PDF.

  • OSSF License Numbers: Enter your primary and optional secondary OSSF license numbers. Both appear in the PDF header as "License #: LIC-001 / LIC-002". These also appear on invoice PDFs.
  • Signature Name: Enter the authorized representative's name as it should appear on compliance reports. The name renders in a script font in the Certification Statement section. A live preview shows how it will look.
  • Signature Image (optional): Upload a scanned handwritten signature. PNG, JPG, or WebP up to 2MB. When an image is uploaded it takes priority over the typed name. Remove the image to revert to the typed name.

The certification date in the PDF is automatically set to the report generation date. Click Save Changes after updating any field in the Compliance tab.

Checklists & Inspection Templates

Checklists provide structured digital inspection forms for technicians. They replace paper forms and ensure inspection data is captured as structured, queryable records rather than unstructured notes. Jobs can have multiple checklists attached, each independently tracking completion and parts used.

Sidebar › Checklists › /dashboard/checklists/templates

Pre-Built Templates

SepticCycle includes 13 ready-to-use templates covering all standard septic service types:

  • Aerobic System Inspection (detailed component testing, spray field, photo documentation)
  • Aerobic System Maintenance (routine ATU servicing)
  • Camera Inspection (pipe assessment, blockage, root intrusion)
  • Drain Field Inspection (site conditions, distribution box, field assessment)
  • Emergency Service (arrival assessment, diagnosis, resolution)
  • Grease Trap Service (commercial trap cleaning)
  • Land Application (compliance-grade field data with GPS, setback distances, and certification)
  • Minor Repairs (issue assessment, repair work, follow-up)
  • Pump Repair (pump diagnosis, replacement, float/wiring checks)
  • Real Estate Inspection (property transfer with pass/fail result)
  • Riser Installation (pre-install measurements, installation steps, completion)
  • Septic Tank Pumping (safety, pre/post inspection, pumping service)
  • System Inspection (full system evaluation with drain field and D-box)

Loading Default Templates

Checklists › Templates › 📋 Load Defaults

New companies can load all 13 default templates with one click. Click the 📋 Load Defaults button on the Checklist Templates page. A confirmation dialog appears explaining that 13 templates will be added. Templates already in your account (matched by name) are automatically skipped — no duplicates will be created. You can edit or delete any template afterward to customize it for your company.

Creating a Custom Template

/dashboard/checklists/templates/new
  1. 1Click + New Template.
  2. 2Enter a Template Name and select the associated Service Type.
  3. 3Click + Add Section to create logical groupings (e.g., "System Information," "Component Inspection," "Findings").
  4. 4Within each section, click + Add Field. For each field, set: Label, Field Type (Text, Textarea, Number, Checkbox, Dropdown, Date, Time, or GPS), options for dropdowns, and whether the field is Required.
  5. 5Drag and drop sections and fields to reorder.
  6. 6Click Save Template.

Duplicating a Template [New in v47]

/dashboard/checklists/templates

Every template card on the Checklist Templates list page now has a Duplicate button (blue, between Edit and Delete). Duplicating creates an exact deep copy of the template — every section, every field, every color-coding rule, and the service type association — saved immediately under the name "Copy of [Original Name]". The duplicate opens ready to edit so you can rename it and adjust fields without starting from scratch.

When to Use Duplicate Instead of Edit

  • Seasonal variations: Duplicate an ATU Maintenance template and add a winter drain-down section for cold-weather visits, keeping the base template unchanged.
  • Per-county forms: Some counties require extra fields. Duplicate your standard inspection template and add the county-specific fields to the copy.
  • Pricing mode variants: Duplicate a Fixed-price template and switch the copy to Time & Materials for customers billed hourly.
  • Iterating safely: Make a duplicate before making large structural changes so you can always roll back by deleting the experiment.

Step-by-Step

  1. 1Go to Sidebar › Checklists.
  2. 2Find the template you want to copy.
  3. 3Click the blue Duplicate button on the card.
  4. 4The page immediately shows a new card titled "Copy of [Template Name]".
  5. 5Click Edit on the new card to rename it and make any changes.
  6. 6Click Save Template.

📌 Note: Duplicating a template never affects the original. Jobs already using the original template continue to use it unchanged. The copy is completely independent once created.

Answer Color Coding [New in v47]

/dashboard/checklists/templates/new or /dashboard/checklists/templates/[id]

You can assign a highlight color to each answer option on Dropdown / Select fields and to the checked and unchecked states of Checkbox fields. When a technician selects an answer in the field app, the field's background immediately changes to that color — making critical findings jump out at a glance without scrolling through the entire form.

Available Colors

  • None — default white background, no highlight.
  • Green — good condition, pass, operating normally.
  • Yellow — caution, needs monitoring, moderate concern.
  • Red — fail, critical issue, requires action.
  • Blue — informational, N/A, not applicable.
  • Orange — high priority, urgent but not yet critical.
  • Gray — neutral, skipped, or not observed.

Setting Colors on a Select / Dropdown Field

  1. 1Open a template for editing (create new or click Edit on an existing one).
  2. 2Expand the section and click the dropdown / select field you want to color.
  3. 3The field editor shows your list of options. Below each option label, a row of colored dots appears — click a dot to assign that color to that option. Click the dot again (or the "none" circle) to clear it.
  4. 4A small ● colors tag in indigo appears on the field in the field list when any colors are configured — this is your at-a-glance indicator.
  5. 5Click Save Template.

Setting Colors on a Checkbox / Yes–No Field

  1. 1Click the checkbox field in the template editor.
  2. 2Two color pickers appear: Checked color (applied when Yes is selected) and Unchecked color (applied when No is selected). The N/A state always uses blue.
  3. 3Click a color dot for each state, or leave either as None.
  4. 4Click Save Template.

How Colors Appear in the Field App

Colors are applied in real time as the technician fills out the checklist on mobile or desktop. For select fields, the entire answer container (border and background) updates the moment an option is chosen. For checkbox fields, the container updates immediately when Yes or No is tapped. Tapping N/A always renders blue regardless of any configured color. The colors are visual aids only — they do not affect data storage, validation, or required-field enforcement.

Colors in the Checklist PDF

The downloadable Service Checklist Report PDF does not reproduce background colors — PDF color fidelity varies across printers and email clients. Instead, Yes/No answers in the PDF use green bold text for Yes and red bold text for No to convey the same at-a-glance status in a format that prints reliably on any device.

💡 Tip: A common setup: set Tank Condition to green for "Good," yellow for "Fair," orange for "Poor," and red for "Needs Repair." Set the Effluent Screen Present checkbox to green for Yes and red for No. Technicians instantly see the overall health of the system without reading every field.

Photo Capture on Fields [New in v66]

/dashboard/checklists/templates/new or /dashboard/checklists/templates/[id]

You can enable photo capture on any field type: Text, Long Text, Number, Checkbox (Yes/No), Dropdown, Date, Time, or GPS. When the toggle is on, the technician sees a Take Photo button below that field while filling out the checklist on mobile or desktop. The photo is saved against the field, displayed as a thumbnail in the form, and rendered inline under that field on both the customer-copy and company-copy Service Checklist Report PDF.

Enabling Photo Capture on a Field

  1. 1Open a checklist template for editing (create new or click Edit on an existing one).
  2. 2Click the field you want to add photo capture to.
  3. 3Scroll to the bottom of the field editor. Check the 📷 Allow photo attachment toggle.
  4. 4The helper text below the toggle changes based on the field type. For Yes/No fields it explains the auto-open camera behavior. For all other field types it explains the manual Take Photo button.
  5. 5Click Add Field or Save Changes. The field card in the section list shows a small green 📷 indicator next to the field type label.

How It Appears in the Field App

When the technician opens the checklist on mobile or desktop, fields with photo capture enabled show a Take Photo button below the field input. Tapping it opens the device camera (rear camera by default on mobile) or a file picker on desktop. The selected photo:

  • Compresses automatically before upload (under 10 MB final size).
  • Validates as an image format (jpg, png, etc.).
  • Uploads to the secure job-photos storage bucket and is also indexed in the Job Photos tab.
  • Displays as an 80×80 thumbnail under the field with Retake and Remove buttons.
  • Renders inline at 160×120 size on the Service Checklist Report PDF under the field, in both the customer copy (emailed) and the company copy (downloaded).

Behavior on Yes/No (Checkbox) Fields

For Yes/No fields specifically, the toggle has one extra behavior: when the technician selects Yes, the camera automatically opens so they can capture a photo without an extra tap. This matches the original picture-taker behavior from earlier versions and is preserved for backward compatibility. The Take Photo button still appears so the tech can manually retake or cancel. For Yes/No fields where the tech selects No or N/A, the photo UI hides automatically. There is no photo to capture for a "No" answer in this pattern.

Photos in the Checklist PDF

Both versions of the Service Checklist Report PDF render attached photos: the customer copy (attached to the invoice email) and the company copy (downloaded via the Checklist PDF card on the job detail page). Each photo renders inline under its field at 160×120 size. Prior to v66, only the customer copy rendered field-attached photos. The company copy silently dropped them. Both PDFs now produce identical output for any given checklist.

📌 Note: A field's photo only renders on the PDF if the tech took the photo for that specific field. Photos uploaded through the Job Photos tab do NOT auto-attach to a field. They remain general job photos and can still be selected via the Attach Photos to Invoice picker on the Complete Job modal. The two paths are independent.

💡 Tip: Common uses: photograph the cleaned filter on a Filter Cleaned checkbox, the new sticker on a Maintenance Sticker Applied checkbox, the measurement stick on a Sludge Depth number field, or the access point at the recorded GPS coordinates. Pair photo capture with color-coding for visual evidence behind every flagged field.

Importing a Checklist from a Document

/dashboard/checklists/templates/import

Upload an existing paper form or Word document. The system analyzes the document structure and creates a structured checklist template matching the form's layout. Review the generated template and adjust as needed before saving.

Multiple Checklists Per Job

Jobs can have more than one checklist attached. This is useful when a single visit involves multiple service types — for example, a septic pumping plus a system inspection on the same trip. Each checklist independently tracks its own completion status (Pending, In Progress, Completed) and a job is not considered fully done until all attached checklists are completed.

Adding Checklists to a Job

On the job detail page (when the job is In Progress), click the + Add Checklist button. A panel opens listing all available templates with their pricing mode (Fixed or Time & Materials). Click a template to attach it. The checklist appears as a collapsible card with a status badge. Click the card header to expand or collapse it.

Checklist Actions

  • Save Checklist: Saves the current field data. The status changes to In Progress and a progress bar shows completion percentage.
  • ✓ Mark Complete: Marks the checklist as done. Fields become read-only.
  • Reopen: Returns a completed checklist to In Progress for edits.
  • Remove Checklist: Deletes the checklist and all associated parts data from the job.

Parts & Materials Tracking

Each checklist includes a Parts & Materials Used section at the bottom. This tracks every product or service item consumed during the job.

Default Parts Auto-Loading

When you add a checklist to a job, any items tagged as Default for that job's service type (configured in Settings › Items › Service Type Associations) are automatically added to the Parts section with their default quantities and catalog prices. This saves techs from manually searching for common items every time.

Adding Parts Manually

  • From Catalog: Click + Add Part, type to search your items catalog, and click the item to add it with its catalog price.
  • Custom / Freeform: Below the catalog search, enter a description, quantity, and unit price for any item not in the catalog.

Each part shows its description, unit price, editable quantity, and calculated line total. The Parts Total is displayed at the bottom. For Time & Materials jobs, this total feeds into the final job cost calculation.

Contract + Service Type + Checklist Workflow

Setting up a fully automated contract with an attached checklist requires completing three phases in order. Phases 1 and 2 are one-time setup. Phase 3 repeats for each new customer contract.

Phase 1 — Create the Service Type

Settings › Service Types › /dashboard/settings/service-types

A Service Type defines what kind of work is performed and how it is billed. Every checklist and auto-generated job ties back to one.

  1. 1Go to Settings and click the Service Types tab.
  2. 2Click + New Service Type.
  3. 3Set the Name (e.g., “ATU Maintenance”), Pricing Mode (Fixed or Time & Materials), Base Price (optional, pre-fills quoted price on auto-generated jobs), and Estimated Duration (used by the scheduler for time slot allocation).
  4. 4Check Annual Maintenance Service if this visit has no charge unless extra parts are added. When checked, completing the job sends a Service Record instead of generating an invoice.
  5. 5Click Save.

Phase 2 — Create the Checklist Template

Sidebar › Checklists › + New Template › /dashboard/checklists/templates/new

A checklist template defines the inspection form the technician fills out on-site. Linking it to a Service Type makes it auto-load on every job of that type.

  1. 1Go to Checklists in the sidebar and click + New Template.
  2. 2Enter a Template Name and select the Service Type created in Phase 1. This is the link that makes the checklist auto-load on matching jobs.
  3. 3Set the Pricing Mode to match the service type (Fixed or Time & Materials).
  4. 4Add Sections and Fields: click + Add Section to group related fields (e.g., “System Condition,” “Pump Check,” “Parts Used”). Inside each section, click + Add Field and select the field type. Mark fields Required if the tech must complete them before the checklist can be marked done. Drag to reorder.
  5. 5Click Save Template.

Tip: If you already have a paper form or Word document for this inspection, use Import from Document instead of building from scratch.

Phase 3 — Create the Contract

Sidebar › Contracts › + New Contract › /dashboard/contracts/new
  1. 1Select the Customer and Tank / Site Location.
  2. 2Set the Service Type to the one created in Phase 1. This tells the auto-scheduler what kind of job to generate and which checklist to attach.
  3. 3Set Service Frequency. For Custom frequency, enter the Interval in months (e.g., 5). This number is what the scheduler reads — the Display Label is for human reference only.
  4. 4Complete the remaining fields: Contract Type, Start Date, End Date, Total Price, and Billing Frequency.
  5. 5Click Save Contract (creates in Draft status), then activate it by changing status to Active or sending for signature.

What Happens Automatically After Activation

  • Job generation: The auto-scheduler (runs daily at 5 AM UTC) creates a scheduled job when the contract's next_service_date falls within 21 days, assigns the best available technician, and emails the customer a scheduling confirmation.
  • Checklist auto-attach: When the technician marks the job In Progress, the checklist template linked to the service type automatically appears in the Checklists section.
  • Job completion: When the tech marks Complete, the system creates a service record, updates the tank's last service date, generates an invoice (or Service Record for maintenance-type jobs), and advances the contract's next service date so the cycle repeats automatically.

Common Mistakes to Avoid

  • No Service Type on the contract: Auto-generated jobs will have no checklist and no pricing mode. Always set the Service Type on the contract.
  • Checklist not linked to a Service Type: A checklist without a Service Type association will never auto-load. It can still be attached manually but will not appear automatically.
  • next_service_date left null: The auto-scheduler skips contracts with no next service date. This field is set automatically when the first job is generated, but for contracts created manually it may need to be set in the contract detail page.
  • Custom frequency with no interval: Selecting Custom frequency without entering an Interval (months) causes the scheduler to skip the contract entirely.

Waste Manifests & Trip Tickets

Waste manifests are legally required documents that track the chain of custody for septic waste from pickup to disposal. SepticCycle handles the full lifecycle: dispatch, on-site collection, transport, disposal, signatures, and county form generation.

Sidebar › Manifests › /dashboard/manifests

The Manifest Workflow

Every manifest starts with a job. The recommended end-to-end flow is:

  1. 1Office creates a job — customer books a pumping appointment. The job is assigned a technician and scheduled.
  2. 2Tech is dispatched — tech taps Start Driving on the job.
  3. 3Tech arrives and pumps — tech taps Arrive On Site, pumps the tank, then opens the Waste Manifest section at the bottom of the job and taps + Create Manifest.
  4. 4On-site manifest form — a stripped-down mobile form opens, pre-filled with customer, address, and technician. Tech enters gallons pumped, selects waste type and truck, and taps Create.
  5. 5Tech drives to the disposal site — the manifest status advances to In Transit.
  6. 6At the facility — tech opens the manifest, taps Record Disposal, enters gallons disposed and authorization number, and captures the facility signature.
  7. 7County form generated — if the disposal site has a linked county form template, the office (or tech) taps Generate Form to produce a pre-filled PDF for regulatory submission.
  8. 8Tech completes the job — back in the job detail, tech taps Complete Job. The invoice is generated and sent to the customer.

💡 Tip: The Job and Manifest are two separate records that are linked. The job handles scheduling, billing, and invoicing. The manifest handles waste tracking, signatures, and county compliance. Both are visible from each other's detail pages.

Creating a Manifest (Dashboard)

/dashboard/manifests/new

⚠️ Prerequisites: Manifests require at least one Truck and at least one Disposal Site. Both are required fields.

  • Source: Select the customer, property, waste type, and source type.
  • Pickup Details: Collection date, time, gallons pumped.
  • Primary Technician: Required dropdown. Select the lead tech.
  • Additional Technicians: Checklist of remaining active staff. Check any supporting techs. The primary tech is automatically excluded from the checklist.
  • Equipment: Select the truck.
  • Disposal Site: Select the receiving facility.
  • Optional Measurements: pH level, temperature, odor, color.
  • Notes: Internal notes visible to office staff.

Click Create Manifest. The manifest is created with status Collected and you are redirected to the manifest detail page.

💡 Tip: To create a manifest pre-linked to a job from the dashboard, open the job detail page and click + Create Manifest in the Waste Manifest card. This automatically sets the job link on the new manifest.

Creating a Manifest On-Site (Tech App)

/tech/[jobId]/manifest/new

The on-site creation form is reached by tapping + Create Manifest in the Waste Manifest section of a job in the tech app. It is a stripped-down mobile form designed for fast entry at the curb.

Pre-filled from the Job

  • Customer name and property address (read-only)
  • Assigned technician (read-only)
  • Today's date (read-only)

Tech Fills In

  • Gallons Pumped (required) — large number input for easy mobile entry.
  • Waste Type (required) — tap buttons: Domestic Septage, Grease Trap, Holding Tank, Portable Toilet, Other.
  • Collection Time — pre-filled to current time, editable.
  • Truck — tap buttons. Auto-selects if only one truck exists.
  • Disposal Site (required) — tap buttons. Auto-selects if only one site exists.

Tap Create Manifest. The manifest is created with job_id set and the tech is redirected directly to the manifest detail page to record disposal and capture signatures.

📌 Note: Measurements (pH, temperature, odor, color) and additional notes can be added after creation from the manifest edit page. The on-site form only captures what the tech needs at the curb.

Multi-Technician Manifests

Manifests support a primary technician plus any number of additional technicians — the same pattern as jobs. The primary tech is stored directly on the manifest record; additional techs are stored in the manifest_technicians junction table.

  • Primary Technician: Required. The lead tech responsible for the manifest. Shown with an emerald Primary badge on the manifest detail page.
  • Additional Technicians: Optional. Shown with gray Additional badges. The primary tech is automatically excluded from the additional tech checklist to prevent double-assignment.

On the manifest detail page, the Equipment & Personnel card shows all assigned technicians with their role badges.

Statuses & Volume Reconciliation

CollectedIn TransitDisposedCompleted
  • Collected: Waste has been pumped and loaded. Starting status for all new manifests.
  • In Transit: Truck is en route to the disposal facility.
  • Disposed: Waste delivered to the facility. Gallons disposed recorded.
  • Completed: All paperwork complete. Record is closed.

SepticCycle automatically compares gallons pumped versus gallons received at disposal. If the difference exceeds 10 gallons, a red Volume Discrepancy alert appears on the manifest. Click the alert to review both figures and add a resolution note.

Recording Disposal

Open the manifest and tap / click Record Disposal. Enter:

  • Disposal Date — required.
  • Disposal Time — optional.
  • Gallons Disposed — required. Pre-filled from gallons pumped.
  • Authorization # — optional. The facility-issued acceptance number.

On the tech app, the Record Disposal modal uses sticky Cancel and Save buttons that always stay visible above the keyboard, regardless of how many fields are filled.

Signatures

Manifests have two signature slots on the tech app:

  • Technician Signature — the driver signs to confirm collection and delivery were completed.
  • Facility Signature (optional) — the receiving facility representative signs to confirm acceptance.

📌 Note: Customer signatures are not collected by technicians on manifests. The customer's signature for a pumping service is captured on the job (via the job's Signatures section) not the manifest. The dashboard manifest detail page shows two signature columns: Technician and Facility.

Each signature is captured on a canvas pad, timestamped, and stored. Facility signatures include a signer name field for the facility representative's name.

County Form Templates

/dashboard/manifests/forms

County Form Templates let you upload your county's required PDF manifest form, map each blank or checkbox field to a data source, and then auto-fill the PDF from any manifest's data with one click. The editor supports two field types: Text (writes a value at a position) and Checkbox (draws a symbol when the manifest data matches a specified value).

Setup: Upload and Configure a Template

  1. 1Go to Manifests › County Forms and click + Upload Form.
  2. 2Enter a form name and county (optional). Select your county's PDF and click Upload and Open Editor.
  3. 3The Form Field Editor opens — a full-screen canvas showing the PDF. Click Add Field, then click directly on the PDF where a text blank or checkbox appears.
  4. 4In the Properties panel on the right, set the Display Label (internal name only), choose Field Type (Text or Checkbox), and set the Auto-Fill From source.
  5. 5Drag the badge on the canvas to fine-tune position. Use the Position & Size inputs for precise PDF-point placement.
  6. 6Repeat for every field. Click Save Template.

Checkbox Fields

📌 Note: New in v53. Use for dump site selection, Commercial/Residential, Holding Tank Y/N, or any pre-printed checkbox on your county form.

A checkbox field draws a symbol at its position only when the manifest data matches the value you specify. If it does not match, nothing is drawn — leaving the box blank. Each checkbox in a group (e.g. Texas / White Marsh / Gwynbrook) is a separate field with the same Auto-Fill source but a different Match Value. Only one fires per manifest.

  1. 1Click Add Field and click directly on the checkbox on the PDF.
  2. 2In the Properties panel, click ☑ Checkbox in the Field Type row.
  3. 3Set Auto-Fill From to the source that determines which option applies — for dump site checkboxes use "Disposal Site Name"; for Commercial/Residential use "Source Type".
  4. 4Enter the Match Value — the exact text the source must equal for the symbol to be drawn. Comparison is case-insensitive. Example: White Marsh.
  5. 5Choose a Symbol: X (default), ✓ (checkmark), or ● (filled dot).
  6. 6Repeat steps 1-5 for each checkbox option in the group, using the same Auto-Fill source but a different Match Value each time.
  • Dump site group (3 checkboxes): Auto-Fill From = Disposal Site Name. Match Values = Texas, White Marsh, Gwynbrook.
  • Commercial / Residential: Auto-Fill From = Source Type. Match Values = Commercial, Residential.
  • Holding Tank Y/N: Auto-Fill From = Waste Type. Match Value for Y = Holding Tank. Match Value for N = Domestic Septage.

Linking a Template to a Disposal Site

Open a Disposal Site and select the template in the Linked County Form Template dropdown. Every manifest using that site will automatically offer that template for county form generation without requiring manual selection.

Generating a Filled County Form

On any manifest detail page, if a template is linked, a County Form card appears. Click Generate Form. SepticCycle fills every text field with the manifest's data and draws symbols at every checkbox position where the match condition is true. The completed PDF opens in a new tab. Click Regenerate Form any time if data was updated or the download link expired (links expire after one hour).

💡 Tip: Field positions use PDF coordinate space (PDF points, bottom-left origin). Drag badges to position them, then preview to verify placement before saving.

Manifests in the Tech App

/tech/manifests

The tech app has a dedicated Manifests tab (amber truck icon) in the bottom navigation bar. It shows all manifests assigned to the logged-in tech for the selected date, with a date navigator to browse other days.

Manifest List

  • Each manifest card shows the manifest number, customer name, status badge, gallons pumped, and the disposal site.
  • Tap any card to open the manifest detail.
  • A quick-action Call button appears for the customer's phone number.

Manifest Detail (Tech App)

  • Header: Amber background with manifest number, customer name, status badge, and gallons/waste type stats.
  • Pickup Details: Source address, collection date, time (shown as 12-hour format), source type, waste type, truck. All field values are displayed in dark, high-contrast text.
  • Disposal: Disposal site name and address, and a Record Disposal button when the manifest is not yet disposed.
  • Signatures: Technician Signature and Facility Signature (optional). No customer signature section.
  • County Form: If a template is linked, a Generate Form button appears.
  • Notes: Internal notes attached to the manifest.

Status Buttons

The tech advances the manifest through its lifecycle using large action buttons:

Mark In TransitRecord DisposalMark Complete

A manifest can be linked to a service job via the job_id field. Once linked, both the job and the manifest show each other's status.

On the Tech Job Detail

  • A Waste Manifest collapsible section appears in every job's content area.
  • If no manifest is linked: a "No manifest created yet" message and a + Create Manifest button appear. Tapping the button opens the on-site creation form pre-filled from the job.
  • If a manifest is linked: the manifest number, gallons pumped, and status badge appear, along with an Open Manifest → button.

On the Dashboard Job Detail

  • A Waste Manifest card appears in the right column (below Post-Completion).
  • If no manifest is linked: a "No manifest created yet" message and a + Create Manifest link to the dashboard manifest creation form with the job pre-populated.
  • If a manifest is linked: manifest number, status badge, gallons pumped, and technician name with a View Manifest → link.

📌 Note: Each job can have at most one linked manifest. If a pumping run produces multiple loads (unusual), create the additional manifests from the Manifests list page and link them manually by editing the manifest.

Technicians & Equipment

Technician Management

Sidebar › Jobs › Technicians › /dashboard/technicians

Each technician is a user account with Technician role access. Their profile stores:

  • Name, email, phone, and employee ID.
  • Hire date and status: Active, Inactive, On Leave, or Terminated.
  • Job Title: Optional free-text position label displayed in emerald beneath the technician's name on their card (e.g., "Lead Technician", "ATU Maintenance Technician", "Pump Truck Operator"). A dropdown provides 13 common suggestions but any custom value is accepted. Leave blank if not needed.
  • Certifications and licenses with expiration dates.
  • Skills and specializations.
  • Default working hours and days.
  • Hourly Rate Matrix [New in v35]: Five rate fields per technician — Customer (standard contracted rate), Non-Customer (prospect or one-off calls), Commercial (commercial accounts), Weekend (Saturday/Sunday), and Holiday (company or federal holidays). All five are configured in the technician edit modal. Leave any field blank if that rate type is not used.
  • Calendar Color: The color used to identify their jobs on the calendar. Each technician gets a unique color automatically. Change it by clicking Edit on their card.
  • Route Coverage: Controls which zones or routes this technician covers when zone scheduling runs. The edit modal has two modes. When the Assigned to All Routes toggle is ON (the default for new technicians), the tech covers every active zone — use the exclusion chip input to list any specific routes they should be skipped for. The tech card shows a green "All Routes" badge when no exclusions exist, or an amber "All Routes except N" badge when exclusions are set (click to expand). When the toggle is OFF, the tech covers only the specific routes selected via checkboxes — intended for companies with fixed dedicated routes. The auto-scheduler and zone scheduling cron both respect this setting when assigning technicians.
  • Working Days [New in v35]: Sun–Sat toggle buttons control which days a technician is available to be scheduled. Mon–Fri are selected by default. Smart Spread only places jobs on days when at least one zone tech is available — if all zone techs are off a given day, that day is skipped entirely for the zone. Configured per-technician in the edit modal.

First-Login Password Change [New in v23]

When a new technician account is created by an admin, the system sets a must_change_password flag on their profile. The first time the technician logs in to the mobile app, they are automatically redirected to a password change screen before they can access any jobs. This ensures every technician has a personal, secure password rather than a shared temporary one. Once changed, the flag is cleared and future logins go directly to the My Jobs screen.

PTO Accrual (per-technician) [New in v64]

When the company has PTO Accrual enabled (Settings → Payroll → PTO Accrual), each technician's edit modal shows an emerald PTO Accrual card. Four parts:

  • Current Balance: The technician's running PTO balance, color-coded green (positive), gray (zero), or red (negative). Negative balances are permitted and indicate the tech has used more PTO than they have accrued.
  • Adjust Balance button: Admin only. Opens a modal for recording a manual adjustment. Requires a non-zero hours delta and a required reason note. The note appears in the audit ledger forever.
  • Accrual Status checkbox: "Pause PTO accrual for this technician": When checked, this tech receives no monthly accrual regardless of company-wide settings. Useful for unpaid leave or one-off cases without changing employment status. The cron records accrual_skipped each month with the pause as the reason. Tech card list view shows a "⏸ Paused" amber badge.
  • Monthly Accrual Override (optional): Per-tech override of the company-wide rate. Leave blank to use company default. Enter a positive number (1 to 100) for a different rate. Setting to 0 directly is treated as blank — to pause, use the checkbox above.

Hire date and PTO accrual. The Hire Date field is required for PTO accrual to credit the tech. Techs with no hire date are skipped each month with a logged reason. An amber warning appears in the PTO Accrual card whenever hire date is missing. Set a hire date and the next monthly accrual run resumes crediting them. If the hire date is in the current month, the first month is automatically prorated.

Termination and PTO. Changing a technician's status to Terminated triggers a company-policy-driven ledger event. Forfeit policy zeros the balance and records a termination_forfeit ledger entry. Payout policy zeros the balance and records a termination_payout entry showing hours owed in the final paycheck (admin processes manually). The Status dropdown shows an amber hint with the consequence; a confirmation dialog appears before saving. Re-Activating a terminated tech does not restore the prior balance — the ledger entry remains permanent for audit.

Time Off (PTO) Management [Updated in v61]

Click Time Off on a technician's card in the Technicians list, or use the PTO / Leave button on the Job Calendar. Select the staff member (technician or office staff), enter Start Date and End Date, and optionally enter a Reason. PTO can be flagged as Paid or left Unpaid.

Paid vs. Unpaid PTO

The Paid PTO checkbox determines whether the entry flows into payroll. When checked, hours appear on the employee's timecard as a read-only reminder and are included in payroll exports. When unchecked, PTO still blocks the schedule and reassigns or pushes jobs, but is excluded from payroll totals. Unpaid is the default to preserve historical behavior for pre-existing PTO entries.

Paid PTO Debits the Technician's Balance [New in v64]

When Paid PTO is checked and the entry is for a technician (not office staff), the system computes the total hours covered (excluding weekends and holidays, multiplying by hours per day) and debits that amount from the tech's PTO balance. A pto_used ledger entry is recorded. Cancelling a previously-paid entry restores the hours via a pto_cancelled ledger entry. The PTO modal shows a live preview banner with the tech's current balance, the requested hours, and the projected balance after save. If the request would push the balance negative, the banner turns amber with a warn-but-allow message — the system permits the negative balance, but admins can verify with the technician before proceeding.

Partial-day PTO

When Paid PTO is checked, an optional partial-day section becomes visible with three fields:

  • Hours per day: Leave blank for a full 8-hour day, or enter a specific number like 4 for a half-day. Accepts quarter-hour increments. If the date range spans multiple days, this value applies to each day.
  • Start time: Optional. For partial-day entries, the time the employee starts being out. Informational only; does not affect hour calculations.
  • End time: Optional. For partial-day entries, the time the employee is back. Informational only.

Handling Affected Jobs

  1. 1Click Next to see any jobs that overlap the time-off period (technicians only).
  2. 2Choose Reassign (auto-assigns an available technician) or Push (moves jobs to the next available weekday).
  3. 3Click Confirm.

PTO List Display

Active and upcoming PTO appears below the form with color-coded badges:

  • 💰 Paid (emerald) or Unpaid (gray): matches the Paid PTO checkbox value.
  • Xh/day (indigo): appears when a partial-day hours value is set.
  • Active (amber): appears when today falls within the PTO range.
  • Jobs affected count: shown when any scheduled jobs were reassigned or pushed.

Weekend & Holiday Exclusion in Payroll

When a paid PTO entry is included in the payroll export, the system automatically excludes weekends (Saturday and Sunday) and federal holidays from the hour calculation. A 5-day Monday-to-Friday vacation counts as 40 hours; a Friday-to-following-Monday entry counts as 16 hours (Friday plus Monday only). Company custom holidays set in company settings are also excluded. This exclusion happens only in the payroll calculation; the calendar still displays the full PTO range including weekends.

Approved time off appears on the Job Calendar as striped OOTO blocks labeled with the reason regardless of paid/unpaid status.

Trucks & Vehicle Management

Sidebar › Jobs › Trucks › /dashboard/trucks
  • Vehicle name/number, make, model, year, VIN, and license plate.
  • Tank capacity in gallons.
  • Insurance and registration expiration dates.
  • Status: Active, Maintenance, or Out of Service.

Trucks are linked to manifests to track which vehicle transported each waste load.

Truck Detail Page [New in v54]

Sidebar › Inventory › Trucks (or Manifests › Trucks) › click any truck

Each truck has a dedicated detail page with two tabs.

  • Info tab: View and edit all truck fields — truck number, description, license plate, VIN, year, make, model, DOT number, inspection due date, pump type, pump capacity (GPM), status (Active/Inactive), and notes. An inspection alert banner appears in orange when the due date is within 90 days and in red when overdue. Edit Truck button is visible to Admin only.
  • Inventory tab: Shows all items currently loaded on the truck with their quantities. Items at or below their reorder threshold are highlighted in amber with a low-stock banner. The Recent Transactions section shows the last 50 movements involving this truck. The tab is lazy-loaded (data only fetches when first clicked). Refresh button (↻) reloads without leaving the page.

Disposal Sites

Sidebar › Disposal Sites › /dashboard/disposal-sites
  • Facility name, address, contact information, and operating hours.
  • Accepted waste types.
  • Fee Schedule: per-gallon rate, minimum fee, and/or flat rate.
  • Authorization number and expiration date.
  • Permit Number and permit expiry date.
  • Linked County Form Template: Select a county form template to automatically associate with all manifests disposed at this facility. When set, the County Form card on the manifest detail page pre-selects this template for one-click PDF generation.

Inventory

The Inventory module tracks physical parts and materials stored in your shop and loaded on each truck. It connects directly to the Items Catalog — any service item can have inventory tracking enabled, after which SepticCycle monitors stock levels, records every movement, and automatically deducts parts when a technician completes a job. Visible to Admin and Office roles only.

Sidebar › Inventory › /dashboard/inventory

Overview Dashboard

Sidebar › Inventory › /dashboard/inventory
  • Four summary cards: total tracked items, items below reorder threshold, active truck count, total stock movements.
  • Low-stock amber banner at the top listing all items at or below their reorder threshold.
  • Stock table with one column per active truck plus Shop and Total. Search by name or SKU.
  • Compact View toggle (visible when 4+ trucks): collapses all truck columns into a single On Trucks total.
  • Recent Transactions feed showing the last 20 movements. Job-linked transactions include a View Job link.

Manage Items

Sidebar › Inventory › Manage Items › /dashboard/inventory/items

Controls which catalog items are tracked in inventory.

  • Enable/disable tracking: Toggle the switch on any item. Optimistic update with automatic rollback on failure.
  • Bulk actions: The bulk action bar shows Enable N untracked and Disable N tracked buttons that operate on the currently visible (filtered) items only. Use search or the All / Tracked / Untracked filter first to target specific items. Operations batch in groups of 100.
  • Edit metadata: Click Edit on any tracked item to set Reorder Threshold (0 = no alert), Barcode (raw scanned UPC/EAN/Code-128 value — distinct from SKU), and SKU (your internal part number).
  • Disabling with stock: A confirmation dialog appears if the item has existing stock records. Records are preserved and reappear if tracking is re-enabled.

Receive Stock

Sidebar › Inventory › Receive Stock › /dashboard/inventory/receive

Adds quantity to the shop location when a supply order arrives.

  • Step 1 — Find item: Tap Scan Barcode to photograph the product barcode using the device camera (works on all browsers including iOS Safari). If the barcode matches a tracked item it is auto-selected. If no match, the Create New Item modal opens automatically with the barcode pre-filled. Or type in the search box to find items by name, SKU, or barcode value.
  • Step 2 — Enter quantity and notes: Quantity defaults to 1. Use +/− stepper or type directly. Notes field is optional (purchase order, supplier, delivery info).
  • Step 3 — Receive into Shop: Updates shop stock atomically. Success toast shows new shop total (e.g. "Received 12 × Riser Lid. Shop total: 18."). Form resets immediately for the next item.

Creating a New Item from the Receive Page [New in v54]

Click Create new item below the search box (or scan an unknown barcode) to open the full item creation modal. Equivalent to Add Item in Settings › Items Catalog.

  • Barcode lookup: When opened from a scan, the system automatically queries the UPC Item DB API to pre-fill Name, Description, and Retail Price. A status banner shows "Found: [product name]" or instructs you to fill in manually if not found.
  • Default markup: The Markup % field pre-fills from your company Default Markup setting (Settings › Items Catalog). Wholesale cost × (1 + Markup%) auto-calculates the Sell Price.
  • All catalog fields available: Name (required), Description, SKU, Barcode, Item Type (Product/Service), Wholesale/Cost, Markup %, Sell Price, Category, Revision Date, Active status.
  • After clicking Create Item: item is saved to the catalog, inventory tracking is enabled automatically, and the item is auto-selected in the receive form.

Transfer Stock

Sidebar › Inventory › Transfer › /dashboard/inventory/transfer
  • Moves stock between locations: shop to truck, truck to shop, or truck to truck.
  • Select From location first; To dropdown populates and automatically excludes the From location.
  • Both source and destination update atomically — no risk of partial transfers.
  • Success toast shows remaining quantity at source and new total at destination.
  • Stock can go negative (never blocked). Negative quantities shown in red on Overview indicate a discrepancy to investigate.

Adjust Stock

Sidebar › Inventory › Adjust › /dashboard/inventory/adjust
  • Sets a location's count to an exact number after a physical stocktake.
  • Live delta preview shows the change in real time (green for increase, red for decrease, gray for no change).
  • A Reason note is required for every adjustment — creates an audit trail.
  • The transaction log records the delta and new total alongside your note automatically, e.g. "Physical stocktake (+3, set to 8)."

Auto-Deduction on Job Completion

  • When a technician completes a job, SepticCycle automatically deducts job parts from the technician's default truck inventory. Runs silently — never blocks job completion.
  • Default Truck: Set in Settings › Team by clicking the Default truck dropdown on the technician row. Falls back to shop stock if no default truck is assigned.
  • Low-stock notifications: If any item's total drops to or below its Reorder Threshold after a deduction, an email is sent to all Admin and Office users.
  • Only parts whose service item has inventory tracking enabled are deducted. Untracked items are silently skipped.

Truck Inventory Tab

Sidebar › Inventory › Trucks › click any truck › Inventory tab
  • Shows all items loaded on the selected truck with current quantities.
  • Items at or below their reorder threshold are highlighted in amber; a low-stock banner lists affected items by name.
  • Recent Transactions: last 50 stock movements involving this truck (inbound and outbound).
  • Lazy-loaded — data only fetches when the Inventory tab is first clicked.
  • Refresh button (↻) reloads inventory data without leaving the page.

Company Settings

Settings is the centralized configuration hub for your entire SepticCycle account. Changes here set the defaults for all new records across the system.

Sidebar › Settings › /dashboard/settings

Billing & Payments Tab [Updated in v25]

Credit Card Processing Fee

  • Percentage Fee (%): Enter your fee percentage (e.g., 3.000%). This covers Stripe's 2.9% processing rate. The total customer surcharge is calculated as: (invoice × percentage) + flat fee.
  • Flat Fee ($): A per-transaction flat surcharge (default $0.32). This covers Stripe's $0.30 per-transaction fee plus a $0.02 platform fee. Combined with the percentage fee, this ensures your company receives the full invoice amount after all processing costs.
  • Fee Label: The text shown to customers on invoices (e.g., "Credit Card Convenience Fee").
  • Pass to Customer: Toggle on to automatically add the fee as a surcharge when customers pay by card. Toggle off to absorb the processing cost yourself. The Settings page shows a live example calculation so you can see exactly what customers will be charged at any invoice amount.

Other Billing Settings

  • Default Payment Terms: Net 30, Net 15, Due on Receipt, etc.
  • Accepted Payment Methods: Check, Cash, Credit Card, ACH, Venmo, Zelle. Controls which methods appear on invoices and which payment options customers see on the remote signing page. Enable only the methods your company actually accepts.
  • Late Fees: Configure a percentage, flat fee, or both for past-due invoices.

Invoices Tab

Invoice Header

The Invoice Header section controls what appears at the top of every PDF invoice and invoice email. State regulations require your license number, phone, and address on all invoices. Configure these in Settings › Invoices › Invoice Header.

  • Business Phone: Your company phone as it appears on invoices.
  • OSSF License Number: Your state-issued license number, required on all invoices.
  • OSSF License Number 2: Optional second license number (e.g. installer license).
  • Street Address, City, State, ZIP: Your company address shown on the invoice header.
Settings \u203a Invoices \u203a Invoice Header

Upload your company logo to display it at the top of all invoice emails sent to customers. The logo appears above your company name in every invoice email.

  1. 1In Settings › Invoices, scroll to the Invoice Header section. Click the dashed upload zone and select an image file.
  2. 2Supported formats: PNG, JPG, GIF, WebP, SVG. Maximum size: 2MB.
  3. 3After upload, a preview shows with Replace Logo and Remove buttons.
  4. 4Click Save Settings. The logo will appear in all future invoice emails sized to a maximum 64px height.

Numbering & Defaults

  • Invoice Prefix and Next Number: Customize numbering format (e.g., INV-1001). Auto-increments.
  • Default Due Days: Days from invoice date until due date.
  • Default Notes: Standard note on every new invoice (editable per invoice).
  • Invoice Footer: Text at the bottom of printed invoices.
  • Payment Instructions: Instructions for how to pay.

Contracts Tab

  • Contract Prefix and Next Number: Customize numbering (e.g., CON-1001).
  • Default Duration, Cancellation Notice, Auto-Renew Default, Renewal Reminder.
  • Representative Name and Email: Pre-fills the in-person signature modal for every contract signing.

Scheduling Tab

  • Business Hours: Start and end time for the workday.
  • Working Days: Toggle each day of the week on or off.
  • Default Service Duration.
  • Buffer Between Jobs: Minimum travel/transition time between consecutive jobs.
  • Company Timezone: Ensures all timestamps and notifications use the correct local time.

Minimum On-Site Time [New in v50]

Settings \u203a Scheduling \u203a Service Defaults

Set a minimum billable on-site time for Time & Materials jobs. If the total labor time is below this threshold, each technician's time is rounded up proportionally so the total reaches the minimum. Set to 0 to disable (default).

  • Setting the minimum: Enter minutes in the Minimum On-Site Time field under Service Defaults. Save Settings.
  • Tech behavior: The cost breakdown in the Complete Job modal reflects rounded-up time automatically.
  • Per-job override (admin/office only): A blue info box in the Complete Job modal shows the company minimum and allows entering a different value for that specific job. Leave blank to use the company default.
  • Applies to T&M jobs only. Fixed rate and maintenance jobs are not affected.

Invoice Review Workflow [New in v50]

Settings \u203a Scheduling \u203a Job Completion

When enabled, all invoices generated at job completion are held in draft status and require approval from an admin or office user before being sent to the customer. Cash payments bypass this gate.

Enabling Review

Toggle on Require Office Review Before Sending in the Job Completion section and save.

Tech Experience

  • Completion toast reads: "Invoice created. Held for office review before sending to customer."
  • Job detail page shows an amber Invoice Pending Office Review banner.
  • For maintenance jobs: amber Checklist Pending Office Review banner.

Office/Admin Review

  1. 1On the Jobs list page, select Pending Review from the Status dropdown to see all jobs awaiting review.
  2. 2Open the job. An amber banner confirms the invoice is held. A Review Invoice panel appears below.
  3. 3Edit any checklist fields if corrections are needed. Each changed field is logged to Internal Notes automatically.
  4. 4Click Approve & Send to Customer. Checklist edits are auto-saved before the invoice is sent.
  5. 5For maintenance jobs (no invoice), click Send Checklist to Customer to send the service record email with checklist PDF attached.

Internal Notes

Each field change during review is recorded as a Checklist Edit note in the Internal Notes section with the old and new values and the reviewer's name. Approval is recorded as an Approval note.

Zone Scheduling Settings [Updated in v34]

Settings › Scheduling › Zone Scheduling

The Zone Scheduling section controls how the monthly zone-based job auto-creation cron operates. See Section 7.8 for a full explanation of how zone scheduling works.

  • Enable Zone Scheduling: Master toggle. When off, the cron runs but creates no jobs.
  • Scheduling Mode: Manual — all jobs land on the 1st weekday of the month. Smart Spread — jobs are distributed across the month based on each contract's anniversary date.
  • Max Jobs Per Day: Used by Smart Spread. Sets the cap on jobs that can be placed on any single working day. Default: 6.
  • Apply to Frequencies: Which contract service frequencies trigger zone job creation. Supported: Monthly, Every 2 Months, Every 4 Months, Quarterly, Tri-Annual, Semi-Annual, Annual, Every 2 Years. As Needed and Custom are excluded (no fixed interval).
  • Zones: Define your geographic zones. Each zone has a name, a color (shown on the calendar), and a set of months when it is serviced. A live tech count badge shows how many active technicians are assigned to each zone — green if covered, amber if none assigned.
  • Tech assignment warnings [New in v34]: When Smart Spread is active and any zone has no assigned technicians, an amber warning banner lists the affected zones with a direct link to the Technicians page.
  • Month conflict warnings: If the same calendar month is assigned to more than one zone, a conflict warning appears showing which month and which zones overlap.

Holidays (Federal & Custom) [New in v37]

Settings › Scheduling › Holidays

The Holidays section at the bottom of the Scheduling tab controls which days appear as holiday markers on the job calendar.

Federal Holidays (Auto-Applied)

All 11 US federal holidays are computed automatically for the current and following year — no setup required. They appear as a read-only reference list. Badges display on the actual calendar date (e.g. July 4 always shows on the 4th regardless of which day of the week it falls on). Federal holidays are informational only and do not block scheduling.

Custom Company Holidays

  1. 1Select a date and enter a name (e.g. "Day after Thanksgiving").
  2. 2Click + Add Holiday or press Enter.
  3. 3Click Save Settings to persist.

To remove a custom holiday, click Remove next to it and save. Custom holiday badges appear on the calendar in the same red style as federal holidays.

Payroll Tab [New in v62]

Settings › Payroll

The Payroll tab configures the defaults used by the Payroll export on the Reports page and the pay-period math used by the Current and Previous Pay Period buttons. Two cards: PTO & Lunch Deduction Defaults and Payroll Frequency.

PTO & Lunch Deduction Defaults

  • Auto-deduct 30 minutes for lunch: When enabled, the Payroll export subtracts 30 minutes from any day where the staff member worked 8 or more clocked hours without marking Lunch Break Taken. Capped at once per day per staff member regardless of clock-in/out segments. Paid PTO hours do not count toward the 8-hour threshold. This checkbox sets the default state of the Payroll export toggle; individual exports can still flip it per run.
  • Full PTO day hours: The number of hours counted per day for a full PTO entry that does not specify its own hours-per-day. Typically 8 for a standard workday, 7.5 for half-hour-lunch businesses, or 10 for four-day workweeks. Supports quarter-hour increments. Range 1 to 24.

Payroll Frequency

Select how often you run payroll. Four choices: Weekly (every 7 days), Biweekly (every 14 days), Semi-monthly (two fixed pay days each month), or Monthly (calendar month). The Current Pay Period and Previous Pay Period buttons on the Payroll export use this setting to compute the correct date range.

Biweekly vs Semi-monthly — which should I pick?

These two options sound similar but behave very differently. Pick the one that matches how your payroll actually runs.

  • Biweekly pays every 14 days, rolling through the calendar. An anchor date of Monday January 6 produces pay periods on Jan 6, Jan 20, Feb 3, Feb 17, Mar 3, Mar 17, Mar 31, and so on. The same calendar dates almost never repeat across months. 26 pay periods per year. Choose this if you pay every other Friday (or any other fixed day-of-week on a 14-day cycle).
  • Semi-monthly pays on two fixed calendar dates each month. Pay days of the 7th and 21st produce pay dates Jan 7, Jan 21, Feb 7, Feb 21, Mar 7, Mar 21, and so on. 24 pay periods per year. Choose this if your pay dates are the same two calendar numbers every month (common examples: 1st and 15th, 7th and 21st, 10th and 25th, 15th and last day of month).

Weekly and Biweekly: Pay period anchor date

A date input labeled Pay period anchor date appears below the frequency dropdown when Weekly or Biweekly is selected. Enter any past pay period's start date as the reference point. Weekly periods are computed as anchor + 7N days; biweekly as anchor + 14N days. Example: an anchor of January 6, 2025 on a biweekly schedule means the pay period containing today is the Nth 14-day window past January 6 that covers today.

An amber banner reading "Anchor date not set" appears until a value is entered. Until the anchor is set, the Current Pay Period and Previous Pay Period buttons on the Payroll export are hidden. The other preset buttons (This Month, Last Month, Dashboard range, Custom range) still work normally.

Semi-monthly: Pay dates each month

Two number inputs labeled First pay day and Second pay day appear when Semi-monthly is selected. Each accepts an integer 1 to 28; the second must be greater than the first. The cap at 28 avoids month-end edge cases in February. With pay days of 10 and 25:

  • Period A: day 11 through day 25 of the current month.
  • Period B: day 26 of the current month through day 10 of the following month.

When today is exactly the first pay day (e.g. the 10th), today belongs to Period B (the period just ending today), not to Period A. An amber banner "Pay dates not set" appears while either value is empty. A red error banner "Invalid pay dates" appears if values are out of range or the second is not greater than the first. Save is blocked in either error state.

Monthly

When Monthly is selected, no anchor or pay-day inputs appear. A blue informational note explains that monthly payroll aligns with the calendar month, and the Payroll export's existing This Month and Last Month preset buttons already cover that case. The Current Pay Period and Previous Pay Period buttons are hidden for monthly companies to avoid redundancy.

Switching frequency without losing values

Changing the frequency does not wipe previously-entered anchor or pay-day values. Switching from Biweekly to Weekly retains the anchor date (both use the same field). Switching to or from Semi-monthly retains any previously-entered pay-day values so round-tripping works without re-typing.

PTO Accrual [New in v64]

Settings › Payroll › PTO Accrual

Below the Payroll Frequency card, the PTO Accrual card configures automatic monthly PTO crediting for active technicians. By default the feature is OFF. When enabled, a cron job runs once a month on the 1st (around 12:01 AM Central Time) and credits each active technician's PTO balance.

Configuration fields

  • Enable automatic PTO accrual: Master switch. When unchecked, the cron skips this company entirely and no balances change.
  • Monthly hours credit: Decimal between 0 and 100. Common values: 6.67 (≈80 hrs/yr), 10 (120 hrs/yr), 13.33 (≈160 hrs/yr). A live "≈X hours/year" preview appears next to the field.
  • Maximum balance cap: Optional. When a tech reaches this balance, accrual stops until they use some hours. Cron records an accrual_capped or accrual_skipped ledger entry.
  • Year-end carryover cap: Optional. On December 31, any balance above this is forfeited. Leave blank for indefinite roll-over. Check state labor laws (California prohibits forfeit for most employers).
  • Termination policy: Forfeit (default) or Pay out final balance. Drives ledger entry type when status changes to Terminated.

How accrual is computed

The cron runs at the start of each month. For every active technician with a hire date on file:

  • First-month proration: New hires hired during the current month receive prorated hours: (days remaining in month / total days in month) × monthly hours. A technician hired May 15 with 8 hours/month receives 17/31 × 8 = 4.39 hours for May.
  • Future-hire skip: Hire date in the future → no accrual. Cron records accrual_skipped with reason future_hire_date.
  • Missing hire date skip: NULL hire date → skipped with reason no_hire_date. Settings card shows a banner reminding admins to fill in hire dates on the Technicians page.
  • Cap-aware crediting: If Maximum balance cap would be exceeded, only the difference is credited. If already at cap, accrual_skipped with reason at_max_balance is recorded.
  • Per-tech override: Each tech's edit modal has an optional override that takes precedence over the company-wide rate.
  • Per-tech pause: Each tech's edit modal has a Pause checkbox that fully suppresses accrual without changing employment status.

The PTO ledger

Every accrual decision, paid PTO usage, manual adjustment, year-end forfeiture, and termination event is recorded as an append-only entry in the PTO balance ledger. Each entry stores event type, hours change, balance after, and a human-readable note. The ledger is never edited or deleted, only added to. The current balance shown on the Technicians page and the tech timecard always equals the running sum of ledger hours.

To correct a balance, use the Adjust Balance button on the technician edit modal (admin only). This writes a manual_adjustment ledger entry with your reason note and updates the balance accordingly.

Notifications Tab

  • Appointment Reminders: Toggle on/off and set how many days in advance reminders are sent.
  • Invoice Reminders: Toggle on/off and select which overdue intervals trigger reminder emails (7, 14, 30 days).
  • Renewal Reminders: Toggle contract expiration notifications and set the lead time.

Route Optimization Tab

  • Home Base Address: Your office or yard address — the starting point for all route calculations. Click Save & Locate to save and geocode.
  • Geocode All Properties: One-click batch conversion of all property addresses to GPS coordinates.
  • Geocoding Status: Shows the count of properties that are geocoded, pending, or failed.

Service Types & Pricing Mode [Updated in v39]

Settings › Service Types › /dashboard/settings/service-types

Service Types define the kinds of work your company performs. They appear in dropdowns when creating jobs, invoices, and checklists. Each service type has a name, description, base price, estimated duration, and a color for calendar display.

Pricing Mode

Each service type has a Pricing Mode toggle with two options:

  • 💲 Flat Rate: A fixed price per job. The base price auto-fills into the Quoted Price field when creating a new job. The price is shown in the service type list and in the job creation dropdown.
  • 🔧 Time & Materials (T&M): Final price is calculated from labor hours plus parts used. The job creation form shows "Estimated Price (optional)" with a note that the final price will be calculated from labor and parts. The service type list shows "Varies" instead of a dollar amount.

To change a service type's pricing mode, click the edit icon next to the service type, select the desired mode, and save.

Annual Maintenance Service Flag [New in v39]

Each service type has an Annual Maintenance Service checkbox. When enabled, jobs of that type use a no-invoice completion flow: the payment section is hidden, a blue “No charge for this visit” banner appears, and the submit button reads “Send Service Record.” If the tech adds parts with a price during the job, the standard payment flow is shown instead with an amber notice. Service types with this flag show a blue “🔧 Maintenance” badge in the list.

Hide Payment on $0 Jobs (Broadened) [New in v66]

As of v66, the hide-payment behavior described above also applies to any job whose Calculated Total comes to $0.00, even when the service type is not flagged Annual Maintenance. For example, a repair visit whose Final Price has been set to $0.00 because the work was covered by warranty will also hide the Payment Method block and show the "No Charge for this visit" banner. This prevents the credit card processing fee from being applied to a $0 invoice and avoids an unnecessary tap on jobs where no payment is owed. Setting Final Price above $0.00 restores the payment selector immediately.

Inspection Service Type Flag & INSP-XXXX Numbering [New in v61]

Each service type also has an Inspection checkbox. When enabled, jobs of that type automatically receive a system-generated inspection number in the format INSP-XXXX when completed. This is separate from the Annual Maintenance flag: a service type can be flagged as Inspection, Annual Maintenance, both, or neither.

What the Flag Controls

  • On job completion: If the completed job's service type is flagged Inspection, the system assigns an inspection number from your company's counter and writes it to the service record. The number appears immediately in the service history and on any compliance reports that include the record.
  • On CSV bulk import: When importing service records via the Import Records button on a customer's Service History tab, rows whose service_type matches a Settings-configured Inspection type are allocated inspection numbers in a contiguous block. Non-inspection rows in the same import get no number.
  • Counter source: The next number and the prefix (default INSP-) are both configured in company settings and are company-scoped. Each company has its own counter that advances independently.

Configuring the Flag

  1. 1Go to Settings and click the Service Types tab.
  2. 2Find the service type you want to flag (e.g., Camera Inspection, System Inspection, Drain Field Inspection).
  3. 3Click Edit.
  4. 4Check the Inspection checkbox.
  5. 5Click Save.

How the Flag Was Initially Seeded

The Inspection flag was automatically enabled for service types whose name contained the word inspection (case-insensitive) when the feature launched. If your company has inspection-style service types named differently (e.g., Annual Check, Compliance Review), they won't have been auto-flagged. You will need to manually check the Inspection checkbox for those.

📌 Note: A service type named Annual Pump-Out Inspection that is actually a pump-out service (not an inspection) should NOT be flagged Inspection, even though the word inspection appears in the name. If auto-seeding incorrectly flagged it, uncheck the Inspection checkbox to prevent pump-out jobs from consuming inspection numbers.

Counter and Prefix Customization

The inspection prefix (default INSP-) and the starting counter value are stored in your company settings. Contact support if you need to customize these (e.g., to start numbering from a specific value like 10000 to match an external numbering scheme you have been using).

Items Catalog [Updated in v54]

Settings › Items › /dashboard/settings (Items tab)

The Items Catalog is a centralized list of all products and services your company uses on jobs and invoices. Items are categorized as either 📦 Product (physical parts like pipes, fittings, pumps) or 🔧 Service (labor, inspections, contracts). Each item has a name, optional SKU, category, description, and customer-facing sell price.

Pricing Fields

Each item has three pricing fields in addition to the customer-facing Sell Price:

  • Wholesale / Cost: Your internal purchase cost. Never shown to customers.
  • Markup %: The markup percentage you apply over wholesale cost. When both Wholesale Cost and Markup % are filled, the Sell Price is calculated automatically and a green "Auto-calculated" badge appears next to it.
  • Revision Date: The date you last reviewed this item's pricing. Visible in the Rev Date column of the items table (shown on wide screens).

You can override the auto-calculated sell price at any time by typing directly into the Sell Price field — this clears the auto-calculated badge and your value is used as-is. The sell price is the only value shown on invoices and checklists.

Managing Items

  • + Add Item: Create items one at a time with name, type, category, SKU, sell price, wholesale cost, markup %, revision date, and description.
  • 📄 Import CSV: Bulk import from a CSV file. The importer auto-maps columns (Invoice Item Name, SKU, Item Type, Unit Cost, Unit Price, Description, Tags). Wholesale cost, markup %, and revision date are not set by CSV import — edit items individually after import.
  • 📋 Load Defaults: One-click load of 826 default products and services covering common septic industry parts, labor items, and equipment. Items already in your catalog (matched by name) are skipped.
  • Search & Filter: Search by name, SKU, or description. Filter by type (Product/Service), category, and active/inactive status.
  • Pagination: Items display 10 per page with navigation controls.
  • Active/Inactive Toggle: Click the status badge to toggle. Inactive items are hidden from job checklists but preserved for historical records.

Default Markup % Setting [New in v54]

Settings › Items › (above the filters bar)

The Default Markup % field appears above the item filters in the Items Catalog tab. Enter your standard markup percentage and click Save. This value pre-fills the Markup % field whenever a new item is created — whether through the Add Item button in Settings or through the Create New Item quick-add flow on the Receive Stock page.

  • Enter any numeric value (e.g. 25 for 25%).
  • Click Save — a "✓ Saved" confirmation appears briefly.
  • Leave blank to disable the default (markup field will be empty on new items).
  • This setting does not retroactively change existing items — only new items created after saving will use the default.

Service Type → Item Associations [New in v20]

Settings › Items › (scroll below catalog table)

Below the items catalog table, the Service Type → Item Associations section lets you link items to specific service types. Select a service type from the dropdown, then click + Add Items to search and add items from your catalog.

Default vs. Available

  • ✓ Default: Items marked as Default auto-load into the Parts & Materials section whenever a checklist for that service type is added to a job. Techs see these items pre-populated with their default quantity and catalog price.
  • Available: Items marked as Available can be added manually by techs but do not pre-load. Toggle between Default and Available by clicking the badge in the Pre-Load column.

You can also set a Default Qty per association — for example, always pre-load 2 chlorine tablets for aerobic service visits.

SMS Notifications

Settings › SMS › /dashboard/settings

SepticCycle can send automated SMS text messages to customers via Twilio. No Twilio credentials or phone numbers are needed — everything runs through the SepticCycle platform.

Enabling SMS

  1. 1Navigate to Settings › SMS.
  2. 2Toggle the SMS Enabled switch to ON.
  3. 3Save settings.

SMS Templates

Five built-in templates, each fully customizable with a live preview and 160-character counter. Available placeholder variables: {company_name}, {property_address}, {job_date}, {tech_name}, {eta}, {invoice_number}, {amount}, and {payment_link}.

TemplateWhen It SendsPurpose
Appointment Reminder24 hours before a scheduled jobReminds customer of upcoming appointment
En RouteWhen tech marks job as DispatchedAlerts customer technician is on the way
Job CompletedWhen job is marked CompletedNotifies customer work is done
Invoice Reminder7 and 14 days past duePrompts payment on overdue invoices
Job ScheduledWhen a new job is scheduledConfirms scheduling with customer

Customer Consent

SMS messages are only sent to customers who have a phone number on file and have SMS consent enabled. Manage consent per customer from their profile. Customers can also manage their own preferences by replying to any message:

  • STOP or OPTOUT: Unsubscribes from SMS notifications.
  • START or SUBSCRIBE: Re-subscribes after opting out.
  • YES (in reply to an appointment reminder): Automatically confirms the job.

Manual SMS

On any job detail page, use the Send SMS button to send a one-off message to the customer. Select a template or write a custom message. All sent messages are logged and visible in the SMS Log on the customer's profile.

SMS Log

Every SMS message is recorded with the message content, delivery status, timestamp, and type. View the log from a customer's profile page. Administrators can also send a test SMS from Settings › SMS to verify the integration is working.

Automated SMS Schedule

The automated SMS cron runs daily at 9:00 AM Central Time. It sends appointment reminder texts for jobs scheduled within the next 24 hours and invoice reminder texts for invoices at the 7 and 14 day overdue marks. Each customer receives at most one reminder per job and one per overdue invoice to prevent duplicate messages.

SMS Sender Number — Port Your Business Number

Settings › Notifications › SMS Sender Number

By default, outbound texts come from a shared number pool managed by SepticCycle. Porting your existing business phone number means every SMS your customers receive will show your familiar number — not an unfamiliar shared number.

💡 Tip: Customers are far more likely to open and respond to texts from a number they already recognize. Porting takes 5–15 business days and does not interrupt your existing phone service during the process.

Before You Start

Contact your current carrier's porting department (not general customer support) and confirm the following details are correct. Any mismatch between what you submit and what your carrier has on file will cause a rejection.

  • Account holder name (first and last) exactly as it appears on your carrier account
  • Business name (if the service is registered under your company)
  • Service address (street, city, state, ZIP — must be a physical address, not a PO Box)
  • Account number and PIN / passcode (required for wireless numbers)

How Number Porting Works

  1. 1Navigate to Settings › Notifications › SMS Sender Number and click Start Number Porting.
  2. 2Select your number type (Landline, Wireless, or Toll-Free) and account type (Business or Residential).
  3. 3Enter the phone number to port, your name as it appears on the carrier account, and the service address — each field must match your carrier's records exactly.
  4. 4For wireless numbers: enter your carrier account number and PIN or last 4 of SSN.
  5. 5Download, complete, and sign the Letter of Authorization (LOA) — see the Downloads section below. Upload as a PDF (max 4MB).
  6. 6Upload your most recent billing statement (within 30 days) as a PDF (max 4MB). It must show the account holder name, service address, and phone number being ported.
  7. 7Review and accept the terms acknowledgment — you must keep your number active with your current carrier until the port completes, and you are responsible for any early termination fees.
  8. 8Click Submit Port Request. SepticCycle submits the request to Twilio, who coordinates with your carrier. Processing typically takes 5–15 business days.

Once porting is complete, SepticCycle automatically activates your ported number for all outbound SMS. No further configuration is needed.

Port Request Statuses

StatusWhat It Means
DraftRequest saved but not yet submitted. You can still edit all fields.
SubmittedRequest sent to Twilio. Waiting for carrier acknowledgment and FOC (Firm Order Commitment) date.
ProcessingCarrier has accepted the request. Porting is in progress. FOC date shown if available.
CompletedNumber successfully ported. All outbound SMS now use your ported number.
FailedCarrier rejected the request. Common causes: incorrect account info, unpaid balance, VOIP number. See the failure reason and start a new request after resolving.
CancelledYou cancelled the request before completion.

📌 Note: ⚠️ VOIP numbers (Google Voice, Vonage, MagicJack, and similar services) cannot be ported. Standard landlines and cell phone numbers from AT&T, Verizon, T-Mobile, Spectrum, and similar carriers can be ported. Toll-free numbers can be ported but require additional verification after the port completes.

Letter of Authorization (LOA) — Downloads & Reference

Twilio requires a signed Letter of Authorization when you submit a port request. You can use either Twilio's official LOA form or the SepticCycle example LOA pre-written for septic service companies.

Downloads

The Twilio Official LOA is the standard form accepted for all port requests. The SepticCycle Example LOA is a pre-filled example for a fictional septic company (ABC Septic Services) showing exactly how to complete each field — use it as a reference when filling out the official form.

What to Enter on the LOA

FieldWhat to Enter
First Name / Last NameYour name exactly as it appears on your carrier account — not your preferred name, not a nickname. Check a recent bill.
Business NameYour registered business name if the phone service is under the company (e.g., "ABC Septic Services, LLC"). Leave blank if residential.
Service AddressThe physical address your carrier has on file. Must match exactly. PO Boxes are not accepted.
Phone Number(s)The number(s) you are porting, with area code. Format: (XXX) XXX-XXXX
Service ProviderYour current carrier name (e.g., AT&T, Verizon, T-Mobile, Spectrum)
Signature & DateSign with wet ink or a digital signature. Print your name. Date it.

Required Documents Summary

DocumentFormatNotes
Letter of Authorization (LOA)PDF, max 4MBSigned by the authorized account holder. Name and address must match carrier records exactly.
Recent Billing StatementPDF, max 4MBWithin the last 30 days. Must show account holder name, service address, and the phone number being ported.

📌 Note: ⚠️ The company name and address on the LOA must exactly match what your phone carrier has on file for your account. If they don't match, the carrier will reject the port request. Contact your carrier's porting department (not general customer support) to confirm the exact details before submitting.

Online Payments (Stripe Connect)

SepticCycle uses Stripe Connect so each company connects their own Stripe account. Customer payments go directly to your bank account — SepticCycle never holds your funds or has access to your money.

Connecting Your Stripe Account

Settings › Payments tab
  1. 1Navigate to Settings and click the Payments tab.
  2. 2Click Connect Stripe Account.
  3. 3You are redirected to Stripe's secure onboarding flow. Follow the prompts to verify your business identity, enter your bank account details, and agree to Stripe's terms of service.
  4. 4After completing onboarding, you are returned to SepticCycle. Your account status shows as Active with both Charges and Payouts enabled.

💡 Tip: Stripe requires identity verification for payouts. Have your business EIN and a government-issued ID ready.

Payment Settings

The Payments tab shows:

  • Stripe Connection Status (Active/Inactive)
  • Charges Enabled (whether you can accept payments)
  • Payouts Enabled (whether Stripe can send funds to your bank)
  • Stripe Dashboard link — opens your Stripe account to view transactions, manage payouts, and handle disputes.

How Payments Flow

  1. 1You send an invoice email to the customer (or share the payment link manually).
  2. 2The customer opens the link and clicks Pay Now.
  3. 3A secure Stripe-hosted payment form collects their card information.
  4. 4The payment is routed directly to your connected Stripe account.
  5. 5SepticCycle automatically records the payment, updates the invoice, and logs the transaction.
  6. 6Stripe deposits the funds to your bank account, typically within 2 business days. With default fee settings, your company receives the full invoice amount.

Refunds processed through Stripe are automatically reflected in the invoice balance in SepticCycle.

📌 Note: Stripe charges 2.9% + $0.30 per standard US card transaction. With the default card processing fee settings (3% + $0.32 flat), these costs are passed to the customer as a surcharge, ensuring your company receives the full invoice amount. A $0.01 per-transaction platform fee is retained by SepticCycle. You can adjust or disable the surcharge in Settings › Billing & Payments.

Sign & Pay Portal

The Sign & Pay Portal is a public-facing customer self-service feature. Prospective customers can browse your service plans, sign a contract, and pay a deposit or full balance online — without creating an account and without any involvement from your staff.

How It Works

When a prospective customer visits your public booking URL, they first browse your available service plans displayed as cards with name, description, price, deposit, and tax (if configured). After selecting a plan, they are guided through a four-step checkout wizard:

  1. 1Step 1 — Your Info: Full name, email, phone number, and property (service) address. Below the property fields, a Billing address is the same as property address checkbox appears. If left unchecked, a separate billing address form is shown and the Continue button stays disabled until the customer either checks the box or enters a billing street address.
  2. 2Step 2 — Review: The customer reviews their contact info, service address, billing address (if different), plan details, and pricing breakdown (Subtotal, Tax with your label and rate, Total).
  3. 3Step 3 — Sign: A digital signature pad. They sign with finger or mouse and tap the Sign & Pay button. The button displays the full tax-inclusive total.
  4. 4Step 4 — Pay: A secure Stripe payment form collects their card information. The total charged exactly matches the total shown on previous steps (tax-inclusive).
  5. 5Confirmation: A success screen confirms signup and a confirmation email is sent automatically to the customer and your team.

What Gets Created Automatically

  • Customer Record: New customer profile, including the billing (mailing) address. If a customer with the same email already exists, their existing record is left alone — only phone is refreshed, the billing address is never overwritten.
  • Property Record: A new property using the service address they provided.
  • Signed Contract: Created from your template with status Signed.
  • Invoice: For the deposit or full payment plus tax when configured. Marked as Paid immediately when Stripe payment succeeds. A separate tax line item is added when the selected plan has tax_rate > 0.
  • Email Notifications: Confirmation email to the customer and new customer notification to your team.

Setting Up Sign & Pay (Step by Step)

Settings › Sign & Pay tab

Prerequisites

⚠️ Prerequisites: Sign & Pay requires all three of the following before it can be activated: Stripe Connect configured in Settings › Billing & Payments, at least one Contract Template marked as Public Visible in Contracts › Templates, and your Company Name set correctly in Settings. Missing any one of these will prevent the portal from working.

  • At least one active contract template exists in Contracts › Templates and is marked Public Visible.
  • Stripe Connect is configured and active in Settings › Billing & Payments.
  • Company name and address are set in Settings.
  1. 1Enable the Portal: Go to Settings › Sign & Pay and flip the toggle to Active.
  2. 2Set Your URL Slug: Enter a unique slug (e.g., abc-septic). Your booking URL will be: septiccycle.com/book/abc-septic. Availability is checked in real time.
  3. 3Add a Welcome Message (Optional): Appears at the top of your booking page.
  4. 4Configure Your Public Plans: For each contract template you want to offer: toggle Public Visible ON, set the Deposit Type (Full Payment, Percentage, or Fixed Amount), write a Customer Description, optionally enter a Tax Rate (%) and Tax Label (see next section for details), and set Position on booking page (0 = first card).
  5. 5Save: Click Save Sign & Pay Settings. Your booking page is immediately live.

Configuring Tax on a Plan [New in v48]

Settings › Sign & Pay tab › expand a template

Each contract template can have its own tax rate. When a customer books that plan on your public portal, tax is calculated and added on top of the deposit or full payment, a separate tax line item appears on the auto-created invoice, and the Stripe charge captures the tax-inclusive total. Tax is configured per template, so you can set different rates for different plans.

⚠️ Percent, not decimal: The Tax Rate field expects a percent value. Enter 8.25 for 8.25% tax, not 0.0825. A DB CHECK constraint rejects negative values; zero means no tax is applied.

Tax Rate (%)

  • Stored as contract_templates.tax_rate numeric NOT NULL DEFAULT 0.
  • Accepts two decimal places (e.g., 7.00, 8.25, 10.50).
  • A small preview next to the field shows the exact dollar amount of tax that would be charged on this plan, so admins can verify before saving.
  • Leaving the field at 0 means no tax is applied and the template behaves exactly as it did before April 2026.

Tax Label (optional)

  • Stored as contract_templates.tax_label text NULL.
  • Free-form text (e.g., "Sales Tax", "GA State Tax").
  • Shown on the customer checkout breakdown and as the description on the tax invoice line item.
  • Falls back to "Tax" in the UI when left blank.

What the Customer Sees

On the public checkout page, when a plan has a non-zero tax rate the customer sees a three-line breakdown on every wizard step: Subtotal, the tax line with your label and rate (e.g., "Sales Tax (8.25%)"), and Total. The Sign & Pay button on the signature step shows the tax-inclusive total. The Stripe payment step charges the exact total shown. When the plan has tax_rate = 0, no tax breakdown appears anywhere in the flow.

What the Invoice Shows

The invoice created automatically at checkout contains two line items when tax is present: the deposit or full payment, and a separate line using your tax label with the computed tax amount. The invoice's subtotal, tax_amount, total, and balance_due fields all reflect the correct amounts. When tax is zero, only one line item is written and invoice behavior is identical to pre-April-2026.

💡 Tip: The tax rate is applied to whatever amount is collected at checkout. For a full-payment plan that means the full price. For a deposit plan, tax is calculated on the deposit only. If you collect tax on the remaining balance too, configure tax on the follow-up invoice in the customer's profile.

Billing vs Property Address [New in v48]

Sign & Pay captures two addresses separately. A property owner in Dallas may live in Austin; a property manager may pay from a corporate office in a different state. The property address is where service is performed; the billing address is where mail and invoices go. Both are stored on the correct record so the rest of SepticCycle (dispatch, invoicing, mailing) behaves correctly from the first checkout.

Customer Experience

  • On Step 1 of the wizard, customers fill in the property address first.
  • Below the property section, a checkbox labeled Billing address is the same as property address appears. It starts unchecked so the customer must explicitly confirm or differ.
  • If the customer checks the box, the billing form collapses and the billing address is copied from the property address on the server side.
  • If the customer leaves the box unchecked, they fill in a separate billing address (street, optional apartment/suite, city, state, ZIP). The Continue button stays disabled until they either check the box or enter a billing street, preventing accidental blank billing submissions.

Where Each Address Is Stored

  • Customer record (customers.address / address_line_2 / city / state / zip): billing address. Used when mailing invoices or contacting the customer.
  • Property record (properties.address / city / state / zip): service address. Used on the dispatch schedule, route optimization, and the map.

Existing Customers Are Never Overwritten

If a returning customer books a new plan through Sign & Pay using the same email address, their existing customer record (and billing address) is left alone. Only new properties, contracts, and invoices are created. This prevents a customer from accidentally wiping out their own billing address by typing something different on a later booking. If you need to update a customer's billing address after the fact, do it from the customer's profile in your dashboard.

Review Screen

Step 2 (Review) of the wizard shows a Customer card (name, email, phone), a Property card (service address), and — only when the billing address differs from the property address — a separate Billing Address card. When the customer checked "same as property," the Billing Address card is hidden to keep the review screen clean.

Sharing Your Booking Link

  • Add it to your company website as a "Sign Up" or "Get Started" button.
  • Print it on business cards, door hangers, flyers, yard signs, and truck decals.
  • Include it in email signatures and marketing emails.
  • Post on social media or in neighborhood apps.
  • Generate a QR code and print on physical marketing materials.

Troubleshooting Sign & Pay

Customers See "Page Not Available"

  • Verify the portal toggle is set to Active in Settings › Sign & Pay.
  • Confirm the URL slug saved correctly (green checkmark in the slug field).
  • Double-check the URL format: septiccycle.com/book/your-slug with no extra slashes.
  • Make sure you clicked Save Sign & Pay Settings after changes.

No Plans Appear on the Booking Page

  • Confirm at least one template has Public Visible toggled ON.
  • Verify each public template is also marked Active in Contracts › Templates.
  • Ensure each public template has a base price greater than zero.

Payment Step Fails

  • Verify Stripe Connect shows Active status in Settings › Payments.
  • For test environments: use Stripe test card 4242 4242 4242 4242 with any future expiration and any CVC.
  • Check Vercel function logs for the /api/book/checkout endpoint.

Customer Did Not Receive Confirmation Email

  • Check the Email Log in your dashboard to verify if the email was sent.
  • Ask the customer to check their spam folder.
  • Email is sent asynchronously and typically arrives within 1–2 minutes.

Tax Breakdown Does Not Appear on Checkout

  • Confirm the plan's Public Visible toggle is ON. The /api/book/plans endpoint only returns tax fields for templates marked public.
  • Check that Tax Rate (%) is greater than zero on the specific template the customer selected. Zero rate intentionally hides the tax line.
  • Clear the Vercel edge cache or hard-refresh the booking page (Ctrl+F5). Plan data is fetched server-side and may be briefly cached.
  • If tax is set on one template but not another, verify the customer is looking at the right plan — tax is per-template, not company-wide.

Repeat Customer's Billing Address Did Not Update

  • This is intentional. When a returning customer (matched by email) books another plan through Sign & Pay, their existing customer record is never overwritten.
  • If the customer genuinely needs their billing address updated, edit it from the customer's profile in your dashboard instead.
  • Only new properties, new contracts, and new invoices are created on repeat bookings. The customer record is preserved as-is (phone is refreshed if provided).

Route Optimization

SepticCycle includes built-in route optimization for daily technician scheduling. It converts property addresses to GPS coordinates and uses a nearest-neighbor + 2-opt algorithm to minimize total driving distance.

Initial Setup

Settings › Route Optimization tab

⚠️ Prerequisites: Route optimization requires a Home Base address set in Settings › Route Optimization. Without it, the optimizer has no starting point and cannot calculate any routes. Also run Geocode All Properties once before your first optimization — properties without GPS coordinates are excluded from route calculations.

  1. 1Set your Home Base: Enter your office or yard address and click Save & Locate. This is the starting point for all route calculations.
  2. 2Click Geocode All to batch-convert all property addresses to GPS coordinates. This is a one-time operation — new properties geocode automatically.
  3. 3Configure your Google Maps API key in Vercel environment variables as GOOGLE_DIRECTIONS_API_KEY.

Running Route Optimization

Jobs › Calendar › Day View
  1. 1Open the Job Calendar and switch to Day View for the date you want to optimize.
  2. 2For any technician with two or more jobs that day, a Route Optimizer panel appears.
  3. 3Click Optimize Route to preview the optimized job order. The panel shows a before-and-after comparison with total distance saved and a visual route map.
  4. 4Click Apply Route to accept. Jobs are reordered and suggested start times are assigned.
  5. 5Click Cancel to discard the preview without changes.

How the Algorithm Works

  • Phase 1 (Nearest Neighbor): Starting from the company home base, the algorithm visits the closest unvisited job next, building an initial route.
  • Phase 2 (2-Opt Improvement): Iteratively swaps pairs of route segments to reduce total distance until no further improvement is possible.
  • Distance Calculation: Haversine (straight-line) distances with a 1.3× road-distance multiplier to approximate real driving distance without requiring a routing API call.
  • Suggested Times: Arrival times are estimated based on distance between stops plus average stop duration from Settings.

Drag-and-Drop Rescheduling

  • Month View: Drag any job to a different day to change the scheduled date. Time conflicts are detected automatically.
  • Day View: Drag any job to a different time slot to change the scheduled start time. Changes save instantly.

Reports & Analytics

SepticCycle's Reports & Analytics dashboard is a full financial and operational command center covering revenue, profitability, cash flow, accounts receivable and payable aging, technician performance, customer lifetime value, and more — all with a consistent date range selector and CSV/PDF export on every tab.

Sidebar › Reports

Date Range & Filters

All report tabs share a date range picker at the top. Choose from: 7 Days, 30 Days, 90 Days, 12 Months, Year to Date, or All Time. Changing the period immediately refetches data for the active tab.

Revenue Tab

Total revenue collected vs. invoiced, collection rate, average invoice value, and an area chart of revenue over time. The chart groups by day (7d/30d), week (90d), or month (12m/ytd/all). A Year-over-Year toggle is available on 12 Months and Year to Date ranges — it overlays last year's revenue as a dashed line for direct comparison. Payment method breakdown and revenue by invoice tag appear below the chart.

Profit & Loss Tab

A full income statement for the selected period. Toggle between Cash Basis (revenue = payments received) and Accrual Basis (revenue = invoices issued). KPI cards show total revenue, total expenses, net income, and net margin. A monthly area chart with YoY overlay, a line-by-line Income Statement card, and a Tax Summary section (Schedule C preparation) with one-click CSV accountant export are all included.

Cash Flow Tab

Tracks actual money in and money out. Cash In reads each payment's method directly from the invoice record — Card, Cash, Check, ACH, Venmo, Zelle, and any other method you record are each shown as a separate line with a progress bar and percentage. Cash Out is sourced from expenses by category. Monthly bar chart with YoY toggle. Month-by-month table with a totals footer.

Financial Position Snapshot Tab

📌 Note: New in v53. Located between Cash Flow and Jobs in the tab bar.

A simplified balance-sheet-style view. Shows Accounts Receivable (all open invoice balances), Accounts Payable (period expenses as a payables proxy), Working Capital (AR minus AP), and Quick Ratio (AR ÷ AP). Also shows Overdue AR, Net Income for the period, active technician count, and fleet size. A blue disclaimer clearly labels this as a Financial Position Snapshot rather than a GAAP Balance Sheet. An amber context note explains which figures are all-time vs. period-filtered when a short range is selected.

Jobs Tab & True Job Profitability

📌 Note: Updated in v53 — full parts and labor cost breakdown added.

KPI cards for total jobs, completion rate, and total revenue. A bar chart shows scheduled vs. completed over time. A status pie chart uses distinct colors for every state. A collapsible Job Profitability panel shows the top 25 jobs by revenue with Revenue, Parts Cost, Labor Cost, Total Cost, Gross Profit, and Margin % columns. The header shows overall avg margin color-coded green/amber/red. Export CSV includes all profitability columns.

Technicians Tab & Utilization

📌 Note: Updated in v53 — utilization %, billable hours, and labor cost added.

Per-technician table with 11 columns including Utilization % (billable ÷ total clocked hours, color-coded ≥70% green / ≥40% amber / <40% red), Hours (billable/total), and Labor Cost. KPI cards include Total Labor Cost. Click a technician name to expand a drill-down with every job in the period.

Time Tracker Tab

Billable hours logged per staff member and per job. Flags out-of-range clock-ins and shows lunch compliance percentages. Expand any staff row for daily time detail.

Payroll Tab [Updated in v62]

Payroll breakdown per staff member for a selected date range, combining clocked work hours with paid PTO hours. Designed to produce the data you hand to your payroll provider each pay period.

Pay Period Selection

Six buttons cover all common payroll schedules:

  • Dashboard range: uses the date range active at the top of the Reports page. Good for ad-hoc period review.
  • Current Pay Period: the pay period containing today, computed from the company's configured payroll frequency in Settings › Payroll. Visible only when frequency is weekly, biweekly, or semi-monthly.
  • Previous Pay Period: the pay period immediately before the current one. Ideal for running payroll on pay day for the period just ended. Visible only when frequency is weekly, biweekly, or semi-monthly.
  • This Month: 1st through last day of the current calendar month.
  • Last Month: 1st through last day of the previous calendar month. Recommended for monthly payroll.
  • Custom range: arbitrary start and end via date pickers.

The currently effective range is always displayed below the buttons.

How Current and Previous Pay Period Are Computed

These buttons read the payroll frequency and anchor date (or semi-monthly pay days) set in Settings › Payroll, then compute the correct dates automatically. A weekly schedule with anchor date Monday January 6 produces 7-day periods starting every Monday. A biweekly schedule with the same anchor produces 14-day periods. A semi-monthly schedule with pay days 10 and 25 produces two periods each month: 11th through 25th, and 26th through 10th of the following month. See Settings › Payroll Tab for a full explanation of biweekly vs semi-monthly and how to configure the anchor or pay days.

Setup-Hint Banner

If payroll frequency is weekly or biweekly and no anchor date is entered in Settings, the Current Pay Period and Previous Pay Period buttons appear disabled (grey) with an amber banner underneath explaining the fix. A similar banner appears for semi-monthly companies that have not entered both pay days. The other preset buttons (This Month, Last Month, Dashboard range, Custom range) continue to work while the config is incomplete.

For monthly companies, the Current and Previous Pay Period buttons are hidden entirely, because This Month and Last Month already cover those date ranges. No setup-hint banner appears.

30-Minute Lunch Auto-Deduction

The Deduct 30 min if lunch not taken on 8h+ days checkbox applies the rule at the day level. 30 minutes is subtracted from the day total only when both conditions are true for that day: total clocked time is 8 hours or more, AND the technician did NOT mark Lunch Break Taken. The rule never applies to days under 8 hours. The rule never applies to days where lunch was already marked. A technician with split shifts in one day still receives at most one 30-minute deduction.

The checkbox default comes from Settings › Payroll. Individual exports can override by toggling the checkbox before viewing results.

Paid PTO Integration

Paid PTO entries overlapping the selected date range are automatically included. PTO hours are calculated as: number of overlap days excluding weekends and federal holidays, multiplied by hours per day (from the entry or the company default set in Settings › Payroll). Unpaid PTO is excluded entirely. PTO hours do NOT count toward the 8-hour lunch threshold: a technician who worked 4 clocked hours and took 4 paid PTO hours on the same day is NOT subject to the lunch deduction.

Table Columns

Eight columns per staff row:

  • Staff: name and role (technician or office).
  • Days: number of distinct days with clocked time.
  • Worked Hrs (after deduction): clocked hours, with any applied 30-min deductions subtracted.
  • Deduction: amber text like -0.50h (1d) when auto-deduction was applied that period; em dash when not applicable.
  • PTO Hrs: paid PTO hours in indigo, with day count like (2d). Em dash when none.
  • Total Paid: bold total = Worked Hrs + PTO Hrs.
  • Lunch Compliance: percentage of 8h+ days where lunch was marked, with a green/orange progress bar.
  • Out-of-Range: count of days with at least one out-of-range clock-in.

Click any staff row to expand a detail panel showing every clock-in/out segment for that person in the period. An amber left-border and -30m label mark any day where lunch deduction was applied. Paid PTO entries contributing to that person's total are listed at the top of the expanded view with date range, weekday count, and hours per day.

Summary Cards & Banner

Four cards above the table show Worked Hours, Paid PTO Hours, Total Paid Hours, and Lunch Compliance for the selected period across all staff. An amber banner appears when the deduction checkbox is on and at least one deduction was applied, listing total days affected and total hours deducted.

Exports

  • CSV: one row per staff member with nine columns — Staff, Type, Days Worked, Worked Hours (after deduction), Deduction Days, Paid PTO Hours, Total Paid Hours, Out-of-Range Days, Lunch Compliance %. Hand directly to a payroll provider or import into accounting software.
  • PDF: formatted report with company header, selected date range, summary statistics, and per-staff table. Suitable for printing or sharing with bookkeepers.

Customers & CLV Tab

Total customers, new this period, active contracts, and retention rate. A growth chart tracks cumulative customer count. A collapsible Customer Lifetime Value table shows total paid, outstanding balance, months active, revenue per month, and last invoice date per customer. Dormant customers (no invoice in 12 months) are flagged. The footer avg $/month is a correctly weighted average across all customer-months.

Receivables Tab

Outstanding invoice aging report with five clickable bucket cards: Current, 1-30 Days Overdue, 31-60, 61-90, and 90+. Click a bucket to filter the detail table. Sorted most-overdue first. Click any row to open the invoice.

A/P Aging Tab

📌 Note: New in v53. The payables mirror of the Receivables tab.

Expenses aged by days since incurred. Five clickable bucket cards: Current (0-30 days), 31-60, 61-90, 91-180, and 180+ Days. Each row shows Date, Category, Amount, and Age in days — color-coded gray/amber/orange/red by age. A category breakdown pie chart appears on the right. Export CSV with all columns.

Services Tab

Revenue and job count broken down by service type. Identify your highest-revenue and highest-volume service categories over the selected period.

Expenses Tab

Expense totals by category for the selected period.

Year-over-Year Comparison

📌 Note: New in v53. Available on Revenue, Profit & Loss, and Cash Flow charts.

A YoY toggle pill appears in the chart header of these three tabs. Click it to overlay the prior-year equivalent as dashed, semi-transparent lines on the same chart. The legend updates to show both years. On the Revenue tab, the toggle is restricted to 12 Months and Year to Date (daily/weekly granularity is not meaningful for year-over-year). On P&L and Cash Flow, the toggle is available on all non-all-time ranges.

Exporting Reports

  • CSV Export: Spreadsheet-ready file with all columns for the active tab. The Jobs tab CSV includes Revenue, Parts Cost, Labor Cost, Total Cost, Gross Profit, and Margin %.
  • PDF Export: Formatted report with your company header, date range, KPI summary, and data tables — suitable for printing or sharing with accountants and stakeholders.

Land Applications

Land application records track the beneficial reuse of treated septic waste applied to agricultural or approved land sites. This section provides regulatory documentation for the land application process.

Sidebar › Land Applications › /dashboard/land-applications

Creating a Land Application Record

/dashboard/land-applications/new

Click + New Land Application and enter:

  • Application Date and Site: The date and location where treated waste was applied.
  • Applicator: The technician who performed the application.
  • Volume Applied: Total gallons applied.
  • Waste Source: Originating property and customer.
  • Soil and Crop Information: Details about the land and any crops present.
  • Weather Conditions: Temperature, wind, and precipitation at time of application.
  • Regulatory Notes: Applicable permit numbers or regulatory references.

Managing Records

All land application records appear in a list sorted by date. Records can be filtered by date range and applicator. Each record can be viewed and edited. PDF exports are available for regulatory submissions and audits.

Mobile App for Technicians

SepticCycle includes a mobile-optimized web app built specifically for field technicians. It runs in your phone's browser and can be installed to your home screen for a native app experience using the Progressive Web App (PWA) standard.

Installing the App

  1. 1On your smartphone, open Chrome (Android) or Safari (iPhone) and navigate to your SepticCycle URL.
  2. 2Log in with your normal email and password.

Android (Chrome or Edge)

  • An install banner appears at the bottom of the screen. Tap Install, or tap the browser menu (three dots) and select "Add to Home Screen."
  • The SepticCycle app icon appears on your home screen.

iPhone (Safari)

  • Tap the Share button (the square with an upward arrow at the bottom of the screen).
  • Scroll down in the share sheet and tap "Add to Home Screen."
  • Give the app a name and tap Add.

Once installed, the app opens full-screen without browser toolbars. If you dismiss the install banner, it reappears after seven days.

My Jobs (Today's View) [Updated in v23]

The main screen shows a greeting with your name and today's date, quick stats (Remaining, Completed, and Total job counts for today), and all jobs assigned to you today sorted by priority: In-Progress first, then Dispatched, then Scheduled. Jobs where you are an additional technician (not just primary) now appear in your daily view as well. Use the left and right arrows to browse other days.

Auto-refresh: The view automatically refreshes its data whenever you switch back to the app from another tab or after backgrounding your phone. This means you always see the latest job status without needing to manually reload.

Each job card shows: route order number, status indicator, service type, customer name, property address, scheduled time, and estimated duration. Emergency jobs are flagged with a red border. Each active card has quick-action buttons to call the customer, open navigation, or send a text message.

Job Detail & Status Progression [Updated in v37]

Tap any job card to open the full job detail screen. The header color changes based on status: blue (scheduled), purple (dispatched), yellow (in-progress), green (completed). A large action button advances status:

  • Start Driving: Changes status from Scheduled to Dispatched. Records dispatch time.
  • Arrive On Site: Changes from Dispatched to In Progress. Records start time.
  • Complete Job: Opens the completion form.

Collapsible Sections

  • Property Details: Address, access instructions, gate code, and all tank information (58 fields, read-only).
  • Notes: Internal and customer-facing notes attached to the job.
  • GPS Check-In: Tap Check In when you arrive. GPS location, timestamp, and distance from property are recorded. Each tech on a multi-tech job checks in independently — your timer runs separately from other assigned techs. A "My Billable Time" section shows your running counter with individual time segments and a cumulative total. Use Pause/Resume to handle breaks. Tap Check Out when you leave.
  • Signatures: Capture arrival and completion signatures on the phone screen.
  • Service Checklists: Add one or more checklists to the job. Each checklist is a collapsible card with inspection fields and a Parts & Materials section. Default items auto-load based on the service type. Progress bar shows completion. [Updated in v20]
  • Photos: Take from camera or upload from gallery. Categorize as Before, During, After, Issue, or Other.
  • Customer Notes: View internal office notes and customer-facing notes attached to the job. Add your own field notes directly from this section — they are saved to the customer's profile and visible to office staff and other technicians.
  • Service History: Shows the last six completed service visits for this customer. Each visit card displays the service date, type, technician, and tank condition badge. Tap a card to expand it and see gallons pumped, sludge and scum depth readings, work performed, recommendations (highlighted in amber), completed checklist field data, and service photos. Gives you full context on the customer's tank history before starting work.

Advance Notice Banner [New in v37]

If the customer requires advance notice, an amber 🚩📞 Call Customer Before Arriving banner appears below the primary action button. It shows instructions from the office and a direct Call Now button.

No Access Button [New in v37]

A red 🔒 No Access button appears in the action bar when status is Scheduled, Dispatched, or In Progress. Tap it when you cannot access the property. The system updates the status, writes a note, alerts the office, and notifies the customer. The job stays as Scheduled so the office can reschedule.

Completing a Job on Mobile [Updated in v50]

When you tap Confirm & Invoice, the completion screen shows an itemized cost breakdown: Labor (each tech's name, hours, rate, and total), Parts & Materials (from checklists), or a Fixed Rate line. A green Calculated Total bar shows the sum. If a Minimum On-Site Time is configured in Settings, labor is automatically rounded up to meet the minimum before the total is shown. Below: Final Price (editable), Next Service Date, Additional Notes, and an optional Issue Report toggle.

Payment Method [Updated in v50]

Payment buttons are filtered by your company’s Accepted Payment Methods setting (Settings › Billing). Only the methods your company accepts appear. Bill Left on Site always appears regardless of settings. Select the method the customer is using:

  • Card: Invoice is emailed with a Pay Now link. Job becomes "invoiced."
  • Cash: Invoice is created as "paid" immediately. Job becomes "paid." No follow-up needed. The invoice email does not include a pay button or offline payment options.
  • Check: Invoice is created with a "check collected on-site" note. Job becomes "invoiced." A Check # input appears — enter the check number if available (optional). A 📷 Take Photo of Check button also appears. The invoice email does not include a pay button or offline payment options.
  • Bill Left on Site: Invoice is emailed with a Pay Now link (if email is on file) and SMS sent if opted in. A paper bill is handed to the customer. If no email is on file, an amber warning appears but the job can still be completed.

Invoice Review [New in v50]

If your company has Require Office Review Before Sending enabled in Settings, invoices are held in draft after completion and not sent immediately. The completion toast reads "Invoice created. Held for office review before sending to customer." The job page shows an amber Invoice Pending Office Review banner. For maintenance jobs (no invoice), the banner reads Checklist Pending Office Review. An admin or office user must review and approve from the dashboard before the customer receives the email.

A blue invoice preview box shows the customer's total including any card processing fee (service amount + fee = total). Checklist data (gallons pumped, sludge depth, etc.) is written to service records automatically. A green confirmation message shows the invoice number and the email address it was sent to (or confirms the job is pending review).

Schedule Tab [Updated in v23]

Tap the Schedule tab in the bottom navigation to see your jobs for the next seven days grouped by date. Each entry shows scheduled time, status dot, customer name, property address, and a quick link to open the job detail. The schedule includes jobs where you are assigned as an additional technician, not just primary. The tab auto-refreshes when you switch back to it from another app or tab.

Tips for Technicians

  • Take before and after photos on every job for documentation and liability protection.
  • Use GPS Check-In to prove arrival and departure times for billing and compliance disputes.
  • Always enter a final price on the completion form so the invoice generates and emails automatically.
  • Select the correct payment method — Cash marks the job as fully paid immediately; Card and Check leave it as invoiced for later collection; Bill Left on Site emails and texts the invoice (same as Card) and a paper bill is left on site.
  • If you find a problem during service, toggle the issue report on the completion form — the office will see it on their dashboard.
  • Get a customer signature at completion. They can draw on the screen or you can type their name.
  • The app requires internet. If you lose signal, complete your work and sync when back in range.

Timecard [New in v39, Updated in v61]

Tap the Timecard tab in the bottom navigation to log your daily hours. The timecard supports multiple clock-in and clock-out segments per day, so you can clock out between jobs and clock back in for additional calls or after-hours work without losing your earlier time.

  • Clocking In: Tap Clock In. Your GPS location is verified against your company's home base. Within 0.5 miles you clock in normally. Beyond that, a warning shows your distance with a Clock In Anyway option. Out-of-range clock-ins are flagged in amber and visible to your supervisor.
  • Paid PTO Today panel [New in v61]: If your employer has scheduled paid PTO for you on the current date, an indigo Paid PTO Today card appears above the clock-in controls. The panel shows hours scheduled, an optional reason, and an optional time window for partial-day entries. It is read-only. You can still clock in and log work on the same day for any hours you work alongside PTO — for example 4 hours of work in the morning plus 4 hours of paid PTO in the afternoon. PTO hours flow directly into payroll separately and do not count toward the 8-hour lunch threshold. If no paid PTO covers today, the panel is hidden.
  • PTO Balance widget [New in v64]: When your employer has PTO Accrual enabled, an emerald 🌴 PTO Balance card appears at the top of the timecard. The card shows your current balance (in hours), year-to-date accrued hours, year-to-date used hours, and a collapsible recent activity log of your last five PTO events with friendly labels (e.g. "Monthly accrual +8.0h", "PTO used -8.0h"). Status pills appear when relevant: "⏸ Accrual paused" when your accrual is paused, "Auto-accrual off" when your company has not enabled the feature, or "No hire date" when your hire date is missing (ask your admin to add it so the cron will start crediting you). The widget is read-only — to adjust your balance, contact your admin.
  • While Clocked In: A live timer shows total time worked today, including all prior segments from earlier in the day. Mark Lunch Break Taken when you take your 30-minute break. Once marked on any segment it applies to your whole day and locks. An alert appears automatically at 8 hours if lunch has not been marked.
  • Clocking Out and Back In: Tap Clock Out to end your current shift. If you are called back later in the day, tap Clock Back In to start a new segment. All segments are summed for your daily total.
  • Admin Timecard View: Admins and office staff can access Dashboard › Timecards to see all staff records. The Today view shows live working status for each person. History groups entries by date with individual segments, totals, lunch compliance, and out-of-range flags. Any entry can be corrected directly. The page also includes a My Time Today widget so admins and office staff can clock in for themselves without leaving the dashboard.

Team Management

Manage all user accounts for your SepticCycle workspace from one place.

Settings › Team › /dashboard/settings/team

User Roles

  • Admin: Full access to everything — customers, jobs, invoices, contracts, compliance, settings, billing, team management, and user administration (create, edit, reset passwords, delete users).
  • Office: Manage customers, jobs, invoicing, contracts, and compliance. Cannot access Settings, billing, or create/delete users. Can edit users and reset passwords from Settings › Team only.
  • Technician: Field-focused view with job details, checklists, photos, GPS check-in/out, and status updates. Cannot edit customer records, tank specs, or financial data. Technicians granted Field Office Access by an admin can switch into Office Mode from their Profile tab (see Field Office Access below).

Inviting Team Members

  1. 1Go to Settings › Team.
  2. 2Click Invite Team Member.
  3. 3Enter the person's email address and select their role.
  4. 4Click Send Invitation. They receive an email with a link to set their password and access the system.

Managing Existing Users [Updated in v38]

From the Team page, click the ⋯ menu on any user card to access:

  • Edit User — change the user's full name, email address, or role. Available to Admin and Office users. Changing email updates both the login credential and the display address. The user must log in with the new email going forward.
  • Reset Password — set a new password on behalf of the user. Available to Admin and Office users. Optionally check "Require password change on next login" to force them to set their own.
  • Manage Licenses & Certs — link to the Technicians page for license management (only appears for technician-role users with a linked technician record).
  • Delete User — permanently removes the login account. Admin only. The user's historical job and service records are preserved.

📌 Note: Office users can see the ⋯ menu and use Edit User and Reset Password. They cannot see the Delete User option or the New User button — those are Admin-only actions.

Field Office Access [Updated in v40]

Field Office Access lets specific technicians browse and edit customer records from the mobile app without a full office role. It is designed for senior techs or working foremen who need to look up customer history, update contact details, or verify site information while in the field.

  • Granting Access (Admin Only): Go to Settings › Team, open the Edit modal for a technician, and scroll to the Field Office Access toggle. Enable it and save. The toggle only appears for Technician-role users and is cleared automatically if the role changes.
  • Enabling Office Mode (Tech): Once access is granted, an Office Access toggle appears on the tech's Profile tab. Tap it to enable Office Mode. The app header turns blue, an Office Mode Active bar appears above the bottom navigation, and a Customers tab is added to the nav. Office Mode resets every time the app is closed, so the tech always starts fresh in standard Tech Mode.
  • What the Tech Can Do (Mobile): Search and browse all company customers. Tap a customer to view their info card, job history grouped by property and tank, full checklist field answers, notes (internal and customer-facing), and job photos. Edit the customer's name, phone, email, status, billing address, and advance notice settings.
  • Desktop Dashboard Access: On the Profile tab, tap Desktop Dashboard to switch to the full desktop view for the current browser session. The sidebar shows Dashboard, Customers, and Jobs only. All other sections are hidden. Within Customers, the Contracts and Invoices tabs are visible read-only with no create, edit, or delete actions. Tap ← Tech App in the sidebar or toggle Office Mode off to return to /tech.
  • Security: Desktop access requires both the session cookie and the DB-level secondary_role = office flag. A tech without the flag cannot reach the desktop dashboard even with a stale cookie. Revoking Field Office Access in Settings takes effect on the next page load.
  • Audit Trail: All customer edits made in Office Mode automatically generate an internal system note on the customer record showing the date, the tech's name, and exactly which fields were changed and what the old and new values were.

Alerts & Notifications

Overview

SepticCycle generates alerts and notifications in two forms: in-app dashboard alerts that surface actionable items when you log in, and outbound notifications sent automatically to customers or your own team by email and SMS. This section is a complete inventory of everything the system currently generates and what triggers each one.

📌 Note: Most outbound notifications can be toggled on or off — or have their timing adjusted — in Settings › Notifications. SMS requires the SMS toggle to be enabled and each customer to have SMS consent recorded on their profile.

Dashboard Alerts (In-App)

These widgets appear on the main dashboard and surface items that need your attention. They are passive — you see them when you log in, but the system does not send you an email or SMS when a threshold is crossed.

Services Due Widget

Lists every property whose Next Service Due date (calculated as Last Service Date + Service Interval set on the tank) is today or earlier, plus properties coming due within the next 30 days. The Quick Stats bar at the top of the dashboard shows a live count. Each row has an Add to Calendar button to schedule the job without leaving the widget. This is the primary mechanism for catching tanks that haven't been pumped in a long time — e.g. a customer whose 3-year service interval has elapsed.

Upcoming Renewals Widget

Shows contracts expiring soon. Toggle between 30-, 60-, and 90-day windows. The Quick Stats bar shows a Renewals Soon count for anything within 90 days. Click any contract row to open it and start the renewal process. The full Renewals Dashboard (Sidebar › Contracts › Renewals) breaks them into urgency buckets: Overdue (red), Next 7 Days (orange), and Next 30 Days (yellow), along with a Revenue at Risk total.

County Deadlines Widget

Displays pending county compliance submissions that have an upcoming or past deadline. Each row shows the county name, the linked contract, and the number of days until (or since) the deadline. The Compliance Dashboard (Sidebar › Compliance) gives a fuller view with an overdue count, a county-by-county summary sorted by urgency, and a Pending tab listing all contracts with unreported services that need attention.

Issues Dashboard

All open issues across all customers appear in the Issues list (Sidebar › Issues), color-coded by severity: Critical, High, Moderate, and Low. Open issues also surface on the individual customer's Issues tab and in the Open Issues count on their Info tab summary panel. Issues remain visible until they are resolved or deferred.

Manifest Volume Discrepancy

When a manifest is completed, SepticCycle automatically compares gallons pumped at pickup versus gallons received at the disposal facility. If the difference exceeds 10 gallons, a red Volume Discrepancy alert appears directly on the manifest record. Click the alert to review both figures and add an explanation note.

Automated Emails to Customers

The following emails are sent automatically to the customer's email address on file. All are logged in the Email Log (Settings › Notifications) with delivery status and timestamps.

TriggerWhat Sends
Job created (manual or via auto-scheduler)New job scheduled email with date, time, service type, assigned technician, and property address.
Job date or time changesRescheduled email showing the original scheduled time and the new time.
7 days before scheduled job7-day advance reminder with full job details and any pre-service instructions.
1 day before scheduled jobFinal confirmation reminder with job details and company contact information.
Invoice overdue 7 daysFirst overdue reminder with outstanding balance and a direct Pay Now link.
Invoice overdue 14 daysSecond overdue reminder.
Invoice overdue 30 daysThird and final overdue reminder. Stops automatically once the invoice is paid or voided.
Contract nearing expirationRenewal reminder email. Lead time is configurable in Settings › Notifications › Renewal Reminders.

💡 Tip: Configure which overdue intervals fire (7, 14, 30 days) and toggle reminders on or off individually in Settings › Notifications › Invoice Reminders.

Automated SMS to Customers

SMS notifications require the SMS toggle to be enabled in Settings › SMS and each customer to have SMS Consent recorded on their profile. All five templates are fully customizable with a live preview. Available placeholders: {company_name}, {property_address}, {job_date}, {tech_name}, {invoice_number}, {amount}, {payment_link}.

TemplateWhen It SendsPurpose
Job ScheduledWhen a new job is createdConfirms scheduling with the customer
Appointment Reminder24 hours before the scheduled jobReminds customer of their upcoming appointment
En RouteWhen tech marks job as DispatchedAlerts customer that the technician is on the way
Job CompletedWhen job is marked CompletedNotifies customer that work is done
Invoice Reminder7 days overdue, then again at 14 days overduePrompts payment on overdue invoices

📌 Note: Customers can reply STOP to unsubscribe or START to re-subscribe at any time. A customer who replies YES to an appointment reminder SMS will have their job automatically confirmed in SepticCycle.

Company / Owner Notifications

These notifications are sent to your company's admin users and company email address — not to the customer.

  • Contract Paid & Signed (green email): Sent when a customer completes the signing flow and pays by credit card. Confirms both payment and signature were received.
  • Contract Signed — Payment Pending (blue email): Sent when a customer signs but selects an offline payment method (check, cash, ACH). Clearly shows the selected method (e.g. "Check — Pending Collection") so you know to confirm receipt before countersigning.
  • Failed auto-charge notification: If an auto-invoice charge fails after all retry attempts, you receive a notification to follow up manually and the contract is flagged for review.

What Is Not Yet Automated

The following situations currently surface only as passive dashboard widgets — no outbound notification is sent to your team when the threshold is crossed:

  • Tank service overdue: A tank crossing its Next Service Due date appears on the dashboard Services Due widget, but no email or SMS is sent to your office. A proactive "overdue service" digest email to the company is a planned future feature.
  • County compliance deadline approaching: The County Deadlines dashboard widget shows upcoming deadlines, but the system does not currently send your office an email reminder when a submission deadline is near.
  • Issue severity escalation: Open issues are visible in the Issues dashboard, but the system does not send a notification if a Critical issue has been open for an extended period without a follow-up job.

💡 Tip: If any of the above would improve your workflow, use the thumbs-down on any response to send feedback to the SepticCycle team — these are actively considered for upcoming releases.

Quick Reference

Status Codes Summary

Invoice Statuses

DraftSentViewedPendingPaidPartialOverdueVoid

Job Statuses [Updated in v23]

ScheduledDispatchedIn ProgressCompletedInvoicedPaid

Additional: On Hold, Cancelled, Draft, No Access 🔒

Contract Statuses

DraftActiveSignedExpiredCancelledRenewed

Compliance Report Statuses

DraftGeneratedSubmittedConfirmedRejected

Issue Statuses

OpenQuotedApprovedResolvedDeferred

Manifest Statuses

CollectedIn TransitDisposedCompleted

Automated System Schedules

  • 6:00 AM UTC daily: Auto-invoice generation — checks all active contracts and creates invoices for contracts whose Next Billing Date is today or earlier.
  • 8:00 AM UTC daily: Overdue invoice reminders — sends email reminders for invoices at the 7, 14, and 30 day overdue marks.
  • 7:00 AM UTC daily: Appointment reminders — sends upcoming appointment reminder emails.
  • 8:30 AM UTC daily: Job scheduling email reminders — 7-day and 1-day advance job reminders.
  • 5:00 AM UTC daily: Auto job scheduler — creates upcoming service jobs from all active contracts within the 21-day lookahead window.
  • 1st of month, 7 AM UTC: Zone scheduling — creates jobs for all active zone contracts whose service months include the current month.
  • 9:00 AM Central daily: Automated SMS reminders for upcoming jobs (within 24 hrs) and overdue invoices (7 and 14 day marks).

AI Assistant

Overview

Every SepticCycle account includes a built-in AI Assistant powered by Claude. The assistant is available on every dashboard page and answers questions about how to use SepticCycle, explains workflows step by step, and provides guidance on Texas OSSF and TCEQ regulations. It is designed for new users getting started as well as experienced staff who need a quick answer without searching through documentation.

The assistant knows your current page when you ask a question. If you are on the Reports page and ask “what does accrual basis mean?” it will answer in the context of the reports dashboard. If you are on the Technicians page and ask “how do I set up zones?” it will give instructions relevant to that screen.

Accessing the Assistant

Look for the emerald circular button with a lightbulb icon in the bottom-right corner of any dashboard page. Click it to open the chat panel. The panel floats above the page content and does not interrupt your work.

  1. 1Click the emerald bubble in the bottom-right corner of any dashboard page.
  2. 2The panel opens above the button. If you have a prior conversation it resumes immediately.
  3. 3Type your question in the text box at the bottom of the panel and press Enter to send. Use Shift+Enter to start a new line without sending.
  4. 4Press Escape or click the X in the panel header to close.
  5. 5Click the trash icon in the panel header to clear the conversation and start fresh.

💡 Tip: The assistant is context-aware. Open it while you are on the page you have a question about for the most relevant answers.

Quick-Start Actions

When you open the assistant with no prior conversation, eight quick-action chips appear. Click any chip to send that question automatically — no typing required.

  • First-time setup — walks through the full company setup checklist with step-by-step instructions for every Settings tab.
  • Add a customer — explains how to add a customer, link a property, and add a tank.
  • Schedule a job — covers creating a job, assigning a technician, and the full job status flow from Scheduled to Paid.
  • Create a contract — explains contracts, service frequencies, e-signatures, and how auto-scheduling works.
  • Record a payment — covers recording cash, check, card, and other payment methods on an invoice.
  • Set up zones — covers zone scheduling configuration, tech route coverage, and automatic monthly job creation.
  • Receive inventory — explains the Inventory module including receiving stock, barcode scanning, transferring to trucks, and auto-deduction on job completion.
  • Run reports — describes the 13 report tabs and how to export data.

What the Assistant Knows

The assistant is trained on the full SepticCycle workflow including customers, properties, tanks, contracts, invoices, jobs, estimates, compliance reports, manifests, inventory, reports, and all settings. It covers every screen and feature documented in this guide.

The assistant reads from the same User Guide source that powers the downloadable Word document at the bottom of this page, so its knowledge is always in sync with the latest published documentation. New features and clarifications appear in the assistant's answers as soon as the User Guide is updated.

It also knows Texas OSSF and TCEQ regulations (30 TAC Chapter 285) including:

  • On-Site Sewage Facilities (OSSF): Permit requirements and the role of county Authorized Agents.
  • Conventional septic tanks: Minimum sizing rules (1,000 gallons for 1–2 bedrooms, 250 gallons per additional bedroom), pump-out frequency (every 3–5 years or when solids reach 30–40%).
  • Aerobic Treatment Units (ATU): Electricity requirements, mandatory maintenance contracts with licensed providers, and annual testing and reporting obligations.
  • Setbacks: Standard minimums of 50 ft from water wells, 5 ft from property lines, and 25 ft from surface water.
  • Installer licensing: TCEQ Licensed Installer and Designated Representative requirements.
  • Maintenance reporting: County affidavit submission requirements and consequences of non-compliance.

📌 Note: For all regulation questions, the assistant reminds you to verify with your local county Authorized Agent. County rules can be stricter than TCEQ minimums.

Knowledge Currency [New in v48]

The assistant's knowledge updates automatically whenever the SepticCycle User Guide is updated. There is no separate “train the assistant” step. When a new feature is added or an existing one is clarified in the documentation, the assistant picks up the change on the next deploy.

How to Check How Current the Assistant Is

Open the assistant and ask: “How current is your knowledge?” The assistant will reply with a date, for example: “My knowledge version is current as of April 19, 2026.” That date is the last time the User Guide was updated. If the date is recent, you can trust the assistant has the latest features.

If a Feature Seems Missing

If you read about a new feature in a release note or a support email but the assistant doesn't recognize it, the documentation hasn't been updated yet. Contact SepticCycle Support and we'll get the User Guide refreshed so the assistant can answer questions about it.

💡 Tip: Ask the assistant about a feature you know exists. If it confidently explains it, knowledge is current. If it says it doesn't recognize the feature, the User Guide may be lagging behind, and the support team can help.

Conversation History

Your chat history is stored in your browser and persists when you navigate between pages or refresh. It is specific to your company account — if two companies share a device, each company sees only its own conversation history. History retains the last 40 messages.

  • History survives page navigation and browser refreshes.
  • History is cleared when you click the trash icon in the panel header.
  • Clearing your browser storage (cookies/site data) also clears the assistant history.
  • History is stored locally in your browser only — it is not synced to other devices or other users at your company.

Tips for Getting the Best Results

  • Be specific. "How do I set up zone scheduling for monthly ATU contracts?" gets a better answer than "How do zones work?"
  • Ask follow-up questions. The assistant remembers the context of your current conversation. If it explains a workflow and you need more detail, just continue the thread.
  • Ask about regulations. "What are the Texas setback requirements for an ATU?" or "How often does a conventional tank need to be pumped under TCEQ rules?" will get detailed, sourced answers.
  • Use it for onboarding. New office staff and technicians can ask the assistant for step-by-step instructions on any task instead of searching through this guide.
  • Ask it why something is not working. "Why is the auto-scheduler not creating jobs?" or "Why can I not generate a compliance report?" will surface the most common root causes and fixes.

💡 Tip: The assistant is always available — even mid-workflow. You can ask a question, get an answer, close the panel, and continue exactly where you left off without losing your place on the page.

Need Help?

Can't find what you're looking for? Download our guides or reach out to our team.