Every reservation has a downloadable PDF receipt accessible at
/api/reservations/[id]/receipt. Includes operator branding, customer
info, vehicle details, line items, taxes, and payment summary.
What's on the receipt
Header
- Operator name (your subaccount name)
- Levy Fleets logo (if
public/levyfleets-logo.pngexists in the deploy) - Booking number
- Generated-at timestamp
Customer block
- Full name
- Email (if provided)
- Phone (if provided)
Rental block
- Vehicle (number or model name)
- Pickup datetime
- Return datetime
- Pickup location (if applicable)
Line items
- Base rental
- Each add-on with quantity × unit price = total
- Promo discount (if any, as a negative line)
- Adjustment / damage charge (if any)
Totals
- Subtotal
- Tax (with percentage shown if known)
- Total (bold)
- Amount paid (negative)
- Refunded (if any, negative)
- Balance due (bold, only if > 0)
Footer
- Booking number + operator name
- Centered, smaller font
Generating the receipt
Three ways:
Open in browser
Visit /api/reservations/[id]/receipt while logged in. The PDF
renders inline (download or print from the browser).
From the booking detail
The booking detail page doesn't yet have a "Print receipt" button — queued. For now, manually visit the URL above.
Email to customer
Currently no automatic post-rental receipt email. Operators copy the receipt URL or download and attach manually.
A native "Email receipt" feature on the booking detail and an automatic post-completion receipt email are both on the roadmap.
When the receipt regenerates
The receipt PDF is generated on each request — no caching. So if you:
- Change the customer's name → next download shows the new name
- Refund the customer → refunded amount appears on next download
- Apply a late fee → late fee appears as adjustment line
This is by design. Customers who saved an old PDF still have a historically-accurate snapshot, while new downloads reflect current state.
What's NOT on the receipt
- Stripe charge IDs — internal-only, not customer-facing
- Per-rider names for group bookings — only the lead booker
- Refund reasons — refunds show as a totaled line, not itemized
- Loyalty points earned — separate program
- Marketing content — this is a tax/audit document, not a sales page
Operator branding
The header uses your subaccount name from subaccounts.name. To
customize beyond:
- Logo — replace
public/levyfleets-logo.png(default) with your own. This affects all receipts globally; per-subaccount logo override is on the roadmap. - Header colors — currently fixed; per-subaccount theming is queued
- Footer text — currently fixed to subaccount name
Currency
Pulled from the reservation's currency_code. The receipt uses
locale-aware formatting (e.g., $1,234.56 for USD, €1.234,56 for EUR).
Multi-language
Receipts are English-only today. The frontend page can render in other languages but the PDF generator doesn't yet localize. Add to roadmap if you have non-English customers requesting localized receipts.
Receipt as legal document
The receipt is sufficient for most consumer dispute resolution and small-claims paperwork. For tax filings:
- Total includes tax (broken out as a line)
- Refunds are shown if applied
- Operator name + booking number make it auditable
For chargeback dispute evidence, attach the receipt PDF along with the signed waiver and any photos.
Reporting all receipts
To pull all receipts for a tax period, query reservations and generate on demand:
SELECT r.id, r.reservation_number, r.total_cents
FROM reservations r
WHERE r.subaccount_id = '<your-subaccount-id>'
AND r.completed_at BETWEEN '2026-04-01' AND '2026-06-30'
AND r.status = 'completed'
ORDER BY r.completed_at;
Then iterate and download each. A bulk-export tool is on the roadmap.
Common questions
Customer says the receipt is wrong
If a refund or adjustment was made after they downloaded, ask them to re-download. The latest version is always at the same URL.
Customer needs a paper receipt
Print from the browser. Most tablets and POS systems have a connected receipt printer; they can be set up to print from a "Print" button in the browser dialog.
Receipt has weird character formatting
Likely a font issue. Check the deployed font configuration. If the issue is in customer names with non-Latin characters, ensure the PDF renderer is using a font with extended Unicode support.
Running a fleet on this hardware?
Levy Fleets runs scooters, e-bikes, mopeds and golf carts on the IoT hardware you already have, with integration pages for 29 vendors including Segway, Okai, Omni, Queclink, Invers and Comodule. Keyless unlock, geofencing, rider payments and rider support are included, and the Managed plan is a share of revenue with no per-vehicle software fee.