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:
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.
- 1Navigate to septiccycle.com and click Sign Up.
- 2Enter your email address and create a strong password.
- 3Enter your Company Name. This appears on invoices, contracts, and customer-facing documents — enter it exactly as you want customers to see it.
- 4Click Create Account. You are taken directly to your dashboard. No email verification is required to begin.
- 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
- 1Navigate to your SepticCycle URL.
- 2Enter your email address and password.
- 3Click Sign In. You are taken directly to your dashboard.
- 4To sign out, click your initials at the bottom of the left sidebar and select Sign Out.
Your Free Trial and Adding a Payment Method
SepticCycle includes a 90 day free trial. No credit card is required to start, and a payment method can be added at any time during the trial. Adding it early does not start charges early. The first charge happens when the trial ends. [New in v128]
- During the trial: a banner at the top of the dashboard counts down the days remaining. It can be dismissed.
- Payment method already added: full access continues uninterrupted, the banner stops appearing, and the company is never asked to add payment again. Adding a card during the trial does not trigger an early charge.
- Trial expired with no payment method: the company can still sign in and view the main dashboard page. A red, non-dismissable banner explains the trial has expired. Every other dashboard route (Jobs, Invoices, Settings, and the rest) redirects back to /dashboard until a payment method is on file.
- Add Payment Method in the banner opens /subscribe, which lives outside the dashboard layout and stays reachable while locked. Full access is restored as soon as the subscription is confirmed.
- One subscription per company. An already-subscribed company that lands on /subscribe is redirected to the dashboard rather than being allowed to create a duplicate subscription.
📌 Note: A company that subscribes during its free trial keeps full access even after the trial end date passes. Access is decided by whether a Stripe customer and subscription are on file, not by the trial date alone. [New in v128]
Navigation Overview
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.
Follow-Ups Due Widget
Shows service records you flagged for follow-up whose follow-up date is today or in the next 30 days, plus any that are overdue, with overdue items in red. Click a row to open that service record, or select Mark Done to clear it. A View all follow-ups link opens the full Follow-Ups page. Available to admin and office users.
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
Your company name, address, and logo appear on every invoice, contract, and customer-facing document. Set these before creating any records.
- 1Navigate to Settings in the left sidebar.
- 2Enter your Company Name exactly as it should appear on documents.
- 3Enter your Address, City, State, and ZIP.
- 4Enter your Phone Number and Email.
- 5Upload your Company Logo — appears on invoices, contracts, and the customer portal. PNG or JPG, recommended 400×200px or wider.
- 6Click Save.
Step 2 — Invoice Settings Required
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.
- 1Click the Invoices tab within Settings.
- 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.
- 3Set your Invoice Prefix (e.g.,
INV). - 4Set your Starting Invoice Number. If migrating from another system, set this one above your last invoice number to avoid gaps.
- 5Set your default Payment Terms (e.g., Net 30).
- 6Add any standard Invoice Notes or Footer Text you want on every invoice.
- 7Click Save.
Step 3 — Contract Settings Required
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.
- 1Click the Contracts tab within Settings.
- 2Set your Contract Number Prefix (e.g.,
SC) and starting number. - 3Enter your Representative Name and Email — this pre-fills the company signature block every time you countersign a contract in the office.
- 4Enter your standard Terms & Conditions text. Pre-fills on every new contract.
- 5Click Save.
Step 4 — Define Your Counties Required for Contracts & Compliance
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.
- 1Navigate to Contracts › County Requirements in the sidebar.
- 2Click Add County for each county you service.
- 3For each county, set the submission frequency, submission method, deadline, and any contact information or portal URL.
- 4Save each county. They will now appear in the county dropdown when creating or editing contracts.
Step 5 — Add Technicians Required for Jobs
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.
- 1Navigate to Technicians in the sidebar.
- 2Click Add Technician and enter their name, phone, and email.
- 3Set their status to Active.
- 4Repeat for each field technician on your team.
Step 6 — Scheduling Settings Required for Auto-Scheduler
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.
- 1Click the Scheduling tab within Settings.
- 2Set your Company Timezone — this affects all timestamps, notifications, and the auto-scheduler.
- 3Set your Business Hours start and end time.
- 4Toggle your Working Days.
- 5Set the Default Job Duration in minutes and any Buffer Time between jobs.
- 6Click Save.
Step 7 — Connect Stripe for Online Payments Required for Online Payments & Sign & Pay
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.
- 1Click the Billing & Payments tab within Settings.
- 2Click Connect with Stripe and complete the Stripe onboarding flow.
- 3Once connected, a green Stripe Active indicator appears.
- 4Configure the Credit Card Processing Fee: set the percentage fee (default 2.9%), flat fee (default $0.30), and label. The percentage is capped at 3%, and card surcharges are automatically limited to 3% of the invoice (the card network maximum), so the fee a customer sees never exceeds 3% even on small invoices [New in v144]. Toggle Pass to Customer on to add the surcharge to card payments, or off to absorb the cost.
- 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.
- 1Navigate to Trucks in the sidebar and click Add Truck.
- 2Enter the vehicle name/number, make, model, tank capacity, and status.
- 3Save. Repeat for each vehicle.
- 4Navigate to Disposal Sites in the sidebar and click Add Disposal Site.
- 5Enter the facility name, address, accepted waste types, and fee schedule.
- 6Save. Repeat for each disposal facility you use.
Step 9 — Route Optimization Home Base Required for Route Optimization
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.
- 1Click the Route Optimization tab within Settings.
- 2Enter your Home Base Address (office or yard) and click Save & Locate.
- 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.
- 4Click Save.
Step 10 — Create at Least One Contract Template Required for Sign & Pay Portal
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.
- 1Navigate to Contracts › Templates in the sidebar.
- 2Click New Template and configure your most common service plan — services, pricing, duration, and terms.
- 3Toggle Public Visible on if you want this template to appear on the Sign & Pay portal.
- 4Save.
Step 11 — Notifications & SMS Optional
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.
- 1Click the Notifications tab within Settings.
- 2Review and adjust which events trigger customer emails.
- 3To enable SMS: toggle SMS Enabled to ON.
- 4Customize the five SMS templates to match your company voice.
- 5To show your business number on outbound texts instead of a shared number, click Port Number — see Section 13.10 for full porting instructions.
- 6Click Save.
Step 12 — Invite Team Members Optional
- 1Navigate to the Team section in the sidebar.
- 2Click Invite Member.
- 3Enter their email and assign a role: Admin (full access including Settings), Office (no Settings, billing, or team management), or Technician (mobile app only).
- 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
- Search: Type any part of a customer name, company name, email address, phone number, property address, city, zone, permit number, or customer ID (the CUST-XXXX badge or the raw number) to filter the list in real time. The search also looks across the properties on each customer record, so you can find a customer by any of their service addresses, not just their billing address. [New in v100]
- 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
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.
Service Location & Sortable Columns [New in v94]
The Property column on the Jobs, Service History, Contracts, Issues, and Invoices tabs shows the specific service location for each row. When the record is tied to a tank, it shows that tank's street address followed by the tank's Custom System Name in parentheses, for example 456 Service Road (North System). When there is no tank it shows the property address, and if neither is available it falls back to the customer's billing street, so the column is never blank.
- Contracts and invoices follow the tank. A contract created against a specific Tank / Site Location, and any invoice generated from that contract, shows that tank rather than the billing address.
- Issues and multi-tank properties. Issues, and contracts on a property with more than one tank, show the property address when there is no single tank to identify the location.
Sorting
Every column on the Jobs, Service History, Contracts, and Invoices tables is sortable. Click a column header once to sort ascending, click it again to sort descending, and click a third time to return to the default order (newest on top). Blank values always sort to the bottom. The default view is unchanged until you click a header, and sorting one tab does not affect the others.
Exporting Customer Data [New in v48]
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 administrators only [New in v93]; office and technician users no longer see it. 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/andphotos/properties/subfolders inside the ZIP, plus aphoto-manifest.csvindex 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]
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 Credits Tab [New in v76]
The Credits tab on the customer detail page tracks credit balances and credit history for each customer. Credits accumulate from overpayments and manual issuance, and can be applied to outstanding invoices to reduce what the customer owes.
When Credits Appear
- Overpayment auto-credit: When you record a payment that exceeds the invoice balance due, the overpayment automatically becomes a credit on the customer's account. You will see a soft-confirm amber banner during payment entry showing the overpayment amount.
- Manual issuance: Click Add Credit on the Credits tab and enter a dollar amount with optional notes. Use this for goodwill adjustments, prepayments, or any other reason to put money on a customer's account that is not tied to a specific invoice payment.
Viewing the Balance and History
The Credits tab shows the current credit balance in a tinted balance widget at the top. If the balance is positive, the widget is emerald-green; if zero, it is gray. The customer detail tabs row also reflects the balance in the Credits tab label (for example, "Credits ($25.00)" when there is money on account).
Below the balance widget, the Credit History table lists every credit event with date, amount (signed: positive for issuance, negative for application or refund), source type (overpayment, manual, refund, adjustment, applied to invoice), the user who created the entry, and notes. Entries are immutable; once recorded, they cannot be edited or deleted through the dashboard.
Adding a Credit Manually
Click Add Credit on the Credits tab. Enter the dollar amount and a note explaining the reason. Submit. The new entry appears in the history table immediately, the balance widget updates, and the tab label reflects the new total. The credit is now available to apply to outstanding invoices.
Applying Credit to an Invoice
The Apply Credit button on the Credits tab is enabled whenever the customer has a positive credit balance AND at least one outstanding invoice (invoices with a balance due greater than zero and not in void or cancelled status). If either condition is missing, the button is disabled and a tooltip explains why.
Clicking Apply Credit opens a modal with a scrollable list of the customer's outstanding invoices. Each row shows the invoice number, due date, current balance due, and a status badge. Select an invoice to apply credit to. The modal auto-fills the apply amount with the smaller of the credit balance or the invoice balance due. You can adjust the amount downward if you only want to apply part of the credit.
A live preview shows the post-apply credit balance and invoice balance side by side so you can confirm the math before submitting. Click Apply to commit. The invoice balance is reduced, a Customer credit applied line item is added to the invoice itself (so the invoice tells the credit story), and the Credit History table gains a new entry showing the negative amount applied.
Outstanding AR Banner
When the customer has BOTH a positive credit balance AND outstanding invoices, an amber Outstanding AR banner appears above the Credit History table showing the total outstanding balance and the number of unpaid invoices. This banner exists to prompt office staff to apply available credit toward open invoices rather than leaving both balances dangling. The banner disappears when either condition stops being true.
Automatic Credit Application via Cron
The auto-invoicing cron automatically applies available customer credit toward newly generated invoices before any Stripe charge happens. This works for all three cron sites: standard contract billing, monthly installment billing, and annual installment billing. If the customer's credit balance fully covers the new invoice, no card charge is attempted and the credit-applied amount is shown in the customer's email receipt. If the credit partially covers the invoice, the remaining amount is charged to the card on file (with the card fee calculated on the post-credit amount, not the original total). Customer credit is always applied before the card is charged, never after.
Refunding a Credit [New in v83]
Office and admin users can refund any positive credit row on the customer's ledger from the Credit History table. Refunds appear on the customer's account as a separate negative ledger entry that reverses the original credit in full and decrements the credit balance accordingly. The Refund button is visible only to users with admin or office roles, never to technician sessions, because this is a customer-facing money operation that requires elevated permissions.
Two refund methods are available. Stripe refund sends money back to the original payment method via Stripe, and is available only for credits that originated from a Stripe overpayment (source type: overpayment). The system looks up the original payment intent on the invoice that produced the overpayment and issues a Stripe refund against it, with metadata tagged so the Stripe Dashboard shows the refund linked back to the credit and customer for audit purposes. Manual reversal posts a negative ledger entry without involving Stripe, and is the right choice for goodwill credits being revoked, write-offs, manually-issued credits, or any situation where money should not be pushed back to a card. Manual reversal is available for all credit source types (overpayment, manual, adjustment).
To refund a credit, navigate to the customer's Credits tab, locate the credit row in the Credit History table, and click the Refund button in the Actions column on the far right. The button appears only on rows that are eligible for refund (see below). The Refund Credit modal opens with a summary of the credit being refunded, a refund method radio (Stripe option is disabled for non-overpayment credits with an explanation), a notes field for documenting the refund reason, a live balance preview showing the credit balance before and after, and a confirmation gate: type the word REFUND in uppercase to enable the Submit Refund button. The confirmation gate prevents accidental refunds from a misclick.
Click Submit Refund to commit. For Stripe refunds the system contacts Stripe first and writes the ledger row only if Stripe succeeds. The new refund entry appears in the Credit History table immediately, the balance widget updates, and the original credit row now shows a refunded badge so it is obvious which credit produced the refund.
A credit row is eligible for refund only if all three of these are true: the row is a positive issuance (negative rows like applied to invoice are debits, not credits, and corrections to those are made by adjusting the invoice instead); the row's source type is overpayment, manual, or adjustment (refund rows themselves cannot be refunded); and the row has not already been refunded (each credit can only be refunded once). If a credit row has already been refunded, the Refund button is replaced by a refunded badge in the source column.
If the Stripe API rejects the refund (card closed, account frozen, etc.), no ledger entry is written and the modal displays the Stripe error message. The credit balance is not affected. Retry is safe because Stripe uses an idempotency key derived from the credit ID, so a second attempt for the same credit returns the same refund result rather than double-refunding. In the rare case where Stripe succeeds but the database write fails, the modal displays a critical error message including the Stripe refund identifier so the operator can manually verify the refund in Stripe Dashboard. The refund will not be lost; retry is safe and will reconcile the ledger.
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
Merging moves all properties, contacts, contracts, invoices, and history from the source customer into the target customer. The source record is then deleted.
- 1Navigate to Customers › Merge.
- 2Search for and select the customer you want to keep (Target Customer).
- 3Search for and select the duplicate customer to merge in (Source Customer).
- 4Review the merge preview showing what will be transferred.
- 5Click Merge Customers to complete.
Bulk Customer Import
The import wizard guides you through bringing customers from another system into SepticCycle. It supports Excel (.xlsx) and CSV files and detects your source format automatically when you upload, so there is no software to choose first.
Step 1 — Upload your file [New in v93]
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. You no longer pick your previous software first.
Step 2 — Automatic format detection [New in v93]
SepticCycle inspects your column headers as soon as the file loads. If it recognizes a SAFE export (by characteristic columns such as InspPerYear, AeratorModel, and Contract Starts), it routes you to the automated SAFE preview with no column matching. Every other file — QuickBooks, Jobber, ServiceTitan, FieldPulse, Housecall Pro, or a custom spreadsheet — goes to the column-mapping step with the obvious columns matched for you.
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 common columns (Name, Email, Phone, Address, and now Mobile/Cell, Company, Tags, Lead Source, Customer ID, and septic details like Tank Size, Last Pumped, and Next Service). 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.
Fields the importer can capture [New in v93]
From a single file, the importer builds the full customer record and everything attached to it. Map any columns you have to these targets:
- Customer: name (or company name for business-only rows), individual vs company type, email, phone, a separate mobile or cell number, full address, tags or labels, lead source, and your old system Customer ID.
- Customer Since date: map a Date Added column to backdate when each customer was added; rows with no date use today.
- Property: the service address becomes a property under the customer.
- Tank: tank size, tank type, last pumped date, access notes, and next service date.
- Contract: a service frequency or interval column sets up the service agreement.
- Contacts & notes: extra contacts and leftover details (disposal type, tank material, and similar) are saved with the record.
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]
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
- 1Navigate to the customer's profile, then click the Service History tab.
- 2Click the green Import Records button in the top right.
- 3In the modal, make sure the CSV — Service Records tab is active.
- 4Drag and drop your CSV file, or click to browse.
- 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.
- 6Click the green Import X Records button to proceed.
- 7When the import completes, a confirmation screen shows the count of successful and failed records. Click Done.
- 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_inspectionflag is what drives numbering.
Add a Service Record Manually [New in v92]
The + Service History button on a customer's Service History tab lets you add a single service record by hand, without importing a file or completing a job. This is useful for logging a one-off visit, backfilling a record you missed, or recording work performed by an outside crew. The record is linked to the customer whose page you are on. The button and the create action are visible only to admin and office users.
Opening the Form
Open the customer, click the Service History tab, then click the green + Service History button to the left of Import Records. A modal opens with the same fields you see when editing an existing record, organized into Basic Info, Property and Tank, Service Details, Costs, Follow-up, and Work Notes.
Required Fields
- Service Date: the date the work was performed.
- Service Type: choose one of your configured service types, or pick Other (custom) to type a one-off label. The selected type is what drives automatic inspection numbering (see below).
- Property: choose which of the customer's properties the visit applies to. A property is required so the record always has a service location.
Technician
Pick a technician from your list of active technicians, or choose Other (custom) to type a name. Selecting a listed technician links the record to that technician record. Use Other for a former employee or an outside crew member who is not in your technician list. Leaving the field on Unassigned is allowed.
Property and Tank
After you choose a property, the Tank dropdown fills with that property's tanks. If the property has exactly one tank, it is selected for you. When a tank is selected, the Tank Type is taken from that tank and shown read-only. If you choose No specific tank, a Tank Type selector appears so you can record Conventional or ATU for a historical record that has no tank on file.
Automatic Inspection Numbering
If the Service Type you choose is flagged as an Inspection in your Settings (is_inspection = true), the saved record receives an automatic INSP-XXXX inspection number, exactly like a completed inspection job or a CSV import. A custom service type, or any type not flagged as an Inspection, receives no number.
Step-by-Step
- 1Open the customer, then click the Service History tab.
- 2Click the green + Service History button at the top right.
- 3Set the Service Date and choose a Service Type, or choose Other (custom) and type one.
- 4Choose the Property. Pick a Tank, or leave it on No specific tank and set the Tank Type.
- 5Choose a Technician from the list, or choose Other (custom) and type a name.
- 6Fill in any service details, costs, follow-up, and notes you want to record.
- 7Click Save Record. The modal closes and the service history refreshes to show the new row.
To attach photos to a manually added record, save it first, then click the new row to open the Service Record Detail view, where photos can be added.
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
- 1Open the customer record and click the Properties tab.
- 2Click + Add Property.
- 3If the service address matches the billing address, check Same as Billing Address to auto-fill.
- 4Enter Street, City, State, Zip, and County (free-text county name).
- 5Enter the Parcel Number if applicable (used for compliance reports).
- 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.
- 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.
- 8Set the Property Type: Residential, Commercial, or Industrial.
- 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.
- 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.
- 1Open the property detail page from the customer record.
- 2Scroll to the Property Photos section.
- 3Click the upload area or drag and drop image files (JPG, PNG, HEIC supported).
- 4Multiple photos can be uploaded at once. Each uploads immediately in the background.
- 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. Supported formats: JPG, PNG, PDF. Maximum file size: 25 MB per file.
Each diagram is saved with a type (Site Layout, Tank Location, Drain Field, Access Map, As-Built Drawing, Permit Drawing, or Other), an optional title, and an optional description. You can mark one diagram as the primary diagram for a property, and it appears first with a highlighted border.
Editing a Diagram [New in v115]
You can change a diagram's details after it is uploaded without re-uploading the file.
- 1Click the diagram thumbnail to open the viewer.
- 2Click Edit. The title and type become editable fields and a description box appears.
- 3Update the title, change the type, and edit the description as needed.
- 4Click Save to apply your changes, or Cancel to discard them.
💡 Tip: If you leave the title blank, the diagram is labeled with its file name instead. Editing only updates the title, type, and description. The uploaded file itself is never changed.
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
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), LPD (Low Pressure Dosing), Biogenerator, Grease Trap, Dosing Chamber, Pump Chamber, or Other. New tanks now default to ATU (Capacity switches to GPD and the Chlorine Required option appears). [New in v90]
- 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.
Equipment Install Dates [New in v70]
Two optional date fields on the tank let you record when individual equipment components were installed. These are separate from the tank install date itself and from the last pump replacement (which is a service event, not a component install). They are useful for warranty lookups when a customer asks "when was my pump put in?" or "is the aerator still under warranty?"
- Pump Install Date: The date the current pump was installed. Stamp this when you replace a pump in a pump tank or dosing tank. Future warranty lookups read from this field. Leaving it blank is fine — the field is optional, and most pre-existing tanks will have no value here because the information was tracked on paper invoices historically.
- Aerator Install Date: The date the current aerator was installed (aerobic systems only). Stamp this when you replace an aerator on an ATU. Independent of the pump install date — replacing one does not affect the warranty clock on the other.
Both fields are available on the Tank New, Tank Edit, Property New, and Property Edit pages. To populate the date, open the tank, scroll to the Pump / Dosing section (for pump install date) or the Aerator portion of the ATU / Operational section (for aerator install date), pick the date from the calendar picker, and Save.
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.
📌 Note: Tank Zone & Permit # [New in v113]: A tank's Zone and Permit # now appear in two read-only places — the Tank card on the contract detail page, and each tank row under the Properties tab on the customer detail page. The Zone shown is the tank's own zone when set, otherwise the property's Service Zone / Route, so custom route names display just like the cardinal zones (North, South, East, West). Permit # is read from the tank record. Tanks with no zone or permit on file simply omit those lines.
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.
📌 Note: Company customers on the contracts list [New in v104]: the Customer column now shows the business name as the primary line, with the contact person on a smaller line beneath it. You can find a company contract by typing either the business name or the contact name into the search box. Individual customers are unchanged and show the person's name.
Creating a Contract
⚠️ 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.
- Company Contract Fields (when a PDF template with office-fill fields is selected): A card appears below the template dropdown with an input for each Company Fill field configured on that template. Type the per-contract values (effective dates, permit numbers, custom notes, etc.) before saving. The values are persisted on the contract and can also be reviewed or edited from the countersign modal before activation. Leave a field blank to skip it. [New in v77]
- Choose a template, or opt out: If your company has active PDF contract templates, you must select a PDF template, or select a classic template, or check Contract should not use a template before the contract can be created. A classic template counts as a valid choice. If you skip this, a message appears at the top of the page and the page scrolls up to it so you do not miss it. This prevents creating a contract without its custom template by accident. [New in v127]
- 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.
Customer Search [New in v71]
The Customer field on the New Contract page is a search bar plus a filtered list. Type any part of a customer's name, email, or phone digits to filter the list. The phone search ignores punctuation, so typing (469) 882 or 469-882 or 4698823166 all match the same customer.
- Type to filter: The list updates as you type. The filter matches name, email, and phone simultaneously, so typing
johnfinds anyone whose name contains John, whose email contains john, or (rarely) whose phone notes contain john. - Click to select: Click a customer in the filtered list. The search bar populates with their name and the list hides automatically. The Tank / Site Location dropdown next to it becomes enabled and shows the tanks linked to that customer.
- Re-focus to re-open: Click back into the search bar to re-show the list. The filter stays applied, so you see the previously matched customers. Clear the search bar to see all customers and start over.
- Clear the search: Empties both the search input and the current selection, and re-shows the full list. Useful when you started on the wrong customer and want to switch.
- Pre-fill via link: If you arrive on the New Contract page from a customer-specific link (such as the "Create Contract" button on a customer's detail page), the search bar is pre-populated with that customer's name and the list is hidden, so you go straight to filling in contract details.
📌 Note: Zone cadence banners [New in v133]: When a contract's service frequency does not line up with its zone's service months, the New Contract form (at frequency selection) and the contract detail page show a short banner. An amber Zone Cadence Mismatch banner appears when the contract asks for more visits per year than the zone provides (for example, an every-2-months contract in a zone serviced 3 times a year), and states how many visits the zone will actually schedule. A blue Zone Scheduling Not Applied banner appears when the frequency is one zone scheduling does not cover, such as Monthly, so the contract keeps its own schedule instead. To service a contract on its own cadence, create a zone whose months match that frequency. The same note is also written to the contract's internal notes when it is activated. Also new: visit numbers on maintenance jobs now count continuously across years instead of restarting each service year, so the fourth visit reads Visit 4.
Contract Statuses
Contracts move through a defined lifecycle from creation to archive. Most transitions are automatic, and the system handles them without manual intervention.
Lifecycle
- Draft: You are still building the contract. It has not yet been sent to the customer.
- Sent: The contract has been emailed to the customer for signature. The customer has not signed yet.
- Signed: The customer has signed the contract. If the contract requires a deposit or payment up front, the system creates the invoice and waits for payment. Once payment is recorded, or if no payment is required, the contract automatically transitions to Active.
- Active: The contract is in force. Recurring jobs (if any) are being generated and scheduled automatically per your scheduling configuration.
- Expired: The end date has passed. The system transitions the contract from Active to Expired automatically at 6:30 AM UTC daily. Contracts marked for auto-renewal are excluded from this transition and follow the renewal flow instead (see Renewal Management below).
- Archived: Cleanup state for expired contracts. The system transitions Expired contracts to Archived automatically at 7:00 AM UTC daily, but only after the contract has been Expired for 30 days [Updated in v69]. This 30-day grace period gives you and your customers a visible "Expired" window for late renewal conversations and end-of-month reporting before the contract moves out of default views. Archived contracts remain in the database for compliance and reporting.
Other Terminal States
- Cancelled: You manually cancel a contract from the contract detail page. The contract leaves the active lifecycle and stops generating recurring jobs. Cancelled contracts are kept for reference and reporting.
- Draft and Sent: While in either of these two states, a contract can be deleted entirely from the contracts list. Once Signed, deletion is no longer available, and you should use Cancelled instead.
📌 Note: The automatic Active to Expired and Expired to Archived transitions ran for the first time across all tenants in May 2026. If your company had contracts whose end date passed before then, those contracts all transitioned on a single day. You can see the transition history on each contract's detail page. [New in v68]
Contract 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.
- 1Click + New Template.
- 2Enter the Template Name (internal use, e.g., "Annual Residential Pumping").
- 3Set the Default Duration, Default Price, and Services Included.
- 4Add any standard terms and conditions to pre-fill on new contracts.
- 5Toggle Active to make the template available for selection.
- 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
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.
Contract PDF Date Format [New in v71]
Contract PDFs now display all dates in MM/DD/YYYY format, replacing the previous spelled-out month style. For example, a contract that previously read May 20, 2024 now reads 05/20/2024. The change applies consistently across the entire contract PDF:
- Start Date and End Date in the Contract Details section.
- Signed dates on the customer and company signature lines.
- Generated on date in the footer of every page.
- Renewal reminder emails sent by the automated cron now use the same MM/DD/YYYY format in both the subject line and the EXPIRES callout.
- Contract activity log notes visible on the customer's activity feed (such as Contract signed by Cody on 05/15/2026) use the same format for consistency.
The change is rendering-only and applies to all newly-generated PDFs immediately. PDFs that were generated and stored before this change keep their original format. Re-generating a contract PDF (Contract detail page → Re-generate Final Contract PDF) refreshes the stored PDF to the new format.
Remote Signing, Payment Step [Updated in v66]
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 Contract Payment Methods setting (Settings › Billing & Payments). This is the customer-facing list and is separate from the Job Payment Methods list that controls what your techs see at job completion. The two lists are independent, so you can accept Venmo on customer-facing contracts but not at jobs, or vice versa.
- 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.
Your Add-On Selections Are Saved When You Choose Them [New in v121]
When a customer picks add-ons on a contract and continues to the payment step, those selections are now recorded immediately, before any payment is taken and before the signature. This means the selections are kept even if the customer pays and then closes the page before signing, so nothing is lost. It works for every payment method (card, cash, check, and bank transfer), and if the customer goes back and changes their selections before signing, the saved record updates to match the final choices.
The Signed Contract PDF Is Generated Reliably After Signing [New in v121]
Once a customer completes the signature, the filled contract PDF is produced and stored automatically, so your office and the customer have the finished document on file. You can also regenerate it at any time from the contract detail page (Re-generate Final Contract PDF).
Choose When a Contract's Remaining Balance Is Billed [New in v122]
Each contract, and each contract template, now carries a deposit remainder setting that controls when the balance left after the deposit is billed. There are three choices: automatically after the deposit (a daily job bills the remainder a couple of days after the deposit is paid — this is the default and matches the previous behavior), when the job is completed (the remainder bills the moment the contract's job is finished in the field or from the office), or manually only (the remainder is never billed automatically; you bill it by hand). Set the default on the Default Deposit card of a contract template, and change it on an individual contract from the contract detail page any time before it is billed.
The Contract Balance Can Bill When the Job Is Completed [New in v122]
For a contract set to bill on job completion, finishing the visit automatically bills the remaining contract balance — whether the job is completed from the office or by a technician on the mobile app. Because the contract covers the scheduled service check, the Complete Job screen shows a reminder to remove any covered lines at checkout; anything left on the job invoice bills the customer as additional work, separate from the contract remainder. If a covered line is left on by mistake it can double-charge, so the reminder banner is there to prevent it.
Cleaner Labor Lines on Invoices [New in v122]
A labor line now shows only its amount on the invoice page, the emailed invoice, and the invoice PDF. The hours and rate no longer print on those lines, so the customer sees a simple labor total. Your stored records keep the full quantity and rate for reporting; only the customer-facing display changes.
Your Logo and Brand Color on Every Customer Email [New in v122]
Your company logo and Brand Accent Color, set in Settings → Invoices, now appear at the top of every email a customer receives — invoices, receipts, estimates, appointment and job notices, contract and signing emails, and payment notices. Buttons and highlights use your accent color too, so all of your customer emails match your brand. A company that has not chosen an accent color sees the standard blue used on the invoice email and PDF.
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.
📌 Note: Itemized payment receipts [New in v108]: the Payment Received receipt emailed after you record an offline payment now lists each line item from the invoice (description, quantity, price, and amount) with a subtotal and total, matching the invoice itself, instead of showing only the amount paid. Invoices with no line items still show the amount paid as before.
📌 Note: Lower fees for bank (ACH) payments [New in v109]: customers paying online can now choose Bank account (ACH) instead of a card, and you can set a separate, usually lower Bank Payment Fee for those payments in Settings under Billing. When a customer pays by bank, the invoice shows a Bank Payment Fee line instead of the card fee, and the amount updates to match the method they pick before they pay. Bank payments take a few business days to settle, so they show as submitted and are marked paid automatically once the funds clear. Saved bank accounts now appear with the bank name and last four digits instead of as a card.
Renewal Management
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.
Automated Renewal Reminders [New in v69]
In addition to the manual ✉ Remind button described below, the system automatically sends one renewal reminder email per non-auto-renewing contract per lifetime. Automated reminders fire daily at 14:30 UTC (9:30 AM Central, 7:30 AM Pacific). The system finds all active contracts that are not set to auto-renew, whose end date falls within the next 60 days, and that have not yet received their automated reminder, then sends a single email to the customer of record on each one.
The automated email is branded as {Your Company} via SepticCycle so customers recognize their relationship with you. The email body includes the contract number, end date, days remaining, and your company contact information (phone and email pulled from Settings → Company Profile). Customers who want to renew contact your office using the phone or email shown in the email footer. They do not click a renewal link in the email; the renewal conversation happens by phone or in-person, and office staff use the Renew button on the Renewals page to create the new contract.
Each contract receives only one automated reminder. Once the automated email has been sent, the contract is permanently excluded from future automated runs. You can still send manual reminders via the ✉ Remind button at any time, even after the automated reminder has already gone out. If a customer reports they did not receive their first automated reminder (lost in spam, technical issue), contact support to re-queue the contract.
Auto-renewing contracts skip this flow entirely. They follow the auto-renewal path described in the Auto-Renew Section below.
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.
Renewing Soon and Expiring Soon Status Cards [New in v76]
The Contracts page in the dashboard shows a row of seven status cards above the contract list. These cards summarize the current state of your active contracts at a glance. Two of those cards specifically surface contracts that are ending within the next 60 days, split by whether the contract is set to renew automatically.
Renewing Soon (Green)
The Renewing Soon card counts active contracts that have auto-renewal enabled AND have an end date within the next 60 days. These contracts will renew themselves on their end dates without any office action required. The number on the card represents future revenue that is already locked in.
Click the Renewing Soon card to filter the contract list below to just these contracts. This is useful for verifying that auto-renewal is set up correctly on the contracts you expect to renew, and for catching any contracts where the customer needs to be informed of the upcoming renewal charge before it happens.
Expiring Soon (Amber)
The Expiring Soon card counts active contracts that do NOT have auto-renewal enabled AND have an end date within the next 60 days. These contracts will end on their end dates unless office staff manually create renewal contracts. The number on the card represents action items: contracts that need outreach, a renewal conversation, and a new contract generated before the end date arrives.
Click the Expiring Soon card to filter the contract list to just these contracts. From there, click into each contract individually to renew it, or use the Renewals page for batch renewal operations.
The Two Cards Together
Renewing Soon and Expiring Soon together give you a complete view of your 60-day renewal pipeline. Renewing Soon is revenue that requires no action; Expiring Soon is revenue that requires action. The cards are color-coded to reinforce this distinction: green for revenue locked, amber for action needed.
The Renewals page is the workflow surface where you act on the Expiring Soon contracts. The Contracts page status cards are the awareness surface where you see the pipeline at a glance.
Differences from the Renewals Page Buckets
The Renewals page shows expiring contracts in four urgency buckets (Expired, 0-30 Days, 31-60 Days, 61-90 Days) covering a 90-day window. The Contracts page status cards show a 60-day window only. The two surfaces serve different purposes: the Renewals page is for working through the renewal backlog, the Contracts page cards are for the dashboard summary.
The Renewing Soon card is unique to the Contracts page; the Renewals page does not show auto-renewing contracts because they do not need office action.
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
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
- 1Navigate to Contracts › Templates in the sidebar and click Upload PDF Template.
- 2Select your PDF file and click Upload. SepticCycle analyzes the document and detects fillable blanks.
- 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 on a per-contract basis. When you create a new contract and select this template, a Company Contract Fields card appears with an input for each Company Fill field. The values are saved with the contract, can be reviewed or edited from the countersign modal before activation, and appear on the generated PDF. Useful for effective dates, permit numbers, or any value that changes from one contract to the next. [Updated in v77]
- 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 the date the customer signs the contract, shown in your company time zone. On template preview (no signature yet) it shows today's date. [Updated in v87]
- Ignore: Marks a detected field as not used. Ignored fields are skipped entirely during fill and do not appear on the signing page.
On templates built from a PDF without fillable form fields, each field box width controls how much text appears, so size address and email boxes to fit long values. Long values shrink to fit their box automatically, and widening the box keeps text at full size. On templates whose PDF already has fillable form fields, the box width is only a guide and the embedded form field controls the text. [New in v87]
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."
Saved Card and Add-Ons at Signing [New in v85]
On the Pay page, the Pay Year 1 and Monthly Installments options keep the customer's card on file so future contract payments can be charged automatically. The payment step shows a locked "Card saved for future contract payments" notice on these plans. It is required, not an optional checkbox, and the same wording is used for both annual and monthly plans (it previously read "next year's installments" even when the customer chose monthly). The Pay Full Contract and one-time payment options do not save a card.
📌 Note: A contract is finalized only after the customer completes the signature step [New in v106]: payment and signature are separate steps, and the payment is collected first. If a customer pays but closes the page before signing, the payment is still received and their card is saved on file, but the contract stays in Sent status and the monthly or annual plan is not set up until the signature is completed. When you see a paid contract that still shows Sent, follow up with the customer to finish signing, or complete it on your end.
Any paid add-ons the customer selects are collected in full today on every payment plan, including Pay Year 1. The amount due today on the Pay page reflects the year 1 (or first monthly) amount plus the full add-on total, and the card fee is calculated on that combined amount.
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).
How Contracts, Service Types, and Checklists Connect [New in v78]
SepticCycle uses three core objects that work together: Contracts, Service Types, and Checklist Templates. Understanding how they relate will help you set up recurring work, generate accurate invoices, and ensure technicians always see the right inspection form. The step-by-step setup is covered under Checklists and Inspections; this section explains how the pieces relate.
The Central Hub: Service Type
The Service Type is the most important piece. It defines:
- What work is performed (for example, Annual ATU Service, Septic Pump Out, or Camera Inspection).
- Pricing defaults: a base price and a pricing mode (Fixed or Time and Materials).
- Estimated duration, used by the scheduler.
- Default invoice tag, automatically applied to any invoice created from this service.
- Optional linked Contract Template, used as a pre-fill when creating new contracts.
Contracts Link to Service Types
When you create a contract, you choose (or the system defaults) a Service Type. This link does three important things:
- Drives automatic job creation. The scheduler uses the contract's Service Type plus frequency (monthly, quarterly, annual, and so on) to know when to create future jobs.
- Determines billing. After the contract is signed, pricing lives on the contract record itself. The Service Type's base price is used only as a starting point at contract creation.
- Attaches the correct checklist. When a job is created from the contract, SepticCycle looks at the Service Type and automatically loads any Checklist Templates linked to it.
Checklist Templates Link to Service Types
Checklist Templates point to Service Types (a one-way relationship).
- In the Checklist Template editor, you assign it to one or more Service Types.
- When a technician starts a job that matches that Service Type, the checklist automatically appears.
- You can link multiple checklists to the same Service Type if needed (for example, a standard inspection plus a separate sampling checklist).
This is why technicians almost always see the correct form: the connection flows through the Service Type.
Visual Summary of the Relationships
Service Type
|-- Pricing defaults & default invoice tag
|-- Optional linked Contract Template (creation pre-fill)
+-- Linked Checklist Templates (auto-attach to jobs)
Contract
+-- Chooses a Service Type
|-- Controls recurring job generation
|-- Owns final pricing after signing
+-- Triggers correct checklist(s) on jobs
Job (created from Contract)
+-- Inherits Service Type, then auto-loads matching Checklist(s)💡 Tip: Create your Service Types before creating contracts or checklists, since both connect through the Service Type. Use clear, consistent names (they appear on jobs, invoices, and reports), link checklists to Service Types rather than to individual contracts, and set a default tag on each Service Type so invoices are categorized automatically.
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
- 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., 2.9%) and flat fee (e.g., $0.30), capped at 3% of the invoice, ensuring your company recovers its Stripe processing cost up to the card network limit.
- 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.
Fixed or Percentage Discount [New in v95]
The Discount box has a Fixed ($) / Percent (%) toggle. Choose Fixed to enter a dollar amount, or Percent to enter a rate from 0 to 100 that is applied to the subtotal. In Percent mode a helper line shows the resulting dollar amount (for example, 10% off a $200 subtotal shows "= $20.00 off $200.00 subtotal"), and the Summary line reads Discount (10%). The credit card convenience fee, when it applies, is still calculated on the subtotal rather than the discounted amount.
When you edit an invoice that used a percentage discount, the toggle reopens on Percent with your rate filled in, and the discount recalculates automatically if you change the line items. Switching between Fixed and Percent, or changing the rate, is recorded in the invoice's Internal Notes audit trail.
Building Invoice Line Items [New in v103]
The line-item editor on a manual invoice (New Invoice) and on the edit-invoice page now works the same way as the estimate editor. Each line has a Service dropdown listing your configured Service Types alongside the built-in options, sorted alphabetically with Other / Custom pinned last.
- Selecting a Service Type sets that line's Description and Unit Price from the Service Type (its description or name, and its base price for flat-rate types; Time and Materials types priced as Varies stay at zero). Changing the service refreshes that line and replaces only the products it had auto-added.
- If the Service Type has default associated products configured in Settings, those are added automatically as their own lines beneath the service line.
- Pricebook: click the Pricebook button to search your full item catalog and insert any product or service as a line.
- Description typeahead: start typing in the Description box to search the same catalog, then pick a match to fill the line.
- Drag to reorder: use the handle on the left of any row. The order you set is the order shown on the invoice, the PDF, and the customer email.
- Choose Other / Custom to leave the line free-form for anything that does not map to a Service Type.
If an invoice was created from an estimate that used section headers, those headers carry onto the invoice and appear as full-width label rows (no quantity or price) on the invoice detail page, the PDF, the emailed invoice, and the online payment page, exactly as they appeared on the estimate.
Invoice Statuses
- 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.
- Payment Processing: A bank (ACH) payment, or an automatic bank charge for a recurring installment, has been submitted and is settling. This takes a few business days. The invoice is marked Paid automatically once the funds clear, so there is nothing to do while it shows Payment Processing. Pay Now and Record Payment are hidden during this window to prevent a double collection.
- Payment Failed: An automatic charge did not go through, for example a card was declined or a bank account had insufficient funds. SepticCycle retries the charge on a set schedule, up to three attempts. If every attempt fails, the invoice is flagged for your office to follow up and both you and the customer are notified.
- 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.
📌 Note: Two statuses relate to bank and automatic payments [New in v125]: Payment Processing appears while a bank (ACH) payment or an automatic bank charge is settling, and the invoice becomes Paid on its own once the funds clear. Payment Failed appears when an automatic charge does not go through; the charge is retried automatically up to three times before the invoice is flagged for your office.
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.
Service Property and System Name on Emailed Invoices [New in v98]
The emailed invoice now shows the service property for the job in both the email body and the attached PDF, so a customer with more than one property can immediately see which location an invoice is for. When the serviced property has more than one system, the invoice also names the specific system that was serviced, for example East System (ATU) or North System (Conventional). If a tank has no custom system name, the system type is shown on its own, for example ATU.
The serviced system is taken from the tank recorded on the job. On a property with a single tank it resolves automatically; on a multi-tank property it appears when the job was tied to a specific tank. The system name uses the same labels as the rest of the app (ATU, Conventional, LPD, and so on).
📌 Note: The on-screen invoice detail page already shows the service property; this change brings the same service property and the serviced system name to the copy your customer actually receives.
Receipts for Offline Payments [New in v99]
When you record an offline payment (check, cash, ACH, Venmo, or Zelle) on an invoice, SepticCycle now emails the customer a Payment Received receipt, the same kind of receipt that card payments have always generated. The receipt shows your company logo and brand accent color, the amount paid, the payment method in plain language (for example Credit Card or Check rather than a raw code), and whether the invoice is now paid in full or still has a balance.
📌 Note: The receipt sends automatically right after you record the payment, as long as the customer has an email on file. No extra step is needed.
Company Logo and Brand Color on the Payment Page and Invoice Email [New in v99]
Your company logo and brand accent color now appear on the public payment page customers open from an invoice email, and on the invoice email itself. The logo appears at the top and the accent color is used for headings and the Pay button, so the payment experience matches the rest of your customer-facing documents. Set both in Settings under your company profile and invoice branding.
The Technician's Collected Payment Method Carries to the Invoice [New in v99]
When a technician chooses how a customer paid at the end of a job, for example Check, that choice now carries onto the invoice the office generates from the visit instead of defaulting to card. The office sees the method the technician collected already selected on the invoice form, along with the check number when one was entered, so the generated invoice reflects how the customer actually paid.
On-Site Offline Payments Stay Pending Until Confirmed [New in v99]
When a technician collects an offline payment on-site (check, Venmo, Zelle, or ACH), the invoice now shows as Pending until the office confirms the payment was received and records it to mark it Paid. Cash collected on-site is still marked Paid right away. If your company reviews invoices before they go out, the invoice waits as a Draft and moves to Pending when you approve it.
💡 Tip: This mirrors how the customer payment portal already works: a payment the customer indicates is held as Pending until your office verifies it, so your receivables only show Paid once money is confirmed in hand.
Internal Notes Audit Trail [New in v72]
Every payment-related action on an invoice now writes a timestamped entry to the invoice's Internal Notes section, creating a complete chronological audit log of who did what and when. The following actions all generate audit entries:
- Sending or resending an invoice email — records the sender, the recipient email address, and whether it was the initial send or a follow-up reminder.
- Recording a payment — records the amount, payment method, reference number, and any notes the user entered.
- Marking an invoice paid manually — records the user who marked it and notes that no payment was actually entered.
- Voiding an invoice — records the user who voided it and the balance that was cleared.
- Deleting a draft invoice — only Draft invoices can be deleted, via the Delete button beside Void; the invoice and its line items are removed permanently. Deletion is refused when a payment is recorded, when other installment invoices name it as their parent, when it is linked to a contract signature, or when it was converted from an estimate. Sent and paid invoices are financial records and can only be voided. Invoice numbers are never reused, so a deleted draft leaves a gap. [New in v129]
- Editing invoice fields or line items — records the user along with a bullet-list of every changed field showing the old and new values.
- Customer offline payment selection on the public payment portal — records the method the customer chose and the dollar amount they indicated.
Each entry is stamped with the date and time in your company's local timezone, in a consistent format like [2026-05-20 8:43 PM CDT]. The Internal Notes panel renders entries with visual separation between blocks, so you can scan the history at a glance instead of reading one wall of text. Edit-invoice entries include the user's name on the first line followed by an indented bullet list of every field that changed.
💡 Tip: Internal Notes is staff-only and never visible to customers. The audit trail is append-only — entries are added but never modified or removed, even if you re-edit the invoice or void it later. This makes Internal Notes a reliable place to look when reconciling a payment history with a customer over the phone.
Pay Online Button on Partially-Paid Cash or Check Invoices [Updated in v72]
If a customer paid only part of an invoice in cash or check and you later resend the invoice to collect the remaining balance, the resent email now includes a Pay Online button and the list of accepted online payment methods. Previously the email was treated as a receipt because the original payment method was on-site, and customers had no way to pay the rest online. The button now appears whenever a balance is still owed, regardless of how the partial payment was originally collected.
Reliable Sequential Invoice Numbers [New in v72]
The rare edge case where two invoices created at exactly the same moment could end up with the same number has been eliminated. Invoice number generation now runs as a single atomic database operation across every creation path — manual create, bulk generate, contract renewal, estimate conversion, job completion, tech-app completion, auto-payoff cron, and the customer Sign & Pay flow. You will not see duplicate invoice numbers. You may notice the counter occasionally skips a value if a creation attempt failed mid-way; this is intentional. Invoice numbers must be unique, but they do not need to be perfectly sequential.
Invoice Number Format and the -d# Suffix [New in v73]
Invoice numbers use the format PREFIX-NUMBER where the prefix is configured in Settings (default INV-) and the number is a sequential counter per company. Example: INV-1031.
If you ever see an invoice number ending in -d1, -d2, etc., the d stands for "duplicate." SepticCycle adds this suffix when it detects two or more invoices that ended up with the same number (rare, can occur with legacy data imported from another system or under specific race conditions in older versions of the app). The oldest invoice keeps its original clean number; each additional copy is renamed with the next available suffix (-d1 for the second copy, -d2 for the third, and so on). Both the original and the renamed copy remain searchable by the base number, and all references in emails, PDFs, and customer records continue to point to the correct record. You generally will not create new -d# invoices through normal use; the convention exists to safely preserve historical data when a duplicate is discovered.
Bill To Customer Link [New in v113]
On the invoice detail page, the customer name in the Bill To section is a link. Click it to open that customer's profile page.
Attaching Files to Invoices [New in v111]
You can attach files to an invoice — permits, photos, receipts, or signed paperwork — and they travel with the invoice when you email it. Accepted file types are PDF, image, Word, and Excel, up to 10 MB each. Files are stored privately and are only reachable through short-lived signed links generated when you open them.
On a New Invoice
The New Invoice page has an Attachments panel between Invoice Tag and Discount. Choose your files there; each one is listed as staged with its size and a remove control. The files are uploaded and saved with the invoice when you click Save or Save & Send. If you leave the page without saving, nothing is stored, so an abandoned draft never leaves stray files behind.
On an Existing Invoice
The invoice detail page has an Attach File button between Edit and Send Invoice. It opens a window where you can upload more files, download a file, or delete one. An Attachments card on the right side of the invoice also lists what is attached for quick access. Attaching and deleting are turned off once an invoice is Void or cancelled, but existing files can still be opened.
Attached Files Are Emailed With the Invoice
When you Send or Resend an invoice, the attached files are included with the email alongside the invoice PDF, so the customer receives everything together. If you attach files to a new invoice and choose Save & Send, those files go out with that first email as well.
📌 Note: The combined size of everything attached to one email is capped at 40 MB. With the 10 MB per-file limit this is rarely a concern, but if a very large set of files would exceed the cap, the invoice email still sends and the oversized file is left off.
Drag and Drop [New in v112]
On both the New Invoice panel and the Attach File window, you can drag files directly onto the upload area instead of clicking it. The area highlights and reads Drop files to attach while you hover a file over it, and dropped files go through the same size check and handling as files you pick with the button.
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 (2.9% + $0.30 flat, capped at 3% of the invoice), processing costs are passed to the customer as a surcharge up to the 3% card network limit.
- 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 and the dollar amount they indicated (e.g., "Customer indicated payment by Check of $500.00 via the payment portal. Pending verification."). [Updated in v72]
- 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
- 1Open the contract you want to auto-invoice.
- 2Set the Billing Frequency: Monthly, Quarterly, Semi-annually, or Annually.
- 3Set the Next Billing Date to when the first auto-invoice should generate.
- 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
- 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.
Creating an Estimate
- 1Search for and select a Customer. The estimate title auto-fills with the customer name.
- 2If the customer has multiple properties, select the Location / Property.
- 3Set an Estimate Title and Expiration Date (required). Expiration defaults to 30 days from today.
- 4Optionally enter a Reference (PO number or work order) and Commission Recipient.
- 5Use the Link To toggle to link the estimate to an existing job, or leave it set to None.
- 6Toggle Save As Estimate Template if you want to reuse this structure for future quotes.
- 7Add line items in the first estimate option tab.
- 8Add Tags as needed using the tag input.
- 9Fill in any Additional Fields (Instructions, Contract Status).
- 10Add Estimate Notes (customer-visible) or Internal Notes (office only) in the notes tabs.
- 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.
- 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.
Building Line Items [New in v101]
Each option holds its own list of line items. The Service dropdown on each line is populated from your company service types (Settings › Service Types), sorted alphabetically with Other / Custom pinned at the bottom.
- Pick a service type to auto-fill that line's Description and Unit Price from the service type. You can still edit either field afterward.
- Switching the service on a line overwrites the Description and Unit Price to match the newly chosen service. If the new service has no set price, the Unit Price clears so you can enter your own.
- Default associated items: if a service type has default items configured, picking it auto-adds those items as their own lines beneath the service line. Switching the service replaces the items it auto-added this session.
- Pricebook pulls an item from your Items Catalog into the line as an Other / Custom line carrying the catalog description and price.
- Add Grouping inserts a labeled section header (for example, "DIGGING") — a label only, with no quantity or price. Groupings render as section headers on the customer email and the online estimate, not as priced lines.
- Drag to reorder: grab the handle on the left of any line and drag it up or down, including into or out of a grouping. The order you set is the order the customer sees.
📌 Note: Line order is saved when you save the estimate, and it drives the order on the admin detail page, the customer email, and the public estimate page alike.
Hiding the Itemized Breakdown [New in v116]
Some quotes are easier to win when the customer sees a clean bottom-line price for each option instead of every part and labor line. Each estimate has a Hide itemized breakdown toggle that controls this for the whole estimate at once.
When the toggle is on, the customer sees each option as a single summary: its option title, its customer-facing description (if you wrote one), and the option total. The individual line items, their quantities, and their unit prices are not shown on the public estimate page, in the estimate email, or on the printed copy. Your office still sees every line item on the dashboard, and the Cost Basis tab is unaffected, so hiding detail changes only what the customer sees, never what you track internally.
📌 Note: Hiding works per option, and an option only hides its lines when there is something to show in their place. An option is summarized when it has a service line (at least one line tied to one of your service types) or a customer-facing description. If an option has neither (for example, an option built only from custom or grouping rows with no description), that option keeps showing its full line items even while the toggle is on, so the customer never sees an empty or priceless option.
💡 Tip: Write a short, plain-language description on each option you intend to hide, for example "Full aerobic system replacement including tank, pump, and controls." Turn on Hide itemized breakdown, and the customer sees that sentence and the price rather than the parts list. Turn the toggle off at any time to reveal the full detail again.
Showing a Subtotal Under Each Section [New in v135]
When an option covers more than one service, you can group its line items under section headers (for example a 2" Water Well section and a 500 gal ATU section, each with its own lines). The Show a subtotal under each section toggle, in the Customer Visibility area next to Hide itemized breakdown, adds a subtotal line under each section so the customer sees what each service costs as well as the grand total.
Each section's subtotal is the sum of the lines in that section, worked out fresh every time the estimate is shown (never stored), so it always matches the current prices. The subtotals render the same way on the estimate detail page, in the estimate email, and on the public estimate link. A section subtotal is a running total for that group of lines, so it comes before any estimate-wide discount or tax, which still apply once to the whole estimate in the totals at the bottom.
📌 Note: Subtotals are only added when an option has two or more section headers. With a single section, or none, the toggle adds nothing, because the option total already says the same figure. Lines above the first section header, and empty sections, are left without a subtotal.
💡 Tip: You can combine this with Hide itemized breakdown. With both on and two or more sections, the customer sees a clean summary for the option: each section's name, the service descriptions in that section, and that section's subtotal, then the grand total. Individual parts and prices are hidden, but any custom or parts-only lines (no service type) are still counted inside the section subtotal, so the section figures always add up to the grand total. Your office always sees full detail on the dashboard, and the Cost Basis tab is never affected.
📌 Note: The setting travels with the estimate: revising an accepted estimate keeps your Show a subtotal under each section choice on the new draft, so a revision looks to the customer the way the original did.
Estimate Statuses
- 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 signed and approved, or you marked it accepted yourself. 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.
- Superseded: A newer revision of this estimate was created. The original is kept for the record and is no longer the working copy. See Revising an Accepted Estimate below.
📌 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.
📌 Note: Open and Closed are not statuses [New in v116]. They are filter groups on the Estimates list that bundle the statuses above. Open covers estimates still in play (Draft, Sent, Viewed). Closed covers estimates that have reached an end state (Accepted, Declined, Expired, Superseded). The badge on each row always shows the precise status; the Open and Closed tabs only decide which rows are listed. Pipeline Value sums only open, undecided estimates and does not count superseded revisions, so an estimate and its revision are never both counted.
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.
Accepting an Estimate (Customer Flow) [Updated in v116]
When a customer opens the link to a sent estimate, they see the full quote and, at the bottom, two actions: Accept and Decline. SepticCycle estimates are about agreeing to a scope and a price, so the customer accepts and signs online and you arrange payment separately. There is no online card payment on the estimate page.
- Picking an option: if the estimate has more than one option, the customer chooses one with the option selector before they can accept, and the total shown updates to match the selected option. With a single option, that option is used automatically.
- Signing: when the customer clicks Accept, they are asked to sign. They can draw their signature with a finger or mouse, or type their name to generate one, and their printed name is required. Accepting is not complete until the signature is provided.
- On confirm: the estimate moves to Accepted, the signature is captured, and the moment is stamped with the date, the time, and the signer's name. The customer sees an Accepted confirmation, and your office receives a Schedule the job notification email. Accepting does not create an invoice or charge anything; it records the customer's signed approval.
- Declining: clicking Decline marks the estimate Declined and shows a short confirmation. No further automation runs.
💡 Tip: An accepted estimate shows the Accepted badge along with the captured signature, the signer's printed name, and the signed date and time on the detail page. A proof note is also written to the Comments tab recording the signature, so there is an internal record of who accepted and when.
📌 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. The Notification CC field accepts more than one address separated by commas. When an admin clicks Mark Accepted on the detail page instead, no email is sent; the system records an internal note on the Comments tab showing who accepted it and the date and time. The dashboard shows a Jobs Pending Schedule card counting accepted estimates that have not yet been turned into a job, so accepted work does not get lost before it is scheduled.
Collecting Payment After Acceptance [New in v116]
Because the estimate page does not take payment, you collect it once the customer has accepted, using the same tools you use for invoices. The usual path is to convert the accepted estimate to an invoice (see Converting an Estimate to an Invoice), then either email that invoice so the customer can pay online by card or bank, or record an offline payment such as cash or check against it.
If you take a deposit before the work becomes a job or invoice, record it on the estimate's Payments tab. Any card processing or bank fees, online payment options, and receipts are handled by the invoice and the payment page, which are covered in the Invoicing chapter. This keeps every estimate on a single, simple accept-and-sign step and keeps all money handling in one place on the invoice.
📌 Note: Earlier versions offered an Accept & Pay flow that charged a card and auto-created a paid invoice from the estimate, and a credit card convenience fee at that checkout. That online-payment step has been removed from the estimate page. Estimates now end at a signed acceptance, and the credit card convenience fee applies on the invoice payment page instead. See the Invoicing chapter for fee configuration and online payments.
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.
The link runs both ways [New in v116]. An invoice created from an estimate shows a Created from Estimate #EST-XXXX link in its Activity card, so from the invoice you can jump straight back to the estimate it came from. This link is also what protects the estimate: an estimate that has a live invoice or job attached cannot be deleted (see Deleting an Estimate).
📌 Note: If the estimate uses section headers to group its line items, those headers carry onto the new invoice and display as full-width label rows with no quantity or price on the invoice detail page, the printed and emailed PDF, the customer email, and the online payment page, matching how they appeared on the estimate.
Revising an Accepted Estimate [New in v116]
Once a customer has signed and accepted an estimate, that signed copy is a record and is not edited in place, because changing it would invalidate the signature. When the scope or price needs to change after acceptance, you create a revision instead.
On an accepted estimate that has not yet been converted, click Create Revision. You are asked for an optional reason. SepticCycle then makes a new Draft estimate that is a copy of the original's options and line items, including the hide itemized breakdown setting, and opens it for editing. The new estimate carries the next revision number in the series: the first revision of EST-1042 becomes EST-1042-R2, the next is EST-1042-R3, and so on. The original is marked Superseded and kept for the record.
- Linked both ways: the revision shows a Revision of note pointing back to the original, and the original shows a Superseded by note pointing to the revision, with the reason you entered recorded on both.
- Editing: edit the revision like any draft, then send it for signature as usual. Any new line items, files, or purchase orders you add belong to the revision.
- For the customer: if a customer opens the link to an estimate that has since been revised, they see a note that the estimate has been revised, and Accept and Decline are not available on that old copy, so they cannot sign a version you have replaced. Send them the new revision's link to collect a fresh signature.
- Read only for acceptance: a superseded original cannot be marked accepted or declined, and its conversion actions are off, since the live working copy is now the revision.
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.
Deleting an Estimate [New in v116]
You can delete an estimate from its detail page or from the Estimates list, but only when nothing live is attached to it. SepticCycle blocks a delete when the estimate has a live invoice or a live job linked to it, so you cannot remove a quote that real billing or scheduled work depends on. This protection is enforced in the database itself, not just on the screen, so it holds no matter how the delete is attempted.
- Deletable: an estimate with no invoice and no job attached, or one where the only things ever attached are no longer live.
- Voided invoice does not block: an estimate whose invoice was voided can be removed, while the voided invoice is kept on its own.
- Cancelled job does not block: a cancelled job does not stop deletion either.
- When blocked: the Delete action is hidden or disabled on that row and on the detail page; the reason is the live invoice or job, and the Activity sidebar links show you what is attached.
📌 Note: Deleting an estimate also removes its options, line items, comments, files, and purchase orders, since those belong to the estimate. It does not delete any invoice or job, which are independent records once created. To remove an estimate that is currently protected, first void its invoice or cancel its job, then delete the estimate.
Estimate Numbering Settings
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]
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]
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.
Job Number Format [New in v73]
Jobs are numbered automatically using the format PREFIX-YEAR-NUMBER, with the prefix from Settings (default JOB-), the current year, and a sequential counter padded to five digits. Example: JOB-2026-00123. The counter increments atomically inside the database so two jobs created at the same moment can never receive the same number, even when multiple office users or the auto-scheduler are creating jobs simultaneously. As with invoices, the counter may occasionally skip a value if a creation attempt failed mid-way; this is intentional and harmless.
The -d# Suffix on Duplicate Jobs
The same convention used on invoices applies to jobs: if a job number ends in -d1, -d2, etc., the d stands for "duplicate" and the suffix indicates that the system found two or more jobs sharing the same number and renamed the newer copies. The oldest job per duplicated number keeps the clean form; subsequent duplicates get suffixed in chronological order (-d1 for the second oldest, -d2 for the third, and so on). This preserves both records and keeps the original number searchable in the job list. See the Invoice Number Format section under Invoicing for the full explanation of the convention.
Self-Healing Counter [Updated in v74]
The job number generator also self-heals against unusual data states. If the internal counter ever drifts behind the actual data (for example after a bulk import, a restored backup, or a duplicate cleanup), the system detects the gap on the next job creation and advances the counter to catch up automatically, so collisions are prevented in any state. You may notice the Next Job Number value in Settings has been advanced as part of this self-healing; this is intentional and normal. No action is required on your part.
Creating a Job
⚠️ 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]
Customer Search on the Map [New in v119]
The Jobs page map view now includes a customer search so you can place any customer on the map and add them to a technician's route without leaving the page. Click Map on the Jobs page, then type a customer or company name in the search box above the map. Matches are grouped under each customer's name, with one row per property, so a customer with several addresses shows each as its own choice.
Selecting a property drops a star pin on the map and shows the nearest technician scheduled that day, with the straight-line distance to their closest stop and the next closest technicians listed beneath. A property that has not been geocoded yet cannot be placed on the map; geocode its address in Settings › Route and search again.
Click Add to route on the pin to open a quick-create window prefilled with the customer, property, nearest technician, and the date you are viewing. Choose a service type, adjust the date, time, technician, or site if needed, and click Create job. The job is created with status Scheduled, added to that technician's route, and appears immediately as a numbered pin; the customer receives the usual scheduling confirmation when a date is set. When the property has a single site it is selected automatically. The technician list shows field technicians only, and you can leave it unassigned to set later.
💡 Tip: For a job that needs more detail, such as a custom price, contract link, or extra notes, use the full New Job form instead. The map quick-create is built for fast dispatching.
Office and Admin Assignments on the Map [New in v124]
A job assigned to an office or admin user, not only a field technician, now appears on the map with that person's own pin color and a matching entry in the map legend, so an office-assigned job no longer shows as Unassigned. A job a technician is actively working, checked in and In Progress, is highlighted with a green glow so you can see at a glance where active work is happening.
Job Detail Page
Visit Number on Maintenance Jobs [New in v117]
A scheduled maintenance visit that belongs to a recurring maintenance agreement now shows a (Visit N) label after its title, both at the top of the job detail page and on the customer's Jobs tab. The visit number counts the recurring visits for that contract and restarts at 1 each contract year, measured from the contract start date rather than the calendar year. For example, a contract serviced three times a year reads Visit 1, Visit 2, Visit 3, then Visit 1 again in the next service year. One-off jobs, and jobs not tied to a recurring maintenance agreement, do not show a visit number.
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 v124]
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. If you check in to a job that has no one assigned yet, that job is assigned to you automatically; a job that already has someone assigned is left as is, so checking in never takes a job from the person who already owns it.
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.
Removing Line Items and the Price Adjustment Line [New in v102]
Each line in the cost breakdown has a small remove control, so you can drop a part or labor line that should not be billed. A removed line is left off the customer invoice and is not billed. When the Final Price you charge differs from the sum of the itemized lines, whether because you removed a line or typed a different Final Price, the invoice adds a single Price Adjustment line equal to the difference, so the itemized lines always total the subtotal the customer is charged. The card convenience fee is shown in the totals, not as a line item.
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]
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
Active contracts with a recurring service frequency can automatically generate scheduled jobs months in advance. Select how many months ahead (1, 2, 3, 6, or 12) and click Generate All, or click Generate on a single contract row.
What Appears in the List [New in v68]
Only contracts that can actually produce jobs appear in the list. The page automatically hides:
- Contracts whose end date has already passed. These have transitioned to Expired status and no longer generate jobs.
- Contracts with a service frequency of As Needed. These are job-on-demand contracts and are not on a recurring schedule.
- Inactive, Draft, Cancelled, and Archived contracts.
If you expect to see a contract in this list and do not, check the contract's Status and End Date on its detail page.
Sortable Columns [New in v68]
Click any column header in the contracts table to sort the list by that column. Click the same header again to reverse the sort direction. The column headers stay sticky to the top of the table area as you scroll, so you can always see which column is currently sorted.
Result Banners After Generate [New in v68]
After you click Generate or Generate All, a banner appears at the top of the page showing the result. The banner stays sticky to the top of your viewport while you scroll, so you will not lose the result message while reviewing the table below. The banner uses three colors:
- Green (success): Jobs were created. The number created and the months covered are listed.
- Amber (warning): The action ran without errors but produced zero new jobs. This usually means the contracts were already up to date for the selected range, or no contracts qualified for generation. Re-check the contracts and the months-ahead setting.
- Red (error): Something went wrong. The error message is displayed in the banner.
Duplicate Prevention and Capacity Limits
- The system never creates duplicate jobs for the same contract on the same date.
- Each technician is capped at 8 jobs per day. If a contract's preferred date would push a technician past that cap, the job moves to the next available working day.
Jobs Dashboard Features
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
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
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
⚠️ 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
Most of the following settings live in Settings › Scheduling and are enforced by the nightly cron; the appointment reminder toggle lives in Settings › Notifications. Changing them takes effect on the next run.
- Enable Automatic Scheduling: A master on/off toggle at the top of the Scheduling tab. When turned off, the nightly cron skips your company entirely — no jobs are created automatically until you turn it back on. Existing jobs are not affected. For example, a customer on a quarterly maintenance contract has their next visit created and scheduled automatically; turn this off if you would rather schedule each visit yourself.
- 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 (Settings › Notifications): This toggle lives in Settings › Notifications, not the Scheduling tab. When turned off, jobs are still created but no confirmation email is sent to the customer at creation time. It is the same toggle that governs the advance appointment reminders configured in that section, so turning it off affects both.
- 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.
Zoned Contracts Are Handled Separately [New in v67]
If your company uses Zone Scheduling (Settings › Scheduling › Zone Scheduling), contracts whose properties fall in a configured zone are owned by the monthly Zone Scheduling job, not the daily auto-scheduler. The daily cron sees these contracts, recognizes them as zoned, and skips them with a log entry like Skipping SC-2026-0031, zoned (Hill Country), handled by zone-schedule. Jobs for zoned contracts are pre-created on the 24th of each month for the following month. This split prevents two crons from creating duplicate jobs for the same contract and date.
Contracts that are not in a configured zone, or whose service frequency is not in your zone configuration's applies-to list, continue to be scheduled daily by the auto-scheduler as normal. A contract is considered zoned only when all three of the following hold: zone scheduling is enabled for your company, the contract's service frequency is in your zone configuration's applies-to list, and the property has a tank assigned to a zone that matches one of your configured zones.
Zone Scheduling [Updated in v34]
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.
First Visit When a Contract Is Activated [New in v123]
When you activate a contract for a property in a service zone, the first visit is scheduled inside that zone's service months, not a fixed number of days out. SepticCycle chooses the date from the contract start date, the working days remaining in the eligible month, and technician availability. The first visit is never placed on the day you create the contract, and never before the contract start date. If a technician who covers that zone is available, the visit is assigned to them automatically. If the whole zone crew is on time off for the eligible month, the visit still lands inside the zone's month and is left unassigned with a note so your office can assign it. If that month is already full, the visit moves to the zone's next service month. You can always move a visit to another date manually afterward.
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.
Sharing a Month Across Zones [New in v89]
The same service month can be assigned to more than one zone. For example, Route 1 and Route 11 can both be serviced in March, April, September, and October. The settings page no longer blocks this; it shows a neutral Shared service months note listing each shared month and the zones that service it, and the schedule preview marks those months with a count badge such as 2 zones. Overlapping months never double-book a property, because each property belongs to exactly one zone, the monthly cron processes each zone independently, and a per-contract duplicate guard prevents a second job for the same contract in the same target month.
Job Scheduling Email Notifications
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]
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
- 1Open the customer profile and click Edit.
- 2Scroll to Scheduling Preferences (amber background).
- 3Check 🚩📞 Requires Advance Notice.
- 4Optionally enter instructions (e.g. "Call 30 min before; gate code 1234").
- 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]
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]
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.
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
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
⚠️ 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
A three-step wizard guides you through report creation:
- 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.
- 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.
- 3Review and Generate: See the summary of total services and gallons. Add additional notes. Click Generate Report.
Batch Report Generation
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.
- 1Select a county from the left panel. All active contracts requiring county submission are listed.
- 2Set the Report Period — choose a calendar month using the month picker, or enter a custom start and end date.
- 3Select a Report Type (Maintenance Report or Service Summary) and toggle Include Technician Notes.
- 4Click Select All or individually check the contracts to include.
- 5Click Generate Reports. A progress bar tracks each report as it is created.
- 6Review the results screen — successful reports show the report number with a link; contracts with no services in the selected period are flagged.
- 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]
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:
- 1First, send to whichever recipient is currently toggled active, using the subject and body you have entered.
- 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_aton each relevant service record with the current date and time. - Sends to customer stamp
customer_emailed_aton 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
Rejected reports can have a reason recorded and can be corrected and resubmitted.
Report Settings
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
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.
Pre-Built Templates
SepticCycle includes 15 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
New companies can load all 15 default templates with one click. Click the 📋 Load Defaults button on the Checklist Templates page. A confirmation dialog appears explaining that 15 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
- 1Click + New Template.
- 2Enter a Template Name and select the associated Service Type.
- 3Click + Add Section to create logical groupings (e.g., "System Information," "Component Inspection," "Findings").
- 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.
- 5Drag and drop sections and fields to reorder.
- 6Click Save Template.
Duplicating a Template [New in v47]
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
- 1Go to Sidebar › Checklists.
- 2Find the template you want to copy.
- 3Click the blue Duplicate button on the card.
- 4The page immediately shows a new card titled "Copy of [Template Name]".
- 5Click Edit on the new card to rename it and make any changes.
- 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]
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
- 1Open a template for editing (create new or click Edit on an existing one).
- 2Expand the section and click the dropdown / select field you want to color.
- 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.
- 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.
- 5Click Save Template.
Setting Colors on a Checkbox / Yes–No Field
- 1Click the checkbox field in the template editor.
- 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.
- 3Click a color dot for each state, or leave either as None.
- 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]
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
- 1Open a checklist template for editing (create new or click Edit on an existing one).
- 2Click the field you want to add photo capture to.
- 3Scroll to the bottom of the field editor. Check the 📷 Allow photo attachment toggle.
- 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.
- 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-photosstorage 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.
Formula Fields [New in v74]
A Formula field is a read-only field whose value is automatically calculated from other fields in the same checklist. It is perfect for any "this minus that" math (time differences, percentage changes, running totals) where you do not want techs entering the result by hand.
When to Use a Formula Field
Use a Formula field when the value can be calculated from other field values in the same checklist, when you want to prevent typos or math mistakes in the calculated value, or when you want the calculated value to update live as the tech enters its inputs.
Common examples:
- Days Since Last Inspection calculated from two date fields.
- Total Flow calculated as gallons-per-minute times duration.
- Sludge Reduction Percent calculated from before-and-after depth readings.
- Minutes Run calculated as elapsed time multiplied by 60.
Creating a Formula Field
- 1Open a checklist template for editing. Click + Add Field.
- 2For Field Type, choose Formula. A blue editor block appears.
- 3In the Formula Expression box, type your formula using
{field-id}references for any fields you want to read from. To insert a field reference without remembering the ID, click + Insert field reference and pick from the dropdown. - 4The supported operators are
+ - * /and parentheses, plus a special functiondate_diff({date_a}, {date_b})which returns the whole-day difference between two date fields. - 5Below the formula box, a live preview shows your expression with field names substituted in. If anything is wrong, a red error box explains what is broken.
- 6Click Save Template.
Examples
- Days between two dates:
date_diff({date_this}, {date_last}) - Minutes between two ETM readings:
({etm_this} - {etm_last}) * 60 - Percentage reduction:
({before} - {after}) / {before} * 100 - Sum of three values:
{val_a} + {val_b} + {val_c}
How It Appears in the Field App
When the tech opens the checklist, formula fields appear as blue read-only boxes with a calculator icon and "Auto" badge. As the tech enters values into the referenced fields, the formula recalculates instantly. The tech cannot edit the formula value directly. If the tech leaves a referenced field blank, the formula shows a dash until all inputs are filled. Formula fields are excluded from the completion-percentage indicator since they fill themselves.
How It Appears on the Service Checklist PDF
The downloaded Service Checklist Report shows formula values in bold, followed by a small "AUTO" text badge so it is clear the value was auto-calculated. The badge prints reliably on all printers.
📌 Note: If you delete or rename a field that a formula references, you will see a red error in the editor at save time telling you which formula needs fixing. Templates with broken formulas cannot be saved, which prevents shipping a broken template to your techs.
Carry-Forward Fields [New in v74]
A Carry-Forward field is one whose value is automatically pulled from the previous completed checklist at the same property using the same template. This saves techs from re-entering data that does not change visit-to-visit (like access notes or gate codes), and makes time-series comparisons easy (like "what was the ETM reading last visit?").
Two Modes: Pre-populate or Show Prior Visits
Carry-Forward has two modes. Both are configured on the same field, but you can only pick one mode per field.
- Pre-populate: copies the prior value into the editable field at job-load time. The tech sees the prior value sitting in the input, ready to keep or change. An amber "From last visit" tag appears below the field as long as the prior value is unchanged; the tag disappears the moment the tech edits.
- Show Prior Visits: displays the prior values as small read-only columns to the left of the editable input. The tech sees 1, 2, or 3 prior values (your choice) alongside the current input. Use this when you want the tech to compare the new reading against the trend, not just the last visit.
When to Use Each Mode
- Pre-populate when the value usually does not change visit-to-visit (access codes, site notes, gate combinations, persistent observations) and you want to save time on data entry for routine information.
- Show Prior Visits when the value is a measurement you want to compare across visits (sludge depth, BOD readings, ETM, filter clean dates), and the trend tells the story better than the single number.
Enabling Carry-Forward on a Field
Only Text, Long Text, Number, Date, and Time fields can use carry-forward. Checkbox, Dropdown, and GPS fields cannot.
- 1Open a checklist template for editing. Click on the field you want to enable.
- 2Scroll to the amber ↻ Last Visit Data radio block. Choose one of three options: Off (default), Pre-populate from last visit, or Show prior visits.
- 3If you chose Pre-populate, a Source field dropdown appears below. By default this is blank, which means the field pre-populates from itself (the same field in the prior visit). For "this visit vs last visit" patterns (like "ETM Last" reading from prior visit's "ETM This"), pick the paired field from the dropdown.
- 4If you chose Show prior visits, pick how many prior columns to show (1, 2, or 3).
- 5Click Save Template.
Example: Paired-Field Pre-populate (ETM Last reads from ETM This)
Your template has two fields: "ETM This Inspection" (a number the tech enters today) and "ETM Last Inspection" (a number the tech needs from the prior visit). On the "ETM Last Inspection" field, set carry-forward mode to Pre-populate from last visit and set the Source field dropdown to "ETM This Inspection". Now on every new visit, "ETM Last Inspection" is pre-populated with whatever the tech entered for "ETM This Inspection" on the previous completed inspection. The tech does not have to remember last visit's reading; it is already there.
Example: Show Prior Visits (Sludge Depth Trend)
Your template has a "Sludge Depth" number field. You want techs to see the last 2 readings while they take this visit's measurement, so they can compare. On the "Sludge Depth" field, set carry-forward mode to Show prior visits and set the count to 2. Now the field appears as three columns side-by-side: the oldest visit's reading, the most recent visit's reading, then the editable input for today's reading. The today column has a light green tint so the tech knows which column to fill in.
How It Appears on the Service Checklist PDF
For Pre-populate fields, there is no special PDF rendering: once saved, the value is indistinguishable from one the tech entered manually (which is correct, since the tech confirmed it by saving). For Show Prior Visits fields, the PDF shows a small full-width sub-table with the prior columns and today's value, matching what the tech saw in the field app. The today column has a subtle green tint on the date header so it stands out.
How Prior Visits Are Found
The system looks at the property associated with the current job, then finds the most recent completed checklists at that property that used the same template. Only completed checklists count (in-progress ones are not pulled in). The match is per-template, so different templates at the same property each have their own prior-visit history.
📌 Note: If this is the first time the template has been used at this property, there is nothing to pull from. Pre-populate fields stay blank (just like any other field), and Show Prior Visits fields hide the prior columns and render the field as a regular input. No error, no warning; the field simply behaves like a non-carry-forward field of its type.
Multi-Select Fields [New in v86]
A Multi-Select field lets the technician choose more than one option from a list. It renders as a group of checkboxes rather than a single-choice dropdown, so the technician can tick as many of the listed options as apply to the visit.
When to Use a Multi-Select Field
Use a Multi-Select field whenever a single question can have several correct answers at once, such as which components were inspected, which issues were found, or which maintenance tasks were performed. If only one answer can ever be correct, use a Dropdown instead. If the answer is simply yes or no, use a Checkbox (Yes/No) field.
Creating a Multi-Select Field
- 1Open a checklist template for editing. Click Add Field, or click an existing field to edit it.
- 2Set the field Type to Multi-Select.
- 3Enter the options one per line, exactly as you would for a Dropdown. These are the choices the technician can tick.
- 4Optionally turn on Required. A required Multi-Select field must have at least one option ticked before the checklist counts as complete.
- 5Optionally turn on photo capture (the camera toggle), the same as any other field type.
- 6Click Add Field or Save Changes.
How the Technician Fills It Out
While filling out the checklist on mobile or desktop, the technician sees each option with its own checkbox, ticks every option that applies, and leaves the rest unticked. There is no limit on how many can be selected. A Multi-Select field with nothing ticked is treated the same as an unanswered field.
How It Appears on the Service Record and PDF
Everywhere the checklist is shown (the Service Record Detail modal, the office review screen, the Service History view, and the Service Checklist Report PDF), the ticked options are listed together separated by commas, for example "Tank, Pump, Filter." If no options were ticked, the field shows a dash on the PDF, the same placeholder used for any other blank field.
📌 Note: Multi-Select lives entirely in the checklist template, so no setup beyond adding the field is required. Existing checklists and templates are unaffected.
Importing a Checklist from a Document
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 [New in v97]
On the job detail page (when the job is In Progress), click the + Add Checklist button. The panel opens showing the checklist tied to the job's service type, so the correct form is featured first. Click + Add a different checklist to reveal every other active template, each listed with its pricing mode (Fixed or Time & Materials). When the job's service type has no checklist tied to it, the panel shows all active templates at once. Templates already attached to the job appear greyed out and marked Added, so the same checklist is not added twice. 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
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.
- 1Go to Settings and click the Service Types tab.
- 2Click + New Service Type.
- 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).
- 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.
- 5Click Save.
Phase 2 — Create the Checklist Template
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.
- 1Go to Checklists in the sidebar and click + New Template.
- 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.
- 3Set the Pricing Mode to match the service type (Fixed or Time & Materials).
- 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.
- 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
- 1Select the Customer and Tank / Site Location.
- 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.
- 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.
- 4Complete the remaining fields: Contract Type, Start Date, End Date, Total Price, and Billing Frequency.
- 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_datefalls 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.
The Manifest Workflow
Every manifest starts with a job. The recommended end-to-end flow is:
- 1Office creates a job — customer books a pumping appointment. The job is assigned a technician and scheduled.
- 2Tech is dispatched — tech taps Start Driving on the job.
- 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.
- 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.
- 5Tech drives to the disposal site — the manifest status advances to In Transit.
- 6At the facility — tech opens the manifest, taps Record Disposal, enters gallons disposed and authorization number, and captures the facility signature.
- 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.
- 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)
⚠️ 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)
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
- 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
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
- 1Go to Manifests › County Forms and click + Upload Form.
- 2Enter a form name and county (optional). Select your county's PDF and click Upload and Open Editor.
- 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.
- 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.
- 5Drag the badge on the canvas to fine-tune position. Use the Position & Size inputs for precise PDF-point placement.
- 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.
- 1Click Add Field and click directly on the checkbox on the PDF.
- 2In the Properties panel, click ☑ Checkbox in the Field Type row.
- 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".
- 4Enter the Match Value — the exact text the source must equal for the symbol to be drawn. Comparison is case-insensitive. Example:
White Marsh. - 5Choose a Symbol: X (default), ✓ (checkmark), or ● (filled dot).
- 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
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:
Linking Manifests to Jobs
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
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.
Password requirements [New in v126]: the Change Your Password screen shows a live checklist that turns each rule green as it is met. A new password must be at least 8 characters and include one lowercase letter, one uppercase letter, one number, and one symbol, and it must differ from the current password. SepticCycle also rejects any password that has appeared in a known data breach (Supabase leaked-password protection), even when it meets every other rule, and asks for a different, unique one. When a forced first-login change also prompts for the current password, the temporary password the admin set is entered there.
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
- 1Click Next to see any jobs that overlap the time-off period (technicians only).
- 2Choose Reassign (auto-assigns an available technician) or Push (moves jobs to the next available weekday).
- 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
- 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]
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
- 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.
Overview Dashboard
- 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
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
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
- 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
- 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
- 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.
Vendors [New in v120]
Vendors are the suppliers and payees your company buys from (a hardware store, a parts supplier, a property manager you pay rent to). The Vendors page lives under the Inventory section and is visible to Admin and Office roles. Each vendor stores a company name, email, phone and mobile, billing address, payment terms, an account number, a Tax ID, a 1099 flag, and a W-9 on file flag. Phone numbers are stored as raw digits and formatted on display as (555) 999-8787. Vendors are deactivated rather than deleted from the row actions, so their history on past bills is preserved; the Show inactive only checkbox switches between active and inactive.
Each row shows three figures aggregated from the bills linked to that vendor:
- YTD Billed: total of this year's bills for the vendor.
- Open Balance: amount still owed across open and partial bills (amber when above zero).
- Last Activity: date of the vendor's most recent bill.
Click any column heading to sort and click again to reverse; on a phone the table becomes a stack of cards. Export CSV downloads the full list including the three figures. Each row also has two shortcuts: New Bill opens the bills page with a bill already started for that vendor, and Record Payment opens the bills page filtered to that vendor (a banner shows the vendor name with a Clear link) so you can record a payment against the right bill.
You pick a vendor when creating a one-off bill or a recurring bill; the field lets you select an existing vendor or type a new name to add it on the spot. Recurring bills carry their vendor onto every bill they generate. On Receive Stock you can now search your entire item catalog (not only items already marked as inventory), optionally record the vendor you bought from, and an item starts tracking inventory the first time it is received. The QuickBooks Online export includes a vendors file built from these real vendor records.
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.
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 [Updated in v66]
- Default Payment Terms: Net 30, Net 15, Due on Receipt, etc.
- Contract Payment Methods: Customer-facing methods shown on the remote signing page, the customer Pay Now portal, and invoice emails. Typical config: Credit Card, ACH, Venmo, Zelle. Cash is rare here because customers cannot easily mail cash through an online flow.
- Job Payment Methods: Tech-facing methods shown in the Complete Job modal on the tech app and on the office job detail page. Typical config: all six customer-payable methods plus Bill On Site, which is a tech-only convenience for accounts billed through the office rather than collected in the field.
- Independence: The two lists are independent, so you can accept Venmo on customer-facing contracts but not at jobs (so techs do not have to verify a Venmo transfer in the field), or vice versa. Enable only the methods your company actually accepts in each context.
- 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.
Company Logo on Invoices [New in v50]
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.
- 1In Settings › Invoices, scroll to the Invoice Header section. Click the dashed upload zone and select an image file.
- 2Supported formats: PNG, JPG, GIF, WebP, SVG. Maximum size: 2MB.
- 3After upload, a preview shows with Replace Logo and Remove buttons.
- 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.
Brand Accent Color [New in v78]
Sets the accent color used throughout your invoice PDF: the header border, company name, table header, total row, section titles, and the payment remittance slip accents. Use the color picker or type a 6-digit hex code (for example, #008080 for teal). Leave it at the default to keep the standard blue. A Reset to default button appears once a custom color is set. If the hex value is not valid, the invoice falls back to the default blue until it is corrected. Your uploaded company logo prints in the invoice header alongside this color.
Payment Remittance Slip [New in v78]
Controls which payment sections appear on the remittance slip (page 2 of the invoice PDF): Show Pay by Check and Show Pay by Credit Card. Each can be turned on or off independently. This is separate from the payment methods customers see when signing a contract or paying online, so you can offer credit card online while keeping it off the mailed remittance slip. If both sections are turned off, the slip shows only the amount due with no payment method details.
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]
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.
The Override Raises the Charge [New in v102]
Entering a value in the per-job Override field raises the charge for that job. Both the Calculated Total and the Final Price update to the override amount, with the labor billed at the override minutes, and the completed invoice totals to that figure with the labor line showing the higher amount (no separate Price Adjustment line). Clearing the Override resets the Calculated Total and Final Price to the default breakdown. A Final Price you type by hand after setting an override still wins and is what gets billed.
Invoice Review Workflow [New in v50]
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
- 1On the Jobs list page, select Pending Review from the Status dropdown to see all jobs awaiting review.
- 2Open the job. An amber banner confirms the invoice is held. A Review Invoice panel appears below.
- 3Edit any checklist fields if corrections are needed. Each changed field is logged to Internal Notes automatically.
- 4Click Approve & Send to Customer. Checklist edits are auto-saved before the invoice is sent.
- 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.
Approval Notes Name the Recipient [New in v132]
When you approve and send an invoice, or send a checklist, the email is now sent first and the approval note is written afterward, so the note reflects the real result. It names the exact address the email went to (for example, Invoice INV-1221 approved and sent to customer's email: name@example.com), says the email failed to send if it did not go through, and says no email on file, so it was not sent when the customer has no address saved. The precise recipient, delivery status, and any error are also recorded in the email log for that job or invoice.
Resending a Checklist [New in v132]
After a job is completed, you no longer need to download the checklist PDF and attach it to a new email to send it again. On the job detail page, the Checklist PDF card (admin and office roles only) has a Resend button next to Download PDF. Click Resend, and a Send checklist to field appears already filled with the customer's email. Leave it as is to send the customer another copy, or type a different address, such as your own, to send yourself a copy. Click Send, and a short confirmation appears below the field. Every resend is recorded in the email log with the address it went to and its status.
Zone Scheduling Settings [Updated in v34]
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]
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
- 1Select a date and enter a name (e.g. "Day after Thanksgiving").
- 2Click + Add Holiday or press Enter.
- 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]
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: A 30-minute lunch break is unpaid, so the Payroll report removes it from billable time in two situations. Any day where the staff member marked Lunch Break Taken always has 30 minutes removed, because the break actually happened. When this checkbox is enabled, the report also removes 30 minutes from any 8-hour-or-longer day where the staff member did NOT mark a lunch break, covering a required break that was forgotten. When the checkbox is off and no lunch was marked, no deduction applies even on a long day. 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 report toggle; individual runs can still flip it.
- 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.
Work week start day [New in v65]
A Work week starts on dropdown sits directly below the frequency selector and offers Sunday through Saturday. It sets the first day of the week rendered on the technician timecard's This Week ledger. This control applies to all frequencies, so a semi-monthly or monthly company with no pay-period anchor can still choose its week-start day. It is display-only and does not change pay-period math — the Payroll export continues to derive periods from the frequency and anchor. This decouples the timecard display week from payroll: a company can show a Monday-start timecard while running Monday-anchored biweekly payroll, or set any other timecard start day without shifting a single pay period. Stored in company_settings.week_start_day (0=Sun..6=Sat); on rollout each company was backfilled from the weekday of its existing payroll anchor, falling back to Sunday.
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]
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]
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.
Maintenance Agreements vs. the Annual Maintenance Flag [New in v131]
A contract whose type is Maintenance Agreement does not, by itself, make its visits no-charge at completion. The no-invoice behavior described above is driven entirely by the service type's Annual Maintenance Service flag (or by a $0.00 Calculated Total), not by the contract type. A job can belong to a Maintenance Agreement and still generate an invoice when it is completed if its service type is not flagged Annual Maintenance. This is most common with Time & Materials service types: the technician's clocked hours build a Labor line, the Calculated Total comes to more than $0.00, and the modal creates an invoice for that labor even though the visit is part of the agreement.
If maintenance visits are billing labor when they should be covered, open Settings → Service Types, find the service type the contract uses, and confirm Annual Maintenance Service is checked. Because the flag is global to the service type, use a dedicated maintenance service type when the same work is sometimes covered by an agreement and sometimes billed as a standalone paid visit; flagging a shared service type would make the standalone paid visits complete as no-charge as well.
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_typematches 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
- 1Go to Settings and click the Service Types tab.
- 2Find the service type you want to flag (e.g., Camera Inspection, System Inspection, Drain Field Inspection).
- 3Click Edit.
- 4Check the Inspection checkbox.
- 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]
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.
- Export CSV [New in v118]: Download your entire catalog as a single CSV file. The button re-fetches every item for your company and ignores any active search or filter, so the file always contains the full catalog. Columns: Item Name, SKU, Item Type, Category, Description, Unit Price, Wholesale Price, Markup %, Revision Date, Active, and Created. The header names match the Import CSV format, so an exported file can be edited and re-imported, and the file also drops into QuickBooks or another platform (Item Name to Name, Unit Price to Sales Price/Rate, Wholesale Price to Purchase Cost).
- 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]
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]
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
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
- 1Navigate to Settings › SMS.
- 2Toggle the SMS Enabled switch to ON.
- 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}.
| Template | When It Sends | Purpose |
|---|---|---|
| Appointment Reminder | 24 hours before a scheduled job | Reminds customer of upcoming appointment |
| En Route | When tech marks job as Dispatched | Alerts customer technician is on the way |
| Job Completed | When job is marked Completed | Notifies customer work is done |
| Invoice Reminder | 7 and 14 days past due | Prompts payment on overdue invoices |
| Job Scheduled | When a new job is scheduled | Confirms 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
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
- 1Navigate to Settings › Notifications › SMS Sender Number and click Start Number Porting.
- 2Select your number type (Landline, Wireless, or Toll-Free) and account type (Business or Residential).
- 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.
- 4For wireless numbers: enter your carrier account number and PIN or last 4 of SSN.
- 5Download, complete, and sign the Letter of Authorization (LOA) — see the Downloads section below. Upload as a PDF (max 4MB).
- 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.
- 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.
- 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
| Status | What It Means |
|---|---|
| Draft | Request saved but not yet submitted. You can still edit all fields. |
| Submitted | Request sent to Twilio. Waiting for carrier acknowledgment and FOC (Firm Order Commitment) date. |
| Processing | Carrier has accepted the request. Porting is in progress. FOC date shown if available. |
| Completed | Number successfully ported. All outbound SMS now use your ported number. |
| Failed | Carrier rejected the request. Common causes: incorrect account info, unpaid balance, VOIP number. See the failure reason and start a new request after resolving. |
| Cancelled | You 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
| Field | What to Enter |
|---|---|
| First Name / Last Name | Your name exactly as it appears on your carrier account — not your preferred name, not a nickname. Check a recent bill. |
| Business Name | Your registered business name if the phone service is under the company (e.g., "ABC Septic Services, LLC"). Leave blank if residential. |
| Service Address | The 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 Provider | Your current carrier name (e.g., AT&T, Verizon, T-Mobile, Spectrum) |
| Signature & Date | Sign with wet ink or a digital signature. Print your name. Date it. |
Required Documents Summary
| Document | Format | Notes |
|---|---|---|
| Letter of Authorization (LOA) | PDF, max 4MB | Signed by the authorized account holder. Name and address must match carrier records exactly. |
| Recent Billing Statement | PDF, max 4MB | Within 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
- 1Navigate to Settings and click the Payments tab.
- 2Click Connect Stripe Account.
- 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.
- 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
- 1You send an invoice email to the customer (or share the payment link manually).
- 2The customer opens the link and clicks Pay Now.
- 3A secure Stripe-hosted payment form collects their card information.
- 4The payment is routed directly to your connected Stripe account.
- 5SepticCycle automatically records the payment, updates the invoice, and logs the transaction.
- 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:
- 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.
- 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).
- 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.
- 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).
- 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)
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.
- 1Enable the Portal: Go to Settings › Sign & Pay and flip the toggle to Active.
- 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.
- 3Add a Welcome Message (Optional): Appears at the top of your booking page.
- 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).
- 5Save: Click Save Sign & Pay Settings. Your booking page is immediately live.
Configuring Tax on a Plan [New in v48]
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 4242with 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/plansendpoint 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
⚠️ 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.
- 1Set your Home Base: Enter your office or yard address and click Save & Locate. This is the starting point for all route calculations.
- 2Click Geocode All to batch-convert all property addresses to GPS coordinates. This is a one-time operation — new properties geocode automatically.
- 3Configure your Google Maps API key in Vercel environment variables as
GOOGLE_DIRECTIONS_API_KEY.
Running Route Optimization
- 1Open the Job Calendar and switch to Day View for the date you want to optimize.
- 2For any technician with two or more jobs that day, a Route Optimizer panel appears.
- 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.
- 4Click Apply Route to accept. Jobs are reordered and suggested start times are assigned.
- 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.
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. A Payment Methods pie and a Revenue by Tag pie appear below the chart; the tag slices use each tag's configured color from Settings › Tags so the chart matches your tag chips.
Interactive Revenue Charts
📌 Note: New in v114. Both pies below the Revenue chart are now click-to-drill.
Click any Payment Method slice or its legend row to open a detail panel below the pies: total collected through that method, payment count, average payment, percent of all collected revenue, a trend over the selected period, your top five customers for that method, and a table of every payment (click a row to open the invoice in a new tab). Click any Revenue by Tag slice or legend row to see that segment's Collected and Invoiced totals, Collection Rate, Uncollected AR, Average Invoice, invoice count, a "how this segment pays" payment-method breakdown, top customers, and its invoices. Each panel has an Export CSV button scoped to the rows shown. The selected slice is highlighted and the others dim; click the same item again or the Close button to dismiss. All of this is computed in the browser from data the tab already loads, so there is no extra wait.
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 the payments you record against your bills, so it reflects money you have actually paid out, grouped 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 (calculated automatically from your open and partially paid bills [New in v110]), 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.
📌 Note: New in v88: credit now follows who logged time on each job, not who was assigned.
Each job is credited to whoever logged time on it (technician or office/admin staff). When several people work one job, each is credited and that job's revenue is split evenly. Jobs with no clocked time fall back to the completing (primary) technician, and older jobs fall back to the assigned technician. Credited office/admin staff appear with a (Staff) badge, and their hours, utilization, and labor cost are included. Completing a job also removes anyone who was assigned but never clocked in, so the Jobs list and job detail show who actually did the work.
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 [Updated in v84]
A 30-minute lunch break is unpaid, so the report removes it from billable time in two situations. Any day where the technician marked Lunch Break Taken always has 30 minutes removed, because the break actually happened. Separately, when the Deduct 30 min if lunch not taken on 8h+ days checkbox is enabled, the report also removes 30 minutes from any 8-hour-or-longer day where the technician did NOT mark a lunch break, covering a required break that was forgotten. When the checkbox is off and no lunch was marked, no deduction is applied even on a long day. The rule applies once per day at the day level, so a technician with split shifts in one day still receives at most one 30-minute deduction.
The checkbox default comes from Settings › Payroll. Individual runs can override it by toggling the checkbox before viewing results.
How Hours Are Calculated [New in v84]
Each clocked day is first rounded to the nearest quarter hour, then any lunch deduction is subtracted from the rounded total. Rounding follows a carry-forward rule based on the minutes past the hour: 0 to 6 rounds down to the hour, 7 to 21 rounds to :15, 22 to 35 rounds to :30, 36 to 44 rounds to :45, and 45 to 59 rounds up to the next hour. For example, 8h 51m rounds up to 9h, and a 9h day with a lunch deduction becomes 8h 30m billable.
The Worked Hrs column shows the rounded total BEFORE the lunch deduction, the Deduction column shows the lunch time removed, and Total Paid is Worked Hrs minus Deduction plus Paid PTO. Because Worked Hrs is shown before deduction, the numbers read cleanly: Worked minus Deduction plus PTO always equals Total Paid. Every hours value on the tab, including the table, the summary cards, the grand-total row, and both exports, is shown in hours-and-minutes format such as 40h 45m rather than a decimal like 40.75h.
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 [Updated in v84]
Columns per staff row, with a grand-total row at the bottom that sums every staff member for the period:
- Staff: name and role (technician or office).
- Days: number of distinct days with clocked time.
- Worked Hrs (before deduction): rounded clocked hours, shown before any lunch deduction is applied.
- Deduction: amber text like
-30m (1d)when a lunch deduction was applied that period; em dash when none. - PTO Hrs: paid PTO hours in indigo, with day count like
(2d). Em dash when none. - Total Paid: bold total = Worked Hrs minus Deduction plus PTO Hrs.
- PTO Balance: current paid-time-off balance, with the per-paycheck accrual rate underneath when configured.
- 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. Inside, the period is broken into weeks, and the weeks sum exactly to the staff member's row total. Expand a week to see every clocked day with its clock-in and clock-out time, the rounded total, the billable amount after deduction, whether lunch was marked, and a plain-language note explaining the rounding and any deduction for that day. An amber left-border and -30m label mark any day where a lunch deduction was applied. Paid PTO entries contributing to that person's total are listed 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 the columns Staff, Type, Days Worked, Worked Hours (before deduction), Deduction Days, Paid PTO Hours, Total Paid Hours, Out-of-Range Days, and Lunch Compliance %. Hours are written in hours-and-minutes format. 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.
Bills & Expenses Tab
📌 Note: New in v110; consolidated in v114. Bills, Recurring, and Expenses now live together on one tab.
Switch between three views with the buttons at the top: Bills, Recurring, and Expenses. The Bills view lists every bill with its vendor, category, bill date, due date, amount, and remaining balance, with aging KPI cards at the top for what is owed, due soon, and overdue. Filter by status with the pills: Open, Partial, Paid, and Void. Admin and office users can add a new bill, record a full or partial payment against any bill (the remaining balance and status update automatically), and switch to Recurring to manage bills that repeat. The Expenses view shows expense totals by category for the selected period. See Bills & Accounts Payable below for the full walkthrough.
A/P Aging Tab
📌 Note: New in v53; updated in v110. The payables mirror of the Receivables tab, now driven by your open bills.
Shows every bill that is not yet fully paid, grouped into aging tiers by how far past its due date it is, so you can see what needs paying first. KPI cards show Total Owed and the amounts running overdue. Click any bucket card to filter the table. Each row shows the vendor, category, due date, amount still owed, and age in days — color-coded so the most overdue stand out. 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.
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.
Bills & Accounts Payable
📌 Note: New in v110. Track what your business owes alongside the money coming in, without a separate accounting tool. Adding bills and recording payments is limited to admin and office users.
Adding a Bill
Open the Bills & Expenses tab (Bills view) and click New Bill. Enter the vendor name, choose a category (fuel, supplies, maintenance, repair, permit, equipment, rent, utilities, insurance, office, software, loan, or other), and set the amount, the bill date, and the due date. Add a note if you want. Save it and the bill appears in the list as Open.
Recording a Payment
Find the bill and click Record Payment. Enter the amount paid and the date. You can pay a bill in full or in part. The remaining balance and status update on their own: a bill becomes Partial when some of it is paid and Paid once the balance reaches zero. Each payment also flows into the Cash Out figure on the Cash Flow tab, so your spending stays current.
Recurring Bills
For bills that repeat, such as rent, insurance, or a software subscription, switch the Bills tab to the Recurring view. Create a template once with the vendor, category, amount, how often it repeats (monthly, quarterly, or annually), and the day of the month it is due. SepticCycle then generates the bill for you automatically on schedule. You can also click Generate Now to create the next bill immediately, edit or delete a template, and pause a template so it stops generating without losing its history.
Automatic Accounts Payable
Your Accounts Payable figure on the Financial Position tab is calculated for you from your open and partially paid bills, so it is always current and you never type it in. The other liability figures (credit cards, short-term loans, and the equipment loan) are still entered by hand in the liabilities panel, along with an as-of date.
Your Expense History
Any expenses you recorded before the Bills view existed are carried into the bills ledger automatically as paid bills, so your Cash Out and expense totals reflect your real spending history and nothing is lost. New expenses you enter the usual way continue to appear there too.
Understanding Each Number
📌 Note: New in v110. Small information icons explain how each key figure is calculated.
Many of the key figures on the Reports page now have a small information icon next to them. Hover over the icon on a computer, or tap it on a phone, and a short explanation appears describing exactly how that number is calculated and what it includes. These tooltips are available on the Financial Position, Cash Flow, Profit & Loss, Revenue, and Jobs tabs, and are there so you, or whoever handles your books, never has to guess what a figure means.
Land Applications
Land application is the beneficial reuse of pumped septage spread on approved farm fields, where crops take up the nutrients. SepticCycle lets you set up approved sites, plan each field's yearly nutrient budget, record every application with regulator-ready detail, and generate print-ready compliance forms. The workflow has four stages: set up land sites, enter your septage license, create cropping plans, then record applications and generate forms.
Setting Up Land Sites [New in v134]
Each field you apply to should exist as a site. Add it under Disposal Sites, set the Site Type to Land Application Site, and complete the Land Site Details section:
- Site I.D. #: the identifier your regulator assigns to the site. Prints on every compliance form.
- County, Township, Section: the location and legal land description of the field.
- Land Owner: the owner of the field.
These are optional in the software. Any left blank appear blank on the printed forms.
Septage License [New in v134]
In Settings, find the Septage Hauler License card and enter your Septage License Number. This prints on the Cropping Plan form and only needs to be entered once.
Cropping Plans [New in v134]
A cropping plan is the yearly nutrient budget for one field. It records the crop, its nitrogen need, and the resulting Agronomic Application Rate (AAR), the maximum gallons per acre you may apply that year. SepticCycle then tracks applications against it and warns you as you approach the limit.
Click + New Cropping Plan, choose the site, field, and cropping year, then use the AAR calculator:
- Nitrogen basis (most common): enter the crop nitrogen requirement and the nitrogen credits that reduce it: prior-crop legume credit, soil organic matter, chemical fertilizer, a prior-septage credit (a checkbox fills 8 lb), and manure. SepticCycle subtracts them all, then divides the remainder by the nitrogen content of septage [New in v169].
- Phosphorus basis: used when soil phosphorus is high; divides by the phosphorus content instead.
- Waste strength: domestic septage uses the standard rate, portable toilet waste is stronger (rate divided by three), holding tank waste is more dilute (rate multiplied by three).
The computed AAR updates live; click Use this AAR to store it as the value applications are tracked against. Open any plan to see a usage meter (green under 80 percent, amber 80 to 100, red over 100) showing gallons applied versus the yearly limit. One plan is allowed per site, field, and year.
Recording an Application [New in v134]
Click + New Application and complete the form:
- Link to Manifest (optional): carry over waste details from a pumping manifest, or leave it as a standalone record.
- Application Site: link to an authorized site so the record tracks against its cropping plan and fills the site details onto the forms; the address fills in automatically.
- Application Details: date, time, waste type, gallons, method, acreage, and equipment; the rate per acre calculates automatically. You can also split a load into septage and other gallons with a description and a source or invoice number, which print on the Volume Record [New in v169].
- Lime Stabilization: record the alkaline material, lime amount, form, initial pH, and pH after 30 minutes. For cold loads you can also record the temperature (°F) and reading time at each pH reading; SepticCycle then shows the temperature-corrected pH, and the met or not met flag uses that corrected value because a meter reads low in cold septage [New in v167].
- Crop and Pathogen/Vector Reduction: crop grown, expected yield, Field Type (Cropped or Fallow), nitrogen applied, and the reduction methods.
- Setbacks, Time, and Certification: distances to water, wells, property lines, and residences; time to incorporation; and who certified the application.
If a technician completed a Land Application checklist in the field, use the Import from Job Checklist panel to copy the captured values into the form. When a record is linked to a site with a cropping plan, its detail page shows an Annual Agronomic Rate card with the percent of the yearly limit used.
Compliance Forms [New in v134]
The Compliance Forms panel at the top of the list generates print-ready PDFs for a chosen site and year:
- Volume Record: one row per application mirroring the daily hauling record: source or invoice, septage, other, and total gallons, plus a coded method (I for injection, SA for surface, SA6 for surface applied and incorporated within 6 hours), with a total volume [New in v169].
- Lime Stabilization Log: one row per lime-stabilized application with the initial and 30-minute pH, their temperatures, reading times, and the temperature-corrected pH (shown in red below 12.0), plus material and driver.
- Cropping Plan: one block per field with acreage, phosphorus, AAR, a nitrogen budget line (requirement, credits, and net) [New in v169], crops, a 12-month applied grid, and your business name, septage license, land owner, and site ID.
Managing Records
All records appear in a list, filterable by date range and method and searchable by site, number, technician, or permit, and every column is sortable (click a header to sort, click again to reverse) [New in v169]. Summary cards show total applications, gallons, acreage, and certified count. Open any record to view, edit, or generate its compliance forms.
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
- 1On your smartphone, open Chrome (Android) or Safari (iPhone) and navigate to your SepticCycle URL.
- 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 v66]
Payment buttons are filtered by your company's Job Payment Methods setting (Settings › Billing & Payments). This is the tech-facing list and is separate from Contract Payment Methods, which controls what your customers see on the remote signing page and the Pay Now portal. Only the methods enabled on Job Payment Methods appear in the Complete Job modal. Bill On Site always appears regardless of settings (when enabled on Job Payment Methods). 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.
- ACH, Venmo, Zelle: The system captures the customer's stated intent to pay via the selected method but does NOT auto-mark the invoice paid, because the tech cannot verify the actual transfer in the field. The invoice stays in Sent status with a note recording which method the customer indicated. The follow-up invoice email surfaces the selected method first with a colored highlight so the customer knows where to send the money. The office confirms the payment via the relevant provider's dashboard and marks the invoice paid via Record Payment.
- Bill 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 v65]
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.
- This Week summary [New in v65]: A This Week card at the top of the timecard lists each day of the current week with the hours you clocked that day and a Week Total at the bottom. Today is highlighted and its value ticks up live while you are clocked in; days not yet worked show a dash. The week begins on the day your company set in Settings › Payroll › Work week starts on (Sunday by default), so a Monday-start company sees Monday through Sunday. Hours shown are raw clocked time — payroll rounds each day to the nearest quarter hour and subtracts unpaid lunch, so paycheck hours may differ slightly. A prior in-week day where you forgot to clock out renders as 0m with a "Never clocked out" flag so it can be corrected.
- 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.
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
- 1Go to Settings › Team.
- 2Click Invite Team Member.
- 3Enter the person's email address and select their role.
- 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.
Hourly Rate for Office and Admin Staff [New in v102]
The Edit User window includes an optional Hourly Rate field for office and admin users who are not linked to a technician record. The rate bills that user's labor on Time & Materials jobs: it is captured when the user clocks in to a job, so it applies to time logged after you set it, not retroactively. Leave it blank for no rate. Technician rates are not set here; they live on the Technicians page, and a technician's rate takes precedence.
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.
Follow-Ups Due Widget [New in v136]
Surfaces service records you flagged for follow-up on the Service Record Detail modal. It lists any follow-up whose date is today or within the next 30 days, plus every overdue follow-up, sorted oldest first with overdue items in red. Click a row to open that exact service record, or select Mark Done to clear it. A count of follow-ups flagged without a date shows beneath the list, and a View all follow-ups link opens the full Follow-Ups page. The widget and its Mark Done action are available to admin and office users.
The Follow-Ups Page [New in v136]
Open it from Sidebar › Jobs › Follow-Ups or the widget's View all link. The Due section lists follow-ups that have a date, oldest first, with overdue in red. The No date set section lists follow-ups you flagged without choosing a date. Click any row to open that service record. Select Mark Done once you have handled it. Marking a follow-up done removes it from these lists but leaves the service record unchanged. Available to admin and office users.
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.
| Trigger | What 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 changes | Rescheduled email showing the original scheduled time and the new time. |
| 7 days before scheduled job | 7-day advance reminder with full job details and any pre-service instructions. |
| 1 day before scheduled job | Final confirmation reminder with job details and company contact information. |
| Invoice overdue 7 days | First overdue reminder with outstanding balance and a direct Pay Now link. |
| Invoice overdue 14 days | Second overdue reminder. |
| Invoice overdue 30 days | Third and final overdue reminder. Stops automatically once the invoice is paid or voided. |
| Contract nearing expiration | Renewal 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}.
| Template | When It Sends | Purpose |
|---|---|---|
| Job Scheduled | When a new job is created | Confirms scheduling with the customer |
| Appointment Reminder | 24 hours before the scheduled job | Reminds customer of their upcoming appointment |
| En Route | When tech marks job as Dispatched | Alerts customer that the technician is on the way |
| Job Completed | When job is marked Completed | Notifies customer that work is done |
| Invoice Reminder | 7 days overdue, then again at 14 days overdue | Prompts 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
Job Statuses [Updated in v23]
Additional: On Hold, Cancelled, Draft, No Access 🔒
Contract Statuses [Updated in v68]
Additional terminal states: Cancelled (manually cancelled), and the renewal flow which creates a successor contract for auto-renewing contracts before they reach Expired. Active to Expired transitions automatically at 6:30 AM UTC daily. Expired to Archived transitions automatically at 7:00 AM UTC daily.
Compliance Report Statuses
Issue Statuses
Manifest Statuses
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.
- 6:30 AM UTC daily: Auto-expire contracts [New in v68]. Transitions Active contracts whose end date has passed (and that are not set to auto-renew) to the Expired status.
- 7:00 AM UTC daily: Archive expired contracts [New in v68]. Moves Expired contracts to the Archived status so they no longer appear in default views. As of v69, contracts must have been Expired for 30 days before this transition fires [Updated in v69].
- 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).
- 14:30 UTC daily (9:30 AM Central): Contract renewal reminders [New in v69]. Sends an automated email to each customer whose contract expires within the next 60 days and is not set to auto-renew. One email per contract per lifetime. Customers reply by phone or email to your office (no clickable renewal link).
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 in the bottom-right corner of any dashboard page. It shows a small white robot with the SepticCycle logo on its chest. Click it to open the chat panel. The panel floats above the page content and does not interrupt your work.
- 1Click the emerald robot button in the bottom-right corner of any dashboard page.
- 2The panel opens above the button. If you have a prior conversation it resumes immediately.
- 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.
- 4Press Escape or click the X in the panel header to close.
- 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.
Sending Documents by Text
When a customer has no email address on file, you can send them their document link by text message instead [New in v141]. This works for invoices, estimates, and contracts. Email is always the preferred channel, so when the customer has an email SepticCycle sends by email as usual. The text option appears only when there is no email on file, and it sends only when the customer has a mobile number and has opted in to text messages.
- Invoices. On Send Invoice, a Send by text button appears next to Send by email when the customer has no email, delivering a secure pay link to their mobile number.
- Estimates. On Send Estimate, a Send by text button delivers a link to review the estimate. On the New Estimate page, Save and Send does this automatically: email if there is one, otherwise a text. If the customer cannot be texted, the estimate is saved as a draft so you can add an email, and no duplicate is created.
- Contracts. On Send for Payment and Signature, a Send by text button creates the invoice and signing link exactly as the email version does, then texts the link so the customer can review, pay, and sign from their phone. The invoice is created only once, so texting after an email attempt, or clicking more than once, never creates a second invoice.
📌 Note: If the customer has not opted in to text messages, or has no mobile number on file, SepticCycle tells you why instead of sending. On an estimate or contract with no email, a note reminds you to add an email to send electronically, or add a mobile number and text consent to send by text.
Technicians texting invoices. When a technician completes a job that creates an invoice, SepticCycle automatically texts the customer the pay link if the customer has a mobile number on file and has opted in to text messages, so a customer without email still receives their pay link on site.
Text Message Usage and Overage Billing
Your plan includes a monthly allowance of text message segments [New in v142]. The included allowance is 500 segments per calendar month. A short text is one segment, and a longer text can split into more than one segment, so a very long message may count as two or more. Only messages that are actually sent or delivered count toward your allowance, messages that fail or are blocked do not count.
- Included first. You are never charged for segments inside your monthly allowance.
- Overage is small and automatic. Segments beyond the allowance are billed at a low per segment rate (currently three cents per segment) and added to your regular monthly invoice, so there is nothing separate to pay.
- Typical use has no overage. Most companies never reach the included allowance.
📌 Note: Before a customer can receive anything by text, their profile needs a mobile number and text message consent (the SMS consent setting on the customer edit page). If either is missing, SepticCycle tells you which one instead of sending. If you want your current month usage, contact support and we can look it up.
Choosing a Customer on a New Invoice or Estimate
When you create a new invoice or estimate and choose a customer, business customers now show as the company name with the contact name in parentheses, for example Acme (Cody Quinney) [New in v142]. Individual customers show just their name. This makes it easy to tell apart two businesses that share the same contact person, and you can search by either the business name or the contact name.
📌 Note: The New Invoice page also mirrors the New Estimate page for delivery: Save and Send emails the invoice when the customer has an email, and otherwise texts the payment link. If the customer cannot be texted, the invoice is saved as a draft with no duplicate created.
Your Subscription and Billing
SepticCycle starts with a free trial, and you are not charged while your trial is active [New in v143]. When you move from your trial to a paid subscription, you add a payment method so your service continues without interruption. Your card is saved at that point, and nothing is charged until your trial ends.
- First charge at trial end. When your free trial ends, your first monthly invoice is charged to the payment method on file, and your subscription renews automatically each month after that.
- If a payment does not go through. SepticCycle shows a banner at the top of your dashboard letting you know your last payment did not go through, with the date by which you need to update it. You keep working during a short grace period, so a failed charge does not lock you out while you sort it out.
- Updating your card. Use the link in the banner to open your billing portal and update your payment method. You can also reach the billing portal from your subscription settings at any time.
Tank Maintenance Report
The Tank Maintenance Report is a compliance report generated for tank maintenance jobs [New in v143]. It captures the maintenance details, a per tank inventory, the destination where the septage was taken, and signatures from both the technician and the property owner. You generate one report per job, and it downloads as a PDF with a details page and a certification and signatures page.
Save Your Signature Once
On the Profile tab, find the My Signature card. Draw or type your signature, pick a style, and Save. Your saved signature and your certifications are applied automatically to every Tank Maintenance Report you generate, so you never sign each report by hand. Choose Update Signature to change it later.
Fill Out the Checklist
- Add the checklist. On the job, add a Tank Maintenance Report checklist. The maintenance date, property address, property owner name, and parcel ID prefill from the customer and property. Known values are filled for you, and a brand new customer starts blank.
- Record the tanks. In Tank Inventory, mark each tank Present or N/A. Marking a tank N/A hides that tank and every later tank, along with their measurements and gallons removed, so a one or two tank job stays short and reaches 100 percent complete.
- Choose the destination. In Disposition, choose whether the septage will be taken to a treatment facility or to land application, then choose the facility or site. The list narrows to match the destination, so treatment shows your treatment facilities and land shows your land sites and fields. Choose Other to type one in.
Capture Signatures and Generate
When you complete the job and capture the completion signature on your device, that signature appears on the property owner block of the report. Once the job is completed, invoiced, or paid, open the job and use the Tank Maintenance Report button to download the PDF. Page one shows the maintenance details and tank inventory. Page two is the certification and signatures, with your printed name, license or certification number, and saved signature, plus the property owner name, address, and signature.
Need Help?
Can't find what you're looking for? Download our guides or reach out to our team.