UpsideThink is Suzanne Madsen's PSYCH-K® practice in Vancouver. We designed and built the whole thing: a calm, editorial website, a booking system that takes payment and makes the video call, and a private Studio where she runs the practice herself — prices, hours, sessions, writing — without ever calling a developer.
01 — At a glance
| Client | Suzanne Madsen — certified PSYCH-K® facilitator |
|---|---|
| Where | Vancouver, BC, and online |
| What we built | Website, booking and payments, multi-session packages, owner Studio, blog |
| Stack | Next.js, Firebase (Firestore, Auth, Hosting), Stripe, Zoom |
02 — The brief
PSYCH-K® is a process for changing subconscious beliefs, and most people arrive at it curious and a little sceptical. The site had two jobs. First, explain the method plainly — what it is, and just as clearly what it isn't — so a stranger can trust it. Second, turn that trust into a booked, paid session in as few steps as possible.
Behind that sat a harder constraint. Suzanne isn't technical, and she wanted to run everything herself. So the rule for every decision became:
Nothing that matters should need a developer, and nothing she types should be able to break the site.
03 — Booking in four steps

Pick a session, pick a day, pick a time, add your details, pay. Everything is shown in Pacific Time and priced in Canadian dollars. The moment Stripe confirms the payment, the booking is written, the slot closes, and online sessions get their own Zoom meeting.
- One source of truth for availability. The calendar, checkout and both reschedule paths all ask the same question — "can this be booked?" — so a time can never be offered in one place and refused in another.
- Prices are set on the server. Checkout prices from Suzanne's saved catalogue, never from the browser, so a tampered page can't change what's charged.
- Two people, one slot. If someone takes a time while another client is still paying for it, the second payment is refunded automatically and the booking is recorded as cancelled — nobody is double-booked and nobody is charged for nothing.
- Self-serve changes. Every booking comes with a private link to move or cancel it inside the notice window Suzanne sets.
04 — Packages that stay simple

Three-session packages are a single payment, not three bookings. The client picks their first date at checkout and books the other two whenever suits them, from a link. Under the hood a package is a set of credits, claimed one at a time, so a double-click or a slow connection can never spend two. Earnings count the package once, not three times.
05 — The Studio
Suzanne's admin lives at /admin, and it's written in her words, not ours: "How much notice to cancel", not a settings key. Eight tabs cover the whole practice:
- Bookings and My availability — the calendar, her weekly hours and the days she's away.
- Earnings and Clients — who came, what they paid, what's coming up.
- Website — every headline, paragraph, price and session on the public site.
- Writing — the blog. Messages — the contact form. Settings — time zone, notice periods and connected services.
Adding a new session is one row in the Studio, and it's bookable on the live site as soon as she saves. Each session keeps a permanent id however she renames or reorders it, so old bookings and earnings always point at the right thing.
06 — A calm design

The visual language is quiet on purpose. Warm paper and ink, sage and copper accents, Cormorant Garamond headlines over Archivo for the reading text. No rounded corners, no shadows — just 2px rules and generous space, so the page feels closer to a well-set book than a wellness template. The accent colours are only used at sizes where they pass contrast, so small text stays readable.

07 — Built to stay up
- It never renders blank. Every word Suzanne edits falls back to the designed copy if the database is unreachable. We tested it by cutting the database off: every page still loaded, with content.
- Tested where the money is. Bookings, refunds, packages and reschedules were tested against a real database emulator, not mocks, because that's where these bugs actually happen.
- Payments are safe to retry. Stripe can send the same payment event more than once; it can never create two bookings.
- Automatic deploys. Every change ships through one pipeline that publishes the site, the database rules and the indexes together, so they can't drift apart.
The result is a practice that runs itself. Suzanne writes, sets her hours and changes her prices; clients find a time, pay and get their link — and none of it needs us.
