Skip to main content

Favourite Services

Customers can “heart” services to mark them as favourites. Favourited services appear first in the booking dialog (Step 3) on subsequent bookings, reducing friction for repeat customers.
In plain terms: a customer taps a heart on the services they book most often, and those services jump to a “Your Favourites” section at the top next time — so a regular can re-book their usual two or three services in seconds.

Problem

Repeat customers at Royal Glow typically book the same 2–4 services every visit. Currently, they must scroll through all services each time. This adds unnecessary friction to the booking flow.

Solution

Add a heart icon on every service card. Tapping toggles the favourite state. On subsequent bookings, favourited services are shown in a “Your Favourites” section above the regular service list in Step 3 of the booking dialog.

Database Schema

Design decisions:
  • Composite primary key prevents duplicate favourites
  • CASCADE delete: if user or service is deleted, favourites are cleaned up
  • created_at allows future sorting by “most recently favourited”
  • No limit on favourites — with 20–40 services, no practical reason to limit
The columns at a glance:

API Endpoints

GET /api/favourites — list the signed-in user’s favourites.
  • Auth: Required (customer+)
  • Response: { success: true, data: { favourites: string[] } } (array of service IDs)

UI Implementation

Heart Icon Component

Booking Dialog Step 3 — Service Ordering

Data Flow

Edge Cases

Accessibility

  • aria-label="Add to favourites" / "Remove from favourites" on the heart button
  • aria-pressed="true/false" for toggle state
  • Keyboard: Enter/Space toggles
  • Visible focus ring on tab navigation
  • Colour is not the only indicator (filled vs outline shape)

Analytics Events

Where It Appears

Implementation Priority

  • DB table + migration
  • 3 API endpoints (GET, POST, DELETE)
  • Heart icon on booking dialog Step 3
  • “Your Favourites” section ordering in booking
Last modified on June 29, 2026