Industry playbooks
ContentFlow's building blocks are the same in every industry: blocks to show, campaigns and journeys to reach, profiles and segments to target, analytics and sensors to measure. What changes is the vocabulary, the regulator, and the moments that matter. Each playbook below is built only from capabilities that work today, and lists the calls in the order you make them.
- Every industry uses the same building blocks: blocks, campaigns and journeys, profiles and segments, analytics and sensors.
- Each playbook starts from its consent preset (for example
banking_ksa), fetched withGET /sdk/v1/consent/config/{preset}, then its profile schema and event helper. - Each scenario gives the goal, the products, the one-time setup and the calls. Use the switcher to show one industry.
How to read a playbook
Every industry starts with its consent preset (fetch it with GET /sdk/v1/consent/config/{preset}), its profile schema (industryType plus typed fields), and its event helper. Each scenario then gives the goal, the products, the one-time setup, and the calls. Use the switcher to focus on one industry.
Banking
1. Personal-finance offer for salaried customers
Goal: raise applications from customers who earn enough to qualify. Products: enrichment, segments, blocks, push campaign, analytics.
- Nightly, stored on each profile:
monthly_salaryandhas_personal_financeper customer, sourceerp_syncorcsv_upload. - Daily update frequency; used by the campaign and the journey.
If this step is skipped: Enrichment rules aren't evaluated on the in-app delivery path. For the in-app card, also send the salary band as an identify trait (traits.salary feeds a workspace segment on the salary trait).
- The in-app offer card targets a workspace segment on the
salarytrait (fed by the trait the app sends on identify). - The Management API dispatches a push campaign to the enrichment segment, Arabic and English, deferred around prayer times, to people with push consent.
- ContentFlow hands each push to the provider, which delivers it to the device.
- Events reach analytics through the SDK API within seconds. Tap on the card; conversion when the application is submitted. Compare variants if the card runs an A/B test.
2. Card activation onboarding
Goal: get new customers to activate their card in the first week. Products: journeys, push, in-app, traits.
- A journey triggered by the Signs up app event (eventType
SIGN_UP) → wait 1 hour → push "Activate your card in two taps" → condition Card active → no branch: in-app step (shown asjourney_message) after 2 days. - Segment Card active:
customAttributes.card_active is_true. - App:
trackSignUp({ username: userId })on registration; on activationtrackBanking('card_activated', { cardType })andidentify({ traits: { card_active: true } }).
3. "Eligible but didn't apply" win-back
Goal: follow up with people who saw they were eligible but never applied. Products: sensors, rules, segments, WhatsApp.
- Enable sensors on
offer.eligible(the eligibility message) andoffer.apply_cta(the Apply button). - Relationship absence: impression of
offer.eligiblewithout interaction withoffer.apply_ctawithin 24 hours. Rule: add to segment Eligibility drop-offs, remove on recovery. - Journey with trigger
segment_entryon that segment → WhatsApp template with a link back to the offer. - App: render both strings with
client.t();trackString('offer.apply_cta', 'interaction')on tap.
4. Security and transaction alerts
Goal: reliable alerts that survive marketing opt-outs. Products: consent presets, push, one-off notifications API.
- Build the consent screen from
banking_ksa: security alerts are required, marketing topics optional. - App:
registerPushafter OS permission;setChannelConsent({ push: true }). - Your backend:
POST /api/v1/notificationsfor the person when your core banking system raises an alert. Note that PDPL opt-out blocks every channel.
Fintech and wallets
1. Low-balance top-up nudge
- App:
client.track('wallet_low_balance', {}, { balance: 12 })when the balance drops below your threshold. - Journey trigger
event=wallet_low_balance→ push "Top up in one tap" with a deep link (https universal link) → wait 1 day → in-app reminder. - Measure with
trackBanking('transfer_completed', …)or a customwallet_top_upconversion.
2. Finish your verification
- App: on each verification step send a trait, for example
identify({ traits: { kyc_level: 'basic' } }). - Segment
customAttributes.kyc_level in ['none', 'basic']→ a home block explaining the benefits of full verification, and a journey reminder. - Verification itself stays in your KYC provider; ContentFlow's KYC records are server-side only and not exposed to the SDK.
3. Referral programme A/B test
- One
referral_cardinstance with an A/B test: "Give 50, get 50" vs "Invite friends, earn rewards". - Each device sticks to its variant;
trackTapandtrackConversioncarryvariantId. - Read results per variant, conclude the test, and the winner is served to everyone.
Insurance
1. Claim status updates
- With the claim reference as a property.
- The SDK API accepts the event and analytics records it.
- The journey's event trigger enrols the person into the Claim follow-up journey.
If this step is skipped: Without analytics consent there's no profile, so the person can't be enrolled. Make claim notifications part of your required service consent.
- An approved template; the claim reference fills a variable.
- Then an in-app reminder to upload missing documents.
2. Renewal reminders
- Upload
policy_end_dateandpolicy_typefrom your policy system as enrichment (typed date). - Segment on the end date with a date rule, updated daily; a push and SMS campaign 30 days ahead, and a renewal block in the app for the same segment through a trait such as
renewal_due: true.
3. Motor cross-sell
- Segment: has a vehicle (
industryProfile.vehicles exists) and no motor policy. - Blocks and campaigns with a quote CTA;
trackInsurance('quote_requested')as the conversion.
Healthcare
1. Appointment reminders
- App:
trackHealthcare('appointment_booked', { clinic, slot }). - Your scheduling system uploads
next_appointmentas enrichment; a daily segment "appointment tomorrow" feeds a push and SMS campaign with a check-in link. - Measure attendance with
trackHealthcare('appointment_checked_in').
2. Lab results ready
- Your lab system calls
POST /api/v1/notificationsfor the patient with a neutral message and a deep link into the results screen. - The app records
trackHealthcare('lab_results_viewed').
3. Seasonal wellness content
- A
wellness_tipblock with Ramadan fasting and hydration guidance on a custom schedule, Arabic and English, for all users. - Sensors on the tip's title and read-more link to see engagement.
Travel and airlines
1. Check-in reminder and upgrade offer
- Upload upcoming flights (
next_departure) as enrichment; segment "departs in the next 48 hours", updated hourly. - Push "Check-in is open" to that segment; the app's home block (trait
upgrade_eligible: true) shows a paid upgrade. trackTravel('checkin_completed')andtrackTravel('upgrade_requested')as conversions.
2. Airport presence
- The app registers a geofence around each airport:
registerGeofence({ fence: { type: 'circle', id: 'ruh-airport', … }, triggers: { onEnter: true, onDwell: true } }). - Enter and dwell events appear in Analytics → Location; use the local
onEntercallback to show the boarding pass. A journey can start when someone enters, leaves or dwells in a geofence (GEOFENCE_ENTER/GEOFENCE_EXIT/GEOFENCE_DWELL, optionally filtered by fence).
3. Loyalty tier upgrade
- Segment on
industryProfile.loyalty.tier; a celebratory block and push when people enter the Gold segment (journey triggersegment_entry).
Retail and e-commerce
1. Cart recovery
- When the cart is left with items, with cart value and item count.
- The SDK API accepts the event and analytics records it.
- The journey's event trigger enrols the person into Cart recovery; each person enters once, so design it as a long-running programme.
- Give them time to come back on their own.
- Branch on a segment built from a purchase trait.
If this step is skipped: Without a purchase segment the reminder goes to people who already bought. Keep a trait like last_purchase_at current on identify.
- Only on the no branch, to people with push consent.
- The conversion, sent through the SDK API to analytics, which measures the journey.
2. Seasonal collections
- A collection block (carousel) of product cards for White Friday or Ramadan, each card its own instance with its own segment, on a custom schedule (Riyadh time by default).
- Impressions and taps per card show which products pull.
3. Back in stock
- The person opts into the back in stock topic; your inventory system calls
POST /api/v1/notificationsfor each subscriber when the item returns.
Food delivery
1. Iftar-time offers in Ramadan
- The journey checks the Hijri calendar each day; its Hijri trigger enrols people on the first day of Ramadan.
- Waits until maghrib for the day (prayer-time aware).
- Branch: regulars get a loyalty offer, others a first-order discount.
- Arabic and English, to people with push consent.
- ContentFlow hands the push to the provider for delivery.
- The conversion.
2. Win back lapsed customers
- Journey trigger
inactivity, 30 days → push with a voucher → wait 3 days → SMS if still inactive (condition on a recent-order segment).
3. Order status
- Order status is a required topic. Your order system calls
POST /api/v1/notificationsat each stage; the app recordstrackFoodDelivery('order_delivered').
Any app, including government and media
1. Kill switch and feature flags
- Give a feature's entry point a block with an
#enabledboolean field. Pausing the instance or disabling the type hides it on the next sync, with no release.
2. Service announcements
- An
announcementblock on the home screen for outages, holidays and new services, with Arabic and English copy and a custom schedule; publish goes through approval.
3. Measure your copy
- Turn the strings on your key screens into sensors; a surface tracker shows what people see and tap, before and after a copy change.
4. Ask for feedback
- An NPS card block for engaged users (lifecycle engaged), recorded with
track('nps_submitted', {}, { score }); detractors enter a follow-up journey through a trait.