๐Ÿ— KeyzHub
19Keys ยท community archive
3626 bytes raw
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# Booking Page โ€” "Request a Key"

**Requirements:** just a browser and a text editor to preview/edit; a local static server, Supabase project, and Stripe account are optional and only needed to make the form actually submit and take payment โ€” full walkthrough in [SETUP.md](SETUP.md).

A single-file, Cameo-style video-request booking page. Black-and-gold, mobile-first,
built with a Chivo Mono / Space Mono / Doto type system. Visitors pick a request type,
fill in details, add optional upgrades, and submit โ€” the page is wired to POST straight
to a Supabase table and kick off a Stripe checkout via a Supabase Edge Function.

## What's in the box

- `index.html` โ€” the entire page. No build step, no framework, no dependencies beyond
  two external services you plug in yourself:
  - Google Fonts (Chivo Mono, Space Mono, Doto) loaded via `<link>` tags
  - A Supabase REST endpoint + Edge Functions for submitting the booking and creating
    a Stripe Checkout session
- Optional analytics hook for PostHog (disabled by default โ€” see below)

The page includes:
- A profile header, sample-clip strip, scarcity/social-proof line, and a live-activity
  ticker (the ticker text is hardcoded sample copy โ€” replace it)
- A 6-option request-type picker that expands into a details form
- Two optional add-ons (priced) and a running total
- Client-side form validation
- Three end states: request-submitted fallback, payment-success, payment-cancelled

## Quickstart

1. Open `index.html` in a browser. It renders and is fully interactive with no backend โ€”
   form submission will fail gracefully until you connect the pieces below.
2. Swap the copy: business name, request types (`#choices`), prices (`data-price`,
   `BASE_PRICE` in the script), reviews, footer contact link.
3. Swap the images: the `<img>` tags point at `images/...` paths that are not included
   in this template (personal photos were intentionally left out). Drop in your own and
   update the `src` attributes.
4. Wire up submission (optional โ€” the form works as a static page without this):
   - Create a Supabase project with a `bookings` table matching the `payload` object in
     the submit handler (`id`, `service`, `name`, `email`, `phone`, `instagram`,
     `duration`, `preferred_date`, `preferred_time`, `location`, `offer_amount`,
     `details`, `status`).
   - Replace `YOUR_PROJECT_REF` and `YOUR_SUPABASE_ANON_KEY` (both marked
     `keyzhub-allow` in the file) with your real project ref and anon key. There are
     three places: the CSP `<meta>` tag near the top, and `SUPABASE_URL` /
     `SUPABASE_KEY` / `FUNCTIONS_BASE` in the script near the bottom.
   - Write two Supabase Edge Functions the page already calls:
     - `booking-email` โ€” fire-and-forget notification on new booking
     - `create-checkout` โ€” creates a Stripe Checkout Session and returns
       `{ checkout_url }`
   - On successful Stripe checkout, redirect back to this page with
     `?payment=success&booking_id=...` (or `?payment=cancelled&booking_id=...`) โ€” the
     page already handles both query params on load.
5. (Optional) Analytics: the page has a no-op PostHog snippet. It stays inert until you
   replace `__POSTHOG_KEY__` with a real `phc_...` project key.
6. Deploy anywhere that serves static files โ€” Vercel, Netlify, GitHub Pages, S3, etc.
   There's nothing to build.

## Make it your own

This is a template, not a live integration โ€” nothing will submit successfully until you
connect your own Supabase project and Edge Functions. Everything else (copy, prices,
request types, images, contact links) is yours to replace.