intermediate
pricing
packages
prepaid

Ride Packages

Create one-time prepaid ride bundles that give customers time, unlocks, and distance allowances - different from recurring subscriptions

Levy Fleets Team25 de diciembre de 202512 min read

Ride Packages

Ride packages are one-time prepaid bundles that provide customers with riding credits including time, unlocks, and distance. Unlike subscriptions which renew automatically, ride packages are purchased once and consumed until depleted.

Overview

Ride packages allow customers to pay upfront for a bundle of ride credits that they can use across one or more rides. This is ideal for occasional riders who want to prepay for convenience or save money compared to pay-per-ride pricing.

Key Features

  • One-time purchase - No recurring charges or auto-renewal
  • Flexible consumption - Use credits across multiple rides until depleted
  • Included time - Minutes of riding included (configurable units: minutes, hours, days)
  • Free unlocks - Optional unlock fee waiver
  • Distance allowance - Optional included kilometers
  • Pause minutes - Optional included pause time
  • Group ride support - Packages can support multiple riders (max_riders)
  • Location scoping - Packages can be location-specific or global
  • Wallet or card payment - Customers can pay from wallet balance or credit card

Ride Packages vs. Subscriptions

FeatureRide PackagesSubscriptions
BillingOne-timeRecurring
ExpirationWhen depletedTime-based (days)
Auto-renewalNoOptional
Daily limitsNoOptional
Best forOccasional ridersRegular commuters

Accessing Ride Packages

1

Navigate to Pricing

Go to Dashboard and click Pricing in the sidebar navigation.

2

Find Packages Section

Scroll to the Ride Pricing Packages section.

3

Manage Packages

Click Add Package to create a new package or use edit/delete icons for existing ones.

Location-Specific

Ride packages are managed per-location. Switch to the appropriate subaccount before creating packages.

Package Configuration

Basic Information

Title (i18n)

The display name shown to customers, with translations for multiple languages.

FieldDescriptionExample
English TitlePackage name in English"60 Minute Pack"
Spanish TitlePackage name in Spanish"Paquete de 60 Minutos"

Best Practices:

  • Include the primary benefit (time/unlocks) in the title
  • Keep titles concise (2-4 words)
  • Use consistent naming across packages

Description (i18n)

Optional extended description explaining package benefits.

FieldDescriptionExample
English DescriptionFull details"60 minutes of riding, use anytime"
Spanish DescriptionFull details"60 minutos de viaje, usa cuando quieras"

Step Number

Controls the display order in the mobile app.

ValueDisplay Position
1First (top)
2Second
3+Lower positions

Lower numbers appear first. Highlight your best-value or most popular packages first.

Pricing

Price (Cents)

The amount customers pay for the package, stored in cents.

EntryDisplay
499$4.99
999$9.99
1999$19.99

Pricing Tips:

  • Calculate savings vs. pay-per-ride
  • Offer clear value proposition
  • Consider psychological price points ($X.99)

Included Benefits

Included Time

The primary benefit - riding time included in the package.

FieldDescription
included_time_qtyNumber of time units
included_time_unitUnit type: minutes, hours, or days

Examples:

  • 60 minutes = 1 hour of riding
  • 2 hours = 120 minutes of riding
  • 1 day = 24 hours of riding

Include Unlock Fee

Whether the package covers the unlock fee.

SettingBehavior
truePackage includes free unlock(s)
falseCustomer pays unlock fee separately

When enabled, the max_riders field determines how many free unlocks are included.

Included Distance (Optional)

Kilometers of distance included in the package.

ValueBehavior
nullNo distance included
1010 km included
5050 km included

Distance Pricing

Distance allowances only apply when your pricing uses per-km charges. If using time-only pricing, this field has no effect.

Included Pause Minutes (Optional)

Minutes of paused time included.

ValueBehavior
nullPause fees charged normally
3030 pause minutes included
6060 pause minutes included

Group Ride Support

Max Riders

Number of simultaneous riders the package supports.

ValueBehavior
1Single rider (default)
2Pair riding
4Small group

Group Rides

When max_riders > 1, customers can start group rides with friends. Each rider in the group shares the package benefits. See Group Rides for more details.

Visual Customization

Badge Text

Optional badge to highlight the package.

ValueDisplay
nullNo badge
"BEST VALUE"Badge on package
"POPULAR"Badge on package

Icon

Optional icon identifier for the package.

Flag to indicate this is a popular choice, may affect display styling.

Speed Limits

Max Speed (kph)

Optional speed limit applied during rides using this package.

ValueBehavior
nullNo speed restriction
15Limited to 15 km/h
20Limited to 20 km/h

Useful for beginner packages or safety-focused offerings.

Creating a Ride Package

Step 1: Basic Setup

  1. Navigate to Pricing → Ride Pricing Packages
  2. Click Add Package
  3. Set Step Number for display order
  4. Enter Title in supported languages

Step 2: Pricing

  1. Enter Price in cents (e.g., 999 for $9.99)
  2. Select Currency (typically matches subaccount default)

Step 3: Time Allowance

  1. Enter Included Time Qty (e.g., 60)
  2. Select Included Time Unit (minutes, hours, or days)

Step 4: Additional Benefits

  1. Toggle Include Unlock Fee if package covers unlocks
  2. Set Max Riders if supporting group rides
  3. Add Included Distance if applicable
  4. Add Included Pause Minutes if applicable

Step 5: Customize & Activate

  1. Add optional Badge Text
  2. Toggle Activated to make available
  3. Click Save

How Packages Work

Purchase Flow

1

Customer Browses Packages

In the mobile app, customer views available packages for their location.

2

Select Package

Customer taps on a package to see details and purchase.

3

Choose Payment Method

Customer selects wallet balance or card payment.

4

Complete Purchase

For wallet: Immediate deduction. For card: Stripe PaymentIntent flow.

5

Package Activated

Credits are immediately available for use.

Usage During Rides

When a customer with an active package starts a ride:

  1. System checks for active package purchases
  2. Benefits applied - Unlock fee waived (if included), time starts counting against package
  3. During ride - Time/distance deducted from package allowances
  4. Ride ends - Remaining credits updated, excess charged normally

Package Consumption

Package: 60 Minutes
├── Ride 1: 15 minutes → 45 minutes remaining
├── Ride 2: 20 minutes → 25 minutes remaining
├── Ride 3: 30 minutes → Package depleted (5 min charged normally)
└── Status: Consumed

When a package is depleted, regular pricing applies for any excess usage.

Mobile App Integration

Package Display

The mobile app /packages screen shows:

  • Available packages for the customer's location
  • Package title (localized)
  • Price formatted for currency
  • Duration/time included
  • Group ride indicator (if max_riders > 1)
  • Purchase button

Active Packages

Customers can view their active packages:

  • Package name and purchase date
  • Remaining time/unlocks
  • Location where package applies
  • Usage history

Location Resolution

Packages are location-specific:

  1. App sends customer's GPS coordinates
  2. System checks which zones contain the location
  3. Matching subaccount's packages are displayed
  4. If ambiguous, customer may need to select location

API Reference

GET /api/mobile/packages

Fetch available packages for a location.

Query Parameters:

  • lat - Latitude (optional)
  • lng - Longitude (optional)
  • subaccount_id - Direct subaccount ID (optional)

Response:

{
  "data": {
    "purchases": [...],
    "available_packages": [...],
    "has_active_package": false,
    "location": {
      "subaccount_id": "uuid",
      "subaccount": { "name": "City Name" }
    }
  }
}

POST /api/mobile/packages

Purchase a package.

Request Body:

{
  "package_id": "uuid",
  "payment_method": "wallet"
}

Response (wallet payment):

{
  "data": { ... purchase record ... },
  "payment": {
    "method": "wallet",
    "amount_cents": 999,
    "new_wallet_balance_cents": 1501
  }
}

Response (card payment required):

{
  "requires_payment": true,
  "client_secret": "pi_..._secret_...",
  "payment_intent_id": "pi_...",
  "amount_cents": 999
}

Database Schema

Table: ride_pricing_packages

ColumnTypeDescription
idUUIDUnique identifier
subaccount_idUUIDLocation scope
step_numberIntegerDisplay order
title_i18nJSONBLocalized titles
description_i18nJSONBLocalized descriptions
price_centsIntegerPackage price
currencyTextCurrency code (USD)
activatedBooleanAvailable for purchase
include_unlock_feeBooleanUnlock fee included
included_time_qtyIntegerTime amount
included_time_unitTextminutes/hours/days
included_distance_kmIntegerDistance included
included_pause_minutesIntegerPause time included
max_ridersIntegerGroup ride support
max_speed_kphIntegerSpeed limit (optional)
badge_textTextDisplay badge
is_popularBooleanPopular flag
deleted_atTimestampSoft delete

Table: ride_pricing_package_purchases

ColumnTypeDescription
idUUIDUnique identifier
customer_uuidUUIDCustomer reference
package_idUUIDPackage reference
subaccount_idUUIDPurchase location
statusTextactive/consumed
package_snapshotJSONBPackage at purchase time
purchased_atTimestampPurchase time
remaining_time_minutesIntegerTime remaining
remaining_unlocksIntegerUnlocks remaining
remaining_distance_kmDecimalDistance remaining
remaining_pause_minutesIntegerPause time remaining

Common Scenarios

Scenario 1: Basic Time Package

Goal: Simple 1-hour ride package

Setup:

  • Title: "1 Hour Pack"
  • Price: $9.99 (999 cents)
  • Time: 60 minutes
  • Include Unlock: Yes
  • Max Riders: 1

Customer Value: Saves vs. unlock fee + hourly rate

Scenario 2: Group Day Pass

Goal: Family/friends day out

Setup:

  • Title: "Group Day Pass"
  • Price: $29.99 (2999 cents)
  • Time: 4 hours
  • Include Unlock: Yes
  • Max Riders: 4
  • Badge: "BEST FOR GROUPS"

Customer Value: 4 people can ride together sharing the time

Scenario 3: Distance Package

Goal: Tour/exploration package

Setup:

  • Title: "Explorer 50km"
  • Price: $24.99 (2499 cents)
  • Time: 2 hours
  • Distance: 50 km
  • Include Unlock: Yes

Customer Value: Good for touring with distance cap

Best Practices

Package Design

  1. Clear value proposition - Make savings obvious
  2. Tiered options - Small, medium, large packages
  3. Match use cases - Commute, recreation, tourism
  4. Group options - Families, friends, tourists

Pricing Strategy

  1. Calculate break-even - When does package save money?
  2. Anchor pricing - Show per-minute equivalent
  3. Bundle value - Combine time + unlocks + pause

Display Optimization

  1. Best value first - Use step_number strategically
  2. Use badges - Highlight popular/recommended
  3. Clear descriptions - Explain what's included

Troubleshooting

Package Not Visible

  1. Check activated is true
  2. Verify deleted_at is null
  3. Confirm correct subaccount selected
  4. Check customer's location matches package subaccount

Credits Not Applying

  1. Verify purchase status is 'active'
  2. Check remaining credits aren't zero
  3. Confirm package subaccount matches ride location
  4. Review ride pricing calculation logs

Group Ride Issues

  1. Check max_riders setting
  2. Verify group rides enabled in subaccount settings
  3. Confirm package has remaining unlocks

Packages Configured

With ride packages in place, customers can prepay for ride credits and enjoy simpler, more predictable pricing. Monitor package sales and usage to optimize your offerings.