Suppression & Frequency Policy

"Agreed once, referenced forever. Every email and WhatsApp build starts here."

● LIVE v1.0 Agreed: 2026-06-29 Owner: Max Persson ID: SUPPRESS

Why This Exists

Before this policy, every new email flow restarted the same conversation about suppression, overlap, and frequency caps — landing on Max each time. This document closes that loop. Agreed once, it governs every journey in the SwingFIT comms system. When in doubt, come here first.

Global Frequency Cap — Email

📧
Hard cap: 2 marketing/lifecycle emails per contact per rolling 7-day window.
Exempt from cap — always fires regardless of the 7-day window
  • Booking confirmations and reminders
  • Payment receipts and invoices
  • Cancellation and pause confirmations
  • Dunning / failed payment notices
  • Direct replies to member requests
  • Any email explicitly triggered by a member action in the last 24 hours

Global Frequency Cap — WhatsApp

💬
Hard cap: 1 WhatsApp message per contact per rolling 7-day window.
Exempt from cap
  • Booking reminders sent within 24h of a scheduled session
  • Urgent account actions (payment failure, cancellation confirmation)

Priority Hierarchy

When a contact qualifies for multiple flows simultaneously, the highest-priority active flow wins. Lower-priority flows wait — they do not stack.

B5 / B6 Overlap Rule

This is the specific case that triggered this policy. Both flows can be eligible simultaneously — a member who is inactive may also have expiring credits.

Default Rule: B5 Suppresses B6

If B5 triggers (no activity for 21+ days), B6 is paused until B5 exits or the member re-engages.

Reasoning: inactivity is the more urgent signal. Getting the member back through the door is the priority; credit reminders follow once they're active again.

Exception — Imminent Credit Expiry Override

If a B6 credit expires within 7 days AND B5 has not yet fired, B6 takes priority for that send only. An expiring credit with a hard deadline outweighs a general inactivity nudge.

Suppression Rules — Master Table

Situation Suppressed from Notes
In B7 onboarding (Days 0–30) B5, B6, B8, all lifecycle Onboarding owns the inbox for 30 days
In active dunning sequence B5, B6, B8 Revenue protection takes priority
Unsubscribed All marketing / lifecycle Transactional still fires
Hard bounce All email permanently Auto-suppress; no override
B5 active B6 Unless B6 credit expires within 7 days
B8 active B5, B6 Winback owns the re-engagement slot
Booking made in last 7 days B5 Re-engagement achieved — B5 exits
Re-subscribed B8 B8 exits immediately
PAYG purchase in last 7 days B8-P Exit condition met

Exit Conditions

Flow Exit trigger
B5 Inactive Retention Any booking made
B6 Credit Activation Credit used OR sequence completes naturally
B7 Member Onboarding Day 30 email sent (natural completion)
B8 Winback — Member branch Re-subscribes at any point
B8 Winback — PAYG branch Makes any booking
All flows Contact unsubscribes

CRM Implementation Notes

How this policy is enforced technically in Zoho CRM.

Audit date: 2026-06-29. Section below reflects actual CRM state. Items marked LIVE are confirmed in place. Items marked BUILD need to be created before the relevant flow can go live to members.

Last_Nurture_Sent FIELD EXISTS ✓
Email frequency cap field. Date field confirmed on Contacts (108 fields audited 2026-06-29). However: B5, B6, and B7 workflow rules do not yet check this field before sending. The field exists but is not yet wired into workflow rule conditions. Fix required: add Last_Nurture_Sent < TODAY()-7 OR IS_EMPTY(Last_Nurture_Sent) as a condition on each rule, and add a Field Update action to stamp it on each send.
Last_WA_Sent BUILD NEEDED
WhatsApp frequency cap field. Field does not exist on Contacts as of 2026-06-29. Must be created (type: Date) before any WhatsApp journey goes live. Independent count from the email cap — 1 per rolling 7-day window.
In_Onboarding (Contact flag) BUILD NEEDED
B7 suppression for B5/B8. Onboarding_Route lives on Memberships, not Contacts. B5 fires on Contacts and cannot cross-module query Memberships in a standard workflow condition. Fix: add an In_Onboarding checkbox or date field to Contacts. B7 E0 stamps it on Day 0; a scheduled action clears it on Day 30. B5 and B8 then check In_Onboarding = false before firing.