Promo Codes and Discounts
Promo codes are a powerful marketing tool that lets you offer discounts to attract new customers, reward loyal riders, and run promotional campaigns. This guide covers everything you need to know about creating, managing, and optimizing promo codes.
Overview
Promo codes provide discounts that customers can apply to rides, wallet top-ups, or subscription purchases. Each code can be configured with specific discount amounts, usage limits, validity periods, and targeting options.
Key Features
- Percentage or fixed discounts - Offer a percentage off or a fixed dollar amount
- Multiple application types - Apply to rides, wallet credits, or subscriptions
- Usage limits - Control total uses and per-customer limits
- Location targeting - Restrict codes to specific subaccounts
- Vehicle type filtering - Limit codes to specific vehicle models
- Minimum spend requirements - Require a minimum subtotal before discount applies
- Maximum discount caps - Prevent percentage discounts from exceeding a set amount
Accessing Promo Codes
Navigate to Pricing
Go to Dashboard and click Pricing in the sidebar navigation.
Find Promo Codes Section
Scroll to the Promo Codes section.
Manage Codes
Click Add Promo Code to create a new code or use the edit/delete icons to manage existing ones.
Promo Code Configuration
Code
The unique identifier customers enter to redeem the discount.
| Field | Description | Example |
|---|---|---|
| Code | Alphanumeric promo code (case-insensitive) | SUMMER20, NEWUSER |
Code Best Practices
Use memorable, easy-to-type codes (6-10 characters). Avoid ambiguous characters (0/O, 1/I/l). Include campaign hints like SUMMER20 or HOLIDAY50. Codes are automatically converted to uppercase and must be unique.
Discount Type
Choose how the discount is calculated:
| Type | Description | Example |
|---|---|---|
| Fixed Amount | Specific dollar amount off | $5.00 off |
| Percentage | Percentage of the subtotal | 20% off |
Fixed Amount Calculation:
Discount = Fixed Amount
Example: Subtotal $12.00, Code $5.00 off = Discount $5.00 = Final $7.00
Percentage Calculation:
Discount = Subtotal x (Percentage / 100)
Example: Subtotal $12.00, Code 20% off = Discount $2.40 = Final $9.60
Discount Value
The actual discount amount based on the type selected:
| Type | Entry | Meaning |
|---|---|---|
| Fixed | 5.00 | $5.00 off |
| Percentage | 20 | 20% off |
Application Type
Specify where the promo code can be used:
| Type | Description | Use Case |
|---|---|---|
| Wallet Credit | Adds credit to customer's wallet | Sign-up bonuses, referral rewards |
| Ride Discount | Applied directly to ride charges | Marketing campaigns, promotions |
| Subscription Discount | Applied to subscription purchases | Subscription promotions |
Wallet Credit Behavior:
- When redeemed, the discount value is added to the customer's wallet balance
- The credit can then be used on any future rides
- Works like a gift card or bonus credit
Ride Discount Behavior:
- Applied during ride billing after dynamic pricing
- Only affects the specific ride where the code is used
- Appears in the ride's pricing breakdown
Subscription Discount Behavior:
- Reduces the cost of purchasing a subscription plan
- Applied at the time of subscription purchase
Usage Limits
Total Uses (Global)
Maximum number of times the code can be used across all customers.
| Setting | Behavior |
|---|---|
| Unlimited | No limit on total uses (leave blank) |
| 100 | Code stops working after 100 total redemptions |
Use Cases:
- Limited-time flash sales (first 50 customers)
- Exclusive event promotions
- Budget-controlled campaigns
Uses Per Customer
Maximum times a single customer can use the code.
| Setting | Behavior |
|---|---|
| 1 | Each customer can only use the code once (default) |
| 3 | Customers can redeem up to 3 times |
| Unlimited | No per-customer limit (leave blank) |
Best Practices:
- First-ride discounts: Set to 1
- Loyalty rewards: Allow multiple uses
- Referral codes: Set to 1 per customer
Validity Period
Valid From
Date and time when the code becomes active.
| Field | Format | Example |
|---|---|---|
| Valid From | Date/Time picker | 2025-01-01 00:00 |
Codes cannot be redeemed before this date.
Valid Until (Optional)
Date and time when the code expires.
| Setting | Behavior |
|---|---|
| Blank | Code never expires |
| Date set | Code stops working after this date |
Common Scenarios:
- Weekend sale: Friday 5 PM to Sunday 11:59 PM
- Holiday promo: December 20 to December 31
- Summer campaign: June 1 to August 31
Targeting Options
Location (Subaccount)
Restrict the code to a specific operating location.
| Setting | Behavior |
|---|---|
| All Locations | Code works at any location (default) |
| Specific Location | Code only works at the selected subaccount |
Use Cases:
- City-specific launches
- Location-based partnerships
- Local event promotions
Vehicle Types (Advanced)
Limit the code to specific vehicle models. This is configured in the database and available for advanced use cases.
Example:
- Premium vehicle promotion: Only applies to e-bikes
- Scooter launch discount: Only applies to scooters
Minimum Spend Requirement
Set a minimum subtotal the customer must reach before the code applies.
| Field | Description | Example |
|---|---|---|
| Minimum Ride Amount | Subtotal threshold in dollars | $10.00 |
How It Works:
If Subtotal >= Minimum:
Apply discount
Else:
Reject promo code
Use Cases:
- "$5 off rides over $15" - Encourages longer rides
- "20% off $25+ rides" - Protects margins on small rides
Maximum Discount Cap
Limit the maximum discount for percentage-based codes.
| Field | Description | Example |
|---|---|---|
| Max Discount | Maximum discount amount | $10.00 cap |
How It Works:
Raw Discount = Subtotal x (Percentage / 100)
Final Discount = MIN(Raw Discount, Max Discount Cap)
Example: 50% off with $10 max:
- $12 ride: 50% = $6.00, Discount: $6.00 (under cap)
- $30 ride: 50% = $15.00, Discount: $10.00 (capped)
Use Cases:
- Generous percentage discounts without unlimited liability
- "50% off, up to $10" style promotions
Creating a Promo Code
Step 1: Basic Information
Code (Required)
- Enter a unique code or click Generate for a random 8-character code
- Codes are case-insensitive and stored uppercase
Application Type (Required)
- Select where the code can be used: Wallet Credit, Ride Discount, or Subscription Discount
Step 2: Configure Discount
Discount Type (Required)
- Choose Fixed Amount or Percentage
Discount Value (Required)
- Enter the amount (e.g., 5.00 for $5 or 20 for 20%)
Step 3: Set Limits
Total Uses (Optional)
- Enter maximum global uses or leave blank for unlimited
Uses Per Customer (Optional)
- Enter per-customer limit (defaults to 1)
Step 4: Set Validity
Valid From (Required)
- Select when the code becomes active (defaults to now)
Valid Until (Optional)
- Select expiration date or leave blank for no expiration
Step 5: Add Details
Description (Optional)
- Internal description for reference (e.g., "Summer 2025 new user promo")
Location (Optional)
- Select a specific location or leave as "All Locations"
Step 6: Create
Click Create to save the promo code. It will be immediately active if the valid_from date has passed.
Managing Promo Codes
Viewing Codes
The promo codes table displays:
| Column | Description |
|---|---|
| Code | The promo code (with copy button) |
| Description | Internal description |
| Discount | Amount and type (e.g., "20%" or "$5.00") |
| Location | Subaccount scope or "All Locations" |
| Usage | Current uses / max uses |
| Valid Until | Expiration date or "No Expiry" |
| Status | Active/Inactive badge |
Editing Codes
- Click the Edit (pencil) icon
- Modify any fields
- Click Save
Immediate Effect
Changes take effect immediately for new redemptions. Previously applied discounts are not affected.
Cloning Codes
Use the Clone button to create a similar code:
- Click the Clone icon on an existing code
- A new form opens with all settings copied except the code itself
- Enter a new unique code
- Adjust any other settings
- Click Create
Use Cases:
- Creating location-specific variants of a campaign
- Rolling over expiring codes with new dates
- A/B testing different discount values
Deactivating Codes
Toggle the Active switch to disable a code:
- Inactive codes cannot be redeemed
- Code remains in the system for historical reference
- Can be reactivated anytime
Use For:
- Pausing campaigns temporarily
- Ending promotions early
- Preparing codes for future activation
Deleting Codes
- Click the Delete (trash) icon
- Confirm deletion
Permanent Deletion
Deletion is permanent. For temporary suspension, use deactivation instead.
How Promo Codes Are Applied
Billing Position
Promo codes are applied after all other pricing calculations:
Base Charges -> Tier Benefits -> Subscription -> Packages -> Dynamic Pricing -> PROMO CODE -> Final
This means the promo discount applies to the amount remaining after other discounts and adjustments.
Validation Process
When a promo code is submitted, the system checks:
- Code exists - The code is in the database
- Code is active - The
is_activeflag is true - Time validity - Current time is within valid_from and valid_until
- Global limit - Total uses haven't exceeded max_uses
- Customer limit - Customer uses haven't exceeded max_uses_per_customer
- Location match - If scoped, the ride's subaccount matches
- Vehicle match - If scoped, the vehicle type matches
- Minimum met - Subtotal meets min_ride_amount requirement
If any check fails, the code is rejected with an appropriate error message.
Discount Calculation
If discount_type = 'percentage':
Raw Discount = Subtotal x (Percentage / 100)
Else:
Raw Discount = Fixed Amount
If max_discount set:
Discount = MIN(Raw Discount, Max Discount Cap)
Final Discount = MIN(Discount, Subtotal) // Can't exceed subtotal
Common Scenarios
Scenario 1: New User Discount
Goal: Give new customers $5 off their first ride
Setup:
- Code: WELCOME5
- Type: Ride Discount
- Discount: Fixed $5.00
- Uses per customer: 1
- Location: All Locations
- Valid: No expiration
Scenario 2: Summer Flash Sale
Goal: 25% off all rides this weekend, capped at $10
Setup:
- Code: SUMMER25
- Type: Ride Discount
- Discount: 25%
- Max Discount: $10.00
- Total Uses: 500 (first 500 only)
- Valid From: Friday 5 PM
- Valid Until: Sunday 11:59 PM
Scenario 3: Wallet Bonus
Goal: Add $10 credit to customer's wallet
Setup:
- Code: BONUS10
- Type: Wallet Credit
- Discount: Fixed $10.00
- Uses per customer: 1
- Location: All Locations
Scenario 4: Premium E-Bike Promotion
Goal: 15% off premium e-bike rides only
Setup:
- Code: EBIKE15
- Type: Ride Discount
- Discount: 15%
- Vehicle Types: Premium E-Bike model ID
- Uses per customer: Unlimited
- Valid: 30 days
Scenario 5: Minimum Spend Promotion
Goal: $3 off rides over $12
Setup:
- Code: SAVE3
- Type: Ride Discount
- Discount: Fixed $3.00
- Minimum Ride Amount: $12.00
- Uses per customer: Unlimited
Best Practices
Code Design
- Keep codes simple - Easy to remember and type
- Use meaningful prefixes - SUMMER_, LAUNCH_, REF_ for organization
- Avoid confusion - Skip O/0, I/1/l characters
- Test before launch - Verify codes work in your test environment
Discount Strategy
- Start conservative - Begin with smaller discounts and increase if needed
- Set maximum caps - Protect against unexpectedly large discounts
- Use minimum spends - Encourage larger rides while offering value
- Track performance - Monitor usage to measure campaign effectiveness
Usage Limits
- Always set per-customer limits - Prevent abuse
- Consider total caps - Budget-friendly campaigns
- Plan for fraud - Watch for unusual patterns
Timing
- Schedule in advance - Set valid_from for future campaigns
- Use expiration dates - Create urgency and prevent stale codes
- Allow buffer - Start codes slightly early for testing
Technical Reference
Database Table: promo_codes
| Column | Type | Description |
|---|---|---|
id | UUID | Unique identifier |
code | Text | The promo code (uppercase) |
description | Text | Internal description |
discount_type | Enum | 'percentage' or 'fixed' |
discount_value | Decimal | Discount amount |
max_uses | Integer | Global usage limit (null = unlimited) |
max_uses_per_customer | Integer | Per-customer limit (default 1) |
uses_count | Integer | Current global usage count |
valid_from | Timestamp | Start of validity period |
valid_until | Timestamp | End of validity (null = no expiry) |
is_active | Boolean | Whether code is enabled |
subaccount_id | UUID | Location restriction (null = all) |
vehicle_types | UUID[] | Vehicle model restrictions (null = all) |
min_ride_amount | Decimal | Minimum subtotal in dollars |
max_discount_cents | Integer | Maximum discount cap in cents |
applicable_to | Enum | 'ride', 'wallet', or 'subscription' |
Database Table: customer_promo_uses
Tracks individual customer usage of promo codes.
| Column | Type | Description |
|---|---|---|
id | UUID | Unique identifier |
customer_uuid | UUID | Reference to customer |
promo_code_id | UUID | Reference to promo code |
ride_uuid | UUID | Reference to ride |
used_at | Timestamp | When the code was used |
Troubleshooting
Code Not Working
- Check active status - Ensure
is_activeis true - Verify dates - Current time must be between valid_from and valid_until
- Check limits - Verify global and per-customer limits aren't reached
- Check location - If scoped, ensure ride is at the correct subaccount
- Check minimum - Ensure subtotal meets minimum ride amount
- Check application type - Ensure code type matches usage context
Discount Amount Incorrect
- Check discount type - Percentage vs fixed calculation differs
- Verify max cap - Percentage discounts may be capped
- Check subtotal - Discount can't exceed the subtotal amount
- Review billing order - Promo applies after other discounts
Customer Says Code Was Already Used
- Check
customer_promo_usesfor their usage records - Verify
max_uses_per_customersetting - Look for multiple ride records with the same promo
Usage Count Seems Wrong
uses_countis incremented each time the code is applied- Check
customer_promo_usesfor the actual usage records - The count may differ if there were failed transactions
Promo Codes Ready
With promo codes configured, you can run effective marketing campaigns, reward loyal customers, and attract new riders. Monitor usage metrics to optimize your promotional strategy.