Skip to content

PRD 13 — Marketing

Status: draft · Priority tier: P2 · Size: L · Depends on: PRD 01 (workspace, auth, roles), customers + tags + marketing consent (customers PRD), pricing plans/packages (for referral rewards), PRD 15 (email provider/sender, sent history)

1. Summary

Let a studio owner email its customers: one-off campaigns (wizard, audience by all/tags, block-based content, scheduling, status and engagement stats), recurring lifecycle automations from 22 templates, a referral program with referee/referrer rewards, and smart tags that segment customers automatically. Goal: repeat bookings and win-backs without a third-party tool.

2. Problem & goals

  • Owners need to reach opted-in customers and trigger timely messages (welcome, expiring plan, win-back) with minimal setup.
  • Goals: draft-to-scheduled campaign in <=6 steps; every send respects marketing consent and monthly quota; owner can see sent/engaged/rate per campaign; automations run unattended.
  • Non-goals (v1): SMS, WhatsApp, push, in-app, web pop-ups (original shows these as "coming soon"; Out), A/B tests, own SMTP.

3. Users & roles

Owner/admin (full), manager (create/send, no billing), staff (no access), customer (receives; unsubscribes; referee/referrer in storefront).

4. Scope

In (v1)

  • Campaign wizard, email channel only (must)
  • Audience: all opted-in customers or selected tags (must)
  • Block email builder: text, image, button, divider, spacer, columns; styles; merge vars (should; text+button+image is the must core)
  • Send now / schedule later; draft / scheduled / completed / archived statuses; stats (must)
  • Campaign list: search, date filter, status tabs, duplicate, delete (must)
  • Campaign tags (could)
  • Automation templates gallery (22) + automations with per-tier limit (should)
  • Referral program settings and tracking (could)
  • Smart tags (could, see open questions) Later: SMS/WhatsApp (needs provider), A/B, link-click heatmaps. Out: Rezerv-style "powered by" footer branding; reselling email quota as add-on is a billing decision (pricing tier: TBD).

5. User stories

  • US-13-01 As an owner, I want to create a campaign with a name so that I can start composing.
  • US-13-02 As an owner, I want to target all subscribers or specific tags so that messages are relevant.
  • US-13-03 As an owner, I want to compose with blocks and preview desktop/mobile so that email looks right.
  • US-13-04 As an owner, I want to send now or schedule so that timing is controlled.
  • US-13-05 As an owner, I want to save drafts at any step so that I never lose work.
  • US-13-06 As an owner, I want to see sent/engaged stats so that I judge results.
  • US-13-07 As an owner, I want to activate an automation from a template so that reminders and win-backs run themselves.
  • US-13-08 As an owner, I want to configure a referral reward so that customers bring friends.
  • US-13-09 As a customer, I want to unsubscribe in one click so that I control what I receive.
  • US-13-10 As an owner, I want customers auto-tagged by behaviour (smart tags) so that I can target them.

6. Functional requirements

ID requirement priority evidence
FR-13-01 Wizard steps: Overview (name, channel=email), When, Who, What, Options, Review; stepper shows completion %; Back/Next must S81, F33
FR-13-02 "Save as draft" available on every step; draft keeps partial data must S81, S82
FR-13-03 When: send immediately, or at a later time, minimum 1 hour ahead, maximum 3 months ahead (timezone = business) must S81b
FR-13-04 Who: all subscribers, or select tags (multi); show live recipient count; only customers with email marketing consent and verified-able address are included must S81c
FR-13-05 What: block builder with Text (rich text), Image, Button, Divider, Spacer, Columns; drag to add/reorder; Next disabled until >=1 block should S81d, F33
FR-13-06 Merge variables first name / last name with fallback should S81d
FR-13-07 Styles: canvas bg, content bg, heading/body font, size S-XL, link colour; undo/redo; desktop/mobile preview could S81d3
FR-13-08 Footer auto-added: business name, mandatory unsubscribe link (not removable) must S81d
FR-13-09 Options: sender email (verified via PRD 15), subject with From/To/Subject preview, optional campaign tags must S81e, S81g, S81h
FR-13-10 Review step summarises audience size, schedule, subject; Send/Schedule blocked when sender or subject missing must F33 (Review not observed)
FR-13-11 Send blocked with clear message when workspace is on trial or monthly quota exhausted; draft still allowed should S82
FR-13-12 Campaign statuses: draft, scheduled, sending, completed, archived; scheduled campaigns editable/cancellable until start must S83
FR-13-13 List: search, start-time filter, status tabs with counts, columns name/status/channel/start/created/recipients/sent/engaged/rate/tags, 50/page must S83
FR-13-14 Row actions Edit, Duplicate, Delete (confirm, irreversible); sent campaigns keep stats (archive instead of delete: assumption) must S83c, S83e, F34
FR-13-15 Stats: recipients, sent, engaged (open or click), rate = engaged/sent; unsubscribes and bounces recorded should S83
FR-13-16 Unsubscribe link flips customer marketing consent off and logs it must S66 consent
FR-13-17 Monthly email quota per tier, shown as used/limit; owner notified at 75% and 100% should parts/06 S156 staff events, parts/07 limits
FR-13-18 Automation template gallery: 22 templates grouped Engage, Remind, Retain & re-engage; search; list in section 9a should S84
FR-13-19 Template detail shows trigger, parameters (e.g. days, credit threshold), and requirements; "Use template" opens editor (subject, content, parameters, active toggle) should S85
FR-13-20 Customisable shared email look: logo, store name, featured image (JPG/PNG/GIF <10MB), footer, live preview could S85b
FR-13-21 Automations list: status, channel, duration filters; "n of limit used"; create blocked at limit with upgrade prompt (limits Starter/Team/Business/Enterprise 5/20/100/100, tier TBD) should S86, parts/07
FR-13-22 Automation run is per customer, once per trigger event; respects consent and quota; entries appear in sent history should S156f
FR-13-23 Referral program: on/off, reward scheme (immediately on join, or after qualification), referee reward (pricing plan, optional), referrer reward (pricing plan), banner title/description (500 chars), details, onboarding page rich text could S89, F37
FR-13-24 Each customer gets a referral code/link; referral records status (completed, referee rewarded, manually added); owner can add manually could S89, Referral report
FR-13-25 Reward rules: changes apply going forward only; refunds follow normal refund rules; reward granted once per referee could S89 text
FR-13-26 Smart tags: system-maintained tags with rule (e.g. no booking in N days, lifecycle) usable as campaign audience; distinct badge from manual tags; tier limit (none/none/10/10 original, TBD) could parts/07 limits; rules not observed
FR-13-27 Audit: who created/sent each campaign should assumption

7. Screens

  • Campaigns list (S83; empty state = S80 landing) — empty/loading/filled/error.
  • Campaign wizard (S81, S82) with step screens; sender dialog (S81g).
  • Automation templates (S84), template detail (S85), automation editor (not observed; our design), automations list (S86).
  • Referral landing/intro/settings (S89*).
  • Smart tags: extend tags list (S62) with rule editor (our design).

8. Flows

  • Create campaign (F33): +Campaign -> name -> When -> Who -> What -> Options -> Review -> Send. Target <=3 clicks to draft, <=12 to scheduled.
  • Manage (F34): row menu. Edge: edit a campaign already sending is blocked.
  • Automation (F35): Add -> pick template -> configure -> activate. Edge: at limit, blocked.
  • Referral (F37): intro -> activate -> settings -> save (disabled until valid).
  • Edge: audience resolves to 0 recipients -> block send; sender unverified -> redirect to sender setup after saving draft.

9. Data model

  • Campaign(id, workspace_id, name, channel, status, send_mode, scheduled_at, audience_type all|tags, content_blocks json, styles json, sender_id, subject, created_by, created_at)
  • CampaignAudienceTag(campaign_id, tag_id); CampaignTag(id, name) (guess)
  • CampaignRecipient(campaign_id, customer_id, sent_at, opened_at, clicked_at, bounced, unsubscribed) (guess)
  • AutomationTemplate (static: key, group, trigger, params schema, default content); Automation(id, template_key, channel, status, params json, content, email_theme)
  • AutomationRun(automation_id, customer_id, trigger_ref, sent_at) (guess)
  • EmailTheme(logo, store_name, featured_image, footer)
  • ReferralProgram(active, scheme, referee_plan_id, referrer_plan_id, banner_title, banner_desc, details, onboarding_html); Referral(id, referrer_id, referee_id, status, manual bool)
  • SmartTag(tag_id, rule json) (guess)

9a. Automation templates (22)

Engage: welcome new customers; birthdays. Remind: package below X credits; package expiring; membership expiring; membership below X credits; class cancelled; before class starts; before appointment starts; appointment cancelled; bumped from waitlist. Retain & re-engage: re-engage lost members; engage active members; engage non-members; win back customers (X days); no class booking; no appointment booking; no outlet access. (Recon lists 18 names; 4 remain unidentified: see open questions.)

10. Business rules & edge cases

  • Only customers with marketing consent receive campaigns/automations; transactional notices (PRD 15) are separate and not blocked.
  • Schedule times validated server-side; deleting a tag used in a scheduled campaign warns.
  • Automation reminders overlap transactional notifications: avoid duplicates (open question).
  • Email must contain unsubscribe link; sender domain verified.
  • Referral rewards before/after payment per setting; a referee cannot refer themselves; duplicate referral codes impossible.

11. Permissions

Owner/manager: create, edit, send, delete, configure automations/referral. Staff: none (v1). Customer: unsubscribe, view own referral code.

12. Acceptance criteria

  • Given a draft with no block, when I press Next at What, then it stays disabled.
  • Given Who=tag "VIP" with 40 opted-in members and 5 opted-out, then recipient count shows 40.
  • Given schedule time 30 minutes ahead, when I continue, then an inline error requires >=1 hour.
  • Given a scheduled campaign, when start time passes, then status becomes completed and stats populate.
  • Given quota exhausted, when I press Send, then it is refused and the draft is kept.
  • Given a recipient clicks unsubscribe, then their consent is off and they are excluded next send.
  • Given automation count equals tier limit, when I add another, then an upgrade prompt appears.
  • Given referral active and referee joins, then referee/referrer rewards are granted per scheme exactly once.

13. Dependencies & open questions

Depends on email provider and sender verification (PRD 15), customers/tags, pricing plans, notifications sent history. Open (not observed in recon): Review step layout; automation editor and exact triggers/params; 4 of 22 template names; smart tag rules and behaviour (only tier limits known); engaged definition; referral behaviour after save; email quota/pricing tier; whether SMS/WhatsApp ever ships.

14. Evidence

See evidence/evidence.md.