Ride

95octane's primary feature is to let users to plan their Ride and then also provide them with nagivation & intercom feature (voice chat)

Overview

Only subscribers can create rides. Free users can inherit a ride via Transfer Ownership if they have at least one free quota slot remaining, but they cannot create new rides. See Access Policy.

Ride Types

Rides are classified by how they can be discovered:

  • A private ride is accessible only via a shared link. The creator shares the link through external channels (WhatsApp, social media, etc.). Anyone with the link can RSVP. RSVP approval is configurable but off by default. The link contains an invite code as a query parameter. The creator or an admin can rotate the invite code at any time, which automatically revokes the old link. See Rotate Invite Link.

  • A public ride appears in the app's Discovery section for all authenticated users in proximity. RSVP approval is configurable and on by default.

Ride Status

A ride moves through the following statuses during its lifetime:

  • draft — the ride is saved but not yet published. Visible only to the creator. A draft can be incomplete — the creator fills in details over multiple sessions and publishes when ready. All creation-time validations (future start, scheduling horizon, required fields) run at publish time, not at save time. If the ride's end time passes while still a draft, the draft is auto-deleted and cannot be published. A draft can be deleted by the creator at any time before publishing.
  • upcoming — the ride has been published and its scheduled start time is in the future. Publishing is an explicit action separate from saving the draft.
  • on-going — set when the first participant starts the ride (up to 2 hours before the scheduled start time), or automatically when the scheduled start time arrives if no participant has started it yet. This transition fires regardless of how many yes participants exist — a ride with zero willing participants still becomes on-going at its scheduled start time. A ride can therefore be on-going while its original scheduled start time is still in the future (when a participant starts early).
  • completed — set when the ride's scheduled end time has passed. Every ride passes through on-going before reaching completed — the auto-transition to on-going at the scheduled start time ensures this even if no participant ever manually taps Start.
  • deleted — set when the creator soft-deletes a ride. All deletes are soft-deletes: the ride document remains in Firestore until the archival process runs at midnight and moves it to Cloud Storage. The ride is immediately hidden from all participants and discovery surfaces on deletion. Deleted rides can be recovered (undeleted) before the midnight archival runs — see Undelete a Ride.

Only upcoming and on-going rides are discoverable. Completed and deleted rides are accessible only through Ride History (deleted rides visible to the creator only).

Ride Cap

There are two independent ride caps. A ride creation fails if either would be exceeded.

Per-subscriber cap: A subscriber can own at most 4 active rides at any time, across all their owned rides — group rides and standalone rides combined.

Per-group cap: A group can have at most 4 active rides at any time, regardless of which member created them.

An active ride is any ride in draft, upcoming, or on-going status. Both caps count only active rides, not completed rides.

  • Both caps are enforced at creation time. A new ride is blocked if the subscriber already owns 4 active rides, or if the group already has 4 active rides — whichever limit is hit first. Group ride creation must pass both caps. Standalone rides (private or public, not inside any group) face only the per-subscriber cap.
  • The per-subscriber cap covers the creator's own portfolio across all contexts. The per-group cap governs the group's shared calendar regardless of who within the group owns each ride.
  • Neither cap applies to rides a user joins as a participant — only to rides they create (own).
  • completed rides do not count toward either cap.
  • deleted rides do not count toward either cap. Soft-deleting a published ride frees the cap slot immediately on deletion, not at archival.
  • When ownership of a ride transfers, the slot moves from the old owner's cap to the new owner's cap at the moment the transfer is accepted.

When a subscriber's subscription lapses, all pending rides they own continue normally — they are not cancelled, hidden, or restricted. Existing participants retain full Premium access for rides RSVPed during the active subscription. Both caps mean at most 4 active rides can be in flight per owner and per group, which is acceptable given subscriptions are yearly. See Subscription for the full expiry behaviour.

Group Rides

A ride created within a group has two visibility modes:

  • Private (default) — visible only to group members in the Group section. Non-members cannot access or preview the ride on the app, even if they receive a share link. A link shared externally provides only a website/OG preview with no in-app access or RSVP for non-members.
  • Public — also appears in the Discovery section for all users and behaves like a standard public ride. Non-members can discover, preview, and RSVP.

Visibility can be switched between private and public while the ride is upcoming or on-going. See Edit a Ride. Switching a public group ride to private immediately disables discovery and blocks new RSVPs from non-members; existing RSVPs (approved and pending) are honored. Switching from private to public makes the ride discoverable immediately. No notification is sent to participants when visibility changes.

The group owner is automatically granted admin status on every group ride, regardless of who created it. The ride creator can demote or remove the group owner from the ride like any other admin. However, demotion or removal does not affect the group owner's ability to detach the ride from the group — that power belongs to the group owner role and cannot be revoked by the ride creator. See Manage Admins and Detach a Ride from a Group.

Settings

These settings apply to all ride types — private, public, and group rides.

  • Require RSVP Approval — boolean, controls whether RSVPs must be approved before a rider joins. Only creator and admin can approve RSVPs. Default is off for private rides (standalone and private group rides) and on for public rides (standalone and public group rides). This rule applies uniformly — group rides follow the same default as their visibility setting.

  • Maximum number of Riders — the maximum number of riders that can actively attend a ride. Optional. Defaults to 50. Maximum allowed value is 100 (operator-configurable via Global Settings). The creator does not consume a maxRiders slot — the cap applies only to other participants. yes, maybe, and pending RSVPs all consume a slot. no RSVPs do not consume a slot and are not capped. Once the limit is reached, no further yes, maybe, or pending RSVPs are accepted. Set to 0 for no limit.

Ride Discovery

Discovery is how a rider finds rides they have not been explicitly invited to. Only upcoming and on-going rides are discoverable.

Discovery Surface by Ride Type

Ride type Discovery section Group section Direct link Creator only
Draft (any type)
Public (non-group) All authenticated users Optional (convenience)
Private (non-group) Link recipients only
Group ride (private) All group members Website/OG preview only (no app)
Group ride (public) All authenticated users All group members Optional (convenience)

Link sharing on a public ride is a convenience feature — it does not restrict discoverability. The ride remains visible in the Discovery section; the link simply gives the creator and admins a quick way to share it directly rather than asking riders to find it themselves.

For private group rides, any link shared externally provides only a website/OG-level preview. Non-members cannot view the ride or RSVP on the app.

Public Ride Proximity

Public rides appear in Discovery for authenticated users whose city matches the city of the ride's origin. A rider's city is determined by their current device location if available, falling back to the city set in their profile. Profile city is mandatory during onboarding, so every user always has at least a profile city. A match on either source is sufficient. Filtering and search within Discovery are not available yet.

Results are returned as a paginated feed.

What a Rider Sees Before RSVPing

A rider can view the following details for any discovered ride before committing to an RSVP:

  • Title and description
  • Start and end date/time
  • Route on the map (origin, destination, breakpoints)
  • Creator's name and photo
  • Riding Buddies in the ride, with their names and RSVP status (yes / maybe / pending)
  • Count of non-buddy participants by RSVP status (yes / maybe)

The full participant list is visible only after the rider RSVPs.

Access Rules

  • draft rides are visible only to their creator. They do not appear in any discovery surface for other riders.
  • A rider who follows a private ride link can view a preview of the ride details (title, date, route on map, creator info) and RSVP from that view. Once RSVPed and approved (if approval is required), full access is granted.
  • Private group rides are not accessible to non-members on the app through any surface. A link shared by the creator provides only a website/OG preview for non-members — they cannot RSVP or view the ride on the app. Non-members can only access a group ride if it is switched to public.
  • Subscription type does not gate discovery or RSVPing. Any user can RSVP regardless of subscription or quota state. Tier gates apply at Start time — see Start a Ride and Access Policy.

Planned — not yet live: The Discovery section, public ride proximity feed, and group ride visibility in Discovery are not yet built. Only private ride access via shared link is partially implemented.

Components of a Ride

Ride Location Types

A ride can have the following location types, called as Breakpoints or Waypoints:

  • origin - the starting point of the ride. MUST be 1 per ride.
  • destination - the ending point of the ride. MUST be 1 per ride.
  • additionalDestination - any additional destination in between the origin and destination. Optional and can be used by riders who want to have multiple stops during the ride. There can be multiple additional destinations in a ride.
  • meetingPoint - a point where riders can meet before starting the ride. This is optional and can be used by riders who want to meet at a common point before starting the ride. There can be multiple meeting points in a ride.
  • haltPoint - a point where riders can take a break during the ride. This is optional and can be used by riders who want to take a break during the ride. There can be multiple halt points in a ride.
  • restaurant - a point where riders can eat during the ride. This is optional and can be used by riders who want to eat during the ride. There can be multiple restaurants in a ride.
  • fuelStation - a point where riders can refuel during the ride. This is optional and can be used by riders who want to refuel during the ride. There can be multiple fuel stations in a ride.
  • other - any other point that doesn't fall into the above categories. This is optional and can be used by riders who want to add any other point during the ride. There can be multiple other points in a ride.

Ride Participants

These are riders who have RSVP'd to the ride. They can be in one of the following statuses:

  • yes: the rider has RSVP'd to the ride and is planning to attend. They will have access to the navigation and intercom features of the app for that ride.
  • no: the rider has RSVP'd to the ride but is not planning to attend.
  • maybe: the rider has RSVP'd to the ride but is unsure if they will attend. If this rider starts this ride, the status is automatically updated to yes.

Other properties of a ride participant include:

  • id: the unique identifier of the rider.
  • name: the name of the rider.
  • photoUrl: the avatar of the rider.
  • joiningLocationId: the id of the location (breakpoint) where the rider is joining the ride. This is a required field to indicate the rider's starting point. For the creator, this defaults to the ride's origin.
  • status: the RSVP status of the rider, which can be as mentioned above. This is a required field to indicate the rider's intention to attend the ride.

The ride creator is automatically added as a yes participant when the ride is created. Their joining location defaults to the ride's origin. The creator cannot remove themselves or change their RSVP status to no without transferring ownership first.

Ride Location

A location is a point on the map that is associated with a ride. It can be the origin, destination, or any of the breakpoints mentioned above. Each location has the following properties:

  • id: the unique identifier of the location.
  • latitude: the latitude of the location.
  • longitude: the longitude of the location.
  • title: the name of the location.
  • placeId: the place id of the location provided by Google Places API. This is an optional field.
  • type: the type of the location, which can be one of the types mentioned above.

See Ride Schema for the Firestore document structure.

Actions

Known Gaps (Post-Launch)

  • RSVP abuse — a user can repeatedly toggle yes/no to hold and free maxRiders slots, or fill an approval queue with pending RSVPs that are never reviewed, squatting on capacity. No rate limiting or pending-expiry mitigation is in scope for launch.

Wishlist (Post-Launch)

  • Ride Moderation / Ban — operators banning rides, criteria, effects on the ride and its participants, and the associated "Ride banned" system notification. Not scoped for launch; to be detailed separately.

Ride Deletion Policy

All ride deletions are soft-deletes. The status is set to deleted and the ride document remains in Firestore until the archival process runs at midnight and moves it to Cloud Storage. A deleted ride can be recovered before that archival — see Undelete a Ride.

  • Only the ride creator can delete a ride. A DELETE confirmation is required to prevent accidental deletions.
  • Draft, upcoming, and on-going rides can be deleted. Deleting an on-going ride requires the creator to be a subscriber — a free-user creator (one who inherited the ride via transfer) cannot delete an on-going ride.
  • When a published ride is deleted, all RSVP'd participants are notified immediately. Draft rides have no participants, so no notification is sent.
  • The ride is immediately hidden from all participants and discovery surfaces on deletion.

For group rides, the group owner can detach the ride from the group. Detaching removes the ride from the group's discovery feed and makes it an independent ride. Its public or private visibility status is unchanged — a public group ride stays public after detaching. See Detach a Ride from a Group.