Create the first operator (this one will be the admin).
Sign in
Choose your name and enter your PIN.
or
C
Txt
—
💬
Select a conversation, or start a new message.
#
—
0 chars · 1 SMS
C
Leads
📂 Open Leads (0)
C
Email
✉️
Select an email to read, or hit Compose.
C
To-Do
C
Calendar
📨
Messages
voice messages from website callers — transcribed for you
📄
NoIM due
🎩
Unallocated
Soon =ceremonies in the nextdays
🎁
Add-Ons Outstanding
Ceremonies that have already happened where an add-on's status is still something other than
Settled or Cancelled — most recent ceremony first.
🖊️
Witnesses
Soon =ceremonies in the nextdays
Bookings whose SCA - Witnesses - Add ONE (1) or Add TWO (2) add-on is still at a status other than
Rejected, Settled or Cancelled — so no real person has been booked to witness yet.
Allocate someone by adding their Witnessing - Name add-on in SCA, then reject the placeholder.
✍️
Blogs
an idea in — a Webflow draft and Instagram content out
1. The idea
2. Target search query the post is built to rank for — and be quoted for — this one question
3. Pictures
Locations are an image source only — they won't be named in the post or the caption unless the query is itself about where to marry. Every picture on each record is used, not just the lead photo. Up to 5 carry through to Webflow (Image_1–Image_5).
4. The output
Target query:
Body
Creating the draft never publishes anything. The item lands in MC_Blogs as an unpublished draft for you to review and publish by hand in Webflow.
Caption
👥
Contact
🧩
Widgets
tools built for the website — open them, or copy the embed code onto any page
A couple who clicks a Google Ads link only has gclid/UTM params in the URL of the exact page they land on — clicking through to any other page on the site (e.g. Home → Locations) loses them, which means every widget below goes blind the moment someone navigates before reaching it. This script fixes that: it captures gclid/UTM once, remembers it in the browser for 90 days (last-touch — a newer ad click overwrites an older one), and every widget snippet below automatically uses it as a fallback.
Paste this once in Webflow → Project Settings → Custom Code → Head Code (applies to every page — not a per-widget Embed element). Must be added before this will do anything; the widget snippets below already call it, they just need it to exist.
🧮
Quote
An instant ceremony-price calculator for couples — the same tool operators use internally. Already embedded on the live /quote page and inside the Location Search widget.
In Webflow, add an Embed / HTML Embed element wherever the quote form should appear, and paste this in:
🧭
Location Search (combined)
The combined view — Recommended locations, search by area, and an instant quote all in one — used on the live /our-location page. If you're updating that page's embed code in Webflow, replace it with this (it wasn't wired up to forward Ads/UTM attribution to the widget before today).
How to add it to the website
In Webflow, add an Embed / HTML Embed element wherever this should appear, and paste this in:
🏝️
All Locations
Every real, listed Standard & Custom Repeating location as a tile — photo, price, tags, Book Now — pulled live from SCA and sorted by each location's Display Order in Bubble.
In Webflow, add an Embed / HTML Embed element wherever the location tiles should appear, and paste this in:
Same snippet can go on as many pages as you like — it's the same live widget everywhere. Updates automatically every 6 hours; after adding or editing a location in Bubble, hit ↻ Refresh widgets on the Locations page to make it live straight away.
⭐
Recommended Locations
Just the "Recommended locations" carousel from the Quote App/Location Search page, on its own — your hand-picked shortlist, auto-sorted to show the region closest to each visitor (geofenced) in the order you set on Quote Pricing. No Category tags shown here, unlike the other widgets.
In Webflow, add an Embed / HTML Embed element wherever the carousel should appear, and paste this in:
Manage which locations appear (grouped by region, with an order number each) on the Quote Pricing admin page. Leave every region empty to hide the section entirely — the widget quietly shows nothing rather than an empty box.
💬
Ask Ange
A chat widget couples can type — or speak — a question into (pricing, the process, a specific location, add-ons like chairs or decorations). Answers are grounded only in real simpleceremonies.com.au content, always with a source link; if it can't answer confidently it asks a clarifying question or offers a team follow-up instead of guessing.
In Webflow, add an Embed / HTML Embed element wherever the chat should appear, and paste this in:
Site content is crawled and cached automatically (about once a day); use "Manage facts & conversations" to add extra pricing/process details, trigger an instant re-crawl, and see real questions couples have asked.
📎
PDF Merge
Combine several PDFs into one file, view it right there, optionally mark it up with typed notes or freehand drawing, then automatically compress it under 3MB and download — all in the browser, nothing uploaded anywhere.
In Webflow, add an Embed / HTML Embed element wherever the tool should appear, and paste this in:
Same snippet can go on as many pages as you like. Files never leave the visitor's browser — nothing is uploaded to SCA or stored anywhere.
🗣️
Certificate of Faithful Performance
For ceremonies using an interpreter. Explains what the form is and when each half is signed, looks the ceremony up from the couple's email and ceremony date, then fills in the real Commonwealth form (statutory declaration + Certificate of Faithful Performance, subsection 112(3) Marriage Act 1961), ready to sign on screen with a draw tool and save as HHMM_ddmmyy_Person1_and_Person2.pdf. All in the browser — nothing is uploaded or stored.
In Webflow, add an Embed / HTML Embed element wherever the tool should appear, and paste this in:
The couple's ceremony lookup uses the same email + ceremony date gate as Sign & Combine. The booked location is only ever filled in automatically for a signed-in POD operator — everyone else types it in.
🎓
Celebrant Enquiries
A form for celebrants interested in the mentoring program or in work opportunities with Simple Ceremonies — name, contact details, location, what they're interested in, and a bit about themselves (year registered, ceremonies performed, why they love the work).
In Webflow, add an Embed / HTML Embed element wherever the form should appear, and paste this in:
Submissions are saved straight to the POD — view, mark reviewed, or delete them from "View submissions (admin)" above.
🎉
Simple Ceremony Quiz
A fun 10-question "would a Simple Ceremony work for you?" quiz — couples tick Yes/I agree or No/I don't through 10 quick statements, pop in their names and email, then get a personalised result with a call to book. Submissions land as new leads (tagged "Simple Ceremony Quiz") in the regular Leads view.
In Webflow, add an Embed / HTML Embed element wherever the quiz should appear, and paste this in:
The 10 questions and their reassurance text are placeholders carried over from your Base44 quiz — send through any edits any time and we'll drop them straight in.
💒
Ceremonies
🗓
Availability
choose whose POD rings for webcalls, and when (Sydney time)
Tick = this operator's POD rings when a couple webcalls from the site. Untick for holidays.
Set the ring window for each day — leave a day blank for no calls that day.
Everyone starts on Mon–Fri 09:00–18:00 (Michael & Ange: every day).
📆 Cashflow — upcoming payouts · by ceremony date · celebrants & partners
Comma-separated, matches any part of the name.
Loading…
Detailed breakdown
Pick Breakdown or Chart to load the sale-by-sale detail — kept off by default so the page loads fast.
Date
Couple
Ceremony
Celebrant
Partner
Add-On
Gross $
Celebrant Fee $
Partner Fee $
Net $
Total
vs Budget
Insights — for the selected period
👤 Celebrants · by booking date
🤝 Partners · by booking date
📣 How did you hear about us? · by ceremony date
🌏 Where do our couples come from? · by ceremony date
🎂 Age of couples · by ceremony date
💍 Conjugal status · by ceremony date
📊 Other stats · by booking date
💸 Owed — paid for, not yet settled · all time · celebrants & partners
Figures come live from SCA (Bubble): every payment marked paid whose payment date falls in the period.
Ceremony = "Booking" payments. The celebrant's fee is the payment's Celebrant Fee + 50% of any Location Fee
(the other 50% stays in-house, in gross). If the fee was set with SCA's Modify button (✎ in the table —
spotted when it differs from that celebrant's default fee), that amount is the celebrant's final fee with no location split.
Add-Ons = "Addon" payments — the Partner's Referral fee % (from SCA → Partners) is SCA's cut, and the
Partner Fee shown is what the partner receives: the rest of the price (10% referral → partner gets 90%).
Net Profits = Total Gross − Celebrant Fees paid − Partner Fees paid.
Cashflow is forward-looking, by ceremony date, not payment date — since every ceremony & add-on is
paid in full when the booking is made, "upcoming" already means "will be owed". It excludes Settled/Cancelled
bookings and, by default, celebrants Michael & Ange Teulon and partner Simple C (edit the exclude fields above
to change that). If a couple has more than one upcoming booking, all of it is credited to their earliest one.
📊
Usage
Tracks calls this app makes to Google Cloud (Google Maps Platform: address autocomplete, place lookup, and drive-time
calculations used by the Quote and Location Search pages). The cost shown is an estimate — calls × the per-call
rate below — not a live pull from your actual Google Cloud bill. Correct the rates below if they don't match your
Cloud Console invoice.
Tracks calls this app makes to Cloudflare Workers AI — lead auto-fill, ✨ Text-ify, 🪄 Draft?, Location Search's
query understanding, call-transcript formatting, and Message Bank suggestions — plus the features on the
Anthropic API (Blogs, Locations content, marketing Analysis), which appear as their own Claude rows. Both are
billed per input/output token, at a different rate per model, so the cost below is tokens × the per-model
rates underneath — still an estimate, not a live pull from either invoice (correct the rates if they
don't match). Cloudflare also gives 10,000 free "Neurons" per day across all Workers AI use on the account, which
this estimate doesn't account for — a quiet day's real bill may be $0 even if a small cost shows here.
Web searches are the exception to per-token billing. When you generate the "Why have the ceremony at this
place" section on a location, Claude searches the web for that venue's real managing authority (the council,
Trust or park authority) and its booking phone and website, so the Booking and Fees block carries genuine
details instead of [CONFIRM: …] placeholders. Anthropic charges those searches separately from tokens, at
a flat $10.00 per 1,000 searches — capped at 6 per generate, so roughly
6¢ a location at worst. That charge is counted in the Est. Cost column alongside the tokens. Nothing else in
the app searches the web.
Blogs, Locations content and marketing Analysis run on the Anthropic API; everything else runs on Workers AI.
All of them are folded into the Claude rows in the AI table above — this card is the Blogs-only per-call
breakdown, since one post makes six calls at three different effort levels and the useful question is which of
them costs the money. Cached input is counted at the full rate here, so the real bill is a little lower.
Posts generated
—
API calls
—
Tokens in / out
—
Est. cost
—
Est. cost per post
—
Model
—
Call
Calls
Tokens in / out
Est. Cost
Ask Ange (public chat widget)
Ask Ange is the one AI feature real strangers can use directly (it's public, no login), so it gets its own
card here — message/conversation volume, its slice of the AI cost above, and anything blocked by the
per-visitor rate limit added 2026-08-06 (max messages a single visitor can send per minute, to stop a bot
or spammer running up AI costs).
Messages sent
—
Conversations
—
Blocked (rate-limited)
—
Est. AI cost (this feature)
—
All Google Cloud projects (real billing data)
This pulls Google's actual recorded cost — not an estimate — across every project under
simpleceremonies.com.au, straight from your Cloud Billing Export. Needs a one-time setup in Google Cloud Console
that only you can do (it involves a private key Claude can't handle) — instructions below.
One-time setup (in Google Cloud Console, done by you)
Billing → Billing export → BigQuery export — turn on "Standard usage cost data", and pick (or create) a BigQuery dataset to stream it into. Note the project ID and dataset ID you chose.
IAM & Admin → Service Accounts → Create service account in that same project (e.g. name it billing-reader).
Grant it two roles on that project: BigQuery Data Viewer and BigQuery Job User.
Open it → Keys → Add key → Create new key → JSON. This downloads a JSON file — keep it private, don't paste it anywhere except the next step.
On your Mac, in ~/Downloads/crazytext-cloud, run npx wrangler secret put GCP_BILLING_SA_KEY, then paste the ENTIRE contents of that JSON file and press Enter.
Come back here, enter the project ID + dataset ID from step 1 below, and Save. It can take a few hours after turning on the export before the first data lands in BigQuery.
You never have to do a rotation alone. Open Claude Code in the crazytext-cloud
folder and paste one of the prompts below. Claude will look up which secrets exist, tell you exactly what
breaks before you touch anything, and check afterwards that it actually worked.
Claude can never see your secret values, and that is deliberate. It can read this app's code and run
the safe commands, but the actual key only ever travels from your clipboard straight into Cloudflare via
pbpaste | npx wrangler secret put NAME —
it never appears in the chat, in your shell history, or in any log. Claude is also under standing instructions
never to run a database migration or set a secret on its own.
The one thing to do yourself, every time: after any rotation, press 🩺 Check all credentials now above.
That makes a live call to each provider and proves the new value is working — so you find out in seconds
rather than from a customer.
🧭
Which order to do them in
Safe any time, no downtime. Each is independent — create the new value, save it, check it works, then
delete the old one: Google Maps · Crazytel · Bubble · Stripe (supports roll-with-expiry) · Instagram.
Needs an uninterrupted hour. The Google OAuth client backs Gmail and Google Ads, so rotating its
secret invalidates every refresh token at once — re-mint them all in the same sitting or email sending and
Ads reporting both stop.
Out of hours. The staff session signing secret logs everyone out the moment it changes.
🔑 Token & Secret Rotation
Every credential this app depends on, in one place, so you can step through rotating them on a regular
schedule. Each card shows what it's for, where to get a fresh value, and the exact command to run — with a
"Mark rotated today" button so the date shown here stays accurate over time (there's no way for this app to
ask Google/Stripe/Crazytel/Bubble/Meta when a key was actually issued, so this log is only as good as you
keeping it up to date when you rotate something).
✉️
Google — Gmail send/receive, staff sign-in & Calendar sync
One Google OAuth client covers all three: sending/receiving as wedo@, staff "Sign in with Google", and the
Calendar sync. Client ID (not sensitive, never changes when you rotate):
806788359830-dqaomt8pfntimhrmn7spf5il5ktpsho4.apps.googleusercontent.com
Where to get a new value: Google Cloud Console → CrazyText SMS project → Google Auth Platform →
Clients → "Web client 1" → Client secrets → "+ Add secret" (copy it immediately — Google only shows
it once). Rotating the secret does not require re-minting any refresh tokens — those keep working
as long as the client itself isn't deleted.
Once you've confirmed Gmail send, staff sign-in, and Calendar sync all still work, go back to Google Cloud Console and disable/delete the old secret so only one is ever active.
Last rotated: —
📧
Gmail refresh tokens (wedo@, admin@, Calendar)
Only needs re-minting if a mailbox connection actually breaks (e.g. "unauthorized_client"/"invalid_grant")
— not on a routine schedule, since these don't expire on their own. For wedo@, run the helper script on
your Mac (asks for the Client ID/Secret interactively, never on the command line):
For the admin@scaustralia.com.au mailbox, same script/flow but sign in as that account and paste into GOOGLE_REFRESH_TOKEN_2 instead. For Calendar, use the in-app "Connect Google Calendar" button — no wrangler needed.
Last rotated: —
🗺️
Google Maps Platform API key
Used for address autocomplete, place lookup, and drive-time calculations on Quote & Location Search.
Where to get a new value: Google Cloud Console → CrazyText SMS project → Credentials → "Maps
Platform API Key" → ⋮ → Regenerate key (or create a new key + delete the old one).
Last rotated: —
💬
Crazytel — SMS send/receive API key
Where to get a new value: sign in at crazytel.com.au → Account/API settings → regenerate your API key.
Last rotated: —
🔗
Inbound SMS webhook secret
Self-chosen (not issued anywhere) — it's the random token in the inbound webhook URL Crazytel POSTs
incoming texts to. Important: after rotating, you must also update the webhook URL saved inside
Crazytel's own dashboard to match, or inbound texts will silently stop arriving.
Last rotated: —
🫧
Bubble (SCA) — read-only data API token
Used to read locations/celebrants/etc. from the SCA Bubble app. Where to get a new value: the Bubble
editor (not the staff dashboard you use day-to-day) → Settings → API → generate a new token.
Last rotated: —
📷
Instagram / Meta app credentials
INSTAGRAM_APP_ID/INSTAGRAM_APP_SECRET come from
developers.facebook.com (Meta for Developers) → your app → Settings → Basic.
INSTAGRAM_VERIFY_TOKEN is self-chosen — when you change it, update it in both places
at once (the Cloudflare secret AND Meta's webhook subscription field), or DM delivery breaks.
Last rotated: —
💳
Stripe (read-only)
Must always be a restricted, read-only key so nothing here can ever move money. Where to get a new
value: dashboard.stripe.com → Developers → API keys → create a new restricted key with read-only access, then delete the old one.
Last rotated: —
🍪
Staff session signing secret
Self-generated — signs staff login session cookies, not issued by any outside service.
Heads up: rotating this instantly logs out every currently signed-in operator (their session
cookie stops verifying) — everyone just signs back in.
Last rotated: —
📊
GCP billing service account key (optional — not set up yet)
Powers the "All Google Cloud projects (real billing data)" table above. See the setup instructions in that
section — once it's configured, come back here to track its rotation like everything else.
Last rotated: —
Other Google Cloud credentials in your organisation (reference only — not used by this app)
Found while auditing every project under simpleceremonies.com.au, for your broader rotation practice. These
belong to other tools (Webflow embeds, other Bubble apps, the review monitor) — to rotate one, go to that
project's own Credentials page in Google Cloud Console, then update the new value wherever it's actually used
(a Webflow embed's API key field, a Bubble API Connector, etc.). Dates are as seen on 3 Aug 2026.
Project
Credential
Type
Created
Simple Ceremonies Maps
For Webflow Site
API key
27 Jun 2024
Simple Ceremonies Maps
Server/Bubble Geocode API
API key
5 Jun 2024
Simple Ceremonies Maps
Client Bubble Google Maps API
API key
5 Jun 2024
Simple Ceremonies Maps
"Don't believe used" ⚠ oldest key found, name suggests unused — good rotation/cleanup candidate
API key
10 Jul 2021
SC Locations - Webflow App
SC Locations API
API key
23 Apr 2026
SC Locations - Webflow App
sc-locations-api@… service account
Service account
check IAM page
SC - Locations
API key 2
API key
27 Apr 2026
Marketing Analytics Suite
analytics-fetcher@… service account
Service account
check IAM page
SCA-CRM
SCA-CRM Bubble (768479901507-isom…)
OAuth client
11 Jun 2026
SC Webflow Locations
New SC Webflow Locations
API key
9 Jul 2026
SCA Google Review Monitor
Web client 1 (1033870814659-6gi…)
OAuth client
1 Aug 2026
SCAPOD
No credentials in this project
📸
Instagram
● Connected
📸
Connect Instagram DMs
Once connected, DMs from couples land here beside Txt and Email — reply in the app and turn a DM into a lead in one tap.
Before this button works, one-time on Meta's side:
1. Your Meta app has the Instagram App ID / secret / verify token set as Cloudflare secrets.
2. Instagram business login + messaging permission approved by Meta App Review.
3. Then tap the button above to link @simpleceremonies — like connecting Google Calendar.
Meta rule: you can reply freely within 24 hours of a couple messaging you — great for enquiries, not cold outreach.
📸
Select a conversation to reply.
@
—
💡 Instagram only lets you reply within 24 hours of the couple's last message.
Leave all unticked for any operator (visible to everyone).
New event
Tick operators to share a private event with them.
New email
Welcome Message
Automated messages your operators see — one is picked at random at the right moment.
👋 Welcome appears when someone signs in for the day, ☕ Break pops up during the day, and 🛏 Time to go rounds out the evening.
Set "show after" (e.g. 16:30) to keep a message for later in the day.
📞 Missed-call voice — record it yourself
When a website call rings out, the caller hears an apology.
Record these two messages in your own voice — callers hear your recording. No recording = a computer voice reads it out.
⚙ Email Rules
Automatically deal with incoming email. Rules apply to new mail that arrives after the rule is created — the first matching rule wins.
Built into the app — 7 automatic behaviours, tap to view
+ New rule
Note: forwarded emails carry the message text and formatting, not attachments.
Follow-ups due
Active leads waiting on a reply. Click one to open it and send a follow-up.
Lead
Enter an email or phone below, then click to pull details from your thread.
📝 Restored an unsent draft from last time. Discard it
0 chars · 1 SMS
Send email
Email isn't connected yet — I'll help you switch it on.
📝 Restored an unsent draft from last time. Discard it
PDF, JPG, PNG or DOCX, up to 10 MB
Snooze follow-ups
Not snoozed — following the normal cadence.
or
Pick a date — it saves automatically and hides the lead from Action Today until then (a reply still surfaces it).
Add note
Timeline
Fee breakdown & Add-Ons
Fee breakdown — internal only. Ceremony Quote above is always the live total of these six fields — Celebrant/Admin/Location/Add Guest/RM Certificate fill automatically for a Standard or Custom Repeating location; Surcharge is always manual.
Add-Ons — from Bubble, for this ceremony's location · never shown to the couple
Pick a Standard or Custom Repeating location above to see Add-Ons for it.
Bookings for
New message
Contact name
💰 Quote breakdown
Internal only — the couple never sees this.
📅 Availability
Internal only — the couple never sees this.
Price for this ceremony
Reports
Filter leads by operator, source, location and status over a date range — keyed to when they were opened or closed/booked.
—
All previous messages
Edit operator
6 characters — 4 numbers and 2 letters, in any order. Not case-sensitive.
Admins can manage settings, templates, operators and see reports. Managers work the leads board.
Change your SCA Code
This is the code you read out to a couple on the witnessing video call — it's what tells Sign & Combine that you witnessed their signature.
6 characters — 4 numbers and 2 letters, in any order. Not case-sensitive.
Insert a template
{Name} becomes the contact's name, {Operator} becomes your signature.
Templates — Txt & Email
Placeholders: {Partner 1} {Partner 2} {Ceremony type} {Ceremony time} {Ceremony Date} {Ceremony Location} {Guest numbers} {Ceremony Quote} {Add-On Quote} {Add-Ons breakdown} {Full Quote Total} {Date last email was sent} {Operator} {Operator's Full Name} {Operator's A Number} {Preferred name 1} {Preferred name 2} {Couple's Preferred names} {Today's Date} {CodeDate}. Put optional bits in [square brackets] — they drop out if the placeholder inside is blank, e.g. "Hi {Partner 1}[ & {Partner 2}],". ({Quote} and {Fee} still work too, for any older templates that already use them.) {Add-Ons breakdown} expands to a table of the lead's currently-chosen Add-Ons (with images, if the Add-On has one) — it's blank (and any [optional bracket] around it drops out) if no Add-Ons have been added yet.
The Preferred-name placeholders come from the couple's SCA booking (matched by the lead's email). {Operator's Full Name} and {Operator's A Number} are set per operator under Admin → Operators → Edit. {Today's Date} is dd/mm/yyyy; {CodeDate} is today as mmdd, e.g. 27 July → 0727.
Email templates have a rich editor — use the toolbar for bold, lists and clickable links (select text, then 🔗). Placeholders still work inside formatted text. (Text templates stay plain.)
Ceremony inclusions
Used by the Quote template's {Ceremony inclusions} placeholder — automatically shows the right "what's included" wording based on each lead's own Ceremony type, so the Quote template doesn't have to hardcode one ceremony type's copy. Accepts the same HTML as an email template body (e.g. <ul><li>...</li></ul> for a bullet list).
Manage
Sender number
Email (Gmail)
Pulls in any replies from couples right now.
Reports
Leads, bookings, conversion by source, and average days to book / close.
Operators
Operators sign in with their Google account (the Gmail above). Add it before they try to sign in.