Completions

Keep-customer swarm · Loyalty-Management Agent · Cross-location-offer-coordination skill · Build pillar · Published July 10, 2026

How to build cross-location offer coordination for multi-banner franchise loyalty

This guide explains how to architect the cross-location-offer-coordination skill on the loyalty-management agent end-to-end at multi-banner multi-location franchise scale: per-portfolio per-member per-banner per-offer per-canonical-per-member-per-banner-offer-state + per-per-channel-frequency-capping + per-per-tier-conflict-resolution + per-per-banner-arbitration + per-per-offer-eligibility-spec + per-per-offer-cooldown-spec + per-per-offer-cross-banner-suppression-spec + per-per-offer-cross-channel-deduplication + per-per-offer-OPA-Cedar-Casbin-Cerbos-Oso-policy-engine + per-per-offer-multi-LLM-pre-send-check + per-per-offer-attribution-handoff + per-per-offer-audit-trail + per-portfolio audit-trail.

What you will build

  • Per-portfolio per-canonical-per-member-per-banner-offer-state across per-pending-offer + per-sent-offer + per-opened-offer + per-clicked-offer + per-redeemed-offer + per-expired-offer + per-suppressed-offer + per-arbitrated-offer canonical-state-machine.
  • Per-canonical-per-channel-frequency-capping — per-email-cap + per-SMS-cap + per-push-cap + per-in-app-cap + per-direct-mail-cap + per-paid-social-retargeting-cap + per-call-cap + per-day + per-week + per-month + per-rolling-window + per-override + per-tier-bonus + per-VIP-override.
  • Per-canonical-per-tier-conflict-resolution — per-Brand-A-Gold-vs-Brand-B-Silver + per-banner-cross-tier-pricing-conflict + per-tier-benefits-conflict + per-tier-expiration-conflict + per-higher-tier-wins + per-most-recent-tier-wins + per-banner-of-origin-wins + per-portfolio-master-tier-wins + per-corp-override.
  • Per-canonical-per-banner-arbitration — per-priority + per-context (per-time-of-day + per-day-of-week + per-season + per-recent-redemption-banner + per-recent-engagement-banner) + per-multi-LLM-decision + per-confidence + per-explainability + per-FBC-feedback.
  • Per-canonical-per-offer-eligibility + per-cooldown + per-cross-banner-suppression + per-cross-channel-deduplication + per-policy-engine + per-multi-LLM-pre-send + per-attribution-handoff + per-audit-trail — per-tier-eligibility + per-spend-threshold + per-recency + per-frequency + per-geographic + per-vertical + per-banner-eligibility + per-OPA-Cedar-Casbin-Cerbos-Oso + per-A/B-test + per-24-hour + per-3-day + per-7-day + per-14-day + per-30-day + per-90-day-cooldown + per-cross-banner-spa-vs-gym + per-restaurant-vs-cafe + per-auto-repair-vs-tire-shop-category + per-SMS-preferred + per-email-fallback + per-push-fallback + per-OPA-Rego + per-AWS-Cedar + per-Casbin + per-Cerbos + per-Oso + per-policy-bundle-versioning + per-policy-bundle-rollback + per-policy-bundle-A/B-test + per-policy-engine-decision-tracing + per-multi-LLM + per-LLM-policy-violation + per-LLM-brand-voice + per-LLM-CASL-CCPA-GDPR-consent + per-LLM-confidence + per-LLM-self-consistency + per-UTM-click-IDs + per-first-party-cookie-CHIPS + per-server-side-Conversions-API + per-cross-device + per-cross-touchpoint-via-identity-resolution + per-attribution-event-emission-handoff + per-LTV-math-primitives-handoff + per-per-offer-canonical-audit-record + per-FCC-TCPA + per-CASL-CRTC + per-PIPEDA-OPC + per-GDPR-DPIA + per-CCPA-DSAR + per-immutable-WORM.

Why per-vendor-Salesforce-Marketing-Cloud-single-banner-single-account breaks at multi-banner-multi-location franchise scale

Per-vendor-Salesforce-Marketing-Cloud-canonical-single-banner-single-account ships per-account per-member per-journey per-message primitive. Per-vendor-Yotpo + LoyaltyLion + Smile.io + Annex-Cloud + Punchh + Open-Loyalty + Antavo + Friendbuy + Talon.One + Voucherify + Capillary + LoyaltyPlus + Eagle-Eye-canonical-single-banner-single-account ship per-vendor per-native single-banner single-account primitives.

At 1-banner-3-location scale per-account per-member per-journey per-message primitive is enough. At multi-banner-multi-location franchise scale per-per-member-per-banner-offer-state + per-per-channel-frequency-capping + per-per-tier-conflict-resolution + per-per-banner-arbitration + per-per-offer-eligibility-spec + per-per-offer-cooldown-spec + per-per-offer-cross-banner-suppression-spec + per-per-offer-cross-channel-deduplication + per-per-offer-OPA-Cedar-Casbin-Cerbos-Oso-policy-engine + per-per-offer-multi-LLM-pre-send-check + per-per-offer-attribution-handoff + per-per-offer-audit-trail.

Per-single-banner-per-journey-per-message + per-cross-banner-offer-state-blind + per-cross-channel-frequency-cap-blind + per-cross-tier-conflict-blind + per-cross-banner-arbitration-blind + per-offer-eligibility-blind + per-cooldown-blind + per-cross-banner-suppression-blind + per-cross-channel-deduplication-blind + per-policy-engine-blind + per-multi-LLM-pre-send-blind + per-attribution-handoff-blind + per-multi-format-audit-trail-blind.

The operator-side architecture above per-vendor-loyalty-management primitive is canonical-per-member-per-banner-offer-state + per-per-channel-frequency-capping + per-per-tier-conflict-resolution + per-per-banner-arbitration + per-per-offer-eligibility-spec + per-per-offer-cooldown-spec + per-per-offer-cross-banner-suppression-spec + per-per-offer-cross-channel-deduplication + per-per-offer-OPA-Cedar-Casbin-Cerbos-Oso-policy-engine + per-per-offer-multi-LLM-pre-send-check + per-per-offer-attribution-handoff + per-per-offer-audit-trail + per-portfolio-audit-trail.

What is in market today

Per-platform per-loyalty-management-vendor

Salesforce Marketing Cloud, Yotpo, LoyaltyLion, Smile.io, Annex Cloud, Punchh, Open Loyalty, Antavo, Friendbuy, Talon.One, Voucherify, Capillary, LoyaltyPlus, Eagle Eye, Brierley (Capillary), Comarch, Epsilon Agility Loyalty. Per-account per-member per-journey per-message primitive. Per-canonical-per-member-per-banner-offer-state-canonical-per-channel-frequency-capping-canonical-per-tier-conflict-resolution-canonical-per-banner-arbitration-canonical-per-offer-eligibility-canonical-per-offer-cooldown-canonical-per-offer-cross-banner-suppression-canonical-per-offer-cross-channel-deduplication-canonical-per-offer-policy-engine-canonical-per-offer-multi-LLM-pre-send-canonical-per-offer-attribution-handoff-canonical-per-offer-audit-trail is not the primitive.

Per-platform per-customer-journey-orchestration-vendor

Salesforce Journey Builder, Adobe Journey Optimizer, Braze Canvas Flow, Iterable Workflows, Klaviyo Flows, MoEngage Flows, CleverTap Journeys, Insider Journey Builder, OneSignal Journeys, Customer.io Workflows. Per-account per-member per-journey primitive. Per-canonical-per-member-per-banner-arbitrated-offer-decision-canonical-cross-banner-cross-channel-coordination is not the primitive.

Per-platform per-coupon-offer-engine-vendor

Talon.One, Voucherify, Capillary, Eagle Eye, Salesforce Loyalty Management, SAP Customer Activity, Oracle Customer Experience Loyalty, RetailRamp. Per-account per-offer per-redemption primitive. Per-canonical-per-offer-eligibility-canonical-per-offer-cooldown-canonical-per-offer-cross-banner-suppression-canonical-per-offer-cross-channel-deduplication-canonical-per-offer-policy-engine is not the primitive.

Per-platform per-frequency-cap-vendor

Braze Frequency Capping, Iterable Send Time Optimization, Klaviyo Smart Sending, MoEngage Frequency Optimization, CleverTap RFM, OneSignal Frequency, Customer.io Throttling. Per-account per-channel per-cap primitive. Per-canonical-per-channel-frequency-capping-canonical-per-channel-cap-window-canonical-per-channel-cap-override-canonical-per-channel-cap-tier-bonus-canonical-per-channel-cap-VIP-override is not the primitive.

How the architecture is built

  1. Per-portfolio per-canonical-per-member-master-record-resolution-substrate. Per-shared-email-hashed-SHA-256 + per-shared-phone-E.164 + per-shared-loyalty-ID + per-shared-payment-token + per-shared-device-ID + per-cross-banner-identity-merge + per-cross-banner-tier-merge canonical-master-record.
  2. Per-portfolio per-canonical-per-member-per-banner-offer-state-machine. Per-pending + per-sent + per-opened + per-clicked + per-redeemed + per-expired + per-suppressed + per-arbitrated canonical-state-machine.
  3. Per-portfolio per-canonical-per-channel-frequency-capping. Per-email-cap + per-SMS-cap + per-push-cap + per-in-app-cap + per-direct-mail-cap + per-paid-social-retargeting-cap + per-call-cap + per-day + per-week + per-month + per-rolling-window + per-override + per-tier-bonus + per-VIP-override canonical-cap.
  4. Per-portfolio per-canonical-per-tier-conflict-resolution. Per-higher-tier-wins + per-most-recent-tier-wins + per-banner-of-origin-wins + per-portfolio-master-tier-wins + per-corp-override canonical-conflict.
  5. Per-portfolio per-canonical-per-banner-arbitration. Per-priority + per-context (time-of-day + day-of-week + season + recent-redemption-banner + recent-engagement-banner) + per-multi-LLM-decision + per-confidence + per-explainability + per-FBC-feedback canonical-arbitration.
  6. Per-portfolio per-canonical-per-offer-eligibility-spec. Per-tier + per-spend-threshold + per-recency + per-frequency + per-geographic + per-vertical + per-banner + per-OPA-Cedar-Casbin-Cerbos-Oso + per-A/B-test canonical-eligibility.
  7. Per-portfolio per-canonical-per-offer-cooldown-spec. Per-24-hour + per-3-day + per-7-day + per-14-day + per-30-day + per-90-day + per-cross-banner + per-cross-channel + per-tier-bonus canonical-cooldown.
  8. Per-portfolio per-canonical-per-offer-cross-banner-suppression-spec. Per-window + per-tier + per-category (spa-vs-gym + restaurant-vs-cafe + auto-repair-vs-tire-shop) + per-portfolio-override canonical-suppression.
  9. Per-portfolio per-canonical-per-offer-cross-channel-deduplication. Per-spec + per-window + per-priority (SMS-preferred + email-fallback + push-fallback) + per-tier-bonus canonical-deduplication.
  10. Per-portfolio per-canonical-per-offer-OPA-Cedar-Casbin-Cerbos-Oso-policy-engine. Per-OPA-Rego + per-AWS-Cedar + per-Casbin + per-Cerbos + per-Oso + per-policy-bundle-versioning + per-policy-bundle-rollback + per-policy-bundle-A/B-test + per-policy-engine-decision-tracing + per-policy-engine-decision-explainability canonical-policy.
  11. Per-portfolio per-canonical-per-offer-multi-LLM-pre-send-check. Per-GPT-4o + per-Claude-Sonnet + per-Gemini-Pro + per-LLM-policy-violation + per-LLM-brand-voice + per-LLM-CASL-CCPA-GDPR-consent + per-LLM-confidence + per-LLM-self-consistency canonical-LLM.
  12. Per-portfolio per-canonical-per-offer-attribution-handoff. Per-UTM-click-IDs + per-first-party-cookie-CHIPS + per-server-side-Conversions-API + per-cross-device + per-cross-touchpoint-via-identity-resolution + per-attribution-event-emission-handoff + per-LTV-math-primitives-handoff canonical-attribution.
  13. Per-portfolio per-canonical-per-offer-audit-trail + per-portfolio-audit-trail. Per-offer-canonical-audit-record + per-FCC-TCPA + per-CASL-CRTC + per-PIPEDA-OPC + per-GDPR-DPIA + per-CCPA-DSAR + per-immutable-WORM canonical-audit.

Frequently asked questions

What is cross-location offer coordination for multi-banner franchise loyalty?

Cross-location offer coordination runs per-portfolio per-member per-banner per-offer per-canonical-per-member-per-banner-offer-state (per-pending-offer + per-sent-offer + per-opened-offer + per-clicked-offer + per-redeemed-offer + per-expired-offer + per-suppressed-offer + per-arbitrated-offer per-canonical-state) + per-canonical-per-channel-frequency-capping (per-email-cap + per-SMS-cap + per-push-cap + per-in-app-cap + per-direct-mail-cap + per-paid-social-retargeting-cap + per-call-cap per-canonical-channel) + per-canonical-per-tier-conflict-resolution + per-canonical-per-banner-arbitration + per-canonical-per-offer-eligibility-spec + per-canonical-per-offer-cooldown-spec + per-canonical-per-offer-cross-banner-suppression-spec + per-canonical-per-offer-cross-channel-deduplication + per-canonical-per-offer-policy-engine (per-OPA-Rego + per-AWS-Cedar + per-Casbin + per-Cerbos + per-Oso per-canonical-policy) + per-canonical-per-offer-multi-LLM-pre-send-check + per-canonical-per-offer-attribution-handoff + per-canonical-per-offer-audit-trail + per-portfolio audit-trail.

Why does per-vendor-Salesforce-Marketing-Cloud-canonical-single-banner-single-account break at multi-banner-multi-location franchise scale?

Per-vendor-Salesforce-Marketing-Cloud-canonical-single-banner-single-account ships per-account per-member per-journey per-message primitive. Per-vendor-Yotpo-canonical + per-LoyaltyLion-canonical + per-Smile-io-canonical + per-Annex-Cloud-canonical + per-Punchh-canonical + per-Open-Loyalty-canonical + per-Antavo-canonical + per-Friendbuy-canonical + per-Talon-One-canonical + per-Voucherify-canonical + per-Capillary-canonical + per-LoyaltyPlus-canonical + per-Eagle-Eye-canonical-single-banner-single-account ship per-vendor per-native single-banner single-account primitives. At 1-banner-3-location scale per-account per-member per-journey per-message primitive is enough. At multi-banner-multi-location franchise scale per-canonical-per-member-per-banner-offer-state + per-canonical-per-channel-frequency-capping + per-canonical-per-tier-conflict-resolution + per-canonical-per-banner-arbitration + per-canonical-per-offer-eligibility-spec + per-canonical-per-offer-cooldown-spec + per-canonical-per-offer-cross-banner-suppression-spec + per-canonical-per-offer-cross-channel-deduplication + per-canonical-per-offer-OPA-Cedar-Casbin-Cerbos-Oso-policy-engine + per-canonical-per-offer-multi-LLM-pre-send-check + per-canonical-per-offer-attribution-handoff + per-canonical-per-offer-audit-trail.

How does per-portfolio per-canonical-per-member-per-banner-offer-state + per-channel-frequency-capping work?

Per-portfolio per-canonical-per-member-per-banner-offer-state runs per-portfolio per-canonical-per-member-master-record-resolution (per-shared-email-hashed-SHA-256 + per-shared-phone-E.164 + per-shared-loyalty-ID + per-shared-payment-token + per-shared-device-ID per-canonical-deterministic) + per-canonical-per-member-cross-banner-identity-merge + per-canonical-per-member-cross-banner-tier-merge + per-canonical-per-member-per-banner-offer-state-machine (per-pending + per-sent + per-opened + per-clicked + per-redeemed + per-expired + per-suppressed + per-arbitrated per-canonical-state) + per-canonical-per-member-per-banner-offer-history-aggregation + per-canonical-per-member-per-banner-offer-LTV-attribution + per-canonical-per-member-per-banner-offer-redemption-rate-tracking. Per-canonical-per-channel-frequency-capping runs per-portfolio per-canonical-per-channel-frequency-cap-spec (per-email-cap + per-SMS-cap + per-push-cap + per-in-app-cap + per-direct-mail-cap + per-paid-social-retargeting-cap + per-call-cap per-canonical-channel) + per-canonical-per-channel-frequency-cap-window-spec (per-day + per-week + per-month + per-rolling-spec) + per-canonical-per-channel-frequency-cap-override-spec + per-canonical-per-channel-frequency-cap-tier-bonus-spec + per-canonical-per-channel-frequency-cap-VIP-override-spec.

What does per-portfolio per-canonical-per-tier-conflict-resolution + per-banner-arbitration + per-offer-eligibility + per-cooldown do?

Per-portfolio per-canonical-per-tier-conflict-resolution runs per-portfolio per-canonical-per-tier-conflict-spec (per-Brand-A-Gold-vs-Brand-B-Silver + per-banner-cross-tier-pricing-conflict + per-tier-benefits-conflict + per-tier-expiration-conflict per-canonical-conflict) + per-canonical-per-tier-conflict-resolution-rule (per-higher-tier-wins + per-most-recent-tier-wins + per-banner-of-origin-wins + per-portfolio-master-tier-wins + per-corp-override per-canonical-rule) + per-canonical-per-tier-conflict-resolution-audit-record. Per-canonical-per-banner-arbitration runs per-portfolio per-canonical-per-banner-arbitration-spec + per-canonical-per-banner-arbitration-priority-spec + per-canonical-per-banner-arbitration-context-spec (per-time-of-day + per-day-of-week + per-season + per-recent-redemption-banner + per-recent-engagement-banner per-canonical-context) + per-canonical-per-banner-arbitration-multi-LLM-decision-spec + per-canonical-per-banner-arbitration-confidence-spec + per-canonical-per-banner-arbitration-explainability-spec + per-canonical-per-banner-arbitration-FBC-feedback-spec. Per-canonical-per-offer-eligibility-spec runs per-portfolio per-canonical-per-offer-eligibility-rule (per-tier-eligibility + per-spend-threshold-eligibility + per-recency-eligibility + per-frequency-eligibility + per-geographic-eligibility + per-vertical-eligibility + per-banner-eligibility per-canonical-rule) + per-canonical-per-offer-eligibility-OPA-Cedar-Casbin-Cerbos-Oso-policy-engine + per-canonical-per-offer-eligibility-A/B-test. Per-canonical-per-offer-cooldown-spec runs per-portfolio per-canonical-per-offer-cooldown-window-spec (per-24-hour + per-3-day + per-7-day + per-14-day + per-30-day + per-90-day per-canonical-window) + per-canonical-per-offer-cooldown-cross-banner-spec + per-canonical-per-offer-cooldown-cross-channel-spec + per-canonical-per-offer-cooldown-tier-bonus-spec.

What does per-portfolio per-canonical-per-offer-cross-banner-suppression + per-cross-channel-deduplication + per-policy-engine + per-multi-LLM-pre-send do?

Per-portfolio per-canonical-per-offer-cross-banner-suppression-spec runs per-portfolio per-canonical-per-offer-cross-banner-suppression-window-spec + per-canonical-per-offer-cross-banner-suppression-tier-spec + per-canonical-per-offer-cross-banner-suppression-category-spec (per-spa-vs-gym-suppression + per-restaurant-vs-cafe-suppression + per-auto-repair-vs-tire-shop-suppression per-canonical-category) + per-canonical-per-offer-cross-banner-suppression-portfolio-override-spec. Per-canonical-per-offer-cross-channel-deduplication runs per-portfolio per-canonical-per-offer-cross-channel-deduplication-spec + per-canonical-per-offer-cross-channel-deduplication-window-spec + per-canonical-per-offer-cross-channel-deduplication-priority-spec (per-SMS-preferred + per-email-fallback + per-push-fallback per-canonical-priority) + per-canonical-per-offer-cross-channel-deduplication-tier-bonus-spec. Per-canonical-per-offer-OPA-Rego-AWS-Cedar-Casbin-Cerbos-Oso-policy-engine runs per-portfolio per-canonical-OPA-Rego-offer-policy + per-canonical-AWS-Cedar-offer-policy + per-canonical-Casbin-offer-policy + per-canonical-Cerbos-offer-policy + per-canonical-Oso-offer-policy + per-canonical-policy-bundle-versioning + per-canonical-policy-bundle-rollback + per-canonical-policy-bundle-A/B-test + per-canonical-policy-engine-decision-tracing + per-canonical-policy-engine-decision-explainability. Per-canonical-per-offer-multi-LLM-pre-send-check runs per-portfolio per-canonical-multi-LLM-ensemble (per-GPT-4o + per-Claude-Sonnet + per-Gemini-Pro per-canonical-LLM) + per-canonical-LLM-offer-policy-violation-detection + per-canonical-LLM-brand-voice-compliance + per-canonical-LLM-CASL-CCPA-GDPR-consent-check + per-canonical-LLM-confidence-scoring + per-canonical-LLM-self-consistency-cross-check.

What does per-portfolio per-canonical-per-offer-attribution-handoff + per-audit-trail + per-loyalty-management-agent-canonical-bundle do?

Per-portfolio per-canonical-per-offer-attribution-handoff runs per-portfolio per-canonical-per-offer-UTM-source-medium-campaign-term-content-spec + per-canonical-per-offer-gclid-fbclid-msclkid-ttclid-li_fat_id-preservation + per-canonical-per-offer-first-party-cookie-CHIPS-spec + per-canonical-per-offer-server-side-Meta-Conversions-API-Google-Enhanced-Conversions-Microsoft-UET-TikTok-Events-API-LinkedIn-Pinterest-Snapchat-Reddit-Conversions-API-spec + per-canonical-per-offer-cross-device-attribution + per-canonical-per-offer-cross-touchpoint-attribution-via-identity-resolution + per-canonical-per-offer-attribution-handoff-to-attribution-event-emission-skill + per-canonical-per-offer-attribution-handoff-to-LTV-math-primitives-skill. Per-canonical-per-offer-audit-trail runs per-portfolio per-canonical-per-offer-canonical-audit-record (per-offer-ID + per-member-ID + per-banner-ID + per-channel + per-frequency-cap-decision + per-tier-conflict-decision + per-banner-arbitration-decision + per-eligibility-decision + per-cooldown-decision + per-cross-banner-suppression-decision + per-cross-channel-deduplication-decision + per-policy-engine-decision + per-LLM-pre-send-decision + per-attribution-handoff-record + per-FCC-TCPA-CASL-PIPEDA-GDPR-CCPA-attestation per-canonical-audit-record) + per-canonical-FCC-TCPA-export + per-canonical-CASL-CRTC-export + per-canonical-PIPEDA-OPC-export + per-canonical-GDPR-DPIA-export + per-canonical-CCPA-DSAR-export + per-canonical-immutable-WORM-storage. Per-loyalty-management-agent-canonical-bundle integrates the cross-location-offer-coordination skill with sibling skills on the same agent: per-canonical-loyalty-management (parent commercial pillar at /loyalty-management) + per-canonical-cross-banner-loyalty-platform-integration (sibling commercial pillar at /cross-banner-loyalty-platform-integration) + per-canonical-per-tier-loyalty-journey-content (sibling commercial pillar at /per-tier-loyalty-journey-content) + per-canonical-subscriber-lifecycle-cadence (sibling commercial pillar at /subscriber-lifecycle-cadence) + per-canonical-per-member-monthly-clv (sibling commercial pillar at /per-member-monthly-clv) + per-canonical-tier-transition-timing (sibling commercial pillar at /tier-transition-timing) + per-canonical-per-member-next-best-action (sibling commercial pillar at /per-member-next-best-action). Per-canonical-cross-skill-flow: per-cross-location-offer-coordination consumes per-canonical-per-member-master-record from cross-banner-loyalty-platform-integration → emits per-canonical-per-member-per-banner-arbitrated-offer-decision → per-per-tier-loyalty-journey-content consumes per-canonical-per-member-per-banner-arbitrated-offer-decision and emits per-canonical-per-member-per-banner-per-tier-tailored-content → per-subscriber-lifecycle-cadence consumes per-canonical-per-member-per-banner-per-tier-tailored-content and emits per-canonical-per-member-per-banner-per-tier-per-lifecycle-cadence-message.

Engage the loyalty-management agent

Per-portfolio per-member per-banner per-offer per-canonical-per-member-per-banner-offer-state + per-per-channel-frequency-capping + per-per-tier-conflict-resolution + per-per-banner-arbitration + per-per-offer-eligibility-spec + per-per-offer-cooldown-spec + per-per-offer-cross-banner-suppression-spec + per-per-offer-cross-channel-deduplication + per-per-offer-OPA-Cedar-Casbin-Cerbos-Oso-policy-engine + per-per-offer-multi-LLM-pre-send-check + per-per-offer-attribution-handoff + per-per-offer-audit-trail + per-portfolio audit-trail shipped as the orchestration layer above your existing per-loyalty-management-vendor + per-customer-journey-orchestration-vendor + per-coupon-offer-engine-vendor + per-frequency-cap-vendor primitive.