PortaPro Docs

Win and serve customers

desktop_windows
Customer Portal
24/7 access to schedules, invoices, and service history.
price_change
Quotes & Invoices
View, approve, and pay documents online.
event_available
Online Booking
Customers book roll-offs and event rentals on your website and pay a deposit. Nothing is scheduled until you approve.
credit_card
Payment Processing
Secure online payments with flexible options.
sms
Inbox
Portal messages, text (SMS), and email in one inbox per customer, plus a Requests tab for everything customers ask for in the portal.
signature
E-Signatures
Sign contracts digitally with audit trails.
build
Service Checklists
Standardized pumping and cleaning workflows.
map
Venue Blueprinting
Pin inventory clusters on satellite maps, link to quotes, and send branded site plans.
mark_email_read
Email From Your Inbox
Send invoices, quotes, and sales email from your real address, with your real deliverability.

Run the field

assignment_add
Job Schedules & Dispatch
Create jobs, dispatch routes, and manage recurring service.
alt_route
Route Optimization
Routes planned around tank capacity, disposal-site hours, and service windows.
smartphone
Mobile App
Offline-first workflows for field operations.
location_on
Unit Pins
Every unit's exact spot on the site map. Drivers move pins from the field.
description
Services Hub
Service requests, checklists, and proof-of-work logs for every job.
sms
Team Chat
Channels and direct messages for drivers, dispatch, and the office.
connect_without_contact
Walkie-Talkie
Push-to-talk inside the PortaPro app, on the channels your crew already uses, with searchable transcripts.
phone_in_talk
Calls & Huddles
1:1 calls and channel huddles for your crew, plus meetings customers join from a browser.

Control the business

inventory
Equipment Inventory
Availability by date, so a weekend booking shows before the weekend.
festival
Event & Tent Rentals
Kits, tents booked by size, pull sheets, scan-back check-in, and charges for what comes back missing.
dashboard
Event Layouts
Tents and tables to scale on the venue or its floor plan, seating charts from the guest list, and a share link for comments and approval.
calendar_month
28 Day Invoicing
Bill every site automatically on the industry-standard 28-day cycle, with duplicate prevention built in.
attach_money
Bookkeeping & Billing
Quotes, invoices, expenses and receipts, bank reconciliation, and QuickBooks, Xero and FreshBooks sync.
group
Customer Accounts
Profiles, sites and locations, contacts, and history.
format_list_bulleted_add
Leads & Deals
The CRM built into PortaPro.
outdoor_garden
Temporary Fencing
Draw the fence on the satellite map or type the feet: panels, gates, stands, clamps and sandbags counted for you, screen priced by the foot.
Roll-Off Rentals
Live ledger for every container on the ground, overage and landfill disposal billed from the weight ticket, and dumpster requests from the customer portal.
local_shipping
Fleet Management
Maintenance, compliance, inspections, and vehicle tracking.
my_location
GPS Tracking
Plug-in trackers for the trucks, battery tags for the units, and an alert when a unit leaves its pin.
phone_in_talk
Business Phone
A real business line with an IVR, ring groups, voicemail, and recording. Click to dial, ring your cell, and every call logs itself on the customer.
manage_accounts
Team Management
Roles, the time clock, and the credentials about to expire.
person_add
Hiring
A careers page, an application built for CDL drivers, and a Hire button that turns the applicant into a team member.
wallet
Payroll
W-2 and 1099 payroll inside PortaPro. In beta, rolling out in stages.
bar_chart
Reporting & Analytics
Gallons by disposal site, overdue sites, and reports on your billing cycle.
water_drop
Septic Service
The tank on the customer's record, pump-out dates predicted, and every septic report form, from pumping to real estate transfer, shipped and attached to the job.
Also in PortaPro:QuickBooks Sync,Xero Sync,FreshBooks Sync,Claude & ChatGPT,Equipment Scanning,Shared Truck Devices,Consumables,Marketing Tools,Automated Review Requests,Septic Reminders,Celebrations,Help & Support

Run your portable sanitation operation from lead to ledger.

One system, 46 features, no per-user or per-vehicle fees or limitations.See all featuresarrow_forward

Learn & Discover

calculate
ROI Calculator
Estimate time, labor, fuel, and cost savings with PortaPro.
route
Route Efficiency Simulator
See how optimized routing can increase weekly service stops.
scale
Dumpster Weight Calculator
Estimate debris weight and the roll-off size it needs.

Support & Training

headset_mic
Support
Submit a request, email our team, or book a call.
support
Help Centeropen_in_new
Guides, documentation, and step-by-step setup resources.
favorite
Our Promise
Why we refuse to let software get worse over time.

GPS Asset & Vehicle Tracking

How GPS tracking works
location_on
Unit tracking device
A sealed battery tag inside the unit. It reports when the unit moves, and the battery lasts five to seven years.
navigation
Vehicle tracker
Plugs into the truck's OBD-II port. Live location, plus odometer and fuel on supported trucks.

Solutions

local_shipping
In the Field
A service day from the yard to the invoice, and where each job goes wrong.
wc
Portable toilet operators
Same-day missed stops, proof for every stop, and rate card invoices.
water_drop
Septic operators
Pump-outs predicted from the tank, and the county's own forms filled from the job.
water_drop
Grease trap service
Each trap on its own cadence, and the FOG 25% rule measured.
Roll-off haulers
Days past term, tons over the allowance, and landfill fees on one final invoice.
celebration
Tent and party rentals
A tent booked by size, packages as one line, every chair checked in.
festival
Event and festival operators
A site plan on the quote, and a weekend priced as a weekend.
account_balance
Municipal contracts
Invoices before the period with the PO printed, and a record of every park visit.
domain
Multi-location operators
Several yards, service territories, divisions, and roles in one account.
Why Operators SwitchPricing
Sign Inrocket_launchStart Free Trial
homeHelp Centerchevron_rightService Hubchevron_rightEmergency & On-Call Jobs

Emergency & On-Call Jobs

schedule14 min read
calendar_todayUpdated July 13, 2026
emergencyon-callafter-hoursprioritysurchargesfeessweepdamage feedry-run feeunit replacementretirephase R3

On this page

EMR-1: The Core ModelEMR-2: The Priority ToggleEMR-3: Attach a Fee to a JobEMR-4: How next_cycle Fees Actually Reach the InvoiceEMR-5: Immediate-Billing FeesEMR-6: Damage, Dry-Run, and After-Hours FeesEMR-7: Unit Replacement in the FieldEMR-8: On-Call Customer SetupEMR-9: How Emergency Fees Interact with AutopayEMR-10: Priority Auto-Derivation (Note)EMR-11: TroubleshootingEMR-12: Related Articles

Need more help?

Need more help?

Contact Us

Have questions about PortaPro? Fill out the form below and our team will get back to you within 24 hours.

Or schedule a quick call at a time that works best for you.

Contact Us

Have questions about PortaPro? Fill out the form below and our team will get back to you within 24 hours.

Or schedule a quick call at a time that works best for you.

PortaPro

Contact:
support@portaprosoftware.com

© 2026 PortaPro. All rights reserved.
All-in-one software for portable sanitation operators.

Quick Links

PricingROI CalculatorDumpster Weight CalculatorFree TemplatesSeptic Rules by StateCompare SoftwareBlogIn The Field

Platform

DispatchBillingFleet ManagementCustomer Portal

Support

Contact supportGetting set upHelp Centeropen_in_newStatusCareers

Company

TermsPrivacyCookie PolicySecurityAccessibilityAbout

Serving operators across North America. Proudly Built in America. 100% US Customer Support

Privacy Policy·Terms of Service·Accessibility·Contact

This article covers how PortaPro handles emergency, after-hours, and on-call work. The phone-rings-at-9pm jobs where a customer needs immediate service and expects the invoice to reflect the urgency. It also covers priority jobs more generally, damage / dry-run / after-hours fees, and unit replacement when something breaks in the field.

If you're doing regular scheduled service, see the Front-Load Recurring Service or Long-Term Rental workflows. This article is for the exceptions. The runs that fall outside the normal cycle rhythm.

---

EMR-1: The Core Model

What "emergency" means in PortaPro

A one-off service job. Usually created immediately, sometimes scheduled for later the same day. That carries an extra fee for the urgency (or the after-hours nature, or the hazmat aspect, or whatever your ops charges for). The fee is attached to the job itself, not to a separate invoice, so it rides through billing correctly whether the customer is cycle-billed or one-off.

The two things every emergency job needs

  • A job: created just like any other service job, with the customer, the location, and what needs to happen
  • A fee attached: from your Surcharges catalog, or as a one-off amount specific to this job
  • That's the whole model. Everything else (priority flagging, autopay handling, cycle sweep, tax treatment) flows from those two things automatically.

    Two ways the fee bills, chosen per fee

    When you attach a fee, you pick its billing disposition:

  • Next cycle: the fee is queued on the job and gets swept onto the customer's next cycle invoice when it generates. Best for cycle-billed customers with an active rate card.
  • Immediate: the fee bills right now on a one-off invoice you send today. Best for customers who don't have a cycle (or who you know pay per job).
  • Every fee stamps its choice at attach time. Sweep-eligible fees are marked next_cycle and live in the surcharge ledger; immediate-billing fees are marked immediate and flow through the invoice generator directly.

    ---

    EMR-2: The Priority Toggle

    Every job has a Priority switch in its detail modal (and in the wizard's scheduling step when you create it). Flipping it on marks the job is_priority = true.

    What Priority does:

  • Sorts the job to the top of dispatch views and route plans
  • Shows a red "Priority" badge on the job card
  • Nudges the auto-router to place it earlier in the day
  • What Priority does NOT do:

  • Priority itself does not add a fee. It's just a scheduling signal. If your ops charges an emergency premium, attach the fee separately (see EMR-3).
  • Priority does not automatically get inherited by a follow-up job (say a pickup after an emergency delivery). Each job has its own toggle.
  • Per-request only

    Priority is set per job at create time or toggled later. There's no "always mark this customer's jobs priority" setting. That would silently apply premium pricing to every job for that customer, which is a footgun. If a customer routinely needs premium service, attach the emergency fee at job-attach time as your standard practice.

    ---

    EMR-3: Attach a Fee to a Job

    Step 1: Open the job's detail view

  • Navigate to the job. Dispatch board, customer profile, or the direct URL
  • Scroll to the Fees section (labeled with the total attached fee amount)
  • Step 2: Add the fee

  • Click + Add Fee
  • Pick from your Surcharges catalog (predefined fees like "After-Hours Emergency," "Sunday Service Premium," "Hazmat Handling"). Or enter a one-off custom amount
  • Set the billing disposition: Next Cycle or Immediate
  • Save
  • What the Surcharges catalog stores:

  • Flat fees ($150 emergency response)
  • Percentage fees (15% surge on the job subtotal)
  • Per-quantity fees ($40 per hazmat drum, $25 per lift-gate deploy)
  • Configure the catalog in Settings → Finance → Surcharges & Fees. Once a fee is in the catalog it's available on every job.

    Snapshot semantics

    When you attach a fee, PortaPro snapshots the name, type, and amount onto the surcharge_application row. Later changes to the catalog entry don't retroactively alter fees already attached. The customer sees the price they agreed to at attach time.

    ---

    EMR-4: How next_cycle Fees Actually Reach the Invoice

    This is the piece that used to be broken and got fixed in July 2026. Full transparency.

    When you attach a next_cycle fee to a job, it sits in surcharge_applications with billing_disposition = 'next_cycle' and billed_invoice_id = null. It's queued.

    Then, when the customer's cycle invoice generates, PortaPro runs sweepJobFeesToInvoice:

  • Finds every unbilled next_cycle fee for this customer's jobs
  • Copies each fee as a verbatim line onto the cycle invoice (verbatim snapshot, same as quote → invoice carry-over)
  • Stamps the original surcharge_application row with billed_invoice_id = <invoice.id>
  • Runs applyDocumentTax on the invoice, which folds the fee lines and their tax into the invoice totals
  • That's the loop. Idempotent (a fee can never bill twice because the candidate predicate is billed_invoice_id IS NULL), self-healing (deleting the invoice re-queues its swept fees automatically via ON DELETE SET NULL), and compensating (if the stamp step fails, the copies are deleted so there's no half-swept state).

    Why this used to be broken (R3 fix)

    Pre-July-2026, sweepJobFeesToInvoice was fully written and tested. But had zero callers. Neither cycle-invoice generator called it. So every "the $150 emergency fee lands on next cycle" promise was structurally broken. The fees stayed queued forever; only a manual sweep or a human noticing would surface them. The R3 fix wired the sweep into both generateCycleInvoice and generateRateCardInvoice. Now it runs on every cycle generation.

    Also fixed at the same time: the cycle-invoice generator returned subtotal + feeTotal where feeTotal was never declared. Throwing a ReferenceError *after* writing the invoice + items + tax to the database. Operators saw a failure toast on a successful write, and no fees swept anyway. Both parts fixed in R3.

    The review flag

    When a cycle invoice sweeps fees, PortaPro stamps a job_fees_swept review flag on the invoice. The pre-close review panel shows a "Job fees swept: $X across N jobs" chip so operators can verify before sending.

    ---

    EMR-5: Immediate-Billing Fees

    If a fee's disposition is immediate, PortaPro doesn't queue it. The operator's next action is usually Create Invoice for the job. The fee flows into that invoice as a line, tax pipeline applies, done.

    Use immediate for:

  • Cash-paying customers who don't have a cycle
  • One-off customers on Net 30 who want a real invoice today
  • Any case where "wait for next cycle" doesn't fit
  • If you attached a fee as immediate and haven't billed yet, you can change it to next_cycle on the fee's edit action (as long as it's still unbilled).

    ---

    EMR-6: Damage, Dry-Run, and After-Hours Fees

    These aren't a separate feature. They're just common surcharge catalog entries:

    Damage fee: customer damaged the unit (drilled holes in the door, dropped it, spray-painted it). Attach at your standard damage rate, next_cycle for cycle customers so it lands on their monthly invoice. Photo documentation goes on the maintenance report for the pickup/service that surfaced the damage; the fee references the job.

    Dry-run fee: driver arrived, couldn't service (locked gate, container moved, wrong address). Attach a dry-run fee to the skipped job. For cycle customers on non-term work, the fee sweeps into their cycle invoice (this is the R6 unification described in the Roll-Off Swap Cycle article, which extended the sweep source filter to include dry_run_fee).

    After-hours / weekend / holiday fee: attach at emergency-call time. If your ops has different rates for weeknight-after-6pm vs weekend vs holiday, keep three catalog entries; PortaPro doesn't auto-detect the time-of-call.

    ---

    EMR-7: Unit Replacement in the Field

    When a driver arrives and finds the unit destroyed (fire, storm, vandalism, drilling), the workflow is:

  • Mark the current unit retired
  • - From the driver app or dispatch: open the unit's detail (or the site's inventory) and set the tracked item's status to retired with a reason

    - The tracked item flips out of the active pool

    - Any equipment_assignments on the unit close out

  • Deploy a replacement
  • - Add a fresh tracked item at the same location (map pin). Either an existing yard unit or a new inventory item

    - The Rate Card row keeps its declared count; the replacement fills the physical placement

  • Attach any relevant fees to the discovery job
  • - Damage fee if customer-caused

    - Emergency replacement fee if you charged premium urgency

    - Fees flow through the normal disposition path (next_cycle for cycle customers, immediate for others)

    The service_location_recurring_units declaration doesn't change. The customer is still contractually renting 3 standard units at the site. Only the physical placement (tracked item id) changes.

    The retire lifecycle

    Retired units are excluded from every active calculation:

  • The siteInventory aggregator skips them (pi.status = 'retired')
  • The availability engine treats them as unavailable
  • The double-booking guard doesn't consider them for future bookings
  • Retiring is soft. The row stays for history. If a mistake was made and the unit isn't actually retired, an admin can flip status back to available from the inventory tool.

    ---

    EMR-8: On-Call Customer Setup

    Some customers are on-call: "call us when you need us." They don't have a scheduled cycle. Setup:

    On the customer:

  • Payment terms = whatever your standard is (Net 15 is common for on-call, they pay per event)
  • Autopay = only if you're comfortable charging without a formal cycle (usually off for on-call)
  • On the site (if any):

  • No Rate Card row required if you don't stage units. Every job is an event
  • If you *do* stage units at the site (they call for service on your equipment): create the Rate Card row with included_pulls_per_cycle = 0 (no per-trip allowance) and no scheduled service day. Jobs are one-off, so the automatic generator (whether the on-save or nightly run) won't create anything on its own
  • For each call:

  • Create a job for the requested date/time
  • Toggle Priority if urgent
  • Attach any premium fees at attach time (disposition immediate for on-call, they usually don't have a cycle to sweep into)
  • Create the invoice at completion, or let it auto-invoice via the immediate path
  • ---

    EMR-9: How Emergency Fees Interact with Autopay

    If the customer has autopay enabled and the fee sweeps onto their cycle invoice, the cycle invoice charges via Stripe on send. No operator action needed. The customer's card takes the full amount including the swept emergency fee.

    If the customer is on autopay but the fee is immediate (one-off invoice), autopay does not charge one-off invoices automatically by default. The operator sends and the customer pays via the emailed link, or via manual Charge on File from the invoice detail. If you want one-off invoices to auto-charge for autopay customers, that's a per-invoice choice, not global.

    ---

    EMR-10: Priority Auto-Derivation (Note)

    There is no current setting to auto-derive priority from a fee type (e.g. "any job with an After-Hours fee is automatically priority"). Priority is set per-job manually. This is noted in the July 2026 audit as an enhancement, not a bug. The intentional design is that priority is a scheduling signal owned by dispatch, and pricing is a separate axis owned by billing. If your ops wants them linked, do it via checklist ("when you attach the emergency fee, flip the priority toggle") rather than automation.

    ---

    EMR-11: Troubleshooting

    "I attached a $150 emergency fee three weeks ago, it's on the job, but the customer's cycle invoice doesn't include it."

    Pre-July-2026 (R3 fix): sweepJobFeesToInvoice had zero callers, so no fees ever swept. Update to the latest deploy. Post-fix, verify:

  • The fee's billing_disposition is next_cycle (not immediate)
  • The fee's billed_invoice_id is null (not stamped to some earlier invoice)
  • The job is attached to the customer whose cycle invoice you're generating
  • If all three are true and the fee still doesn't sweep, delete the cycle invoice (which unstamps any partial sweep via the ON DELETE SET NULL cascade) and regenerate.

    "The invoice says '$0.00 subtotal' after generation but there was a fee attached."

    Pre-July-2026, the generator threw a ReferenceError after successfully writing the invoice and items. The operator saw a "failed" toast on a successful write. Post-fix, this doesn't happen. If it's happening on a post-July-2026 build, that's a bug worth reporting.

    "A fee shows up twice on the same cycle invoice."

    The sweep is idempotent. A fee with billed_invoice_id set is excluded from candidacy. If you're seeing duplicates, the previous stamp may have been cleared manually. Verify the fee's audit history in the surcharge_applications table.

    "The job is marked Priority but the driver's route plan didn't put it first."

    Priority is a sort signal, not a hard constraint. If earlier jobs on the route are pinned to specific times (customer arrival windows, geographic proximity), the planner may leave them in place. To force sequencing, drag-reorder in the route plan editor.

    "I retired a tracked item but it's still showing on the site inventory tab."

    Cache invalidation is per-query. Retiring dispatches a refetch but if the tab was open, refresh it. If the unit persists after refresh, the retire didn't stamp. Check the item's actual status column; if it's not retired, the operation failed silently. Try again from the inventory admin view.

    "The dry-run fee I attached to a skipped job isn't on the customer's cycle invoice."

  • Confirm the fee's disposition is next_cycle
  • Confirm the job has no rental_term_id (roll-off term jobs bill via the final statement, not the cycle sweep)
  • Confirm the customer's cycle billing is active with a Rate Card
  • For roll-off term customers, dry-run fees route to the final statement. See Roll-Off Swap Cycle, section ROL-8.

    "The Priority toggle is missing on a completed job."

    Priority is editable while the job is active; once the job is completed or cancelled, the priority flag is frozen for history. To change historical priority for reporting, an admin can update via the database directly. But this is rare.

    "I attached an emergency fee to the wrong job."

    Open the fee's row in the Fees section of the current (wrong) job, click Delete. Then re-attach on the correct job. If the wrong job's cycle invoice already generated with the fee swept: delete that invoice (which un-sweeps the fee via the compensating logic), re-attach correctly, regenerate.

    ---

    EMR-12: Related Articles

  • Front-Load Recurring Service (per-trip billing, where dry-run and manual fees land)
  • Roll-Off Swap Cycle (term-based fees route to final statement, not cycle sweep)
  • Long-Term Rental Workflow (cycle invoice generation and autopay)
  • Cycle Close & Invoicing (advanced: pre-close review flags including job_fees_swept)
  • Surcharges & Fees Catalog Setup (Settings → Finance → Surcharges)
  • Inventory & Unit Lifecycle (retire, replace, tracked-item status)
  • Was this article helpful?

    Related Articles

    menu_book

    Service Hub Overview

    2 min read

    chevron_right
    menu_book

    Services and Report Templates

    4 min read

    chevron_right
    menu_book

    Service Records

    4 min read

    chevron_right