Booking
The part worth understanding here is that two kinds of data live in two different places. “This time is taken” goes on a public board — anyone you send the link to can see straight away which slots are greyed out — and that record holds nothing but a date and a time. “Who booked it and their number” takes the other route: anyone can drop something in, but only the owner of this app can read it back. Writing names and numbers onto the public board would run perfectly well; it would just mean pinning your customers' phone numbers to the wall.
The second thing is the slots. They aren't a fixed grid — pick “Colour, 150 min” and every slot becomes a 150-minute block (they still start every 30 minutes, they just run longer, so fewer of them fit in the day), and whether one can be booked comes down to a single line of interval arithmetic, a.start < b.end && b.start < a.end. With that, a 2:00 pm colour blocks a 2:30 pm trim by itself, and nothing has to enumerate combinations.