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_rightBilling & Invoicingchevron_rightRoll-Off Swap Cycle Workflow (Dumpster Rentals)

Roll-Off Swap Cycle Workflow (Dumpster Rentals)

schedule16 min read
calendar_todayUpdated October 5, 2026
roll-offdumpsterrental termswaptiered pricingfinal statementdisposallandfill cost + markupweight ticketdouble-billing

On this page

ROL-1: What Makes a Roll-Off Rental DifferentROL-2: Create a Rental TermROL-3: The Tiered Day / Week / Month MathROL-4: The Delivery JobROL-5: Mid-Term SwapsROL-6: Pickup and Term CompletionROL-7: Generate the Final StatementROL-8: Cycle Customers Who Also Get Job Fees (R6)ROL-9: Adjustments Between Delivery and Final StatementROL-10: TroubleshootingROL-11: 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 the roll-off rental term workflow. How PortaPro handles dumpster rentals, roll-off boxes, and any container that gets delivered, swapped mid-rental as it fills, and picked up at the end of the job. Roll-off rentals have their own billing model: they don't bill per cycle like construction rentals, they bill as one final statement at the end of the term.

If you're doing weekend event rentals, see the Weekend Event Rental Workflow. For monthly recurring construction rentals, see the Long-Term Rental Workflow.

---

ROL-1: What Makes a Roll-Off Rental Different

One term = one final statement

Instead of billing every cycle while the box sits on the customer's site, a roll-off rental runs as one term with a start date, an expected end date, and one big final statement at the end that consolidates every part of the job:

  • The rental base (day/week/month math, see below)
  • Every haul (delivery + each swap counts as a pull, priced from rental_terms.base_rate)
  • Every tonnage overage (weight above the included allowance x the overage rate, on a rental that bills disposal as Included in the rate)
  • Every disposal line (the disposal site's tipping fee for the ticket plus your markup, on a rental that bills disposal as Landfill cost + markup)
  • Any manual fees office staff attach mid-term (damage, wasted trip, permits)
  • Minus any prepaid deposit the customer paid, credited to the statement automatically
  • This is the standard roll-off industry model. Customers understand a construction dumpster as "\$X to deliver, \$Y per week, \$Z per swap, extra weight \$/ton." The final statement puts all of that on one page.

    The swap job

    Roll-off rentals use a special job type: swap. When the box is full mid-rental, the driver swaps the full one for an empty one at the same location. The swap job counts as a pull on the term's final statement (that's a haul revenue line) and captures the weight ticket + disposal site for the load being taken away.

    Cycle billing and term billing don't mix

    The exact division: a job attached to a rental_term_id bills exclusively through the term's final statement. A job without a rental_term_id (regular one-off pumping, cycle deliveries, non-term work) bills through the customer's cycle invoice. There is no case where the same job bills both. The double-billing guard closed that gap in the July 2026 fix (R1).

    ---

    ROL-2: Create a Rental Term

    Step 1: Start from the customer profile

  • Open the customer → Sites tab → the service location where the box will drop
  • Click + Roll-Off Rental (or New Rental Term if the menu is worded that way)
  • Step 2: Fill in the term details

  • Product: the container type (e.g. 20-yard, 30-yard). This must be a product with product_type set to roll-off.
  • Start date: the delivery date
  • Expected end date: when the customer expects to be done. This drives the rental base tier math. The actual pickup can be earlier or later; the tier recomputes on the actual pickup date.
  • Base rate: the per-pull haul price (charged once per delivery, once per swap, once per pickup)
  • Day / week / month rates: the tiered rental prices (see ROL-3)
  • How is disposal billed?: pick one:
  • - Included in the rate: set the Included tons per pull and the Overage $/ton above it

    - Landfill cost + markup: each pull bills the disposal site's tipping fee for the ticket (by the ton when the site has a per-ton rate) plus your Markup (%) (0 to 500; blank means none). See Disposal Sites

    The two models are exclusive, and the database enforces it: a rental can't carry an included-tons allowance and a markup at the same time. Picking one model in the wizard, the term editor or the container's catalog defaults clears the other's fields.

    Step 3: Save

    Saving the term auto-creates the delivery job for the start date. The term goes into scheduled status; when the delivery job completes, the term flips to active.

    ---

    ROL-3: The Tiered Day / Week / Month Math

    Roll-off rentals use "tiered DWM" pricing: three rates (per day, per week, per month) and PortaPro picks the cheapest combination that covers the actual rental duration.

    Example: 6-week rental at \$10/day, \$60/week, \$250/month

  • Naive math: 6 x \$60 = \$360? No. PortaPro looks harder.
  • Consider: 2 months = \$500 (rounds up 8 days, but covers the window), 1 month + 4 weeks = \$490, 6 weeks x \$60 = \$360 (wait, that's 42 days, covers it).
  • The cheapest: 6 weeks = \$360 in this example.
  • Now a real spec example: 42 days at \$75/day, \$300/week, \$1,000/month:

  • Naive per-week math: 6 x \$300 = \$1,800
  • Cheapest-covering: 1 month + 2 weeks (28 + 14 = 42 days) at \$1,000 + \$600 = \$1,600? No. Consider 1 month + 1 week + 7 days: \$1,000 + \$300 + 7 x \$75 = \$1,825. Consider 6 weeks x \$300 = \$1,800. Consider 1 month + 2 weeks = \$1,600. Cheapest: 1 month + 2 weeks = \$1,600.
  • Now factor in that if 2 months rounds up to cover 42 days (\$2,000), that's still worse than \$1,600.
  • The result: PortaPro uses 1 month + 2 weeks = \$1,600, which is \$200 cheaper than the naive 6 x week math.
  • Why cheapest-covering favors the customer

    This is a deliberate product decision. The alternative. Some specs use "naive full-week math". Always charges more, and confuses customers who can see that their 6 weeks fits in 1 month + 2 weeks. Cheapest-covering means the invoice matches what a rational customer would expect from the rates you published.

    The rate breakdown snapshot

    Every rental base line stamps a rate_breakdown label like "1 month + 2 weeks" or "3 weeks + 4 days" so the customer's invoice explains exactly how the math worked. If the label ever says "0 days" or looks wrong, one of your tier rates is 0 or missing. PortaPro treats a \$0 tier as unavailable (a \$0 week tier must not make every rental free).

    Ties

    When two combinations tie on total, PortaPro prefers the one with more months, then more weeks. Makes for cleaner-reading invoices.

    ---

    ROL-4: The Delivery Job

    Saving the term creates the delivery job. It shows up on the dispatch board like any other delivery.

    What the delivery job carries:

  • The rental base line (tiered from the term's rates, priced for the initial expected duration)
  • The haul revenue line (base_rate x 1 pull)
  • When the driver completes the delivery, the term flips from scheduled to active and the box is officially on rent.

    What if the customer wants a deposit?

    Some ops collect a deposit at delivery. Put the deposit on the quote, or open the delivery job and choose Request Deposit: either way the deposit is its own invoice, paid online or recorded with Collect Payment. When the final statement is created, the paid deposit is credited to it automatically and the balance due drops by that amount. See Deposits.

    ---

    ROL-5: Mid-Term Swaps

    When the box fills up, dispatch schedules a swap.

    Step 1: Create the swap job

  • Open the term (or the customer's active jobs)
  • Click + Swap (or New Swap on the term)
  • Pick a date and driver
  • Step 2: Driver completes the swap on-scene

  • Driver arrives with an empty box on the truck
  • Weighs the full one (records weight_tons)
  • Loads the full one, drops the empty one at the same location
  • Records the disposal site (disposal_site_id) and takes a photo of the weight ticket
  • Marks the swap complete
  • What lands on the term's final statement:

  • One haul revenue line (base_rate x 1 pull)
  • On an Included in the rate term: the tonnage overage if the load exceeded the included allowance x the overage rate
  • On a Landfill cost + markup term: a disposal line, priced from the disposal site's rates and the ticket's net weight, plus the markup. A per-ton line is one line for the load with the tons carried on it (3.42 tons at $66.70/ton = $228.11), never a quantity of rounded tons. A material the site prices at $0 stages no line at all.
  • How the lines read. On the job's Items card each charge is named (Roll-off haul, Roll-off tonnage overage, Roll-off rental overage, Roll-off disposal) and shows its total, with the tons or days beside it. Under the name is what the customer will read, and on a marked-up disposal line one more line that only your office sees, for example "Landfill $58.00/ton + 15% markup. Not shown on the invoice." These lines are written from the weight ticket and the rental's rates, so in edit mode they read "From the rental and its ticket" instead of a quantity box: change the ticket or the rental, not the line.

    What the customer sees. On the final statement each line carries a description: the haul says which pull and when ("Swap · Sep 19, 2026"), the disposal line names the site, the material, the tons at the customer's rate, the ticket number and the day ("County Landfill · Construction & demolition (C&D) · 3.42 tons @ $66.70/ton · Ticket 451207 · Sep 30, 2026"), a tonnage overage gives the tons over the allowance, the weight, the rate and the ticket, and a rental overage gives the days and the date it ran past ("4 days past Sep 19, 2026 · $10.00/day"). The landfill's own rate and your markup never appear on the customer's copy.

    Weight tickets

    The weight_ticket_photo_url gets attached to the maintenance report for the swap. Office staff can pull it up when disputes come in. Weight is always in tons on the invoice (industry convention).

    ---

    ROL-6: Pickup and Term Completion

    When the customer is done:

    Step 1: Schedule the pickup

    From the term or the customer profile, create the pickup job for the actual pickup date.

    Step 2: Driver completes the pickup on-scene

  • Weighs the last load
  • Records disposal site
  • Marks pickup complete
  • Step 3: The term auto-flips to completed

    When the pickup completes, the term goes to completed. If the pickup happens after the expected end date, the term stops in pending_pickup first (a signal that operations should chase, the customer went over their expected term).

    Step 4: The rental base re-tiers on pickup

    This is important. The rental base line on the term's delivery job was priced for the *expected* duration. When the pickup completes with an actual end date, recomputeTermCharges re-tiers the rental base for the *actual* number of days. If the customer rented for the expected 30 days and picked up at 45, the base line updates to whatever cheapest-covering combo covers 45 days.

    The office can still edit the rental base line before invoicing if there's a business reason to override. The recompute doesn't happen after the term has been invoiced.

    ---

    ROL-7: Generate the Final Statement

    Step 1: Verify the term is completed and all jobs are done

    Every job under the term must be completed, completed_late, or cancelled. If any job is still open, PortaPro refuses to generate the final statement and tells you which jobs to close first.

    Step 2: Open the term and click Final invoice

    On a Landfill cost + markup rental, PortaPro first checks that every pull's disposal can be priced. If a pull has no weight on a per-ton site, no disposal site, or a site with no rate, a dialog titled "Disposal can't be priced yet" lists the pulls ("1 pull has disposal that can't be priced yet: J-1042 (no weight on the ticket). Fix the ticket first, or issue the statement without those disposal charges.") and explains that issuing anyway drafts the statement without those disposal charges, which you can add to the invoice by hand, or fix the tickets and try again. Choose Fix the tickets first to go back, or Issue anyway to draft the statement without those lines. A material the site takes for free is priced at $0 and never holds the statement up.

    The consolidator then runs and:

  • Sweeps every un-invoiced job on the term
  • Adds the tiered rental base for the actual duration
  • Adds each haul revenue line (delivery + swaps + pickup)
  • Adds each tonnage overage line (per-load, sub-totaled)
  • Adds each disposal line (Landfill cost + markup rentals)
  • Adds any manual fees office staff attached (damage, permits, wasted trip)
  • Credits any paid deposit against the statement, so the balance due drops by that amount
  • Applies tax via the standard tax pipeline (ZIP-based or flat, per your Settings)
  • Posts the journal entry
  • Stamps every included job's invoiced_at so they can never be re-swept
  • The result is one draft invoice ready to review and send.

    Double-invoice protection

    The final statement checks each job through isJobBilled before including it. If a job was somehow already billed on a cycle invoice (shouldn't happen, but a fallback), it's excluded and reported so you can reconcile. The cycle sweep, on the other side, excludes term jobs entirely. This is the R1 fix that closed the double-billing gap in July 2026.

    Voided invoices. One thing to know

    isJobBilled doesn't check invoice status. A voided (not deleted) invoice still marks its jobs as billed, so they'll be excluded from the next final statement. To recover from a void: delete the invoice (not void). Deleting removes its lines and clears each job's billed stamp, unless another invoice still bills that job, which re-opens the jobs for a fresh final statement. Voiding is for accounting closure after final delivery to a customer; deleting is for reset.

    ---

    ROL-8: Cycle Customers Who Also Get Job Fees (R6)

    If a cycle-billed customer (Scenario 1: rate card + monthly invoice) also has roll-off work, the R6 fix (July 2026) ensures the roll-off job fees ride correctly on their cycle invoice:

  • Auto-charges from roll-off work (service_config.source = 'rolloff_auto')
  • Manual fees office staff attached to a completed job (damage, wasted trip)
  • Dry-run fees when a driver arrived at a site and couldn't service (nothing to pick up, gate locked, wrong container, etc.)
  • All three types now sweep into the cycle invoice for non-term customers. Before R6, only rolloff_auto swept. Manual and dry-run fees on cycle customers were invisible to the sweep and stayed unbilled until a human noticed. Cycle-billed job fees now include a stamp linking them back to their source job (invoice_items.source_job_id) so the ledger is symmetric with the term-side one.

    ---

    ROL-9: Adjustments Between Delivery and Final Statement

    Roll-off terms often run mid-project. Dispatch or the office adds fees, adjusts the deposit, tweaks weights. These are all supported:

  • Add a fee mid-term: create a manual fee on any completed job. It flows into the final statement automatically at the end.
  • Adjust weight tickets: edit the maintenance report on the swap. The overage line recomputes on the next recomputeTermCharges (runs on pickup completion).
  • Cancel a swap you scheduled but the customer canceled: cancel the job. Cancelled jobs' staged items are excluded from the final statement.
  • Change the disposal site or material retroactively: fix it on the job's Weight Ticket card. The disposal line re-prices as long as the pull isn't invoiced yet.
  • What you can't retroactively change once the final statement is issued

  • The rental base line
  • Anything with an invoiced_at stamp
  • If a customer disputes and you need to adjust after the final statement: delete the invoice (not void), fix what needs fixing, regenerate.

    ---

    ROL-10: Troubleshooting

    "Final invoice isn't offered."

    The term isn't in completed status yet. Complete the pickup job, or if the pickup hasn't happened, the term stays in active (or pending_pickup if past its expected end date). PortaPro also refuses if any job under the term is still open (unassigned, assigned, or in-progress). Close every job first.

    "PortaPro says the customer was billed for a haul that was also on their cycle invoice."

    This shouldn't happen post-July 2026 (R1 fix). If it does: the sweep excludes term jobs by rental_term_id IS NULL. Check the offending job's rental_term_id. If it's set, the sweep should have skipped it; if it's null, the job was miscategorized. Either delete the erroneous invoice line or reconcile via a credit.

    "The customer only picked up 21 days in but the rental base charged for 30."

    The rental base re-tiers on pickup completion. If it didn't, either:

  • The pickup job wasn't marked complete (check its status)
  • recomputeTermCharges ran while the term was already invoiced (it no-ops in that state, undo the invoice to trigger a recompute)
  • "The final statement shows \$0 for a week of rental base."

    One of your tier rates is \$0 or missing. Tiered math treats a \$0 rate as *unavailable*. Otherwise every rental would be free. Set a non-zero week rate on the term (or on the customer's product catalog), then regenerate.

    "The disposal line is missing on the final statement."

    Check the term's How is disposal billed? setting. On Included in the rate, no tipping fee passes through by design. On Landfill cost + markup, each swap and pickup needs a disposal site on its weight ticket, a net weight when the site charges by the ton, and a rate at that site (see Disposal Sites DS-6). Final invoice stops with "Disposal can't be priced yet" for exactly those pulls, so a line is only missing if someone chose Issue anyway, or if the site prices that material at $0 (free, no line by design).

    "Final invoice says 'Disposal can't be priced yet'."

    A Landfill cost + markup pull is missing a weight (per-ton site), a disposal site, or a rate at that site; the dialog names each pull and the reason. Fix the tickets first, correct the pulls on their Weight Ticket cards, and run Final invoice again. Or Issue anyway and add the disposal charges to the draft by hand.

    "The customer paid a \$200 deposit at delivery. Where does it show up?"

    As a credit on the final statement: the paid deposit is applied to it automatically and the balance due drops by that amount. If it doesn't show, check that the deposit invoice is paid and that it was requested from the quote or the delivery job (Request Deposit), not typed as an ordinary invoice.

    "I need to bill a cycle customer for a dry-run fee from a completed pickup, but it's not showing on the cycle invoice."

    Post-R6 fix: yes, dry-run and manual fees on cycle customers' non-term jobs sweep into the cycle invoice. If yours isn't:

  • Confirm the job has NO rental_term_id (term jobs are excluded from the sweep by design)
  • Confirm the job's invoiced_at is null
  • Confirm the fee is stamped service_config.source = 'dry_run_fee' (or manual_fee)
  • ---

    ROL-11: Related Articles

  • Long-Term Rental Workflow (recurring construction rentals, the other main model)
  • Weekend Event Rental Workflow (per-event windows and public accept + pay)
  • Cycle Close & Invoicing (advanced: proration, credits, autopay charge)
  • Emergency & On-Call Jobs (surcharges, per-job fees, sweep-to-cycle)
  • Roll-Off Rentals Page (the dispatcher screen where terms are scheduled, swapped, and picked up)
  • Day Overage, Included Days & Debris Type (extended-rental fees and material labels on a term)
  • Roll-Off Container Setup (product-level defaults that prefill a term's economics)
  • Truck Capacity for Roll-Off (the max_container_yards vehicle field)
  • Roll-Off Jobs on the Driver App (delivery, swap, weight ticket, and pickup on the phone)
  • Disposal Sites (tipping fees by the ton and by material, the source of the disposal line)
  • Was this article helpful?

    Related Articles

    menu_book

    Quotes and Invoices: the Financials Lists

    9 min read

    chevron_right
    menu_book

    The Quote Wizard

    14 min read

    chevron_right
    menu_book

    Quote Statuses, Sending and Converting

    9 min read

    chevron_right