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.