Marketing + email
Reach the right clients without standing up a separate stack.
Broadcasts to segments, automatic birthday emails with the copy you wrote, four smart campaigns that send themselves. The client list is already in Flowesce; the marketing runs from the same place.
Built for salons paying for an email tool they barely use and copying client lists into it every quarter. The audience already lives in your appointment history; the marketing reads from it.
01/
Broadcasts to the audience you describe.
A new broadcast picks an audience by filter (status, last visit window, service booked, service category, staff seen by, gender) and sends to the matching list. Every recipient gets a delivery row so you can see who actually got it, who bounced, and who complained. The per-client marketingOptOut flag filters out on every send so a client who unsubscribed once stays unsubscribed.
Status filter.
Active vs banned. Banned clients don't get marketing.
Last-visit filter.
Visited in the last 30 days, last 90, last year. Or never visited (for a re-engagement push).
Service and category filters.
Clients who've booked a specific service or any service in a category. A promo for a colour-correction offer goes to past colour clients, not the entire list.
Staff filter.
Clients seen by a specific staff member. Useful when a stylist leaves and the salon wants their clients to know who's taking over.
02/
Birthday auto-send with your copy, not ours.
Per-business customizable subject and body. Daily cron at 09:00 UTC scans clients with a birthday on the day (or in the configured window) and sends the email with variables substituted (first name, business name, the discount or message you wrote in). The per-client marketingOptOut flag is respected on every send. Set it once, it runs every year without a touch.
03/
Four smart campaigns out of the box.
Pick the one you want, tune the days, the subject, the body, flip the switch. The daily job picks the right clients and sends. No campaigns to schedule, no list to maintain. Win-back, post-visit review, anniversary, expiring credit. Each one has a four-template gallery to start from, a variable picker for subject and body, and a live preview that renders the exact substitution the cron will run at send time.
Win-back.
Clients who haven't booked in the configured number of days get a one-time email inviting them back. Re-arms when they book again so a fresh dormancy spell later gets a fresh send.
Post-visit review request.
When an appointment lands in Completed, the configured number of days later we send a short feedback ask. One send per appointment.
Anniversary.
On the year-anniversary of a client's first appointment, send a warm thank-you. Fires once per (client, year).
Expiring credit reminder.
When a client has unused credit hitting its expiry in the configured number of days, send a use-it-or-lose-it nudge. One send per credit batch.
04/
No double-sends, no spam-bombs.
Every send writes an audit row keyed by the trigger event (appointment id, year, credit batch id). The row blocks a second send for the same event, even if you manually re-run the cron. Backfill-on-enable defaults off, so flipping a switch on the win-back campaign with 800 dormant clients in your history does not immediately email all of them. Only events after the switch flip qualify; toggle backfill on if you actually want that legacy sweep.
05/
Variables that drop into subject and body.
Insert variable button next to the Subject and Body fields opens a popover with friendly labels: First name, Last visit date, Last visit service, Business name, Appointment date, Appointment service, Credit balance, Expiring credit amount, Expiring credit date, Anniversary year. Click a label and the placeholder lands at the cursor. The picker filters to variables that actually populate for the current trigger kind, so {appointment_date} doesn't appear on a win-back email where it would render empty.
Live preview panel.
Renders the same substitution the cron runs at send time with stable sample data (Hi Sarah, last visit Lash extensions on Apr 12). What you see is what the client reads.
Template gallery.
Four ready-to-use templates per smart-campaign kind with different voice (Personal note, Same as before, What's changed, Quick ask for win-back; Private feedback, Google review, 1-to-10 rating, Would-you-recommend for review request).
Picker drifts to Custom.
The moment you hand-edit a field, the gallery picker shows Custom. Re-pick a stock template anytime to reset.
Same variables in broadcasts.
The variable layer powers smart campaigns today and is wired to feed broadcasts and transactional templates next.
06/
One audit log for every email Flowesce sent on your behalf.
/marketing/email-log is the unified surface across transactional, birthday, broadcast, and smart-campaign sends. Searchable by recipient, status, type, and date. Every row opens a side sheet with the full subject, the full recipient address with one-click copy, a status narrative in plain English, the timeline of every status change, and the Resend message id for support escalation. Bad statuses (Bounced, Complained, Failed) render with a red-tinted timeline card.
Bounce and complaint handling.
Resend webhook fires; the client gets marked bounced or complained; future sends to that address drop. Protects sender domain reputation.
Role-gated.
Manager, Receptionist, and Bookkeeper roles can't see OTP rows (active sign-in codes for the client portal). Owner sees everything.
Plain-English status narrative.
"The recipient marked this email as spam, which means future sends to this address will be dropped" instead of an opaque enum.
Resend message id for escalation.
When something is wrong upstream, the message id ties to the Resend dashboard so support has the link they need.
07/
Smart campaigns are Growth tier; everything else is on every plan.
Solo plan sees every smart-campaign automation page in preview so you know exactly what's there, but the Enable switch is replaced with an Upgrade to Growth CTA. Broadcasts, birthday auto-send, the email log, and bounce handling work on every plan including the 14-day trial. WYSIWYG drag-and-drop editor and WhatsApp marketing are roadmap; we're honest about that.
Common questions
Honest answers, including the ones we don't love.
What about WhatsApp or SMS?
Not at launch. SMS isn't on the roadmap (cost per send doesn't fit the salon margin we're building for). WhatsApp is the more likely first non-email channel; WABA approval is a multi-week project and depends on a region with strong WhatsApp penetration being the first market. Email is the v1 surface.
Can clients unsubscribe?
Yes. Every marketing email has an unsubscribe link that flips the per-client marketingOptOut flag. Every audience query filters out opted-out clients on every send. The flag is visible on the client detail page and can be toggled manually by staff if the client asks in person.
What does the WYSIWYG editor look like today?
Today the body is a textarea with the variable picker and the live preview. Drag-and-drop is on the Later list of the marketing roadmap; we plan to embed an existing email-composer SDK (Unlayer or BEE Plugin) rather than build a from-scratch React editor, because email HTML is table-layouts-with-inline-styles per-client and rolling our own would mean weeks on cross-client compatibility alone.
Can I schedule a broadcast?
Scheduled-send is on the next-up list. Today broadcasts send when you hit Send. The smart campaigns send on their own schedule via the daily cron, which covers the recurring-cadence case without manual scheduling.
What stops a client from getting the same email twice?
Smart campaigns dedupe per (automation, cooldown key) where the key is the trigger event (appointment id, year, credit batch id). The audit row blocks a second send for the same event. Broadcasts dedupe per (broadcast, recipient) so a re-send of the same broadcast can't double-hit the same client.
Pairs well with
Fourteen days. No card.
Try Flowesce on a real Saturday.
No card required, no auto-charge at the end. If Flowesce isn't for you, export everything in one click and walk.