Get up and running with TrashGeek in under 10 minutes.
1. Sign up
Visit trashgeek.app and click Get Started. Fill in your company name, phone, email, address, and create your owner login. You'll be redirected to your dashboard immediately.
2. Log in to the dashboard
Go to trashgeek.app/map.html and sign in with your company slug, username, and password.
3. Add your first dumpster
Click Dumpsters in the sidebar, then Add Dumpster. Enter a label (e.g. "BIN-001") and size. Pricing is pulled automatically from your rate sheet on the Pricing tab. Your inventory is ready to rent.
4. Create a rental
Click Rentals > New Rental. Fill in the customer details, select a dumpster, set dates and pricing, then click Create Rental. The rental appears on your fleet map and dispatch board.
5. Embed the quote widget on your website
Go to Settings > Embed Codes and copy the script tag onto any page of your website. Customers can request quotes directly — you'll get email, SMS, and dashboard notifications instantly.
API base URL
All API endpoints are available at https://trashgeek.app/api. Include your token on every request:
Legacy tokens (without a type field) are still accepted for backward compatibility.
Roles
Role
Permissions
owner
Full access - company settings, SMTP config, pricing, user management, everything below
admin
User management, dumpster add/delete
dispatcher
Read/write rentals, appointments, quotes
driver
View assigned stops, start trips, mark deliveries/pickups, upload proof photos
Multi-tenancy
Every API request is automatically scoped to the company_id embedded in the JWT. It is impossible for one company to access another company's data through the API.
Companies API
Company registration, profile, and settings.
Method
Path
Auth
Description
POST
/api/companies/register
Public
Register a new company and owner account.
GET
/api/companies/me
Any
Get own company details and settings.
PATCH
/api/companies/me
Owner
Update company name, address, pricing, SMTP settings.
When a new user is created, a verification email is sent with a tokenized link. The token is valid for 24 hours. Clicking the link calls POST /api/auth/verify-email?token=XXX and renders a styled confirmation page.
POST /api/auth/resend-verification
Content-Type: application/json
{
"email": "jane@example.com",
"company_slug": "acme-hauling"
}
Rate limiting: The resend endpoint is rate limited to prevent abuse. Wait at least 60 seconds between requests for the same email.
The server compares scale_weight (in tons) against the included tonnage for the dumpster size. If the weight exceeds the limit, an overage charge is automatically calculated using the company's configured overage rate ($/ton) and added to the rental total.
Tip: You can also pass { amount, note } instead of scale_weight to add a manual overage charge without weight calculation.
Dumpsters API
Fleet management -add, edit, dispatch, return, archive, and delete dumpsters.
Method
Path
Auth
Description
GET
/api/dumpsters
Any
List all dumpsters with current status and rental info
GET
/api/dumpsters/available
Any
List dumpsters not currently assigned to an active rental
GET
/api/dumpsters/availability?company=<slug>
Public
Available counts by size (used by embed widget)
GET
/api/dumpsters/lookup?label=X
Any
Find dumpster by label (QR scan flow)
POST
/api/dumpsters
Admin
Add a dumpster
PATCH
/api/dumpsters/:id
Any
Update label, size, notes, or status
POST
/api/dumpsters/:id/dispatch
Any
Mark dumpster as delivered to a rental
POST
/api/dumpsters/:id/return
Any
Return a deployed or full dumpster — completes the rental
POST
/api/dumpsters/:id/dump-and-return
Any
Pick up full dumpster, dump it, return to customer — body: { scale_weight?, dump_fee? }. Weight accumulates across cycles.
POST
/api/dumpsters/:id/archive
Admin
Archive / retire a dumpster -frees plan slot, preserves history
DELETE
/api/dumpsters/:id
Admin
Permanently delete a dumpster (cannot be deployed)
GET
/api/dumpsters/maintenance
Any
List dumpsters needing maintenance (predictive)
POST
/api/dumpsters/:id/service
Any
Record a service event - body: { notes }
Archived dumpsters are hidden by default in the dashboard but can be viewed via the status filter.
Predictive maintenance: The /maintenance endpoint flags dumpsters based on rental count and time since last service. Proactive alerts are sent automatically.
Trailer Rentals
Dumpsters support an equipment_type field that distinguishes between traditional roll-off containers and trailers. When set to trailer, additional fields become available for vehicle and insurance tracking.
Field
Type
Description
equipment_type
enum
roll_off (default) or trailer
trailer_size
string
Trailer dimensions or size label (e.g. "16ft", "20ft")
vehicle_reg
string
Vehicle registration number
vehicle_vin
string
Vehicle identification number
reg_number
string
Registration plate number
insurance_provider
string
Insurance company name
insurance_policy
string
Insurance policy number
insurance_expiry
date
Insurance expiration date
weight_capacity
decimal
Maximum weight capacity in tons
Set equipment_type when creating or updating a dumpster via POST /api/dumpsters or PATCH /api/dumpsters/:id. The GET /api/dumpsters response includes equipment_type and all trailer-specific fields.
Rentals: When a trailer is dispatched to a rental, the rental automatically inherits the equipment_type from the dumpster. You can filter rentals by equipment type in the dashboard.
Appointments API
Schedule deliveries, pickups, and service calls.
Method
Path
Description
GET
/api/appointments
List appointments -filterable by date, type, status
Drivers execute actions on appointments from the mobile app. Each action updates the appointment status, dumpster status, and optionally records GPS coordinates.
Marks dumpster as deployed at the delivery address
picked_up
Marks dumpster as returned, completes the rental. Schedules review email.
loaded_full
Marks dumpster as full — ready for swap or pickup
mark_empty
Resets dumpster to deployed status after emptying
Proof-of-delivery photo
Upload a photo as proof of delivery or pickup. Sent as multipart form data.
POST /api/appointments/:id/proof
Authorization: Bearer eyJ...
Content-Type: multipart/form-data
photo: (binary file)
Photos are stored on the server and the URL is saved to the proof_photo column on the appointment. Photos are visible in the dashboard appointment detail view.
Update appointment
Update an appointment's details. Commonly used to add driver notes or change status for missed/cancelled appointments.
PATCH /api/appointments/:id
Authorization: Bearer eyJ...
Content-Type: application/json
{
"driver_notes": "Gate code 1234, park on left side",
"status": "missed"
}
Supported status values for manual update: missed, cancelled.
Also see GET /api/schedule?month=YYYY-MM for a month-view calendar of all rentals.
Quotes & Forms API
Public lead capture forms (dumpster quote, managed cleanup, contact) and internal quote management.
Method
Path
Auth
Description
POST
/api/quotes?company=<slug>
Public
Submit a form -quote, cleanup request, or contact message
GET
/api/quotes
Any
List quote requests -filterable by status
PATCH
/api/quotes/:id
Any
Update quote status: new · contacted · converted · no_response. Setting status to converted auto-creates a pending rental from the quote data.
DELETE
/api/quotes/:id
Any
Delete quote
POST
/api/quotes/:id/follow-up
Any
Send follow-up to quoted customer. Auto-marks quote as contacted.
Form types -service_type
All three embeddable forms post to the same endpoint. The service_type field distinguishes them.
POST /api/quotes?company=acme-dumpsters
{
"service_type": "contact",
"customer_name": "Alice Brown",
"customer_email": "alice@example.com",
"customer_phone": "555-9012",
"contact_subject": "billing",
"message": "I have a question about my last invoice."
}
On submission, an email alert is sent to the company's configured Quote Alert Email (set under Settings in the dashboard). The subject line and body clearly state the form type. If a promo_code is included, it is validated and the discount is applied to the estimated total.
When a quote is converted (status: "converted"), a pending rental is auto-created along with a delivery appointment. If a promo code was applied, it is automatically redeemed. The customer receives a booking confirmation email and SMS.
Quote follow-up
Send a follow-up message to a customer who submitted a quote. The quote status is automatically set to contacted.
POST /api/quotes/:id/follow-up
Authorization: Bearer eyJ...
Content-Type: application/json
{
"channel": "both",
"message": "Hi Jane, just following up on your dumpster quote. Ready to book?"
}
Field
Type
Description
channel
string
email, sms, or both
message
string
Custom follow-up message body
Pricing API
Public rate sheet and server-side price estimation.
Method
Path
Auth
Description
GET
/api/pricing?company=<slug>
Public
Get the company's published rate sheet (sizes, addon fees, included tonnage, overage rates, mileage)
GET
/api/pricing/sizes?company=<slug>
Public
Get distinct available dumpster sizes -used to populate embed widget dropdowns
POST
/api/pricing/estimate
Any
Calculate a full price estimate -body: { size, days, addons, address }
Pricing JSON structure
Update via PATCH /api/companies/me. Any omitted fields fall back to defaults.
When a scale weight is recorded on a rental, the overage is auto-calculated:
(scale_weight - included_tons[size]) × weight_fees[size].
Only the tonnage exceeding the included amount is charged. For example, a 20 yd dumpster weighing 3.5 tons:
(3.5 - 2) × $62 = $93.00 overage.
Reports API
Business intelligence endpoints -all scoped to the authenticated company.
Method
Path
Description
GET
/api/reports/revenue
Gross revenue, collected revenue, and rental count by period
GET
/api/reports/rentals
Rental volume by period, status, and dumpster size
GET
/api/reports/utilization
Per-dumpster days deployed, utilization %, and total revenue
GET
/api/reports/customers
Top customers by revenue -?limit=10 (max 50)
GET
/api/reports/overdue
Delivered rentals past their scheduled pickup date
GET
/api/reports/aging
Unpaid invoices bucketed by 0-30 / 31-60 / 61-90 / 90+ days
The export finds or creates a QB Customer by DisplayName (customer name), then creates an Invoice with three possible line items: base rental, mileage upcharge, and extra fees. Tokens are automatically refreshed when expired.
Stripe Connect
Collect customer payments directly via your own Stripe account.
Setup flow
Company clicks Connect Stripe in the dashboard Settings page.
Frontend calls GET /api/billing/connect/start -receives an onboarding URL.
User completes Stripe Express onboarding.
Stripe redirects back to /api/billing/connect/return -account is marked enabled.
Company can now generate Payment Links on any rental.
The quote form fetches available dumpster sizes in real time from /api/pricing/sizes?company=<slug> -customers can only select sizes that are currently in stock.
Copy embed snippets
Pre-filled snippets for all three form types are available in the dashboard under Settings → Embed Codes. Each snippet includes your company slug and a one-click copy button.
Pricing Configuration
How per-company pricing works and how to configure it.
Pricing is deep-merged over built-in defaults, so you only need to specify the values you want to override.
Self-service portal for customers to view rentals, request pickups, and chat. Uses separate JWT type.
Method
Path
Auth
Description
POST
/api/portal/generate
Any
Generate a portal link for a customer
GET
/api/portal/me
Portal
Customer info
GET
/api/portal/rentals
Portal
Customer's rentals
POST
/api/portal/rentals/:id/request-pickup
Portal
Request early pickup or reschedule
GET
/api/portal/rentals/:id/photos
Portal
Proof-of-delivery photos
GET
/api/portal/rentals/:id/invoice
Portal
Render invoice HTML
GET
/api/portal/availability
Portal
Equipment availability
Portal chat
Method
Path
Auth
Description
GET
/api/portal/chat
Portal
Get chat messages (customer side)
POST
/api/portal/chat
Portal
Send chat message (customer side)
GET
/api/portal/chat/:customerId
Any
Read chat thread (company side)
POST
/api/portal/chat/:customerId
Any
Reply to customer (company side)
Portal tokens use a separate JWT type: { type: "customer_portal", customer_id, company_id }. They do not grant access to any operator endpoints.
Portal Payments
Customers can pay invoices directly from their portal link via Stripe Checkout. Enable with portal_payments_enabled in company settings.
Method
Path
Auth
Description
GET
/api/portal/invoices
Portal
List customer's invoices with status and amounts
POST
/api/portal/invoices/:id/pay
Portal
Create Stripe Checkout session for invoice payment
Payments are processed via the company's connected Stripe account. Platform fees only apply to Stripe payments and are split automatically based on plan tier.
Reviews
Collect and display customer reviews. Review request emails are sent 1–2 hours after dumpster pickup (configurable). Includes $25-off coupon and customer referral bonus. Embed published testimonials on your website.
Method
Path
Auth
Description
GET
/api/reviews/submit?token=xxx
Public
Self-contained HTML review form
POST
/api/reviews/submit
Public
Save a review; returns promo code + referral link
GET
/api/reviews/company/:slug
Public
Published reviews + average rating
GET
/api/reviews/embed/:slug
Public
Embeddable testimonials widget (iframe)
GET
/api/reviews
Any
List reviews for your company
POST
/api/reviews/request/:rentalId
Any
Send a review request to the customer
PATCH
/api/reviews/:id
Admin
Update review status (approve, hide)
GET
/api/reviews/promo-codes
Any
List promo codes for your company
GET
/api/reviews/promo-codes/lookup?code=XXX
Public
Validate a promo code
PATCH
/api/reviews/promo-codes/:id/redeem
Any
Mark a promo code as redeemed
Locations
Multi-location support - link dumpsters and rentals to specific yards or depots.
Method
Path
Auth
Description
GET
/api/locations
Any
List locations
POST
/api/locations
Admin
Create a location
PATCH
/api/locations/:id
Admin
Update a location
DELETE
/api/locations/:id
Admin
Delete a location
Referrals
Refer other companies and both get 1 free month of service. Referrals accrue — refer 5, get 5 months free. Codes follow the format TG-XXXXXXXX. The /code endpoint also returns free_months — the company's accrued referral credit balance.
Method
Path
Description
GET
/api/referrals/code
Get or create your referral code
GET
/api/referrals
List your referrals and their status
POST
/api/referrals/invite
Send a referral invite email
Damage Reports API
Track dumpster damage, upload photos, and manage insurance claims.
Method
Path
Auth
Description
GET
/api/damage
Any
List damage reports for company. Filter by status and severity query params.
POST
/api/damage
Any
Create a damage report
PATCH
/api/damage/:id
Any
Update damage report status, insurance info
POST
/api/damage/:id/photo
Any
Upload damage photo (multipart form data). Optional type field: pre or post.
Create a damage report
POST /api/damage
Authorization: Bearer eyJ...
Content-Type: application/json
{
"rental_id": 42,
"dumpster_id": 7,
"description": "Cracked side panel from forklift impact",
"severity": "moderate",
"repair_cost": 350.00
}
Severity levels
Severity
Description
minor
Cosmetic damage — dumpster still usable
moderate
Structural concern — may need repair before next rental
major
Significant damage — dumpster out of service until repaired
Upload damage photo
Attach photos to a damage report. Use the optional type field to distinguish between pre-repair and post-repair photos.
POST /api/damage/:id/photo
Authorization: Bearer eyJ...
Content-Type: multipart/form-data
photo: (binary file)
type: pre
Insurance tracking: Use PATCH /api/damage/:id to attach insurance claim numbers, adjuster notes, and resolution status to damage reports.
Escalations
Automated escalation rules for overdue, unpaid, and unresponsive rentals.
Method
Path
Auth
Description
GET
/api/escalations
Any
List escalation rules
POST
/api/escalations
Admin
Create an escalation rule
PATCH
/api/escalations/:id
Admin
Update a rule
DELETE
/api/escalations/:id
Admin
Delete a rule
Escalation rules are evaluated automatically. Available conditions: overdue_days, unpaid_days, no_response_days. Actions: send_sms, send_email, notify_matrix.
Workflows
Event-driven automation with configurable steps. Trigger workflows on rental or appointment events.
Start a trip leg - body: { appointment_id, start_lat, start_lng }
PATCH
/api/trips/:id
Complete a trip leg - body: { end_lat, end_lng }
GET
/api/trips
List trips
Schedule
Monthly calendar view and iCal feed for dispatch scheduling.
Method
Path
Auth
Description
GET
/api/schedule?month=YYYY-MM
Any
Monthly schedule view of all rentals
GET
/api/schedule/ical?token=<calendar_token>
Public
iCal feed - subscribe in any calendar app
Directory
Public consumer search - find nearby dumpster rental companies by location.
Method
Path
Auth
Description
GET
/api/directory/search?lat=X&lng=Y&radius=50
Public
Find nearby companies
GET
/api/directory/company/:slug
Public
Public company profile
Xero Integration
OAuth2 connection and invoice export to Xero.
Method
Path
Auth
Description
GET
/api/integrations/xero/connect
Admin
Start OAuth2 flow
GET
/api/integrations/xero/callback
Xero
OAuth2 callback
GET
/api/integrations/xero/status
Admin
Connection status
POST
/api/integrations/xero/export
Admin
Export rentals as Xero invoices - body: { rental_ids }
DELETE
/api/integrations/xero
Admin
Disconnect Xero
Environment variables
Variable
Description
XERO_CLIENT_ID
Xero OAuth2 client ID
XERO_CLIENT_SECRET
Xero OAuth2 client secret
XERO_REDIRECT_URI
OAuth2 callback URL
HubSpot CRM
Sync customers as contacts and rentals as deals in HubSpot.
Method
Path
Auth
Description
GET
/api/integrations/hubspot/connect
Admin
Start OAuth2 flow
GET
/api/integrations/hubspot/callback
HubSpot
OAuth2 callback
GET
/api/integrations/hubspot/status
Admin
Connection status
POST
/api/integrations/hubspot/sync-contacts
Admin
Push customers as HubSpot contacts
POST
/api/integrations/hubspot/sync-deals
Admin
Push rentals as HubSpot deals
GET
/api/integrations/hubspot/contacts
Admin
List synced contacts
DELETE
/api/integrations/hubspot/disconnect
Admin
Clear tokens and disconnect
Environment variables
Variable
Description
HUBSPOT_CLIENT_ID
HubSpot OAuth2 client ID
HUBSPOT_CLIENT_SECRET
HubSpot OAuth2 client secret
HUBSPOT_REDIRECT_URI
OAuth2 callback URL
FreshBooks
Export rental invoices to FreshBooks via OAuth2.
Method
Path
Auth
Description
GET
/api/integrations/freshbooks/connect
Admin
Start OAuth2 flow
GET
/api/integrations/freshbooks/callback
FreshBooks
OAuth2 callback
GET
/api/integrations/freshbooks/status
Admin
Connection status
POST
/api/integrations/freshbooks/export
Admin
Export rentals as FreshBooks invoices
DELETE
/api/integrations/freshbooks/disconnect
Admin
Clear tokens and disconnect
Environment variables
Variable
Description
FRESHBOOKS_CLIENT_ID
FreshBooks OAuth2 client ID
FRESHBOOKS_CLIENT_SECRET
FreshBooks OAuth2 client secret
FRESHBOOKS_REDIRECT_URI
OAuth2 callback URL
Invoice Ninja
Self-hosted open-source invoicing. Connect via API key and export rental invoices to your Invoice Ninja instance.
Method
Path
Auth
Description
POST
/api/integrations/invoiceninja/connect
Admin
Save Invoice Ninja API key and base URL
GET
/api/integrations/invoiceninja/status
Admin
Connection status
POST
/api/integrations/invoiceninja/export
Admin
Export rentals as Invoice Ninja invoices
DELETE
/api/integrations/invoiceninja/disconnect
Admin
Clear API key and disconnect
Environment variables
Variable
Description
INVOICENINJA_URL
Base URL of your Invoice Ninja instance (e.g. https://invoicing.example.com)
INVOICENINJA_API_KEY
Invoice Ninja API token
Self-hosted: Invoice Ninja runs on your own server, so your financial data never leaves your infrastructure. TrashGeek connects via the Invoice Ninja v5 REST API.
IoT Tracking
Real-time GPS, weight, temperature, and alert data from IoT-enabled dumpsters via HMAC-authenticated webhooks.
Method
Path
Auth
Description
POST
/api/integrations/iot/webhook
HMAC
Receive IoT events (GPS, weight, temp, alert)
GET
/api/integrations/iot/events
Any
List recent IoT events
GET
/api/integrations/iot/events/:dumpsterId
Any
Events for a specific dumpster
POST
/api/integrations/iot/configure
Admin
Set webhook HMAC secret
GET
/api/integrations/iot/status
Any
Configuration status
HMAC verification: The IoT webhook validates the X-Signature header using HMAC-SHA256 with your configured secret.
Google Business Profile
Manage your Google Business listing - post reviews, update hours, and select locations.
Method
Path
Auth
Description
GET
/api/integrations/gbp/connect
Admin
Start OAuth2 flow
GET
/api/integrations/gbp/callback
Google
OAuth2 callback
GET
/api/integrations/gbp/status
Any
Connection status
GET
/api/integrations/gbp/locations
Admin
List business locations
POST
/api/integrations/gbp/select-location
Admin
Save selected location
POST
/api/integrations/gbp/post-review
Admin
Post a review as a local post
POST
/api/integrations/gbp/update-hours
Admin
Update business hours
DELETE
/api/integrations/gbp/disconnect
Admin
Clear tokens and disconnect
Environment variables
Variable
Description
GBP_CLIENT_ID
Google OAuth2 client ID
GBP_CLIENT_SECRET
Google OAuth2 client secret
GBP_REDIRECT_URI
OAuth2 callback URL
Webhooks
Register custom webhooks to receive real-time event notifications at your own endpoints.
Method
Path
Description
GET
/api/webhooks
List your webhooks
POST
/api/webhooks
Create a webhook - body: { url, events }
PATCH
/api/webhooks/:id
Update webhook URL or events
DELETE
/api/webhooks/:id
Delete webhook
POST
/api/webhooks/:id/test
Send a test ping
Webhook payloads are signed with a per-webhook secret (returned on creation). Verify the X-Webhook-Signature header using HMAC-SHA256.
Push Notifications
Web Push (VAPID) for real-time browser notifications. Requires the push_notifications feature flag.
Method
Path
Auth
Description
GET
/api/push/vapid-key
Public
Return VAPID public key
POST
/api/push/subscribe
Any
Save push subscription
DELETE
/api/push/unsubscribe
Any
Remove push subscription
Environment variables
Variable
Description
VAPID_PUBLIC_KEY
VAPID public key for Web Push
VAPID_PRIVATE_KEY
VAPID private key for Web Push
VAPID_EMAIL
Contact email for VAPID (e.g. mailto:admin@example.com)
WebAuthn (Passkeys)
Passwordless login via biometrics and security keys. Requires the webauthn feature flag.
Method
Path
Auth
Description
POST
/api/webauthn/register/options
Any
Generate registration challenge
POST
/api/webauthn/register/verify
Any
Store credential after registration
POST
/api/webauthn/login/options
Public
Generate login challenge
POST
/api/webauthn/login/verify
Public
Verify assertion and return JWT
SMS Inbound
Receive inbound SMS messages from customers via Twilio webhook.
Method
Path
Auth
Description
POST
/api/sms/inbound
Twilio
Twilio inbound webhook
Configure your Twilio phone number's webhook URL to https://yourapi.com/api/sms/inbound. Incoming messages are matched to customers and displayed in the dashboard.
Classifieds & Community Forum
Equipment marketplace, community forum with knowledge base, spam defence, featured listings, and reply notifications. All endpoints are prefixed with /api/classifieds.
Forum Endpoints
Method
Path
Auth
Description
GET
/api/classifieds/forum/categories
Public
List forum categories
GET
/api/classifieds/forum/threads
Public
List threads (filter by category, search)
GET
/api/classifieds/forum/pinned
Public
Knowledge base — all pinned threads
POST
/api/classifieds/forum/threads
User
Create thread (rate limited: 1/60s). Auto-flags links from low-post users.
POST
/api/classifieds/forum/threads/:id/reply
User
Reply to thread (rate limited: 1/30s). Sends email notification to author.
Listings Endpoints
Method
Path
Auth
Description
GET
/api/classifieds/listings
Public
Browse listings. Featured listings sort first. Returns is_featured flag.
POST
/api/classifieds/listings
User
Create listing (rate limited: 1/120s). Auto-flags new accounts with URLs.
PATCH
/api/classifieds/admin/listings/:id/feature
Admin
Feature/unfeature a listing. Body: { featured: 1, days: 7 }
Spam Defence
Honeypot: Hidden website field on registration — bots that fill it get a fake 201 response
Rate limiting: Per-user cooldowns on thread posts (60s), replies (30s), and listings (120s)
Auto-flagging: Posts with URLs from accounts <24h old or users with <5 posts are auto-flagged for review
Admin Moderation
Method
Path
Auth
Description
GET
/api/classifieds/admin/forum-flags
Admin
List unresolved forum content flags
PATCH
/api/classifieds/admin/forum-flags/:id/resolve
Admin
Resolve a forum flag
Reply Notifications
When someone replies to a thread, the thread author receives an email notification (if notify_replies = 1). Users can toggle this in their profile or click the unsubscribe link in the email. The GET /api/classifieds/unsubscribe?token=xxx endpoint handles one-click unsubscribe.
Smart Dispatch & Route Optimization
Kanban-style dispatch board, live driver GPS on the fleet map, auto-swap scheduling, and time window support for appointments.
Dispatch Board
The dispatch board provides a Kanban drag-and-drop interface for managing daily appointments. Columns represent statuses (Pending, Dispatched, In Progress, Completed) and drivers can be reassigned by dragging cards between lanes.
Method
Path
Auth
Description
GET
/api/dispatch/board
Any
Get dispatch board state grouped by status
PATCH
/api/dispatch/:id/assign
Any
Assign or reassign a driver - body: { driver_id }
PATCH
/api/dispatch/:id/status
Any
Move card to a new column - body: { status }
PATCH
/api/dispatch/:id/reorder
Any
Reorder card within a column - body: { position }
Live Driver GPS Tracking
Active drivers broadcast their GPS position in real time. The fleet map shows live driver markers that update continuously, giving dispatchers full visibility into driver locations.
Method
Path
Auth
Description
POST
/api/dispatch/gps
Driver
Report driver GPS position - body: { lat, lng }
GET
/api/dispatch/drivers/live
Any
Get all active driver positions for the fleet map
Auto-Swap Scheduling
When a dumpster is marked full, the system automatically schedules a swap appointment — picking up the full container and delivering a replacement. No manual intervention required.
Method
Path
Auth
Description
POST
/api/dispatch/auto-swap
Any
Trigger auto-swap for a full dumpster - body: { dumpster_id }
GET
/api/dispatch/auto-swap/settings
Owner
Get auto-swap configuration
PATCH
/api/dispatch/auto-swap/settings
Owner
Update auto-swap settings
Auto-Pickup Scheduling
When a rental's preferred pickup date is tomorrow, the system automatically marks the dumpster as full and creates a pickup appointment for the pickup date. This runs daily at 7 AM. If a pickup appointment already exists for the rental (e.g. manually created by the dispatcher), a duplicate is not created.
Auto-scheduled pickups appear on the dispatch board as scheduled status. Dispatchers can reassign drivers, change the date, or cancel the appointment as needed. A Matrix/chat notification is sent when pickups are auto-scheduled.
Time Windows
Appointments support time window preferences: morning (before noon), afternoon (noon–5 PM), or any (all day). Time windows are shown on the dispatch board and used for route ordering.
Set the time_window field when creating or updating appointments. Valid values: morning, afternoon, any.
Customer Payments & Invoicing
Create and send invoices, accept online payments via Stripe checkout, set up recurring contract billing, and let customers pay from the portal.
Invoice Management
Method
Path
Auth
Description
GET
/api/invoices
Any
List invoices (filterable by status, customer, date range)
POST
/api/invoices
Any
Create an invoice - body: { customer_id, items[], due_date }
GET
/api/invoices/:id
Any
Get invoice detail with line items
PATCH
/api/invoices/:id
Any
Update invoice (draft only)
POST
/api/invoices/:id/send
Any
Send invoice to customer via email
PATCH
/api/invoices/:id/void
Owner
Void an invoice
Stripe Checkout
Invoices include a Pay Now button that creates a Stripe Checkout session. Customers complete payment on the Stripe-hosted page and are redirected back to the portal.
Method
Path
Auth
Description
POST
/api/invoices/:id/checkout
Any
Create Stripe Checkout session for invoice payment
POST
/api/invoices/stripe-webhook
Stripe
Webhook handler - marks invoice paid on successful charge
Recurring Contract Billing
Customers with active contracts can be set to recurring billing. Configure a billing day (1–28) and the system auto-generates invoices each cycle.
The customer portal includes an Invoices tab where customers can view all invoices and their statuses. Each unpaid invoice displays a Pay Now button that initiates Stripe Checkout directly from the portal — no login required.
Email Campaigns
Bulk email campaigns with targeting filters, draft/preview/send workflow, and unsubscribe handling.
Campaign Management
Method
Path
Auth
Description
GET
/api/campaigns
Any
List all campaigns with stats (sent, opened, clicked)
Campaigns can target customers based on filters such as:
Status: active, inactive, or all customers
Last rental date: before or after a given date
Location: customers at a specific location
Tags: customer tags for segmentation
Unsubscribe Handling
Every campaign email includes a one-click unsubscribe link. Unsubscribed customers are automatically excluded from future campaigns. The GET /api/campaigns/unsubscribe?token=xxx endpoint processes unsubscribe requests and displays a confirmation page.
Churn Detection & Winback
Automatic at-risk customer detection based on inactivity, winback email campaigns, and configurable alert thresholds.
At-Risk Detection
The system monitors customer activity and flags accounts as at-risk when they exceed the configured inactivity threshold (default: 90 days since last rental). At-risk customers appear in a dedicated dashboard section with recommended actions.
Method
Path
Auth
Description
GET
/api/churn/at-risk
Any
List at-risk customers with last activity date and risk score
GET
/api/churn/stats
Any
Churn overview - total at-risk, winback success rate, trends
Winback Campaigns
Trigger automated winback emails to re-engage inactive customers. Winback emails can include personalized offers and discount codes to incentivize return bookings.
When auto_winback_enabled is turned on, the system automatically sends a winback email when a customer first crosses the inactivity threshold. Each customer receives at most one automatic winback per 90-day window.
Driver GPS & ETA
Continuous GPS tracking during trips, real-time ETA notifications to customers via SMS, and GPS status indicators.
GPS Tracking
Drivers broadcast their GPS position continuously while on active trips. The driver app automatically manages tracking start/stop lifecycle tied to trip status.
Method
Path
Auth
Description
POST
/api/driver-gps/position
Driver
Report GPS position - body: { lat, lng, accuracy, speed, heading }
GET
/api/driver-gps/active
Any
Get all active driver positions with last update timestamps
GET
/api/driver-gps/:driver_id/trail
Any
Get GPS trail (breadcrumb path) for a driver's current trip
ETA Notifications
When a driver is en route, the system calculates the estimated time of arrival and sends an SMS notification to the customer with a live ETA. Customers receive updates when the driver departs and when the ETA changes significantly.
Method
Path
Auth
Description
GET
/api/driver-gps/:driver_id/eta/:appointment_id
Any
Calculate current ETA to appointment destination
POST
/api/driver-gps/notify-eta
Any
Send ETA SMS to customer - body: { appointment_id }
GPS Status Indicator
The fleet map and dispatch board display a GPS status indicator for each driver:
Green: GPS active, position updated within the last 60 seconds
Yellow: GPS stale, last update 1–5 minutes ago
Red: GPS offline, no update for over 5 minutes
GPS tracking requires the driver to grant location permissions in the browser. The driver app displays a prompt on trip start if permissions have not yet been granted.
Overflow Network
Route excess demand to nearby partner operators and earn referral fees on every accepted job. All endpoints are prefixed with /api/overflow.
How It Works
When your fleet is at capacity, incoming quotes can be automatically forwarded to partner operators within your configured service radius. When a partner accepts and completes the job, you earn a referral fee based on the percentage you set. Partners see overflow quotes in their dashboard and can accept or decline with one click.
Settings
Method
Path
Auth
Description
GET
/api/overflow/settings
Owner
Get overflow network settings (enabled, radius, referral %)
List inbound overflow quotes available to your company
POST
/api/overflow/quotes/:id/accept
Any
Accept an overflow quote and create a rental
POST
/api/overflow/quotes/:id/decline
Any
Decline an overflow quote
Referral Tracking
Method
Path
Auth
Description
GET
/api/overflow/referrals
Owner
List referral fees earned and owed, with status and payout history
Overflow is available on all paid plans. The referring company sets the referral percentage (default 10%). Fees are tracked per completed job and appear in the referrals ledger for both parties.
Job Board
Post driver and CDL job openings, manage applications, and let job seekers browse listings publicly. All endpoints are prefixed with /api/jobs.
Job Postings
Method
Path
Auth
Description
GET
/api/jobs
Public
Browse active job listings (filter by location, type, CDL requirement)
Update application status - body: { status } (new, reviewed, contacted, hired, rejected)
Application Flow
Job seekers browse the public /jobs page, filter by location and type, and submit applications with their contact details and optional resume link. The posting company receives an email notification for each new application. Applications can be reviewed and advanced through statuses directly from the dashboard.
Job postings are available on all plans. Listings are shown on the public jobs page and include your company name, location, and logo. Closed or expired postings are automatically hidden from public search.
Native Driver App
A dedicated mobile app for drivers built with Capacitor. Available on Android now, iOS coming soon.
Features
Background GPS tracking — continuous location reporting during active trips, even when the app is minimized
Native camera — proof-of-delivery and damage report photos with better quality than browser capture
QR code scanning — scan dumpster QR codes to dispatch, mark full, or return bins
Push notifications — native push alerts for new stops, schedule changes, and dispatch updates
Offline support — queue actions when offline, auto-sync when connectivity returns
Haptic feedback — vibration on successful scans and completed actions
Installation
The Android app is distributed as an APK. Contact your administrator for the install link. The app connects to the same backend as the web version — log in with your existing driver credentials.
The native app wraps the same driver interface you already use in the browser, enhanced with native device capabilities. All your stops, routes, and trip history stay in sync.
Auto-Ban & Intrusion Detection
Automatic threat detection and IP banning to protect the platform from malicious traffic.
How it works
The platform tracks suspicious requests per IP address in real time. Each failed authentication attempt, malformed request, or access to non-existent routes increments a suspicion counter. When the counter exceeds the configured threshold, the IP is automatically banned and all further requests are rejected with 403 Forbidden.
Configuration
Environment Variable
Default
Description
INTRUSION_THRESHOLD
50
Number of suspicious requests before an IP is auto-banned
BAN_DURATION_MINUTES
30
How long an auto-ban lasts before the IP is allowed again
Bot honeypot
Common attack paths (e.g. /wp-admin, /.env, /phpmyadmin) are trapped by a honeypot layer. Requests to these paths receive a 404 response after a 3-second tarpit delay, and each hit counts as 10x suspicious — meaning bots trigger the auto-ban threshold much faster than regular users.
Matrix alerts: When an IP is auto-banned, a notification is sent to the configured Matrix room so administrators are immediately aware of the event.
Superadmin endpoints
Method
Path
Description
GET
/api/superadmin/banned-ips
List all currently banned IPs and IPs with elevated suspicion scores