Admin CMS guide — running your site

This is your practical, day-to-day guide to the admin dashboard — the private control room behind your public website. It lives at:

https://<slug>.wahylabs.com/admin

where <slug> is your business's subdomain (for the Lasheyeisland studio, that's https://lasheyeisland.wahylabs.com/admin). Everything your visitors don't see — your bookings, gallery, prices, journal posts, WhatsApp chats, and account settings — is managed from here.

You don't need to be technical to use it. This guide walks through each section: what it's for, how to use it step by step, and what you'll see the very first time (before you've added anything). Engineers will find the route and source-file for every surface cited inline.

New here? Before your first content edit, take the built-in guided tour — it pops up automatically the first time you sign in, and you can relaunch it any time from the "Take a tour" button in the header (see The guided tour).


Contents


Signing in

Go to https://<slug>.wahylabs.com/admin/login (the source is app/admin/login/page.tsx). You have two ways in — pick whichever you prefer:

  1. Continue with Google — one click, sign in with the Google account you use for the business.
  2. Email me a sign-in link — type your email, press the button, and open the secure "magic link" we email you. Open the link on the same device you're signing in on; it expires shortly, so use it soon.

Either way, after signing in you land on your Dashboard.

Only authorized people get in. Only a member of your business (with an admin or owner role) can sign in to your admin — the login gate checks membership before it even sends the magic-link email, and again when the session is created (lib/auth/authorize-signin.ts). If an account isn't authorized, you'll see "That account isn't authorized for admin access." That's expected and keeps your studio's data private.

Forgot which email? For anti-snooping reasons, the "check your email" confirmation looks identical whether or not the address is authorized — so nobody can fish for who has access. Use the email tied to your business account.


How your plan shapes what you see

Your admin is made of sections — Bookings, Gallery, Journal, Messages, and so on. Some are always available; others are unlocked by your plan. The registry that defines them is lib/modules/registry.ts.

  • Always-on (every plan): Availability, Settings, and Billing. These are core to running any site, so they never disappear.
  • Plan-unlocked (billable modules): Bookings, the Website bundle (Gallery, FAQs, Services, and the Studio editor), Journal, and CRM (Contacts, Messages).

If your plan doesn't include a section, it simply isn't shown in your menu, and you can't make changes there — the sections and their actions are gated to your plan. Most plan-locked sections also block direct access to their web address (the gate is requireModule(...) in lib/entitlements/route-guard.ts), and every save is separately checked with assertEntitled(...), so nothing can be edited outside your plan even if a page is reachable. To add a section, upgrade from Change plan. Superadmins (the Wahy team, when helping you) always see everything.

Think of it simply: your plan unlocks the sections you need, and hides the rest so your dashboard stays tidy.


When editing is temporarily locked

Your admin stays fully usable while your subscription is healthy. If a payment lapses and your account goes past-due, editing is temporarily put into read-only mode: you can still view everything and still export your data, but saving changes is paused until payment is sorted (lib/lifecycle/read-only.ts). You'll see a status banner on your Dashboard and Billing pages counting down the grace period.

  • Past-due → look-but-don't-save. Sort out payment from Billing and editing unlocks again.
  • Suspended → the public site goes offline entirely until reactivated. (This only happens after the past-due grace period ends.)

This is a friendly guard rail — your data is never touched, it's just paused. Exporting your data is deliberately always allowed, even when past-due (app/admin/(panel)/settings/export/route.ts).


The guided tour

The admin ships with a short click-through tour that highlights the main areas of your dashboard. It's powered by components/admin/onboarding/TourProvider.tsx:

  • It starts automatically the first time you sign in, once, then remembers it's done (so it never nags you again).
  • You can relaunch it any time from the "Take a tour" button in the admin header.
  • The Studio editor has its own mini-tour the first time you open it.

If you ever feel lost, the tour is the fastest way to re-orient.


The surfaces at a glance

Section Web address (under https://<slug>.wahylabs.com) What it's for Unlocked by
Dashboard /admin Your home screen + quick actions Always on
Bookings /admin/bookings See & manage appointments Bookings plan
Availability /admin/availability Set your bookable hours & days Always on
Gallery /admin/gallery Your portfolio photos Website plan
FAQs /admin/faqs Questions & answers on your site Website plan
Services & prices /admin/services Your service menu & pricing Website plan
Journal /admin/journal Blog / news posts Journal plan
Studio editor /admin/editor Visually edit your site pages Website plan
Contacts /admin/contacts Your customer address book CRM plan
Messages /admin/messages Two-way WhatsApp inbox CRM plan
Settings /admin/settings Business, branding, messaging, integrations, account Always on
Billing /admin/billing Your plan, price & payments Always on
Change plan /admin/billing/change-plan Upgrade or downgrade Always on

On your phone: the most-used sections sit in the bottom navigation bar. The rest live in More, the 5th tab — tap it for a full-screen list of every section, including the four already in the bar. This keeps the bar itself uncluttered while giving everything else one predictable home.

Dark mode: the sidebar (desktop) and the More sheet (mobile) both carry a Light mode / Dark mode toggle near the bottom. It's a display preference only — it never affects who can sign in or what you can edit — and it's remembered the next time you open the admin.


Dashboard

Web address: https://<slug>.wahylabs.com/admin · Source: app/admin/(panel)/page.tsx

Your home screen. It greets you by name and shows four at-a-glance counts — Gallery Images, Published Posts, FAQs, and Draft Posts — so you can see the shape of your site at a glance. Below that is a Quick Actions row with one-tap shortcuts:

  • Add Gallery Photo → jumps to Gallery
  • Write New Post → jumps to a fresh Journal post
  • Add FAQ → jumps to FAQs

If your account is on a trial or past-due, a status banner appears here with the countdown.

First time (empty state): the counts simply read 0 until you start adding content — a gentle nudge to use the Quick Actions.


Bookings

Web address: https://<slug>.wahylabs.com/admin/bookings · Source: app/admin/(panel)/bookings/page.tsx · Unlocked by: the Bookings plan.

Where every appointment your customers make shows up, split into upcoming and past. Use it to review who's booked, when, and for what — and to cancel or reschedule an appointment when plans change (each booking card has those actions; rescheduling lets you pick a new open slot).

First time (empty state): you'll see "No upcoming bookings." and "No past bookings." As soon as a customer books through your site (or your WhatsApp bot), it appears here automatically.

Bookings are created from your public site's booking flow and from the WhatsApp booking bot — you don't add them by hand here; you manage what comes in.


Availability

Web address: https://<slug>.wahylabs.com/admin/availability · Source: app/admin/(panel)/availability/page.tsx · Always on.

This is where you decide when customers can book you. It's a month calendar you can page through (you can also deep-link a specific month with ?month=YYYY-MM). Your booking rules come from your Settings and control things like:

  • Slot length (how long each appointment block is — e.g. 2 hours),
  • Day start / day end (your working window, e.g. 09:00–17:00),
  • Minimum notice (how far ahead someone must book),
  • How many days ahead bookings are allowed,
  • Days off (weekdays you're never available).

How to use it: page to the month you want, then open a day to see its time slots and toggle each one open or off, and save. (Slots already booked show as booked.) Customers only ever see and book the times you've opened here.

First time (empty state): the calendar shows your default working hours; adjust it to match your real schedule before you share your site.


Web address: https://<slug>.wahylabs.com/admin/gallery · Source: app/admin/(panel)/gallery/page.tsx · Unlocked by: the Website plan.

Your portfolio — the photos that show off your work on the public site. Upload images, give each a descriptive caption/alt text (this is required — it helps visitors and screen-readers, and it's good for search), and organize them by category (your category list is yours to rename — see Categories & Labels).

These same photos are also what your WhatsApp booking assistant can send when a customer asks to see a sample of your work (e.g. "what does hybrid look like?") — there's no separate photo library to maintain.

How to use it: open Gallery, add a photo, write a short description, pick a category, and save. Reorder or remove photos any time.

First time (empty state): an empty gallery with an invitation to add your first photo. Add a few of your best shots to make your site feel alive.


FAQs

Web address: https://<slug>.wahylabs.com/admin/faqs · Source: app/admin/(panel)/faqs/page.tsx · Unlocked by: the Website plan.

The questions and answers shown on your site — aftercare, what to expect, cancellation policy, and so on. Answering common questions here saves you repeating yourself in DMs.

How to use it: add a question, write its answer, save. Add as many as you like; reorder or edit them any time.

First time (empty state): an empty list prompting your first FAQ.


Services & prices

Web address: https://<slug>.wahylabs.com/admin/services · Source: app/admin/(panel)/services/page.tsx · Unlocked by: the Website plan.

Your service menu — each service, its description, and its price. This does double duty: it feeds the services/price list shown on your public site and the list of services a customer can choose when they book (both on your site and in the WhatsApp booking bot). You can group services by category (rename these under Categories & Labels).

How to use it: add a service, set its name, description and price, choose a category, save. Keep it current — this is what customers pick from when they book.

First time (empty state): an empty menu inviting your first service. Add your services before you share your booking link, so customers have something to choose.


Journal

Web address: https://<slug>.wahylabs.com/admin/journal · Sources: app/admin/(panel)/journal/page.tsx, app/admin/(panel)/journal/new/page.tsx, app/admin/(panel)/journal/[slug]/page.tsx · Unlocked by: the Journal plan (which also needs the Website plan).

Your blog / news section — behind-the-scenes stories, tips, promotions, anything you want to share.

How to use it:

  1. Open Journal to see all your posts (published and drafts).
  2. Tap New post (/admin/journal/new) to start writing. Give it a title and write your content in the rich editor (bold, links, images, and more).
  3. Save it as a draft while you work, then publish when it's ready.
  4. To edit an existing post, open it from the list (/admin/journal/<its-web-address>).

Your Dashboard counts split posts into Published and Draft so you always know what's live.

First time (empty state): an empty post list with a prompt to write your first post.


Studio — the visual site editor

Web address: https://<slug>.wahylabs.com/admin/editor · Source: app/admin/(panel)/editor/page.tsx · Unlocked by: the Website plan.

The Studio is a visual, what-you-see-is-what-you-get editor for your actual site pages — headlines, paragraphs, images, section order, even adding whole pages.

The easiest way in: while viewing your own live site (signed in), tap the floating "Edit site" button (bottom-left). It only appears for you — signed-in members of your business — and takes you straight into the Studio (components/site/EditSiteButton.tsx). Visitors never see it.

How it works:

  • The Studio is three panes: your page list, a live preview of the page, and a properties panel where you edit the selected block's text or swap its image.
  • Edits autosave to a private draft as you go — your live site isn't touched yet.
  • Reorder sections with the up/down chevrons, add or remove blocks from the Block Gallery, and add or remove pages (like About or Contact).
  • When you're happy, press Publish — that copies your draft over to the live site for everyone to see.
  • Made a mistake? Undo/redo is built in, and nothing goes public until you Publish.

The first time you open the Studio you get a short mini-tour of the three panes.

Your site keeps rendering exactly as before until you publish your first change — the Studio is entirely opt-in.


Contacts

Web address: https://<slug>.wahylabs.com/admin/contacts · Source: app/admin/(panel)/contacts/page.tsx · Unlocked by: the CRM plan.

Your customer address book. Every person who messages you on WhatsApp or makes a booking shows up here, de-duplicated by phone number, along with whether they've opted in to receiving messages from you.

How to use it: browse or search your contacts, open a contact to see their details, and use "Open conversation" to jump straight to your Messages thread with them.

First time (empty state): an empty address book — it fills up automatically as people message or book.


Messages — your WhatsApp inbox

Web address: https://<slug>.wahylabs.com/admin/messages · Source: app/admin/(panel)/messages/page.tsx · Unlocked by: the CRM plan.

A two-way WhatsApp inbox, right inside your admin. Conversations from customers land here (via your connected WhatsApp Business number), and you can reply without leaving the dashboard.

How to use it:

  • The left pane lists your conversations; pick one to read the full thread in the middle.
  • Within WhatsApp's 24-hour window (i.e. the customer messaged you recently), you get a free-text composer — just type and send.
  • Outside that window, WhatsApp requires an approved message template — the composer switches to a template picker so you stay compliant.
  • Delivery and read ticks show the status of each message you send.

Contacts can deep-link here (?conversation=<id>), so "Open conversation" from Contacts drops you into the right thread.

A deterministic booking bot can also handle common flows automatically (greeting → book a service → pick a time → confirm) and hand off to you when a human is needed. For the full picture of how WhatsApp is wired up, see whatsapp-integration.md.

First time (empty state): an empty inbox — conversations appear as customers message your number. (You connect your WhatsApp number under Settings → Messaging.)

Your WhatsApp booking bot can also send sample photos from your Gallery when a customer asks to see your work — there's no separate photo library to manage.


Settings

Web address: https://<slug>.wahylabs.com/admin/settings · Always on.

Your business control panel. It's a tab strip (app/admin/(panel)/settings/layout.tsx + components/admin/SettingsTabs.tsx) — each tab below is its own web address, so you can link or bookmark straight to one, and on a phone the tabs wrap onto as many rows as they need instead of hiding off-screen:

  • Business (/admin/settings, source app/admin/(panel)/settings/page.tsx) — your business name, contact details, and the scheduling rules that drive Availability (slot length, working hours, notice, days off).
  • Branding & Theme (/admin/settings/branding, source app/admin/(panel)/settings/branding/page.tsx) — pick from the offered site themes with the theme switcher (this changes your public site's look).
  • Messaging (/admin/settings/messaging, source app/admin/(panel)/settings/messaging/page.tsx) — connect your WhatsApp number, turn the assistant on/off, and customize what your booking bot says and its tone. (Requires the CRM plan.)
  • Categories & Labels (/admin/settings/categories, source app/admin/(panel)/settings/categories/page.tsx) — rename your gallery / service / journal categories, your menu labels, and your booking wording to fit your business. (Requires the Website plan.)
  • Integrations (/admin/settings/integrations, source app/admin/(panel)/settings/integrations/page.tsx) — connect your Google Calendar so bookings sync (the connect card shows your status). Your WhatsApp connection lives on the Messaging tab above, not here.
  • Account (/admin/settings/account, source app/admin/(panel)/settings/account/page.tsx) — deliberately its own tab, away from the routine tabs above:
    • Export my data (JSON) — downloads a copy of your business data (bookings, contacts, messages, content, settings) as a file (app/admin/(panel)/settings/export/route.ts). This is always available, even when past-due.
    • Delete account — the owner-only danger zone for closing your account.

How to use it: start on Business (details + booking rules), then work across the tabs in whichever order matches what you're setting up — pick a theme on Branding & Theme, connect WhatsApp on Messaging, rename categories/labels to match how you talk about your work, connect Calendar on Integrations if you use it, and export or close your account from Account when you need to.

⚠️ If you edit a field on Business and tap another tab before saving, you'll be asked to confirm before the edit is discarded — save (or discard on purpose) first if you want to keep it.


Billing

Web address: https://<slug>.wahylabs.com/admin/billing · Source: app/admin/(panel)/billing/page.tsx · Always on.

Everything about your plan and payments. It shows your current package, the sections it includes, your price (monthly and yearly), your subscription status, and — if you have credit — your wallet balance.

How to pay (M-Pesa): tap "Pay with M-Pesa" and follow the STK Push prompt on your phone to confirm. The screen updates as your payment is confirmed. If a check momentarily hiccups, it will not show a false failure or double-charge you — it waits for the real result.

First time / trial: during a trial you'll see the days remaining; if a payment lapses you'll see the past-due grace countdown (and editing is temporarily locked until you pay).

On mobile, Billing isn't one of the bottom bar's 4 primary tabs — tap More to reach it.


Change plan

Web address: https://<slug>.wahylabs.com/admin/billing/change-plan · Source: app/admin/(panel)/billing/change-plan/page.tsx · Always on (available once your subscription is active).

Where you upgrade or downgrade your plan. It lists every available package with its price, and shows a preview of exactly what a switch costs (a proration figure) against your current subscription — no surprises.

  • Upgrades are confirmed with a payment (you pay the prorated difference for the rest of your period).
  • Downgrades and lateral moves apply immediately and any unused value is returned to your wallet as credit.
  • The Monthly / Yearly toggle lets you compare, but a plan change keeps you on the interval you're already billed on.

Note: plan changes are available once your subscription is active — if you're still on a trial or not yet active, the page points you back to Billing to get started first.


Frequently asked questions

A section I expected is missing from my menu. It's almost certainly not part of your current plan. Plans unlock sections (see How your plan shapes what you see); add it from Change plan.

I can view but can't save anything. Your account is likely past-due and in read-only mode. Sort out payment on Billing and editing unlocks again — your data is untouched (details).

My magic-link says the account isn't authorized. Only members of your business can sign in. Use the email tied to your business account, or ask your owner to add you.

I published a site change and want to undo it. Re-open the Studio, fix the block, and Publish again — the editor keeps undo/redo while you work.

Where do bookings and contacts come from? They flow in automatically from your public site's booking flow and your WhatsApp number — you manage them here rather than adding them by hand.