Every shop rental should ship with a signed rental agreement before the customer rides off. This guide walks through creating a template once; after that, every booking can issue a fresh signing link in two clicks.
Templates live at Agreements in the dashboard sidebar (under Car Sharing — agreements are shared between Shop Rentals and Car Sharing).
Why templates, not flat text
Templates support variable substitution so the same template renders personalized agreements for every booking — name, booking number, pickup date, etc. — without you copy-pasting anything.
They also have sections so a customer reading on their phone can scroll through clearly headed parts of the agreement instead of one wall of legalese.
The frontmatter you fill in
| Field | Purpose |
|---|---|
| Name | Internal label and what customers see ("Rental Agreement") |
| Version | Increment when you make material changes — old signed copies stay tied to the version they signed |
| Body | The intro paragraph(s) |
| Sections | Array of {heading, body, required} blocks |
| Vehicle type | (Optional) Restrict template to a single type — bike, scooter, e-bike, moped |
| Locale | Default en. For other languages, create separate template versions |
| Toggle flags | include_liability_waiver, include_damage_policy, include_insurance_disclosure, include_arbitration_clause |
| Active | Inactive templates don't appear in the walk-in waiver picker |
Variable substitution
Use {{variable_name}} anywhere in the body or section bodies. Available
variables:
{{rider_name}}— customer's full name (or first + last if full_name not set){{customer_name}}— synonym{{customer_email}}— customer's email{{booking_number}}— reservation number (no#, just the integer){{pickup_date}}— formatted asM/D/YYYYin the customer's locale{{pickup_time}}— formatted asH:MM AM/PM{{return_date}}— formatted as pickup_date{{subaccount_name}}— your shop's name
Unrecognized variables render as empty strings (not the literal {{ }}).
Recommended section structure
Body: "I, {{rider_name}}, agree to the following terms for booking
#{{booking_number}} on {{pickup_date}}."
Sections:
1. Liability Waiver
"I assume all risks of injury or damage during this rental..."
required: true
2. Damage Policy
"I am responsible for any damage I cause beyond normal wear and
tear. Damage charges will be assessed by {{subaccount_name}}..."
required: true
3. Insurance Disclosure
"Damage insurance is optional and covers up to $X per claim..."
required: false
4. Helmet & Safety Equipment
"I will wear a helmet at all times while operating the rental."
required: true
5. Return Conditions
"I will return the rental in clean, working condition by
{{return_date}}. Late returns incur fees as disclosed..."
required: true
6. Arbitration Clause
"Any dispute arising from this rental will be resolved..."
required: true
Mark sections required for legally important parts. The signing UI shows the heading visibly for required sections.
Activating the template
Once the template body and sections are filled in, mark Active and save. Inactive templates don't appear:
- In the walk-in wizard's waiver picker
- In the booking detail page's "Issue signing link" buttons
- In the agreements list shown to customers via the manage-link
You can have multiple active templates — bike shops sometimes have separate templates for adults vs. minors, or for hourly vs. multi-day rentals.
Versioning
When you make a material change (new clause, updated arbitration language), increment the version number. Existing signed agreements stay permanently bound to the version they signed; future bookings get the new version.
This matters for legal traceability. If a customer signed v1 and you update to v2, the v1 signature is still valid for that customer's specific booking.
Locales
Templates are scoped to a single locale. To support customers in multiple languages:
- Create one template per language (set the
localefield accordingly) - The template-resolution helper picks the right one based on the customer's preferred language
Most US shops only need en. Add es, fr etc. if your customer base
calls for it.
What's signed in detail
When the customer signs, we capture:
- Typed name — their full legal name as they typed it
- Signature image — if they drew with a finger/stylus (web canvas)
- Signer IP — for audit
- Signer device — user agent string (iOS Safari, Android Chrome, etc.)
- Timestamp — UTC, server-side, immutable
- Rendered body + sections — snapshotted at sign time so the agreement renders identically forever even if the template is later edited
This bundle constitutes a signed agreement record sufficient for most rental disputes.
After signing
The signed agreement appears on the booking detail page with a green "Signed" badge, the typed name, and the signed-at timestamp. Operators can also click through to the rendered PDF (auto-generated for some template types).
For per-rider waivers in group bookings, see Per-rider waivers. For the operator workflow of sending a signing link, see Issuing a signing link.