This article covers the event rental workflow — the way PortaPro handles short, one-off rentals with a defined start and end date. Weddings, festivals, corporate offsites, county fairs, sporting events: anything where the customer wants units delivered, dropped for a specific window, and picked up.
Event rentals are billed differently from recurring rentals: the whole window is one flat price (industry standard), the customer gets a public link to accept and pay upfront, and PortaPro reserves the physical units for the exact date range so nothing gets double-booked. This article walks through the full flow: quote → email → customer accepts + pays → delivery + pickup jobs → what happens if the event runs long or gets cancelled.
If you're doing recurring monthly rentals instead, see the Long-Term Rental Workflow.
---
EVT-1: How Event Rentals Are Different
Event rental = flat price for a defined window
Event rentals use the per_event billing period. One event = one flat price for the entire window, regardless of exact days. This matches how the portable sanitation industry actually prices weekends and festivals: "$400 for the weekend," not "$400 / 3 days = $133.33/day."
The default event window is 3 days (Friday delivery, Sunday event, Monday pickup — the classic weekend). You can change the window per line item when quoting.
Reservations, not just deliveries
Because events run for a defined window, PortaPro reserves the physical units for the exact date range. That means:
One customer touch to accept + pay
Instead of the operator manually chasing signatures and payments, event quotes send with a public link. The customer clicks, reviews, signs (typed name), and pays with a card — all in one flow, from their phone. When they finish, the job is created automatically on the operator's side.
Excluded from MRR by design
Event rentals bill upfront as one-time revenue, not recurring. Your analytics dashboards (MRR, CRR, monthly recurring value on the customer profile) intentionally exclude per_event line items — a wedding you booked in June should not inflate your ongoing monthly recurring revenue.
---
EVT-2: Create the Event Quote
Step 1: Start a new quote
Step 2: Add event line items
For each unit type at the event:
The rate is the flat event price — not per day. If the product has a per_event_rate set in inventory, PortaPro pulls it automatically; otherwise you enter it here.
Step 3: Review the quote total
Each per-event line shows a rate_breakdown like "Event Rental: Nov 14–17 (3 days)" so the customer sees the exact window they're paying for. Tax applies via the standard tax pipeline (flat rate, ZIP-based, or address-based per your Settings).
Step 4: Send the quote
Click Send Quote. The customer receives an email with a link to the public accept page.
---
EVT-3: The Customer Accept + Pay Flow
When the customer clicks the link in the email, they land on a public page tokenized to their specific quote — no login required, no PortaPro account needed.
What the customer sees
Accept & Pay
- Stamps accepted_by_name and accepted_signature on the quote
- Marks the quote accepted
- Creates the delivery job automatically for the delivery date
- Creates the paired pickup job automatically for the pickup date
- Reserves the physical units for the full event window
- Sends a payment confirmation email
Decline
The customer can click Decline and (optionally) type a reason. This stamps declined_at and decline_reason on the quote and closes it out. Your team can follow up if the reason suggests it.
---
EVT-4: The Delivery + Pickup Job Pair
Every accepted event booking creates two jobs: a delivery on the event start date and a pickup on the event end date. This is intentional — you'll assign the delivery to a driver for the front end of the event and the pickup to (usually) a different driver at the back end.
Why the reservation attaches to the pickup, not the delivery
When you mark a job completed, the completion trigger releases that job's equipment back to the yard. If the reservation lived on the *delivery* job, the moment your driver finished the Friday delivery run, the units would flip back to "available" — mid-event. That's obviously wrong.
So for event bookings, PortaPro attaches the equipment reservation to the *pickup* job. The units stay reserved through the whole event window and only release when the pickup is marked complete (or, as a safety net, when the expired-reservation cron picks up the return date the morning after — see EVT-8).
The two jobs on the board
Both jobs appear on the dispatch board. Their statuses move independently:
Cancelling one automatically cancels the other (see EVT-6).
---
EVT-5: Extending an Event (Ran Long)
Events run over sometimes — the wedding party stays late, the festival extends by a day, the client asks for one more night. PortaPro handles this without breaking anything:
Step 1: Open the event's delivery job
Step 2: Click Extend Event
What PortaPro does:
That last piece matters: the base rental price is untouched (the customer already paid), and the overage bills as its own line so it's clean on their books.
---
EVT-6: Cancelling an Event
Weddings get called off. Festivals get rained out. PortaPro handles the cancel with the same "don't break anything downstream" discipline.
To cancel an accepted event:
What PortaPro does:
The reason this is manual: cancellation policies vary (some ops refund 100%, some keep a deposit, some keep everything for a same-week cancel). PortaPro does the operational cleanup and leaves the refund decision to you.
---
EVT-7: Refunds
To refund an event booking:
The refund is issued through Stripe. If your accounting sync (QuickBooks / Xero) is on, the refund posts as a credit against the original invoice.
---
EVT-8: The Reservation Release Cron (Safety Net)
Job completion is the primary way units get released back to available. But drivers forget to mark pickups complete sometimes, or things get lost in the shuffle at a busy multi-event weekend.
PortaPro runs a daily cron (release-expired-reservations) that catches this: any equipment assignment whose return_date is strictly in the past flips to returned, and its serialized unit returns to available — unless another live assignment still holds it.
The cron runs the morning AFTER the scheduled pickup date, never the morning of. So a Sunday pickup that didn't get marked complete releases on Monday morning, not mid-event. This is a backstop, not the primary path — drivers should still complete their pickup jobs on-scene.
---
EVT-9: Booking the Same Unit for a Future Event
The double-booking guard is date-aware. If unit #1002 is on rent this weekend (Nov 14–17), you can still book it for a wedding three weeks later (Dec 5–8) — the windows don't overlap, so there's no conflict. Try to book it for Nov 16–18 (overlapping the first event) and PortaPro will refuse with the exact overlap: #1002 (booked Nov 14 – Nov 17).
This matters for pipeline building: you're not blocked from quoting future dates just because a unit is currently deployed.
The rule
---
EVT-10: Multi-Event Weekends
Some ops run several small events on the same weekend (three graduation parties, four backyard weddings). Each is a separate quote → each is a separate accept + pay → each creates its own delivery + pickup pair. Units are reserved per event, so overlaps are caught automatically. Your route plan handles the sequencing across events on the same day.
There is no bulk-pool capacity guard for non-serialized untracked reservations across many concurrent events — if you have 20 standards in the yard and quote three concurrent events for 8 each, PortaPro will accept all three (24 units of demand vs 20 available). Track your yard capacity manually for high-density weekends. This is a known gap and on the roadmap for a per-yard pool capacity guard.
---
EVT-11: Troubleshooting
"The customer clicked the link and said the page won't load."
Check the quote in your dashboard. If the status is expired or cancelled, the public link is dead — resend a fresh quote. If the quote is still sent, verify the URL in the email uses your production domain (not a preview URL) and that the token wasn't accidentally truncated.
"Customer accepted and paid, but no delivery job was created."
Rare, but check: (1) is the delivery date on the quote in the past? PortaPro won't create a delivery job for a past date. (2) is the customer's service address complete? Missing city/state can block job creation. Look at Vercel logs for [quote-accept] errors.
"Customer paid, but the payment doesn't show on their invoice."
The accept flow creates an invoice in paid state as part of the payment. If it shows open, the Stripe charge didn't complete on their side — check the Stripe dashboard for the charge attempt and error.
"I extended an event but the driver still shows the old pickup date on their route."
The route plan refreshes on the next planning run. If it's the day-of, force-refresh the plan from Dispatch → Route Plan → Re-check so the new pickup date populates.
"Cancelling the delivery job didn't free the units."
This shouldn't happen post-July-2026 — cancellation cascades to the sibling event pickup, and both reservations release. If it does, check the pickup job's status manually: if it's still unassigned (not cancelled), open it and cancel manually. That's a bug worth reporting.
"I booked a future event for a unit that's currently on rent, and PortaPro refused."
Verify the windows actually don't overlap. Inclusive end dates: a rental ending Nov 17 and a new event starting Nov 17 do overlap — pick Nov 18+ for the new event, or Nov 16 or earlier for the current one to end.
"Same-day pickup and next delivery of the same unit."
The tightest legal booking is: pickup on Nov 17 (return_date = Nov 17), next delivery on Nov 18. The GiST no-overlap constraint enforces this.
---
