# Authorize Source: https://docs.masivo.ai/api-reference/auth/authorize/get GET /auth/authorize Get an Access token to be able to call the api. This token should be kept secret and not exposed to the client. # Request TOTP Source: https://docs.masivo.ai/api-reference/auth/totp/post POST /auth/totp Some applications may need customers to authorize other systems on their behalf. With the 'totp' endpoint, customers can request a temporal code that other systems can use to confirm the customer identity. # Verify TOTP Source: https://docs.masivo.ai/api-reference/auth/totp/verify/get GET /auth/totp/verify Verify the TOTP token, if valid return matching customer # Get brands Source: https://docs.masivo.ai/api-reference/brands/get GET /brands Get all brands # Register customer Source: https://docs.masivo.ai/api-reference/customers/post POST /customers Register a customer. For anonymous customers, only the `id` and `is_anonymous: true` are required. Anonymous customers can later be identified using the `/customers/{id}/identify/anonymous` endpoint. # Introduction Source: https://docs.masivo.ai/api-reference/introduction Learn how to integrate your services with Masivo's REST API ## Welcome to Masivo If you are looking to make your customers accumulate & redeem rewards using Masivo, you are in the right place. This API reference will help you understand how to integrate your services with Masivo's REST API. Get started by creating and setting up an account on Masivo to get an API key. ## Authentication Masivo uses OAuth to authenticate request. First you need to get your account's API key from the dashboard. Go to **Settings -> Advance settings** and copy the API key. You will need to use the API key to request an **access token**. All requests to the API should include the access token in the `Authorization` header. Your API Key should never be exposed in a client facing application. Keep it secure in your services. Remember that access tokens expires after 1 hour. You will need to request a new access token after it expires. See our starter guide [Integrating with Masivo's API](/api-reference/guides/integrate-with-masivo) to use our authentication snippet. # Get platforms Source: https://docs.masivo.ai/api-reference/platforms/get GET /platforms Get all platforms # Get reward Source: https://docs.masivo.ai/api-reference/rewards/[id]/get GET /rewards/{id} Get a specific reward # Get rewards Source: https://docs.masivo.ai/api-reference/rewards/get GET /rewards Get all rewards. Rewards are created and managed from the dashboard; there is no API endpoint to create one. To reference a reward as a rule effect's reward_id when creating a campaign, first create it from the dashboard, then look up its id here. # Get customer gift cards Source: https://docs.masivo.ai/api-reference/rewards/gift-cards/get GET /customers/{id}/rewards/gift-cards Get customer gift cards # Redeem gift card Source: https://docs.masivo.ai/api-reference/rewards/gift-cards/redeem/delete Delete /rewards/gift-cards/redeem Mark a gift card as redeemed # Get tiers Source: https://docs.masivo.ai/api-reference/tiers/get GET /tiers Get all tiers # Automate customer lifecycle Source: https://docs.masivo.ai/case/automate-customer-lifecycle Learn how to automate the customer lifecycle using Masivo This page is a work in progress. Feel free to check back later to see if it’s available. # Get to know your customers Source: https://docs.masivo.ai/case/get-to-know-your-customers Masivo is a powerful tool to get to know your customers better. Learn how to use it to improve your business. This page is a work in progress. Feel free to check back later to see if it’s available. # Improve RFM score Source: https://docs.masivo.ai/case/improve-rfm-score Learn how to improve your RFM score using Masivo This page is a work in progress. Feel free to check back later to see if it’s available. # Increase customer engagement Source: https://docs.masivo.ai/case/increase-customer-engagement Using Masivo you can increase customer engagement, learn how to use it to improve your business. This page is a work in progress. Feel free to check back later to see if it’s available. # Reduce customer churn Source: https://docs.masivo.ai/case/reduce-customer-churn Learn how to reduce customer churn using Masivo This page is a work in progress. Feel free to check back later to see if it’s available. # Segment customers Source: https://docs.masivo.ai/case/segment-customers Learn how to segment your customers using Masivo This page is a work in progress. Feel free to check back later to see if it’s available. # Comparison Source: https://docs.masivo.ai/comparison Compare Masivo's features and capabilities with other loyalty platforms ## Masivo vs. Marigold Cheetah Digital: A Comparative Overview While both Masivo and Marigold Cheetah Digital aim to enhance customer engagement and drive sales, each platform offers unique strengths tailored to different business needs. Here's how Masivo stands out in its simplicity and effectiveness compared to Marigold Cheetah Digital: ### 1. Focus **Masivo:** Masivo prioritizes simplicity and effectiveness in its approach to customer engagement. It specializes in running straightforward and highly effective campaigns that leverage rewards such as loyalty points and discounts to incentivize customer actions. This focused approach ensures that businesses can quickly implement and see results from their marketing efforts. **Marigold Cheetah Digital:** Marigold Cheetah Digital offers a comprehensive suite of marketing solutions, including email marketing, loyalty programs, and personalized messaging. While this breadth may be suitable for larger enterprises with diverse marketing needs, it can also introduce complexity that may not be necessary for businesses seeking a more streamlined solution. ### 2. Campaigns and Rewards **Masivo:** Masivo excels in simplicity and effectiveness when it comes to running campaigns and managing rewards. Its user-friendly interface and straightforward campaign setup process make it easy for businesses to launch targeted campaigns that drive results. By focusing on rewards-based incentives like loyalty points and discounts, Masivo ensures that businesses can quickly engage and retain customers without unnecessary complexity. **Marigold Cheetah Digital:** While Marigold Cheetah Digital also offers campaign management and rewards functionality, its broader range of marketing features may introduce complexity that some businesses may find overwhelming. While suitable for enterprises with diverse marketing needs, this complexity can hinder the effectiveness and simplicity that Masivo offers. ### 3. Integration and Customization **Masivo:** Masivo's simplicity extends to its integration and customization capabilities. As a headless service, it seamlessly integrates with existing storefront applications, allowing businesses to tailor the customer experience to their specific needs and branding preferences without unnecessary complexity. **Marigold Cheetah Digital:** While Marigold Cheetah Digital offers integration capabilities, its broader range of features may require more extensive customization efforts to achieve the desired results. This complexity may pose challenges for businesses seeking a simple and effective solution like Masivo. In summary, Masivo stands out for its simplicity and effectiveness in driving customer engagement and sales through straightforward campaigns and rewards management. While Marigold Cheetah Digital offers a broader range of marketing solutions, businesses seeking a streamlined approach will find Masivo's simplicity and focus on effectiveness to be highly appealing. # Brands Source: https://docs.masivo.ai/concepts/brands Learn what brands are and how they can help you create a successful loyalty program. You may manage several brands that need to use the same loyalty program. Brands help you distinguish which brand is offering a reward to a customer. This is useful for tracking how much each brand is spending on rewards and how much each brand is earning. Each brand can have its own rewards and campaigns if desired, ensuring that rewards are only given to the intended brand. Alternatively, you can share rewards and campaigns between brands. # Campaigns Source: https://docs.masivo.ai/concepts/campaigns Learn what campaigns are and how they can help you create a successful loyalty program. Campaigns are how you distribute rewards to your customers. They also allow you to track your spending on rewards and determine the scenarios in which a customer is eligible to receive them. Some examples of campaigns are: * Double points on purchases made on Tuesdays. * 2x1 on all products in the store. * Gold tier customers get a 10% discount on their next purchase. To learn how to create a campaign, see our [Launch a campaign guide](/guides/launch-a-campaign). ## Campaigns in Masivo * Each campaign can be configured to offer any amount of rewards to any customer following the rules you setup. * Rewards offered in a campaign can set their own expiration and how many they will be distributed per event. * Campaigns must offer at least one reward per rule. * Masivo will track how many rewards were distributed and how many were redeemed. * You can set budgets to control how much you spend on rewards redemption. ## Tier eligibility The **Tiers** field in E-commerce is a global eligibility scope. When tiers are selected, only customers whose current tier is included can earn from the campaign. Leaving it empty allows every tier and customers without a tier. This scope is applied before campaign rules. Coupon campaigns can also use the singular **Customer tier** condition inside a rule; when both are configured, both restrictions must match. Eligibility uses the customer's tier at the start of event processing, before any tier transition caused by that event. ## Types of campaigns Similarly to rewards, you can create different types of campaigns. Currently we support: 1. [Behavior](/concepts/campaigns/#behavior) 2. [Coupons](/concepts/campaigns/#coupons) 3. [Punch cards](/concepts/punch-cards) 4. [Referrals](/concepts/referrals) Specialized campaign types with dedicated guides: * [Score Streaks](/concepts/score-streaks) — reward consistent behavior with milestone tiers and time windows ### Behavior Behavior campaigns are campaigns that are triggered by a customer event. For example, a purchase, filling out a survey, or signing up to your platform. You can send any event you would like. Masivo will track the event and apply the rules you set to distribute the rewards. Only matching events will trigger the campaign. ### Coupons Coupons campaigns are campaigns that are triggered by a customer redeeming a coupon code. You can create a coupon codes and set the rules for it to be redeemed. When a customer redeems the coupon, the campaign will be triggered and the rewards will be accumulated in the customer's wallet. ### Punch cards Punch card campaigns are digital stamp cards triggered by a customer event. See [Punch Cards](/concepts/punch-cards) for punches, card limits, and per-punch rewards. ### Referrals Referral campaigns let customers invite others with a referral code. See [Referrals](/concepts/referrals) for codes, referrer vs referee rewards, and use limits. ## Campaigns comparison | | Flexible | Ease of use | Preferred by customers | | - | - | - | - | | [Behavior](/concepts/campaigns/#behavior) | ✅ | ✅ | | | [Coupons](/concepts/campaigns/#coupons) | | ✅ | ✅ | | [Punch cards](/concepts/punch-cards) | | ✅ | ✅ | | [Referrals](/concepts/referrals) | ✅ | | ✅ | # Catalogs Source: https://docs.masivo.ai/concepts/catalogs Store product or content rows for personalization and selections. Catalogs hold tabular data (items with an `id` and custom fields) per account. Create catalogs from the dashboard using your e-commerce products, or manage catalogs and items through the Storefront API. Define **selections** with filters, sort, and a results limit. ## Limits * Storage: 500 MB total catalog item payload per account. * Up to 1000 catalogs per account. * Selections: up to 30 per catalog, 10 filters each, results limit 1–50. # Channels Source: https://docs.masivo.ai/concepts/channels Learn what channels are and how they can help you create a successful loyalty program. Channels are the means through which you distribute your goods and services to customers. You can synchronize your e-commerce channels with Masivo to track customer behavior and create advanced filtering rules. For example, you can set up a campaign that rewards customers who make a purchase through a specific channel. # Customers Source: https://docs.masivo.ai/concepts/customers Learn what customers are in Masivo. Customers are the people who interact with your business. However Masivo only counts as customers those who have signed up to your platform. This allows you to track their behavior and reward them for their loyalty. Learn how to register a customer in our [Tracking customer activity guide](/guides/track-customer-activity). # Customer events Source: https://docs.masivo.ai/concepts/events Learn what events are in Masivo. Events are the actions that your customers take that trigger certain campaigns of type behavior. For example, a purchase, filling out a survey, or signing up to your platform. You can send any event you would like. Masivo will track the event and apply the rules you set to distribute the rewards. Only matching events will trigger certain campaigns. When a customer submits a [review](/concepts/review-forms) through the Storefront API, Masivo creates a resolved **`REVIEW`** event linked to that submission. Use it to track feedback alongside purchases and other behavior events. # In-app messages Source: https://docs.masivo.ai/concepts/in-app-messages Deliver personalized messages inside your mobile app through templates, journeys, and the Storefront API. In-app messages let you show modals, banners, and bottom sheets inside your mobile app. Templates are created in the Masivo dashboard; your app fetches eligible messages and reports impressions through the Storefront API. ## How in-app messages work ```mermaid theme={null} flowchart LR T[Template created] --> M[Message materialized] M --> F[App fetches eligible messages] F --> S[App shows message] S --> E[App logs shown / clicked / dismissed] E --> A[Analytics & tracking events] ``` Messages are **materialized per customer** when a template is scheduled to an audience, sent as a test, or delivered through a journey. Each row in `inapp_messages` stores the rendered content, display rules, and delivery metadata. Your mobile app: 1. Calls `GET /inapp/capabilities` to know whether in-app is enabled and which journey event types support real-time delivery. 2. Calls `GET /customers/{id}/inapp-messages` after app open or when a trigger event fires. 3. Renders the message using the `type` and `content` fields. 4. Calls `POST /customers/{id}/inapp-messages/{messageId}/events` for each impression action. ## Message lifecycle ```mermaid theme={null} stateDiagram-v2 [*] --> pending: Message materialized pending --> shown: shown event (under cap) pending --> clicked: clicked event pending --> dismissed: dismissed event shown --> pending: shown event (more impressions left) shown --> clicked: clicked event shown --> dismissed: dismissed event pending --> expired: expires_at passed clicked --> [*] dismissed --> [*] expired --> [*] ``` | Status | Description | | - | - | | `pending` | Eligible for display; may still accept more `shown` events if under `max_impressions` | | `shown` | Last action was `shown` and impression cap was reached | | `clicked` | Customer tapped a button or primary action | | `dismissed` | Customer closed the message | | `expired` | `expires_at` is in the past | ## Message types | Type | Use case | | - | - | | `modal` | Centered dialog over the current screen | | `fullscreen` | Full-screen takeover | | `slideup` | Bottom sheet style panel | | `banner` | Top or bottom banner | ## Template configuration | Field | Type | Description | | - | - | - | | `name` | `string` | Unique template name per account | | `message_type` | enum | One of the message types above | | `content.title` | `string` | Headline text | | `content.body` | `string` | Main copy (required in dashboard) | | `content.image_url` | `string` | Optional hero image URL | | `content.buttons` | array | Primary, dismiss, and deeplink buttons | | `display_rules.max_impressions` | `number` | Max times a customer can see the message (default 1) | | `display_rules.min_interval_seconds` | `number` | Minimum gap between `shown` events | | `display_rules.priority` | `number` | Higher values win when multiple messages are eligible | | `team_ids` | `string[]` | Restrict analytics visibility to assigned teams | | `variants` | array | Up to 4 optional content versions. Journey actions must pick one when more than one exists. Scheduled sends use a weight distribution that sums to 100%. | ## Delivery sources | Source | Trigger | | - | - | | `scheduled` | Audience schedule from the dashboard | | `test` | Test send to a selected audience | | `journey` | Journey node with an in-app action | Journey-connected templates can also trigger **real-time delivery**: when a qualifying event is emitted, Masivo materializes the message and sends a silent push to customers with a registered device token and push consent. Your app should handle that payload and refresh via `GET /customers/{id}/inapp-messages`. Use `GET /inapp/capabilities` to read the supported `eventTypes`. ## Tracking events Each impression action emits a resolved tracking event: | Action | Event type | | - | - | | `shown` | `INAPP_SHOWN` | | `clicked` | `INAPP_CLICKED` | | `dismissed` | `INAPP_DISMISSED` | Pass optional `metadata` (for example `button_id`) on click events for button-level analytics. ## Comparison with push notifications | | In-app messages | Push notifications | | - | - | - | | Surface | Inside the app UI | OS notification tray | | Requires device token | Only for real-time silent push (journeys); not for on-open fetch | Yes | | Rich layout | Full templates (modal, banner, slideup, fullscreen) | Title, body, image, deeplink | | Real-time trigger | Journey events + silent push refresh | FCM/APNs delivery | | Impression tracking | Explicit API events | Open/delivery analytics | ## Related documentation * [In-app messages](/guides/create-in-app-templates) — dashboard setup * [Template variants](/guides/template-variants) — A/B testing on templates * [Integrate in-app messages](/guides/in-app-messages) — end-to-end app integration * [Integrate in-app messages](/api-reference/guides/integrate-in-app-messages) — Storefront API reference guide # Index Source: https://docs.masivo.ai/concepts/index Learn about the main concepts behind Masivo and how they can help you create a successful loyalty program. Rewards are digital assets that can be redeemed by customers A distribution & tracking mechanism for rewards Reward consistent behavior with milestone streaks Digital stamp cards with rewards on specific punches Invite codes that reward referrers and referees Personalized messages inside your mobile app Reusable questionnaires and structured feedback via API Reward your most loyal customers with exclusive benefits Register & manage your customers A digital wallet to store rewards Events can be use to trigger some campaigns & track customer behavior Keep a record of all rewards distributed & redeemed Manage multiple brands under a single loyalty program Integrate with your e-commerce products Integrate with your e-commerce stores Integrate with your e-commerce distribution channels Organize members and scope analytics visibility Operational custom-event archiving pipeline # News Feed Source: https://docs.masivo.ai/concepts/news-feed Persistent in-app cards resolved from live templates for eligible customers. News Feed cards are persistent in-app content. Unlike overlay in-app messages, a card remains eligible until its assignment expires or the customer dismisses it. ## How News Feed works Cards are assigned to one customer, to an audience, or globally. The Storefront API resolves those assignments against the active template every time the feed is requested. ```mermaid theme={null} flowchart LR T[Active template] --> A[Journey or scheduled assignment] A --> E{Eligible now?} E -- No --> Skip[Omitted] E -- Yes --> F[GET customer news feed] F --> R[Resolve live template content] R --> UI[Render in the app] UI --> I[Log shown, clicked, or dismissed] I --> S[Customer read state] ``` Audience assignments are evaluated against current audience membership. If a customer leaves the audience, that assignment no longer makes the card eligible. Editing an active template changes the content returned for every existing assignment because assignments store a template reference rather than a content copy. ## Card lifecycle ```mermaid theme={null} stateDiagram-v2 [*] --> Assigned: Journey or scheduled publication Assigned --> Visible: Eligible feed request Visible --> Visible: shown or clicked Visible --> Dismissed: dismissed Assigned --> Expired: expires_at reached Dismissed --> Visible: newer assignment created Expired --> [*] Dismissed --> [*] ``` | State | Stored signal | Behavior | | - | - | - | | Assigned | `news_feed_by_customer` row | Targets a customer, audience, or the whole account | | Visible | Active assignment and active template | Returned by `GET /customers/{id}/news-feed` | | Shown | `shown_at` | Records an impression without removing the card | | Clicked | `clicked_at` | Records a click without removing the card | | Dismissed | `dismissed_at` | Hidden until a newer assignment of the same template exists | | Expired | `expires_at` is in the past | Excluded from the feed and later deleted by cleanup | Tracking emits `NEWS_FEED_ASSIGNED`, `NEWS_FEED_SHOWN`, `NEWS_FEED_CLICKED`, and `NEWS_FEED_DISMISSED` events. ## Configuration | Field | Type | Allowed values | Description | | - | - | - | - | | `name` | `string` | Non-empty | Internal template name | | `status` | `string` | Account status values | Only `ACTIVE` templates are returned | | `description` | `string` | Optional | Internal description | | `brand_id` | `string \| null` | Optional | Restricts the card to a brand | | `campaign_id` | `uuid \| null` | Optional | Associates analytics with a campaign | | `card_type` | `string` | `classic`, `captioned_image`, `image_only` | Controls which content fields the editor requires | | `content_title` | `string` | Required for classic and captioned image | Card title | | `content_body` | `string` | Required for classic and captioned image | Card message | | `content_image_url` | URL | Required for captioned image and image only | Card image or classic icon | | `content_link_url` | URL | Optional | Destination opened by the card | | `content_link_text` | `string` | Optional | Link label | | `content_pinned` | `boolean` | `true`, `false` | Places the card before unpinned cards | | `priority` | `integer` | Optional | Orders cards within the pinned group | | `expiration_days` | `integer` | `1`–`30` | Duration calculated from assignment creation | | `team_ids` | `string[]` | Up to 20 ids | Limits dashboard access to teams | | `news_feed_default_expiration_days` | `integer` | `1`–`30` | Account fallback when a template has no expiration | | `variants` | array | Up to 4 | Optional A/B content versions. Journey actions must pick one when more than one exists. Scheduled sends use a weight distribution that sums to 100%. | The public feed endpoint accepts `limit` from 1 to 50 for each request; there is no separate account-level feed size setting. ## Eligibility and ordering The feed combines three assignment branches: 1. Direct customer assignments, including journey actions and test sends. 2. Global assignments with no customer or audience target. 3. Audience assignments when the customer is currently a member. Duplicate branches for the same template are collapsed. A non-expiring assignment keeps the combined card non-expiring. Cards are ordered by pinned state, numeric priority, and newest assignment time. ## Operations and cleanup `POST /api/cron/marketing_automation/news_feed/cleanup` deletes expired assignments in batches of 5,000. It also deletes stale read-state rows after a seven-day grace period when no direct, global, or current-audience assignment still covers the customer and template. Template expiration changes enqueue a batched recomputation of `expires_at` for existing assignments. ## Comparison with in-app messages | | News Feed | In-app messages | | - | - | - | | Surface | Persistent feed | Overlay, banner, modal, or custom code | | Storage | Assignment references a live template | Per-customer message rows | | Audience membership | Resolved live | Materialized at delivery time | | Dismissal | Hidden until a newer assignment | Message state becomes dismissed | | Public fetch | `/customers/{id}/news-feed` | `/customers/{id}/inapp-messages` | | Interaction endpoint | Uses template id | Uses message id | # Products Source: https://docs.masivo.ai/concepts/products Learn what products are in Masivo. Products are the physical goods and services you sell. You can synchronize your e-commerce products with Masivo to create advanced filtering rules. For example, you can set up a campaign that rewards customers whose orders include a specific product. With Products you can also offer them as rewards in your campaigns. For example, you can create a campaign that rewards customers with a free product when they spend a certain amount of money. # Service forms Source: https://docs.masivo.ai/concepts/review-forms Learn what service forms are in Masivo and how to collect structured feedback through the API. Service forms let you define reusable questionnaires in the Masivo dashboard and collect answers from your apps, websites, or integrations through the Storefront API. Each form stores its field schema in Masivo; your client renders the UI and submits reviews. The dashboard calls them **service forms**. Existing API paths and permission keys keep the technical `review-forms` and `review_forms` names for compatibility. Common use cases include post-purchase ratings, NPS-style surveys, comment threads, and custom feedback flows. To create and manage service forms in the dashboard, see the [Create and manage service forms guide](/guides/create-and-manage-review-forms). To integrate programmatically, see [Submit reviews](/api-reference/guides/submit-reviews). ## Form types vs field types **Form type** describes the overall intent of the review form. It is metadata for your team and does not change API validation by itself: | Form type | Typical use | | - | - | | `RATING` | Star or numeric satisfaction surveys | | `COMMENT` | Open feedback | | `THREAD` | Multi-step or conversational flows | | `CUSTOM` | Any other structured feedback | **Field types** define how each answer is validated when a review is submitted. Answers are always keyed by the field **`name`** (not an internal id). | Field type | Answer shape | Validation | | - | - | - | | `SCORE` | Number | Between `min` and `max` (defaults: 1–5) | | `TEXT` | String | Free text | | `SELECT` | String | Must match one `options[].value` | | `MULTI_SELECT` | Array of strings | Each value must be in `options[].value` | ## Field images Each field can include up to **5 images** (for example, icons for a score scale). Images are stored as public URLs from your account **multimedia** library, plus an optional `alt` text for accessibility. ## Lifecycle and visibility | Status | Dashboard | Storefront API | | - | - | - | | `ACTIVE` | Visible | `GET /review-forms/{id}` returns the review form | | `INACTIVE` | Visible | Treated as not found (`404`) | Deleting a review form in the dashboard performs a soft delete and sets the form to inactive. ## Ticket automation Service forms can open a support ticket from the responses they receive. Enable **Ticket automation** in the form settings, pick the pipeline and priority the generated tickets should use, and decide which responses deserve a ticket. | Setting | Default | Description | | - | - | - | | `enabled` | `false` | Turns the automation on for this form | | `pipeline_id` | — | Explicit pipeline for generated tickets; required when automation is enabled | | `priority` | `medium` | Priority applied to every generated ticket | | `trigger` | `always` | `always` opens a ticket per response; `conditions` filters them | | `conditions` | `[]` | Condition groups evaluated against the response | The ticket title comes from the form name and the description is a recap of the submitted answers. The response is linked to the ticket, so agents can open the original submission from the ticket detail. ### Conditions Conditions use the same rule set as campaigns, rewards, and journeys: `conditions` is a list of groups, every condition inside a group must match (**AND**), and any group matching is enough to open the ticket (**OR**). | Condition type | Reads | Operators | | - | - | - | | `Response answer` | The answer named in `field` | Depend on the field type, see below | | `Response sentiment score` | The AI sentiment score of the response (0-100) | `greater than`, `less than`, `equal to`, and their variants | | `Response emotion` | The emotions the AI detected in the response | `is` (detected), `is not` (not detected) | | `Response risk flag` | The risk flags the AI detected in the response | `is` (detected), `is not` (not detected) | `Response answer` is only offered when the form has at least one field, and the operators follow the type of the answer you pick: | Field type | Operators | Value | | - | - | - | | `SCORE` | `greater than`, `greater than or equal to`, `less than`, `less than or equal to`, `equal to`, `not equal to` | Number between the field `min` and `max` | | `TEXT` | `equal to`, `not equal to`, `contains`, `starts with`, `ends with` | Free text | | `SELECT`, `MULTI_SELECT` | `equal to`, `not equal to` | One of the configured options | Answers that arrive empty never match, so a missing field cannot open a ticket on its own. On multi-select answers, `equal to` matches when the value is one of the selected options. Text comparisons ignore letter casing. ```json theme={null} { "enabled": true, "priority": "high", "trigger": "conditions", "conditions": [ [ { "primitive": "custom", "type": "Response answer", "field": "score", "operator": "less than or equal to", "value": "2" } ], [ { "primitive": "custom", "type": "Response risk flag", "operator": "is", "value": "churn_risk" } ] ] } ``` Answer conditions are evaluated as soon as the response is stored. Conditions that read the AI analysis (sentiment, emotions, risk flags) are evaluated when the review analysis job processes the response, so those tickets appear a few minutes later. A group whose answer conditions already fail is discarded without waiting for the analysis, and a group that fully matches on answers opens the ticket right away. Ticket creation runs after the response is stored: if the pipeline or the routing is misconfigured, the response is still saved and the API keeps returning `201`. New tickets are assigned to the available agent with the lightest open load, respecting each agent's maximum open tickets. Accounts without a configured agent roster get unassigned tickets. ## Events and analytics Every successful review submission creates a resolved **`REVIEW`** [customer event](/concepts/events) linked to the review. You can use `source`, `platform`, `brand_id`, `store_id`, and `channel_id` on the review for attribution, similar to other storefront activity. Anonymous reviews are supported: omit `customer_id` in the API request. The review row stores `customer_id` as `null`, while the linked event uses the review id as the customer identifier for tracking. ## Review analysis operations Masivo can process submitted reviews with an internal AI cron route and store validated review analysis in the `reviews.review_analysis` JSON column. The job is not trigger-based. It is designed to be scheduled externally, typically every five minutes, and processes up to 50 reviews per run using a Redis cursor. The processor: * reads new review rows from `reviews` * analyzes answer content, including score-only reviews * validates strict JSON output against the configured analysis catalog * stores `pending`, `processed`, or `failed` status per review * updates the source review row, including `updated_at`, so review backfills can sync AI changes * records AI validation errors for debugging New responses take priority in each run. The remaining slots go to reviews that need another attempt: those left in `failed`, and those stuck in `pending` because a previous run was interrupted. Each attempt increases `retryCount`, and a review stops being picked up after 3 of them, so a permanently broken response cannot block the queue. A successful analysis resets `retryCount` to 0. Because ticket automation runs right after the analysis, recovering a failed analysis also recovers the ticket that was waiting for it. The operational route is: `POST /api/cron/analytics/review-analysis` It requires the standard `x-masivo-cron-auth` header. Passing `force: true` resets the Redis cursor so processing starts from the beginning again. ## Permissions Access to the Service forms section in the dashboard is controlled by the **`review_forms`** role resource: * **read** — view service forms and reviews * **write** — create and edit service forms * **delete** — delete service forms Configure permissions under **Settings → Roles**. # Rewards Source: https://docs.masivo.ai/concepts/rewards Learn what rewards are and how they can help you create a successful loyalty program. Rewards are the incentives you offer to your customers to encourage them to engage with your loyalty program. You can use rewards in many ways to drive customer behavior and increase customer lifetime value. To learn how to create a reward, see our [Creating a reward guide](/guides/create-rewards). ## Rewards in Masivo * Rewards in Masivo are distributed through campaigns. * The amount of rewards and expiration date can be set in the campaign. * Every reward may contain conditions that must be met to be redeemed. * You can create as many rewards of any type as you need. * All rewards are accumulated in the customer's wallet. ## Tier eligibility The **Tiers** field in E-commerce controls who can redeem a reward. Leaving it empty allows customers in any tier, including customers without a tier. When tiers are selected, the customer's current tier must be included. Rewards stored in wallets are snapshots: changing a reward tier scope affects an existing wallet reward only after the existing wallet update flow replaces that snapshot. ## Types of rewards In Masivo, you can create different types of rewards. Currently we support: 1. [Points](/concepts/rewards/#points) 2. [Discounts](/concepts/rewards/#discounts) 3. [Gift cards](/concepts/rewards/#gift-cards) 4. [Products](/concepts/rewards/#products) There will be other types of rewards in the future, so stay tuned! ### Points Points are usually given for purchases or other actions you want to encourage. Customers can accumulate these points and redeem them for rewards. With Masivo, you can decide how much each point is worth. For example, you can make 1 point equal to \$0.10. Sometimes, you might want to have more than one currency of point. This is helpful if you want to make some rewards more special than others. One type of point might be easier to earn than the other. ### Discounts Discounts are a great way to encourage customers to make a purchase. You can offer discounts in many ways, such as: #### By criteria * Order value * Product in order * Discounted shipping #### By value * Percentage off * Fixed amount off #### By condition * Purchase in given store * Purchase in given channel * Purchase in given time * Purchase higher than given amount ### Gift cards Gift cards are another great way to encourage customers to make a purchase. Gift cards are typically used as a gift for someone else, this promote your brand to new customers. In Masivo each gift card contains a code that can be redeemed in physical stores. You can configure as many gift card codes as you need. Just make sure your physical store knows how to use those codes. ### Products Don't confuse Product rewards with products. Your e-commerce products are use as rewards in rewards of type product. Product rewards are a great way to promote new products or clear out old stock. You can offer product rewards in two ways: 1. **Adding a product to the order** - When you want to give a free product to the customer. 2. **Replacing a product in the order** - When you want to replace a product in the order with a cheaper version of the same item, or if you offer the original product bundled with another for the same price. Product rewards may have conditions that must be met to be redeemed. This is useful when you would like to offer a product reward only if the customer buys a specific product or spends a certain amount. For example: * Buy a pair of shoes and get a free pair of socks. * Spend \$100 and get a free t-shirt. * 2x1 on Tuesdays. ## Rewards comparison | | Cheap | Flexible | Ease of use | Preferred by customers | | - | - | - | - | - | | [Points](/concepts/rewards/#points) | ✅ | ✅ | | | | [Discounts](/concepts/rewards/#discounts) | | ✅ | ✅ | ✅ | | [Gift cards](/concepts/rewards/#gift-cards) | ✅ | ✅ | ✅ | | | [Products](/concepts/rewards/#products) | | | | ✅ | # Score Streaks Source: https://docs.masivo.ai/concepts/score-streaks Reward customers for consistent behavior by building streaks that unlock milestone rewards. Score Streaks are a campaign type that tracks how consistently a customer repeats a specific action over time. Each qualifying event extends the streak and increases the customer's score. When the score reaches a configured milestone, rewards are automatically granted. ## How score streaks work A score streak campaign tracks three layered ideas: **time windows (periods)**, **consecutive activity (streaks)**, and **cumulative score (milestones)**. ```mermaid theme={null} flowchart LR E[Customer event] --> S{Qualifies?} S -- No --> Skip[Ignored] S -- Yes --> P{Period expired?} P -- Yes --> Loss[Cycle lost\nNew cycle starts] P -- No --> Gain[Score +1\nPeriod extended] Loss --> Gain Gain --> M{Milestone\ncrossed?} M -- Yes --> Reward[Reward granted] M -- No --> Done[Done] ``` ### Periods and loss conditions Every time a customer earns a score point, the campaign opens a **period window** — a countdown timer during which the customer must send the next qualifying event to keep the streak alive. If the timer runs out before the next event, the cycle is **lost**: the streak resets to zero and a new cycle begins. The loss window is defined by `loss.conditions[0]`: ```json theme={null} { "type": "NO_TRIGGER_EVENT_WITHIN", "amount": 1, "unit": "DAYS" } ``` Supported units: `MINUTES`, `HOURS`, `DAYS`, `WEEKS`, `MONTHS`. ### Cycles A **cycle** is one continuous run of activity without a loss. Each loss or reset starts a fresh cycle identified by a new `current_cycle_id`. This means multiple cycles can exist in a single streak record over its lifetime, and the history events are stamped with the cycle they belong to. ### Milestones Rules in a score streak campaign define **score thresholds** that trigger rewards. When a customer's `current_score` reaches or exceeds a milestone, that milestone's effects (rewards) are granted once per milestone per cycle. ``` Score 1: Milestone reward (first milestone) Score 5: Higher milestone reward Score 10: Highest milestone reward Score 11: Highest milestone reward again (repeats) ``` If the score crosses multiple milestones at once (e.g. from 0 to 5), only the highest applicable milestone fires. ### Scheduled resets Optionally, a campaign can define a **reset calendar** that forcefully closes the active cycle on a schedule — daily, weekly, or monthly. This is independent of the loss condition: a customer with a perfect streak will still be reset on the configured date. ```json theme={null} { "enabled": true, "calendar": { "frequency": "MONTHLY", "day_of_month": 1 } } ``` ## Score streak lifecycle ```mermaid theme={null} stateDiagram-v2 [*] --> Active: First qualifying event Active --> Active: Qualifying event within period Active --> Lost: Period expired (cron) Lost --> Active: Next qualifying event Active --> Reset: Scheduled reset date Reset --> Active: Next qualifying event Active --> Closed: Campaign ended Closed --> [*] ``` | State | Description | | - | - | | `ACTIVE` | Customer has an active streak in progress | | `CLOSED` | Campaign ended; streak is archived | History events stored in the `events` JSON column: | Type | Trigger | | - | - | | `GAIN` | Qualifying event processed; score incremented | | `MILESTONE` | Score crossed a milestone threshold | | `LOSS` | Period expired without a qualifying event | | `RESET` | Scheduled reset fired | | `MANUAL_RESET` | Support agent triggered a manual reset | | `EVENT_REVERSAL` | A source event was reversed, rolling back the associated score gain | ## Campaign configuration | Field | Type | Description | | - | - | - | | `trigger` | `string` | Event type that increments the score (e.g. `"PURCHASE"`) | | `privacy` | `"PRIVATE" \| "PUBLIC"` | Controls visibility in public-facing APIs | | `loss.conditions[0].type` | `"NO_TRIGGER_EVENT_WITHIN"` | Always this value | | `loss.conditions[0].amount` | `number` | How many units before the streak is lost | | `loss.conditions[0].unit` | `"MINUTES" \| "HOURS" \| "DAYS" \| "WEEKS" \| "MONTHS"` | Time unit | | `reset.enabled` | `boolean` | Whether scheduled resets are active | | `reset.calendar.frequency` | `"DAILY" \| "WEEKLY" \| "MONTHLY"` | Reset cadence | | `reset.calendar.week_starts_on` | `0–6` | First day of week (0 = Sunday). Required when `WEEKLY` | | `reset.calendar.day_of_month` | `1–31` | Day of month for reset. Required when `MONTHLY`. Clamped to last day for short months | ## Milestone rules Each rule in a score streak campaign must have a `milestone` score value. When the customer's score reaches that value within a cycle, the rule's effects are applied. Multiple rules can define different reward tiers: ```json theme={null} { "rules": [ { "milestone": 1, "conditions": [], "effects": [{ "type": "POINTS", "amount": 10 }] }, { "milestone": 5, "conditions": [], "effects": [{ "type": "POINTS", "amount": 50 }] }, { "milestone": 10, "conditions": [], "effects": [{ "type": "POINTS", "amount": 200 }] } ] } ``` * Conditions in milestone rules are ignored; only `milestone` and `effects` matter. * When the score reaches milestone 10, only that rule fires — the lower milestones (1, 5) do not fire again for the same score. * If a score crosses a milestone for the first time in a cycle, the reward is granted. If the same milestone is crossed again later in the same cycle (e.g. after a reversal), the reward is granted again. ## Event reversal behavior When a source event is reversed: 1. All `GAIN` and `MILESTONE` history events from that source are marked `reversed_at`. 2. An `EVENT_REVERSAL` history event is appended with the negative score delta. 3. If the reversed event was in the **active cycle**, `current_score`, `current_streak`, `period_score`, and `period_event_count` are decremented. 4. The `highest_milestone_score` is recalculated from surviving milestone events. 5. If the score drops below a previously reached milestone, re-triggering the qualifying event will grant the milestone reward again. Reversal is idempotent: reversing the same event twice has no additional effect. ## Manual admin reset Support operators can force-reset a customer's active streak cycle without waiting for the loss cron or a scheduled reset. This appends a `MANUAL_RESET` history event, starts a new `current_cycle_id`, and zeros score counters for the active cycle. **Endpoint (internal):** `POST /api/admin/score-streaks/reset` | Field | Description | | - | - | | `account_id` | Account UUID | | `campaign_id` | Score streak campaign UUID | | `customer_id` | Customer external id | | `reason` | Audit reason stored in history (for example `Support requested reset`) | | `actor_id` | Optional operator id for the audit trail | Requires the `checksum` header with the `CRON_AUTH_SECRET` value. This endpoint is not part of the public Storefront API. ## Comparison with punch cards | | Score Streaks | Punch Cards | | - | - | - | | Trigger | Any event type | Any event type | | Progress unit | Score (unlimited) | Punches (capped) | | Completion | Milestones (repeating) | Single completion | | Time pressure | Loss window + optional reset | None | | Event history | Full JSON log | None | | Reversal | Score rollback | Standard wallet | | Cron required | Yes (expire lost streaks) | No | # Smart Archiver Source: https://docs.masivo.ai/concepts/smart-archiver Operational overview of Masivo's custom-event archiving pipeline. Smart Archiver moves aged **custom events** from the `events` table into compressed Parquet files in object storage, then optionally deletes the database rows. It keeps query performance stable for high-volume accounts without losing historical data. Smart Archiver is an **internal operational feature**. It is not exposed on the public Storefront API. This page documents behavior for operators and support engineers. ## What gets archived | Scope | Detail | | - | - | | Rows | `events` where `type` is a custom event type for the account | | Retention | **30 calendar days** (`SCA_RETENTION_DAYS`) before the archive cutoff | | Storage bucket | `smart-archiver-events` | | Format | Parquet shards + `manifest.json` per day | | Path pattern | `{accountId}/{base64url(eventType)}/{year}/{month}/{day}/` | A separate **historical archiver** cron handles other entities (`transactions`, `journey_steps`, and legacy `events` by `updated_at`) in the `archived-data` bucket with different retention windows. ## How archiving runs ```mermaid theme={null} flowchart LR CRON[Cron: archive_custom_events] --> LOCK[Per-account Redis lock] LOCK --> DAY[Process one day per event type] DAY --> FETCH[get_custom_events_for_archive_day] FETCH --> PARQUET[Write Parquet shards] PARQUET --> DEL[Delete DB rows] DEL --> KV[Advance progress in KV] ``` **Cron endpoint:** `POST /api/cron/maintenance/archive_custom_events` Protected by the `checksum` header with the `CRON_AUTH_SECRET` value. Per run defaults: * Up to **20,000** records globally (`SCA_RECORD_LIMIT_PER_RUN`) * Concurrency across accounts, event types, and days * Per-account lock (\~11 minutes TTL) to prevent overlapping runs ## Deferral rules Archiving **skips** a day when: * A pending first-run audience still depends on that custom event type * An active audience **rehydration** job overlaps the same event type and date range Rehydration reads Parquet files back into `events` so audiences can be rebuilt from archived data. Smart Archiver defers while rehydration is in progress. ## Progress tracking Progress is stored in Redis/KV per account and event type: ``` archive:custom_events:{account_id}:current_date ``` Default start date for new accounts: **2024-06-01**. Pass `force_reset_smart_archive_progress: true` in the cron body to reset all accounts to the default start date. ## Configuration flags | Flag | Default | Effect | | - | - | - | | `SCA_SAVE_ONLY` | `false` | When `true`, writes Parquet but does not delete DB rows | | `ARCHIVE_HARD_DELETE` | `true` | When `true`, removes rows after successful archive | | `SCA_RETENTION_DAYS` | `30` | Days before events become eligible | ## Monitoring The cron response includes operational counters such as `total_records_archived`, `deferred_accounts`, and `locked_accounts`. Use these to confirm steady progress and detect backlog. ## Related documentation * [Data architecture](/resources/data-architecture) — how events flow through Masivo * [Analytics exports](/guides/analytics-exports) — exporting reports that may reference archived periods # Stores Source: https://docs.masivo.ai/concepts/stores Learn what stores are and how they can help you create a successful loyalty program. Stores are the physical locations where you sell your goods and services to customers. You can synchronize your e-commerce stores with Masivo to create advanced filtering rules. For example, you can set up a campaign that rewards customers who make a purchase at a specific store. # Teams Source: https://docs.masivo.ai/concepts/teams Organize account members and restrict analytics visibility with teams. Teams are account-scoped groups that control **who sees which resources in the dashboard**. They are separate from account membership (users on an account) and from roles (what actions a user can perform). ## Teams vs members vs roles | Concept | Purpose | | - | - | | **Members** | Users who belong to the account (`users_by_accounts`) | | **Teams** | Organizational units for analytics scoping | | **Roles** | Permissions (`read`, `write`, `delete`) per resource area | A member can belong to multiple teams. A member with **no team assignments** (and who is not ADMIN or owner) only sees resources with empty `team_ids`. ## Entity team picker When creating or editing a resource, use the **Teams** field to assign visibility: * Select one or more teams to restrict analytics to those members. * Choose **No teams** to leave `team_ids` empty so everyone can see the resource. The picker lists only teams the current user belongs to (except ADMIN users, who see all teams). ## Dashboard navigation | Section | Path | Actions | | - | - | - | | Members | `/settings/team` | Invite, assign roles and teams, remove members | | Teams | `/settings/teams` | Create, edit, view team members | | Roles | `/settings/roles` | Define custom permission sets | | Invitations | `/settings/invitations` | Track pending invites | ## Permissions | Action | Requirement | | - | - | | View members, teams, invitations | Account member | | Invite members | `settings:write` | | Create / edit / delete teams | `settings:write` / `settings:delete` | | Assign member teams | `settings:write` | | Remove members | `settings:delete` | The built-in **ADMIN** role has all permissions. Custom roles define per-resource access across 30+ areas (campaigns, rewards, marketing automation, and more). ## Invitations Member invitations expire after **24 hours**. Recipients accept via `/auth/accept-invitation?id=…` after signing in with the invited email. ## Related documentation * [Manage teams](/guides/manage-teams) — step-by-step dashboard guide # Tickets & communication Source: https://docs.masivo.ai/concepts/tickets How tickets, stages, assignees, and multi-channel threads fit together in Masivo. ## What is a ticket? A **ticket** is a work item your team tracks from first contact until it is resolved or closed. Think of it as a case file: it has a title, a priority, an owner, a **pipeline**, a current **stage** on the board, and links to related records (reviews, customers, journeys, campaigns, or events). Tickets live in the **CRM → Tickets** area of the dashboard. You can also create and update them through the Storefront API if you integrate Masivo with your own tools (help desk, inbox connector, custom portal, etc.). ## The three layers you need to understand Masivo separates **case management** from **conversation storage**. This keeps the ticket board fast while still storing full message history. | Layer | What it is | Where you see it | | - | - | - | | **Ticket** | The case: stage, priority, assignees, resolution fields | Ticket board, ticket detail page | | **Communication thread** | One conversation channel on a ticket (email thread, WhatsApp chat, etc.) | Conversation tab, thread list API | | **Communication message** | A single inbound/outbound/internal message inside a thread | Timeline, messages API | ```mermaid theme={null} flowchart TB subgraph ticket [Ticket] T[Title, stage, priority, assignees] end subgraph threads [Communication threads] E[Email thread] W[WhatsApp thread] R[Review thread] end subgraph messages [Messages per thread] M1[Inbound customer email] M2[Agent reply] M3[Internal note] end ticket --> E ticket --> W ticket --> R E --> M1 E --> M2 E --> M3 ``` **Important:** listing threads returns **thread shells** (summary fields only). To read the full conversation, call the **messages** endpoint for each thread. ## Ticket lifecycle (pipelines, stages, and status) Every ticket belongs to one **pipeline** and one stage inside that pipeline. Create separate pipelines only when support processes have genuinely different stages; teams that share a process should share a pipeline. Each stage has a stable internal `code`, a display name, an order, and an internal `stage_type`: | `stage_type` | Effect | | - | - | | `open` | The ticket remains active. Moving from a completed stage records a reopen. | | `resolved` | The ticket is resolved and records `resolved_at`. | | `closed` | The ticket is closed and records `closed_at`. | ```mermaid theme={null} stateDiagram-v2 [*] --> OpenStage: pipeline default stage OpenStage --> OpenStage: another open stage OpenStage --> ResolvedStage: stage_type = resolved OpenStage --> ClosedStage: stage_type = closed ResolvedStage --> OpenStage: reopen ClosedStage --> OpenStage: reopen ``` **Status** (`open`, `resolved`, `closed`) is derived from the stage's internal type—not its display name. You normally change **pipeline/stage**, not status directly. Each pipeline receives its own stable stage codes. Some stages require extra text before the move is allowed: | Target stage | Required field in `required_fields` | Purpose | | - | - | - | | `resolved` | `resolution_summary` | Short explanation of how the issue was fixed | | `closed` | `closure_reason` | Why the ticket was closed | Configure pipelines under **CRM → Pipelines**. Every active pipeline must keep exactly one open default stage, at least one open stage, and at least one closed stage. A used stage cannot be removed or change its internal state until its tickets are moved. When an inbound customer message arrives on a closed ticket, Masivo reopens the same ticket in the **first open stage of its current pipeline**. It does not create a replacement ticket. ## Category hierarchy Classification describes the problem independently from its workflow stage. Configure it under **CRM → Categories** as one hierarchy. A top-level category groups related categories and defines their e-commerce availability. A leaf can end at the second or third level; it is selectable on tickets and owns the schema that agents complete. ```mermaid theme={null} flowchart LR A[Orders] --> B[Brand, channel, and store availability] A --> C[Payments] C --> D[Card declined] D --> E[Ticket Schema] B --> F[Allowed ticket e-commerce values] ``` | Configuration | Behavior | | - | - | | Category name | Names any level in the hierarchy | | Parent category | Empty only for a top-level category; hierarchies support three levels | | Brands | Availability inherited from the top-level category; empty means all | | Channels | Availability inherited from the top-level category; empty means all | | Stores | Availability inherited from the top-level category; empty means all | | Schema type | `text`, `textarea`, or `select` | | Placeholder | Optional hint displayed before the agent enters a value | | Required | Prevents the dashboard form from saving an empty value | | Options | Allowed values for a `select` Schema field | When an agent creates or edits a ticket, category selectors appear progressively, for example **Orders › Payments › Card declined**. Only a leaf can be selected. Selecting it displays its Schema and restricts Brand, Channel, and Store to the availability inherited from the top-level category. The database validates the same restrictions. All levels live in `ticket_categories`. A top-level category has a null `parent_id`; every other category references its parent. The leaf Schema is stored in `ticket_categories.schema`. Tickets reference the selected leaf through `category_id` and store validated values in `category_answers`. A category in use cannot be removed until its tickets are moved. ## Ticket sources | `source_type` | Meaning | | - | - | | `manual` | Created by a user or API call | | `review` | Created from a customer review | | `journey` | Created by a marketing automation journey | | `system` | Created automatically by Masivo | Review-sourced tickets automatically get a **review communication thread** with the review answers as the first inbound message. ## Assignees Each ticket can have team members in two roles: | Role | Meaning | | - | - | | `assignee` | Owns the ticket and is the only role that works it | | `watcher` | Follows the ticket read-only | Being linked to a ticket **only** as a watcher makes it read-only for that person: they cannot change its stage, edit it, comment, reply, reassign, or delete it, even when their account role allows writing tickets. Admins keep their global bypass, and anyone with no link to the ticket still acts according to their role, so supervisors can pick up unassigned work. Assignee changes emit journey events (`TICKET_ASSIGNEE_ADDED`, `TICKET_ASSIGNEE_REMOVED`) that you can use in [Ticket Journey Triggers](/guides/ticket-journey-triggers). ## Agents and automatic assignment Everyone who owns a ticket is a **ticket agent**. Assigning a team member by hand adds them to the roster automatically, with automatic routing switched off so they only receive what you hand them. Each agent declares how much work they can take and when: | Setting | Meaning | | - | - | | `availability` | `available`, `busy` or `offline`, changed by the agent | | `max_open_tickets` | Capacity; routing skips the agent once this many stay open | | `auto_assign` | Whether the agent is in the automatic rotation | | `pipeline_ids` | Pipelines the agent takes work from; empty means all | | `category_ids` | Categories the agent can resolve; empty means all | | `working_days`, `workday_start`, `workday_end` | Shift, evaluated in the account timezone | A ticket created without an assignee goes to the **available agent with the lightest open load**, breaking ties by who was assigned least recently. The agent must be on shift, under capacity, subscribed to the ticket's pipeline, and skilled in its category or in one of that category's parents. Accounts with no roster keep creating unassigned tickets. Skipping routing for a single ticket is possible by creating it with `auto_assign: false`; the decision is stored on the ticket, so later sweeps respect it too. ### When every agent is busy If nobody can take the ticket at creation time it stays unassigned instead of failing. An externally scheduled job (`POST /api/cron/tickets/auto_assign`) sweeps the pending backlog. The first sweep after an agent closes work, comes back from a break, or starts their shift assigns the waiting ticket. The sweep interleaves pipeline/category routes so an unsupported category cannot block unrelated work; within each route, urgent and older tickets go first. Agents can also be pulled in manually from the ticket detail with **Auto-assign**, which runs the same routing on demand. ### Agent profiles and performance Open **CRM → Agents** to inspect an agent's current load, shift, pipeline and category routing, recent ticket flow, average resolution time, reopen rate, and open work by priority. The summary compares the latest 30-day window with the previous one. Lifetime metrics keep tickets the agent previously held after reassignment and count each ticket once. The ticket tabs show the agent's current active assignments, split into open, resolved, and closed work. ## Communication threads A **thread** represents one external conversation identity, for example: * One email mailbox thread (`channel: email`, `external_thread_id` from your provider) * One WhatsApp number conversation (`channel: whatsapp`) * One web chat session (`channel: chat`) * The review submission tied to a ticket (`channel: review`, created automatically) ### Thread fields that matter day to day | Field | What it tells you | | - | - | | `latest_message_preview` | Short text shown on the board card | | `latest_message_at` | When the last message arrived | | `latest_message_direction` | `inbound`, `outbound`, `internal`, or `system` | | `unread_count` | Inbound messages not marked read (increments on inbound without `read_at`) | | `external_thread_id` | Your provider's thread id — use for idempotent sync | | `channel_account_id` | Mailbox, phone number, or inbox identifier | ### Thread uniqueness (avoid duplicates) If you sync from an external system, always send **`external_thread_id`** (and usually **`channel_account_id`**) when creating threads and messages. Masivo deduplicates on: * Thread: `(account, channel, channel_account_id, external_thread_id)` * Message: `(account, channel, external_message_id)` Sending the same external ids again returns the existing record instead of creating duplicates. ## Communication messages Each message has: | Concept | Values | Plain English | | - | - | - | | `direction` | `inbound`, `outbound`, `internal`, `system` | Who the message is "from" relative to your team | | `message_type` | `message`, `reply`, `internal_note`, `system_event`, `review_event` | Shape of the message | | `sender_type` | `customer`, `agent`, `email`, `system`, … | Who sent it | | `parent_message_id` | UUID or null | If set, this message is a **reply** to that message **in the same thread** | **Rules to remember:** * Replies must reference a `parent_message_id` that exists **in the same thread**. Cross-thread replies are rejected. * At least one of `subject`, `body_text`, or `body_html` is required when creating a message. * **Internal notes** (`direction: internal`, `message_type: internal_note`) are visible to agents only. They do **not** emit customer reply journey events. ## Ticket `communication_summary` When you fetch a single ticket (`GET /tickets/{id}`), the response includes **`communication_summary`**: a rollup across all threads on that ticket (thread count, latest preview, total unread, dominant channel). Use this for list views and board cards without loading every message. ## Events emitted (for journeys and webhooks) Ticket and communication actions publish internal behavior events. Common ones: | Event | When it fires | | - | - | | `TICKET_CREATED` | New ticket | | `TICKET_STAGE_CHANGED` | Stage move | | `TICKET_ASSIGNEE_ADDED` / `TICKET_ASSIGNEE_REMOVED` | Assignee changes | | `TICKET_RESOLVED` / `TICKET_CLOSED` / `TICKET_REOPENED` | Stage transitions with those outcomes | | `COMMUNICATION_THREAD_CREATED` | New thread | | `TICKET_THREAD_ATTACHED` | Thread linked to a ticket | | `COMMUNICATION_MESSAGE_CREATED` | Any new message | | `TICKET_MESSAGE_RECEIVED` | Inbound message on a ticket thread | | `TICKET_CUSTOMER_REPLIED` | Inbound message on a ticket thread | | `TICKET_AGENT_REPLIED` | Outbound message on a ticket thread | See [Ticket Journey Triggers](/guides/ticket-journey-triggers) to automate follow-ups when these events occur. ## Dashboard vs API | Task | Dashboard | API | | - | - | - | | Discover pipelines and internal stage codes | CRM → Pipelines | `GET /ticket-pipelines` | | Configure and assign dynamic categories | CRM → Categories and the selected category | Dashboard only | | Move ticket on board | Drag card or change pipeline/stage in detail view | `PATCH /tickets/{id}` with `to_pipeline_id` and `to_stage_code` | | Read conversation | Conversation tab on ticket detail | `GET /communication/threads?ticket_id=…` then `GET …/messages` | | Sync inbound email from provider | — | `POST /communication/threads` then `POST …/messages` | | Assign teammate | Ticket detail sidebar | `PATCH /tickets/{id}` or assignee endpoints | For step-by-step API recipes and copy-paste examples, continue with the [Ticket management guide](/guides/ticket-management). ## Journey compensation Ticket journeys can issue a reward to the ticket's current customer using **Compensate customer**. Tickets without a customer and tickets blocked by a compensation policy continue normally. Each ticket can be compensated once; customer limits can apply across the account, within a journey, or for a reward. Cooldowns, rolling caps, lifetime caps and an existing-reward check prevent repeated awards when a customer opens more tickets. Successful grants remain in the compensation history after redemption or expiration. Customer journeys can use the same action without a ticket and share these customer limits with ticket journeys. See [Ticket Journey Triggers](/guides/ticket-journey-triggers#compensate-a-customer) for configuration, defaults, concurrency and failure behavior. # Tiers Source: https://docs.masivo.ai/concepts/tiers Learn what tiers are and how they can help you create a successful loyalty program. Tiers are a way to make your customers feel special. In Masivo you can give your customers different benefits based on their tier. This can be a great way to encourage customers to engage with your brand. For example you can offer a discount to customers who have reached a certain tier. Learn how to create your own system in our [Creating a tier system guide](/guides/setup-a-tier-system). ## Tier scopes Campaigns and rewards can have a global tier scope: * A campaign tier scope controls which customers can earn its rewards. * A reward tier scope controls which customers can redeem that reward. * No selected tiers means that customers in any tier, including customers without a tier, are eligible. Masivo reads the customer's current tier from their profile. Integrations do not send or override the tier during an event or redemption. For an event that also changes the customer tier, campaign eligibility uses the tier the customer had when event processing started. The global scope is different from the singular **Customer tier** condition. If both are configured, both must match. For example, a scope containing Gold and Platinum plus a condition requiring Gold only allows Gold customers. # Transactions Source: https://docs.masivo.ai/concepts/transactions Learn what transactions are in Masivo. Transactions are records of rewards accumulated or redeemed by your customers. They provide a detailed history of reward transfers, including the originating event, the campaign that offered the reward, and the receiver and sender of the reward. Transactions are created automatically by Masivo when a reward is **ACCUMULATED**, **REDEEMED**, **TRANSFERRED**, or **EXPIRED**. # Wallets Source: https://docs.masivo.ai/concepts/wallets Learn what wallets are in Masivo. Wallets are where your customers' rewards are stored, with each reward tracked separately as a wallet line. Each wallet line has its own expiration date, and the wallet shows the sum of all wallet lines of the same type. One important consideration is that only non-expired wallet lines are included in the total. For example, if you have 10 points that expire in 30 days and 5 points that expire in 60 days, the total will be 15 points initially. After 30 days, the total will be 5 points. # Customers Source: https://docs.masivo.ai/guides/CDP/customers Understanding how customers and contacts work together in Masivo's Customer Data Platform # Customers & Contacts In Masivo's Customer Data Platform, **Customers** and **Contacts** are the building blocks that create a complete picture of your customer relationships. ## What are Customers? A **Customer** in Masivo represents a unique individual or business entity that interacts with your brand. It's your "single source of truth" for each person or company you serve. ### Customer Profile Contains: * **Personal Information**: Name, email, phone number, address * **Behavioral Data**: Purchase history, website visits, app usage * **Engagement History**: Email opens, campaign interactions, support tickets * **Preferences**: Communication preferences, product interests * **Lifecycle Stage**: New, active, at-risk, churned, or loyal customer ## What are Contacts? **Contacts** are the individual touchpoints that belong to a Customer. Each contact represents a specific way you've connected with someone. ### Contact Examples: * **Email Contact**: Newsletter subscription * **Website Contact**: Website visit with email provided * **Mobile App Contact**: App download and usage * **Purchase Contact**: In-store or online purchase ## How They Work Together **Step 1: Contact Collection** * Customer visits website → Creates website contact * Subscribes to newsletter → Creates email contact * Makes purchase → Creates purchase contact **Step 2: Identity Resolution** * Masivo recognizes these contacts belong to the same person * Matches them using email addresses or other identifiers * Links all contacts to create one unified customer profile **Step 3: Complete Customer View** * You see the full customer journey across all touchpoints * You can provide personalized experiences based on their entire history ## Related architecture * [Registration flow](/resources/data-architecture#registration-flow) — How signup creates the customer profile and wallet * [Activity & events](/resources/data-architecture#activity-events) — How behavioral data enriches the customer record * [Marketing & destinations](/resources/data-architecture#marketing-destinations) — How audience membership and automation use customer data * [Privacy & consent](/resources/data-architecture#privacy-consent) — How consent controls profile use and deletion ## Next Steps * [Set up Identity Resolution](/guides/CDP/unify/overview) - Configure how contacts get unified into customers * [Learn about Events](/guides/CDP/events) - See how customer actions are captured * [Explore Integrations](/guides/CDP/integrations) - Connect your existing tools *** **Ready to unify your customer data?** Start building complete customer profiles that drive better experiences. # Events Source: https://docs.masivo.ai/guides/CDP/events Understanding how events work in Masivo's Customer Data Platform # Events Events are the actions that your customers take that can trigger automated campaigns and track their behavior. Think of events as the building blocks that help you understand what your customers are doing and when they're doing it. ## What are Events? An **Event** in Masivo represents any action performed by a customer that you want to track or use to trigger automated responses. Events help you understand customer behavior and create personalized experiences. ### Event Examples: * **PURCHASE**: When a customer makes a purchase * **REGISTRATION**: When someone signs up for your platform * **BIRTHDAY**: When it's a customer's birthday * **TIER\_ADJUSTMENT**: When a customer's tier level changes * **ABANDONED\_CART**: When a customer leaves items in their cart (coming soon) Each event captures important moments in your customer's journey with your brand. ## How Events Work ### Event Collection Events are automatically collected when customers interact with your brand: * **Website actions**: Page views, form submissions, button clicks * **Mobile app interactions**: App opens, feature usage, in-app purchases * **Email engagement**: Opens, clicks, unsubscribes * **Purchase activities**: Orders, returns, refunds * **Support interactions**: Ticket creation, chat sessions ### Event Processing When an event is received, Masivo: 1. **Validates the event** to ensure it's properly formatted 2. **Links it to the customer** using their unique identifier 3. **Checks for matching campaigns** that should be triggered 4. **Processes rewards** if the event qualifies for any campaigns 5. **Updates customer profiles** with the new behavior data ## Event Types in Masivo ### Default Events These are the most common events that businesses track: **PURCHASE** (Recommended) * Tracks when customers make purchases * Includes order details, products, and value * Triggers reward accumulation campaigns **REGISTRATION** * Captures new customer sign-ups * Often triggers welcome campaigns * Helps track customer acquisition **BIRTHDAY** * Tracks customer birthdays * Perfect for birthday campaigns and special offers * Creates opportunities for personalized outreach **TIER\_ADJUSTMENT** * Monitors when customers move between loyalty tiers * Triggers tier-specific campaigns * Helps track customer progression **ABANDONED\_CART** (Coming Soon) * Will track when customers leave items in their cart * Enables cart abandonment recovery campaigns * Helps recover lost sales ### Custom Events You can also create custom events for specific business needs: * **Product views** for recommendation campaigns * **Video completions** for content engagement * **Survey submissions** for feedback collection * **App feature usage** for product adoption * **Event attendance** for offline engagement Define the expected payload shape in the dashboard under **Events → Custom event types** (Fields schema). See [Custom event types](/guides/custom-event-types) for steps and an example schema. ## How Events Connect to Campaigns ### Behavior-Based Campaigns Events are the foundation of behavior-based campaigns: * **Purchase events** trigger reward accumulation * **Registration events** start welcome sequences * **Birthday events** activate special offers * **Tier changes** trigger tier-specific communications ### Journey Triggers Events can also trigger customer journeys: * **Welcome Journey**: Starts with registration event * **Purchase Journey**: Begins with first purchase event * **Re-engagement Journey**: Triggered by inactivity events * **Upsell Journey**: Activated by specific purchase patterns ### Real-Time Responses Events enable immediate customer responses: * **Instant rewards** for qualifying purchases * **Immediate confirmations** for important actions * **Real-time notifications** for engagement * **Automatic follow-ups** based on behavior ## Why Events Matter for Your Business ### Complete Customer Understanding Events help you see the full picture of customer behavior: * **What customers do** across all touchpoints * **When they do it** and how frequently * **Why they do it** based on context and timing * **What happens next** in their journey ### Personalized Experiences Events enable you to create relevant experiences: * **Right message** at the right time * **Appropriate rewards** for specific actions * **Targeted campaigns** based on behavior patterns * **Proactive support** when customers need help ### Better Business Decisions Events provide valuable insights: * **Customer behavior patterns** across your business * **Most valuable customer actions** and touchpoints * **Campaign effectiveness** and engagement rates * **Opportunities for improvement** and optimization ## Related architecture * [Activity & events](/resources/data-architecture#activity-events) — Loyalty vs tracking-only paths and what each event updates * [Marketing & destinations](/resources/data-architecture#marketing-destinations) — How events trigger journeys and destination sync ## Next Steps Now that you understand how events work, you're ready to: * [Set up Identity Resolution](/guides/CDP/unify/overview) - Connect events to unified customer profiles * [Learn the onboarding process](/guides/CDP/unify/onboarding) - Get started with event tracking * [Explore use cases](/guides/CDP/unify/use-cases) - See practical examples of event-driven campaigns *** **Ready to track customer behavior?** Start capturing events that drive better customer experiences and business growth. # Overview Source: https://docs.masivo.ai/guides/CDP/integrations Connect third-party tools to sync data from Masivo's Customer Data Platform # Integrations Integrations allow you to connect Masivo's Customer Data Platform with your favorite third-party tools, creating a seamless flow of customer data across your entire marketing and analytics stack. ## What are Integrations? **Integrations** in Masivo are connections that automatically sync your customer data, events, and campaigns with external platforms. Think of them as bridges that keep all your tools updated with the latest customer information. ### What Gets Synced: * **Customers**: Creation, updates, deletions, and customer tags * **Events**: Behavioral events generated by your applications * **Purchases**: Order and product information * **Audiences**: Customer membership reflected in platform-specific audience APIs Some platforms expose **separate destinations** for events vs audiences (Braze, TikTok, Meta, Google Ads). Attach the Events destination for behavior tracking and the Audiences destination when syncing segments. ## How Integrations Work ### Automatic Data Flow Once configured, integrations work automatically: 1. **Enable Integration**: Set up the connection in Settings → Integrations 2. **Automatic Sync**: Masivo automatically syncs data when: * Customers are created, updated, or deleted * Events occur in your applications * Purchases are fulfilled * Audiences are recalculated 3. **Efficient Processing**: Data is batched and sent to your chosen platform optimally ### Smart Validation Before sending data, Masivo validates: * Your configuration is correct * Required features are enabled * Data meets your business rules * Events are appropriate for the target platform ### Efficient Processing * Data is batched automatically to respect platform limits * Failed syncs don't affect other integrations * Real-time processing ensures timely data delivery ### Integration Categories Masivo supports various types of integrations: **Email Marketing** * Customer engagement platforms * Newsletter and campaign tools * Marketing automation systems **Website & Mobile** * Analytics platforms * User behavior tracking * App performance monitoring **Server & Cloud Sources** * Data warehouses * Cloud storage systems * ETL platforms **Event Streams** * Real-time data processing * Event-driven architectures * Stream analytics ## Setting Up Integrations ### Step 1: Choose Your Integration 1. Go to **Settings → Integrations** in your Masivo dashboard 2. Browse available integrations by category 3. Select the platform you want to connect ### Step 2: Configure Connection 1. **API Key**: Enter your platform's API key 2. **Endpoint**: Configure the correct REST endpoint 3. **Permissions**: Ensure proper permissions for the features you want to use 4. **Features**: Enable the specific sync options you need ### Step 3: Test and Activate 1. **Test Connection**: Verify the integration works correctly 2. **Configure Sync Options**: Choose what data to sync 3. **Activate**: Enable the integration to start syncing ## Common Use Cases ### Marketing Automation **Scenario**: Sync customer data with your email marketing platform * **Customer Updates**: New signups automatically appear in your email lists * **Behavioral Triggers**: Customer actions trigger email campaigns * **Audience Sync**: Segmented audiences stay updated across platforms ### Analytics & Reporting **Scenario**: Send customer events to your analytics platform * **Purchase Tracking**: Order data flows to your analytics dashboard * **Behavioral Analysis**: Customer actions are tracked across all touchpoints * **Custom Events**: Business-specific events are captured and analyzed ### Customer Support **Scenario**: Keep your support platform updated with customer information * **Customer Profiles**: Support agents see complete customer history * **Purchase Context**: Support tickets include relevant order information * **Customer Status**: Tier changes and preferences sync automatically ## Related architecture * [Registration flow](/resources/data-architecture#registration-flow) — How customer profiles are created and synced to destinations * [Activity & events](/resources/data-architecture#activity-events) — How behavioral events and purchases reach external tools * [Connected destinations](/resources/data-architecture#connected-destinations) — How audience and event data sync to ad platforms, CRM, and warehouse * [Privacy & consent](/resources/data-architecture#privacy-consent) — How consent and deletion affect outbound sync ## Next Steps Now that you understand how integrations work, you're ready to: * [Set up Identity Resolution](/guides/CDP/unify/overview) - Connect integrations to unified customer profiles * [Learn about Events](/guides/CDP/events) - Understand what data gets synced * [Explore Customers & Contacts](/guides/CDP/customers) - See how customer data flows through integrations *** **Ready to connect your tools?** Start syncing your customer data across all your favorite platforms for a unified view of your customers. # Amazon S3 Source: https://docs.masivo.ai/guides/CDP/integrations/amazon-s3/overview Learn how to integrate Amazon S3 with Masivo CDP for data export and analytics Event exports preserve nested attribution; Parquet stores the object as a JSON string. See the [shared attribution guide](/api-reference/guides/attribution-tracking). ## What is Amazon S3 Integration? The Amazon S3 integration is a **data warehouse destination** that allows you to export customer data, events, and transactions from Masivo to your Amazon S3 bucket. This integration enables you to store and analyze your loyalty program data using AWS services and third-party analytics tools. It supports **historical data backfill**, making it ideal for comprehensive data warehousing and analytics use cases. ## Key Features Warehouse destination that supports historical data export and backfill Choose exactly which data types to export: customers, events, purchases, transactions, rewards, wallets, tiers, and audiences Export data in JSON or Parquet format for different use cases Configure export frequency: daily, weekly, or monthly based on your needs Automatically backfills historical data based on your selected frequency Uses IAM roles for secure, programmatic access to your S3 bucket ## Integration Type ### Amazon S3 as Warehouse Destination Amazon S3 is configured as a **warehouse destination** that exports data to your S3 bucket. You have full control over which data types are exported, and the integration supports historical data backfill based on your configured export frequency. ## Data Flow Customer data, events, and transactions are collected in Masivo Data is validated and transformed for S3 export Data is batched and compressed for efficient S3 upload Data is stored in organized folders within your S3 bucket ## Supported Data Types You can selectively enable or disable each data type for export. The following data types are available: * Customer profiles and attributes - User lifecycle events (create, update, delete) - Customer tags (optional) - Profile information and metadata * Customer behavior events - Engagement tracking - Custom event properties - Event timestamps and metadata * Purchase events and transaction data - Purchase details and metadata * Detailed transaction records - Financial transaction data - Transaction history * Reward records and redemption history - Reward program data * Wallet balance information - Wallet transaction history * Tier assignments - Tier change events - Tier membership data * Audience calculation events (when audiences are calculated) - Audience deletion events (when audiences are deleted) ## File Organization Data is automatically organized in your S3 bucket based on the data type and export frequency you configure: Files organized by day: `{DATA_TYPE}/YYYY/MM/DD/` - Example: `CUSTOMER/2024/01/15/` Files organized by week: `{DATA_TYPE}/YYYY/MM/week-N/` - Example: `EVENT/2024/01/week-2/` Files organized by month: `{DATA_TYPE}/YYYY/MM/` - Example: `TRANSACTION/2024/01/` ## Export Formats Choose between two file formats based on your analytics needs: * Human-readable format - Larger file sizes - Easy to process with any tool * Default format - Best for: Quick data inspection, simple integrations * Columnar storage format - Smaller file sizes (better compression) - Optimized for analytics and big data processing - Best for: Data warehouses, analytics platforms, cost optimization ## Export Frequencies Configure how often data is exported to S3: * Exports data every day - Files organized by day (YYYY/MM/DD) - Best for: Daily reporting and analytics - Default frequency * Exports data once per week - Files organized by week (YYYY/MM/week-N) - Best for: Weekly reporting, batch processing * Exports data once per month - Files organized by month (YYYY/MM) - Best for: Monthly reporting, long-term storage optimization The export frequency determines when historical data backfill occurs. Historical data is automatically synced based on your selected frequency. ## Benefits Complete data warehouse solution with historical backfill support Export only the data types you need, reducing storage costs and processing time Use AWS analytics services like Athena, Redshift, or third-party tools Choose your preferred format (JSON/Parquet) and frequency (daily/weekly/monthly) Secure backup of all customer and loyalty program data Meet data retention and compliance requirements ## Next Step Learn how to configure your S3 integration # Braze Source: https://docs.masivo.ai/guides/CDP/integrations/braze/overview Learn how to integrate Braze with Masivo CDP for seamless customer data synchronization ## What is Braze Integration? The Braze integration allows you to synchronize customer data, events, and audience information between Masivo and Braze in real-time. This integration enables you to leverage Braze's powerful customer engagement platform while maintaining your loyalty program data in Masivo. ## Key Features Customer data, events, and purchases are synchronized in real-time between Masivo and Braze Masivo audiences are automatically synced as custom attributes in Braze user profiles Customer behavior events are tracked and sent to Braze for enhanced segmentation Transaction data including products, amounts, and currencies are synchronized ## Integration Type Masivo exposes **two separate Braze destinations** so each connection sends only one kind of data: | Destination | Catalog ID | What it sends | | - | - | - | | **Braze Events** | `braze-events-destination` | Events, purchases, customer tags, journey attributes | | **Braze Audiences** | `braze-audiences-destination` | Audience membership as custom attributes | ### Braze Events destination * **Customer Profiles**: User attributes, tags, and profile information * **Events**: Customer behavior and engagement events * **Purchases**: Transaction data with product details ### Braze Audiences destination * **Audiences**: Custom attributes indicating audience membership (`masivo_{audience}`) Older combined `braze-destination` connections are legacy. Create separate Events and Audiences destinations for new setups. ## Data Flow Customer data is collected in Masivo through various touchpoints Data is validated and transformed according to Braze requirements Processed data is sent to Braze via REST API Braze uses the data for segmentation, campaigns, and analytics ## Supported Data Types * External ID (customer identifier) - Email address - Device tokens for push notifications - Custom attributes and tags - Profile information * Customer behavior events - Engagement tracking - Custom event properties - Timestamp information * Product SKUs and details - Transaction amounts and currency - Order status and fulfillment - Purchase timestamps * Audience membership attributes - Dynamic audience updates - Audience deletion handling ## Benefits Use Masivo loyalty data to create more precise customer segments in Braze Combine loyalty program insights with Braze engagement data Trigger Braze campaigns based on loyalty program activities Get comprehensive customer insights across both platforms ## Next Step Learn how to configure your Braze integration # Facebook Apps Events Source: https://docs.masivo.ai/guides/CDP/integrations/facebook-apps-events/overview Learn how to integrate Facebook Apps Events with Masivo CDP for mobile app event tracking and conversion optimization UTM are sent in `custom_data.utm_*`, with captured `fbc`/`fbp` in `user_data`. See the [shared attribution guide](/api-reference/guides/attribution-tracking). ## What is Facebook Apps Events Integration? The Facebook Apps Events integration allows you to track customer events, purchases, and conversions from Masivo directly to Facebook's App Events API. This integration enables you to measure the effectiveness of your Facebook advertising campaigns for mobile apps and create custom audiences based on your loyalty program data. ## Key Features Track customer events, purchases, and conversions from mobile apps to Facebook App Events Optimize Facebook ad campaigns based on actual customer behavior and purchases from mobile apps Create Facebook custom audiences based on mobile app loyalty program activities Track customer journey and attribution across Facebook ads and mobile app engagement ## Integration Type ### Facebook Apps Events as Destination When configured as a destination, Masivo sends customer events to Facebook App Events API: * **Customer Events**: Registration, identification, and engagement events from mobile apps * **Purchase Events**: Transaction data with product details and values * **Custom Events**: Loyalty program specific events and behaviors * **App Lifecycle Events**: Install, open, and session tracking ## Data Flow Customer events and purchases are collected in Masivo through mobile app touchpoints Events are mapped to Facebook App Events standard events (Purchase, CompleteRegistration, AppActivated) Customer data is processed and PII is hashed for privacy compliance Events are sent to Facebook App Events API for conversion tracking and audience building ## Supported Event Types * **CUSTOMER/USER/IDENTIFY** → CompleteRegistration - Customer registration and profile creation events - User identification and authentication events * **PURCHASE/TRANSACTION** → Purchase - Transaction data with product details - Purchase amounts, currencies, and quantities * **EVENT/TRACK** → Custom events - Customer behavior and engagement events * Custom loyalty program activities * **PAGE/PAGEVIEW** → AppActivated - App lifecycle and navigation events - Customer journey tracking ## Data Mapping * Email (hashed) - Phone (hashed) - External ID - Client IP - User Agent - Facebook Click ID (fbc) - Facebook Browser ID (fbp) - Device information (brand, model, OS) * App information and metadata - Install referrer - URL schemes - Subscription ID - Facebook Login ID * Product IDs and names - Product categories and brands - Order IDs and values - Currency and quantities - Search terms - Custom properties ## Privacy & Compliance Email and phone numbers are automatically hashed before sending to Facebook Supports Facebook's data processing options for GDPR compliance Supports configurable tracking settings for privacy compliance Respects customer opt-out preferences for data sharing ## Benefits Track the complete customer journey from Facebook ads to mobile app engagement Optimize Facebook ad campaigns based on actual mobile app conversions Create lookalike audiences based on your most valuable mobile app customers Get comprehensive insights into mobile app customer behavior ## Next Step Learn how to configure your Facebook Apps Events integration # Facebook Audiences v2 Source: https://docs.masivo.ai/guides/CDP/integrations/facebook-audiences-v2/overview Sync Masivo audiences to Meta Custom Audiences with automatic audience provisioning ## What is Facebook Audiences v2? **Facebook Audiences v2** (`facebook-audiences-v2-destination`) syncs Masivo audience membership into Meta Custom Audiences. One destination covers all Masivo audiences: Meta Custom Audiences are created automatically per audience using your ad account credentials. Prefer v2 for all new setups. The legacy [Facebook Audiences](/guides/CDP/integrations/facebook-audiences/overview) destination (static `audience_id`) is deprecated. ## Key Features Meta Custom Audiences are created per Masivo audience and stored on the audience attributes Full and diff syncs upload hashed emails for APPEND and DELETE Configure `ad_account_id`, app credentials, and access token once Email identifiers are hashed before upload to Meta ## Requirements * Meta ad account ID (`ad_account_id`) * App ID and App Secret * Access token with `ads_management` and custom audiences permissions ## Catalog ID `facebook-audiences-v2-destination` ## Related * [Facebook Pixel](/guides/CDP/integrations/facebook-pixel/overview) for event streaming * [Facebook Apps Events](/guides/CDP/integrations/facebook-apps-events/overview) for app events * [Legacy Facebook Audiences](/guides/CDP/integrations/facebook-audiences/overview) # Facebook Audiences Source: https://docs.masivo.ai/guides/CDP/integrations/facebook-audiences/overview Legacy Facebook Custom Audiences destination (deprecated — use v2) This destination (`facebook-audiences-destination`) is **deprecated**. Use [Facebook Audiences v2](/guides/CDP/integrations/facebook-audiences-v2/overview) (`facebook-audiences-v2-destination`) for new connections. Existing v1 connections continue to process for compatibility. ## What is Facebook Audiences Integration? The legacy Facebook Audiences integration syncs customer data from Masivo to a **single** pre-created Facebook Custom Audience (you paste a static `audience_id`). v2 replaces this model with ad-account credentials and automatic Meta audience creation per Masivo audience. ## Key Features Sync customer data to Facebook Custom Audiences for targeted advertising Create audiences based on loyalty program tiers, engagement, and behavior PII data is hashed and processed according to Facebook's privacy requirements ## Integration Type ### Facebook Audiences as Destination When configured as a destination, Masivo syncs customer data to Facebook Custom Audiences: * **Customer Profiles**: User information, demographics, and contact details * **Behavioral Data**: Customer engagement and loyalty program activities * **Segmentation Data**: Customer tiers, tags, and custom attributes * **Purchase History**: Transaction data and purchase patterns ## Data Flow Customer data is collected in Masivo through loyalty program activities Customer information is processed and PII is hashed for privacy compliance Customer data is organized and prepared for Facebook Custom Audiences Data is sent to Facebook Custom Audiences API for audience creation ## Supported Data Types * Email addresses (hashed) - Phone numbers (hashed) - External customer IDs * First and last names - Date of birth - Gender - Location data (city, state, country, zip code) * Customer engagement events - Loyalty program activities - Purchase history * Custom attributes * Customer tiers and levels - Custom tags and attributes - Audience membership - Behavioral segments ## Audience Types Upload customer email addresses and phone numbers for direct targeting Target customers based on loyalty program engagement and activities Create audiences based on purchase history and transaction patterns Target customers based on loyalty program tiers and status ## Privacy & Data Protection Email addresses and phone numbers are automatically hashed using Facebook's required methods Supports Facebook's data processing options and privacy controls Only necessary customer data is sent to Facebook for audience creation Respects customer privacy preferences and opt-out requests ## Benefits Target your most valuable customers with highly relevant Facebook ads Create lookalike audiences based on your best loyalty program customers Gain insights into customer behavior across your loyalty program and Facebook ## Audience Examples Customers in top loyalty tiers with high purchase frequency Customers who haven't engaged recently or are showing churn signals Recently registered customers who haven't made their first purchase Customers who have purchased specific product categories ## Integration Requirements * Facebook App ID and App Secret - Access token with custom\_audiences permission * Custom Audience ID - Proper audience configuration in Facebook Business Manager * ads\_management permission - custom\_audiences permission - Business Manager access ## Next Step Learn how to configure your Facebook Audiences integration # Facebook Pixel Source: https://docs.masivo.ai/guides/CDP/integrations/facebook-pixel/overview Learn how to integrate Facebook Pixel with Masivo CDP for enhanced conversion tracking and customer insights UTM are sent in `custom_data.utm_*`, with captured `fbc`/`fbp` in `user_data`. See the [shared attribution guide](/api-reference/guides/attribution-tracking). ## What is Facebook Pixel Integration? The Facebook Pixel integration allows you to track customer events, purchases, and conversions from Masivo directly to Facebook Pixel. This integration enables you to measure the effectiveness of your Facebook advertising campaigns and create custom audiences based on your loyalty program data. ## Key Features Track customer events, purchases, and conversions in real-time to Facebook Pixel Optimize Facebook ad campaigns based on actual customer behavior and purchases Create Facebook custom audiences based on loyalty program activities Track customer journey and attribution across Facebook and your loyalty program ## Integration Type ### Facebook Pixel as Destination When configured as a destination, Masivo sends customer events to Facebook Pixel: * **Customer Events**: Registration, identification, and engagement events * **Purchase Events**: Transaction data with product details and values * **Custom Events**: Loyalty program specific events and behaviors * **Page Views**: Customer interaction tracking ## Data Flow Customer events and purchases are collected in Masivo through various touchpoints Events are mapped to Facebook Pixel standard events (Purchase, CompleteRegistration, ViewContent) Customer data is processed and PII is hashed for privacy compliance Events are sent to Facebook Pixel for conversion tracking and audience building ## Supported Event Types * **CUSTOMER/USER/IDENTIFY** → CompleteRegistration - Customer registration and profile creation events - User identification and authentication events * **PURCHASE/TRANSACTION** → Purchase - Transaction data with product details - Purchase amounts, currencies, and quantities * **EVENT** → source `data.type` name - Customer behavior and custom events - Custom loyalty program activities * **PAGE/PAGEVIEW** → ViewContent - Page view tracking and navigation events * Customer journey tracking ## Data Mapping * Email (hashed) - Phone (hashed) - External ID - Client IP - User Agent - Facebook Click ID (fbc) - Facebook Browser ID (fbp) * Product IDs and names - Product categories and brands - Order IDs and values - Currency and quantities - Search terms - Custom properties ## Privacy & Compliance Email and phone numbers are automatically hashed before sending to Facebook Supports Facebook's data processing options for GDPR compliance Optional test event codes for development and testing environments Respects customer opt-out preferences for data sharing ## Benefits Track the complete customer journey from Facebook ads to loyalty program engagement Optimize Facebook ad campaigns based on actual loyalty program conversions Create lookalike audiences based on your most valuable loyalty program customers ## Use Cases Track loyalty program sign-ups and purchases from Facebook traffic Retarget customers who engaged with your loyalty program but didn't convert Build custom audiences based on loyalty program tier and engagement Test different Facebook ad creatives and audiences using loyalty program data ## Next Step Learn how to configure your Facebook Pixel integration # Google Ads Remarketing Source: https://docs.masivo.ai/guides/CDP/integrations/google-ads-remarketing/overview Sync Masivo audiences to Google Ads customer match lists via the Data Manager API ## What is Google Ads Remarketing? The Google Ads Remarketing destination syncs customers from Masivo audiences into a Google Ads **Customer Match** user list. You can then use that list for remarketing and lookalike-style campaigns in Google Ads. This integration is separate from [Google Ads conversion upload](/guides/CDP/integrations/google-ads/overview). Remarketing syncs **audience membership**; conversion upload sends **purchase and event conversions**. Remarketing uses the **Google Data Manager API** with OAuth and a GCP project. It does **not** require a Google Ads **developer token**. ## Key Features Add and remove customers when Masivo audiences change Populate a Google Ads user list for remarketing campaigns Email, phone, and name are hashed with SHA-256 before upload Optional Login customer ID for Manager (MCC) / client account setups ## Integration type ### Destination (audience sync) When enabled as a destination on a Masivo audience: * **Add**: Customers entering the audience are uploaded to your Google Ads user list * **Remove**: Customers leaving the audience (or delete signals) are removed by hashed email * **Background processing**: A cron worker drains the `google-ads-remarketing` queue in batches ## Data flow ```mermaid theme={null} flowchart LR A[Audience change in Masivo] --> B[Queue message] B --> C[Remarketing cron] C --> D[Hash PII] D --> E[Data Manager API] E --> F[Google Ads user list] ``` A Masivo audience is created, recalculated, or a member is added/removed. Destination jobs are enqueued on the `google-ads-remarketing` queue. The cron batches members, hashes identifiers, and calls Data Manager `audienceMembers:ingest` or `audienceMembers:remove`. Members appear in your Customer Match user list for campaign targeting. ## Identifiers sent | Field | Treatment | When used | | - | - | - | | Email | Trim, lowercase, SHA-256 (HEX) | Add and remove | | Phone | Digits only, SHA-256 (HEX) | Add (if present) | | First / last name | Trim, lowercase, SHA-256 (HEX) | Add (with full address) | | Country code | Plain | Add (with full address) | | Postal code | Plain | Add (with full address) | At least one of **email** or **phone** is required for an add. Removals require **email** only. ## Requirements * Active Google Ads account - Customer Match user list (Audience Manager) - Numeric Customer ID and User List ID * GCP project with **Data Manager API** enabled - OAuth 2.0 Web client (Client ID + Client Secret) - Refresh token with scope `https://www.googleapis.com/auth/datamanager` * Google Ads API developer token - Google Ads API enablement for this destination (Data Manager is used instead) ## Comparison with Google Ads conversions | | Remarketing | Conversions | | - | - | - | | Purpose | Sync audience lists | Upload conversion events | | API | Data Manager | Google Ads API | | Developer token | Not used | Required | | Main IDs | User List ID, GCP Project ID | Conversion Action ID | | Catalog ID | `google-ads-remarketing` | `google-ads-conversions` | ## Next step Configure credentials, OAuth scope, and verify the connection Track purchases and events as Google Ads conversions # Google Ads Source: https://docs.masivo.ai/guides/CDP/integrations/google-ads/overview Learn how to integrate Google Ads with Masivo CDP for conversion tracking and campaign optimization ## What is Google Ads Integration? The **Google Ads Conversions** destination (`google-ads-conversions`) uploads customer conversion events and purchases from Masivo to Google Ads via the Google Ads Conversion Upload API. Use it to measure campaign effectiveness and optimize on loyalty and purchase outcomes. Conversion upload requires a Google Ads **developer token**, OAuth credentials, and a Conversion Action ID. For syncing **audiences** to Customer Match lists (no developer token; Data Manager API + GCP project), use [Google Ads Remarketing](/guides/CDP/integrations/google-ads-remarketing/overview). ## Key Features Track customer conversions, purchases, and events in real-time to Google Ads Optimize Google Ads campaigns based on actual customer behavior and purchases Match uploaded conversions using captured gclid, gbraid or wbraid Track customer journey and attribution across Google Ads and your loyalty program ## Integration Type ### Google Ads as Destination When configured as a destination, Masivo sends customer conversions to Google Ads: * **Conversion Events**: Customer purchases, registrations, and key actions * **Transaction Data**: Purchase amounts, currencies, and product details * **Customer Data**: Captured click identifiers for better matching * **Custom Events**: Loyalty program specific conversions ## Data Flow Customer conversions and purchases are collected in Masivo through various touchpoints Events are mapped to Google Ads conversion actions and enhanced conversions Customer data is processed and formatted for Google Ads API requirements Conversions are sent to Google Ads via Conversion Upload API for campaign optimization ## Supported Conversion Types * Transaction data with product details - Purchase amounts, currencies, and quantities - Order IDs and transaction timestamps - Captured click identifiers for matching * Customer registration events - Account creation tracking - Enhanced conversion data * Loyalty program specific conversions - Custom event tracking - Key action conversions * Email addresses (hashed) - Phone numbers (hashed) - Customer addresses - First and last names ## Data Mapping * Email (hashed) - Phone (hashed) - First and last names - Address information - External customer ID * Order ID - Transaction value and currency - Product IDs and names - Conversion timestamp * Google Click ID (gclid) - Conversion environment - Conversion date and time - Conversion value ## Privacy & Compliance Email and phone numbers are automatically hashed before sending to Google Ads Supports Google's data processing options for GDPR compliance Uses hashed customer data for improved conversion matching while maintaining privacy Respects customer opt-out preferences for data sharing ## Benefits Track the complete customer journey from Google Ads to loyalty program conversions Optimize Google Ads campaigns based on actual loyalty program conversions Improve conversion tracking accuracy with enhanced conversion data Measure the true ROI of your Google Ads campaigns with accurate conversion data ## Related: audience remarketing For syncing Masivo **audiences** into Google Ads Customer Match lists (no developer token; Data Manager API), see [Google Ads Remarketing](/guides/CDP/integrations/google-ads-remarketing/overview). ## Next Step Learn how to configure your Google Ads conversion integration Sync audiences to Google Ads Customer Match lists # Google Analytics Source: https://docs.masivo.ai/guides/CDP/integrations/google-analytics/overview Send events and purchases to the web and app streams in GA4 Masivo sends events and purchases through Google Analytics 4 Measurement Protocol. Standard event names are lowercased, Masivo orders are mapped to GA4 ecommerce fields, and custom events retain their flattened parameters. Attribution requires the real Google tag or Firebase identity and session. UTM parameters preserved by Masivo links must also reach the website/app's analytics implementation. Masivo's own click tracking does not create GA4 sessions. Configure web, Android and iOS streams in the existing destination. The optional event `ga4` context selects the appropriate stream. Events without a real identity keep the legacy customer-ID fallback on the web stream; this path does not provide reliable session attribution. See the [setup guide](/guides/CDP/integrations/google-analytics/setup) and [complete integration reference](/integrations/google-analytics) for link rules, purchase mapping, client context and verification steps. # TikTok Source: https://docs.masivo.ai/guides/CDP/integrations/tiktok/overview Learn how to integrate TikTok Events API with Masivo CDP for conversion tracking and ad optimization ## What is TikTok Integration? The TikTok integration allows you to send customer events and conversions from Masivo to TikTok Events API in real-time. This server-side integration enables better ad optimization, audience targeting, and conversion tracking across your TikTok advertising campaigns, bypassing browser limitations and ad blockers. ## Key Features Send events directly from your server, bypassing ad blockers and browser restrictions Automatically maps common e-commerce events to TikTok standard events Works seamlessly with Masivo's native PURCHASE format with order objects Track business-specific events beyond TikTok's standard catalog ## Integration Type Masivo exposes **two separate TikTok destinations**: | Destination | Catalog ID | What it sends | | - | - | - | | **TikTok Events** | `tiktok-events-destination` | Events API (`/event/track/`) — EVENT and PURCHASE | | **TikTok Audiences** | `tiktok-audiences-destination` | Custom audiences via TikTok DMP / CSV upload | ### TikTok Events destination When configured as a destination, Masivo sends conversion events to TikTok: * **Standard Events**: ViewContent, AddToCart, InitiateCheckout, CompletePayment * **Custom Events**: Business-specific events like ClickButton, Subscribe, Contact * **Purchase Events**: Native Masivo PURCHASE format with order objects ### TikTok Audiences destination * **Audiences**: Customer membership for custom audience targeting Older combined `tiktok-destination` connections are legacy. Prefer separate Events and Audiences destinations. ## Data Flow Customer events and purchases are generated in Masivo Events are validated against your TikTok integration settings Events are transformed to TikTok Events API format with automatic field mapping Events are sent to TikTok Events API in real-time for immediate tracking ## Supported Event Types Events that Masivo automatically converts to TikTok standard names: - `purchase` / `PURCHASE` → `CompletePayment` - `add_to_cart` → `AddToCart` - `begin_checkout` → `InitiateCheckout` - `add_payment_info` → `AddPaymentInfo` - `view_item` → `ViewContent` - `search` → `Search` - `sign_up` → `CompleteRegistration` - `add_to_wishlist` → `AddToWishlist` Use these exact event names for TikTok-specific tracking: - `ClickButton` - User clicks a button - `Contact` - User initiates contact - `Download` - User downloads content - `SubmitForm` - User submits a form - `Subscribe` - User subscribes to service - `PlaceAnOrder` - User places an order Any event name not in TikTok's catalog becomes a custom event: - `free_trial_started` - `newsletter_signup` - `video_watched_50` - Custom events have parameters flattened with `custom_` prefix; campaign UTM also retain their original `properties.utm_*` names ## Event Transformation Masivo's native PURCHASE format is automatically transformed for TikTok: * `order.products` → `contents` array - `order.value` → `value` - `order.purchase_id` → `transaction_id` - `order.currency` → `currency` * `sku` → `content_id` - `name` → `content_name` - `amount` → `quantity` - `value` → `price` ## Benefits Capture 100% of conversions with server-side tracking, not affected by ad blockers TikTok uses conversion data to optimize ad delivery and bidding More control over data sharing with server-to-server integration Bypass browser restrictions and cookie limitations for complete data ## TikTok Pixel vs Events API No reliance on browser cookies or client-side tracking scripts Capture 100% of conversions, not just those visible to browser pixels Server-to-server communication bypasses all ad blockers Use both Pixel (client-side) and Events API (server-side) for best results * TikTok automatically deduplicates ## Use Cases Track complete purchase funnel from product view to payment completion Optimize campaigns for form submissions and registration completions Track in-app purchases and subscription events for mobile apps Track business-specific conversions unique to your industry ## Next Step Learn how to configure your TikTok integration Complete API documentation and event examples # Overview Source: https://docs.masivo.ai/guides/CDP/overview Transform your customer data into a unified, actionable view with Masivo's Customer Data Platform # Customer Data Platform (CDP) Imagine having a complete, real-time view of every customer across all your touchpoints - website, mobile app, email campaigns, in-store visits, and customer support interactions. That's the power of Masivo's Customer Data Platform (CDP). Masivo's CDP is designed specifically for businesses that want to understand their customers better and create more meaningful relationships through data-driven insights and personalized experiences. ## What is a Customer Data Platform? A Customer Data Platform is your central hub for customer data. It collects, unifies, and organizes customer information from all your different systems and channels, creating a single, comprehensive profile for each customer. Think of it as your customer intelligence center - instead of having scattered pieces of information about your customers across different tools, you get one complete picture that tells the whole story. ## Why Your Business Needs a CDP ### The Problem: Scattered Customer Data Most businesses today face the same challenge: * **Marketing team** has email engagement data * **Sales team** has CRM and deal information * **Support team** has ticket and interaction history * **E-commerce platform** has purchase and browsing data * **Mobile app** has usage and preference data Each team sees only part of the customer story, leading to: * Disconnected customer experiences * Missed opportunities for personalization * Inefficient marketing spend * Frustrated customers receiving irrelevant communications ### The Solution: Unified Customer Intelligence Masivo's CDP solves this by creating a single source of truth for all customer data: * **Complete customer profiles** with data from all touchpoints * **Real-time updates** as customers interact with your brand * **Unified customer journey** tracking across all channels * **Actionable insights** for better decision making ## How Masivo's CDP Works Masivo's CDP operates through four key components that work together to create a complete customer view: ### 1. Data Collection Your CDP automatically gathers customer data from all your connected systems: * Website and mobile app interactions * Email marketing platforms * CRM and sales tools * Customer support systems * E-commerce platforms * Social media channels ### 2. Data Unification Using advanced Identity Resolution, Masivo connects all data points that belong to the same customer: * Links anonymous website visits to known customer profiles * Connects mobile app usage with email engagement * Unifies purchase history across different channels * Matches support interactions with customer profiles ### 3. Profile Creation Creates rich, comprehensive customer profiles that include: * Contact information and preferences * Complete purchase and interaction history * Behavioral patterns and engagement levels * Customer journey stages and lifecycle status * Preferences and segmentation data ### 4. Real-Time Activation Makes this unified data available across your entire business: * Personalized marketing campaigns * Informed sales conversations * Context-aware customer support * Product recommendations * Targeted promotions and offers ## Key Components of Masivo's CDP ### Customer & Contact Management Masivo automatically creates and maintains detailed customer profiles by collecting individual touchpoints (contacts) from every interaction. This includes website visits, email subscriptions, mobile app usage, and purchase activities. ### Event Tracking The platform captures and processes customer events in real-time, from purchases and registrations to birthday celebrations and tier changes. These events power personalized campaigns and customer journeys. ### Integration Hub Masivo seamlessly connects with your existing tools and platforms, automatically syncing customer data, events, and campaigns with your marketing automation, CRM, analytics, and other business systems. ### Identity Resolution (Unification) The core engine that intelligently matches and unifies customer data across all touchpoints, ensuring you have one complete view of each customer regardless of how they interact with your brand. ## Key Benefits for Your Business ### Enhanced Customer Experience * **Personalized interactions** based on complete customer history * **Consistent messaging** across all channels and touchpoints * **Relevant recommendations** based on actual behavior and preferences * **Seamless experiences** as customers move between channels ### Improved Marketing Effectiveness * **Better targeting** with complete customer profiles * **Higher conversion rates** through personalization * **Reduced marketing waste** by avoiding irrelevant messaging * **Improved customer lifetime value** through better engagement ### Operational Efficiency * **Faster customer service** with complete interaction history * **More informed sales conversations** with full customer context * **Better inventory planning** based on unified purchase data * **Streamlined operations** with single source of customer truth ### Data-Driven Decision Making * **Complete customer journey visibility** for better strategy * **Accurate customer analytics** based on unified data * **Better segmentation** for targeted campaigns * **Measurable ROI** on customer experience investments ## CDP Best Practices ### Start Simple, Scale Smart * Begin with your most important data sources * Focus on high-value customer touchpoints first * Gradually add more data sources as you see results * Continuously refine and improve your setup ### Focus on Data Quality * Ensure consistent data formatting across sources * Regularly audit and clean your customer data * Set up validation rules for incoming data * Monitor data completeness and accuracy ### Prioritize Privacy and Compliance * Implement proper consent management * Ensure GDPR and CCPA compliance * Provide clear opt-out mechanisms * Maintain transparent data usage policies ### Measure and Optimize * Track key performance indicators * Monitor customer experience improvements * Measure business impact and ROI * Continuously optimize based on results ## Ready to Transform Your Customer Data? Masivo's Customer Data Platform turns scattered customer information into a powerful business asset. Start building unified customer profiles that drive better experiences, stronger relationships, and measurable business growth. ## Related architecture * [Registration flow](/resources/data-architecture#registration-flow) — Where new customer profiles enter Masivo * [Activity & events](/resources/data-architecture#activity-events) — How customer actions are captured and processed * [Marketing & destinations](/resources/data-architecture#marketing-destinations) — How unified data powers segmentation and external sync * [Privacy & consent](/resources/data-architecture#privacy-consent) — How consent gates CDP data use and sharing ### Next Steps * [Learn about Customers & Contacts](/guides/CDP/customers) - Understand how customer data is structured * [Explore Event Tracking](/guides/CDP/events) - See how customer actions are captured * [Set up Integrations](/guides/CDP/integrations) - Connect your existing tools * [Configure Identity Resolution](/guides/CDP/unify/overview) - Unify your customer data *** **Ready to see your customers clearly?** Your unified customer view is just a few clicks away. # Smart Menu Source: https://docs.masivo.ai/guides/CDP/smart-menu Personalized product recommendations based on customer preferences and behavior # Product Recommendations Masivo's Smart Menu transforms your product catalog into a personalized shopping experience that adapts to each customer's unique preferences and behavior. Instead of showing the same products to everyone, your customers see exactly what they're most likely to love. ## How Smart Menu Works Smart Menu analyzes each customer's complete profile to understand their preferences, purchase history, and browsing behavior. It then creates personalized product categories that feel like they were handpicked just for them. The system learns from every interaction, continuously refining recommendations to show customers the products they're most likely to purchase. Whether they're browsing your website, using your mobile app, or shopping in-store, each customer sees a menu tailored specifically to their tastes and needs. ## Personalization Features **Preference-Based Categories** automatically organize products based on what each customer has shown interest in. A fashion lover sees clothing categories, while a tech enthusiast sees electronics sections, all without any manual configuration. **Best Sellers** highlights your most popular products, but filtered through each customer's preferences. They see the best sellers in categories they actually care about, not just your overall top performers. **You Might Like** uses advanced algorithms to predict products customers haven't tried yet but are likely to love, based on their past behavior and similar customers' preferences. **Trending Now** shows what's popular among customers with similar profiles, helping them discover new products that align with their interests. ## Customization Options Smart Menu adapts to your business structure, allowing you to customize recommendations by **store location**, **sales channel**, or **brand**. A customer shopping at your downtown location might see different trending items than someone browsing your suburban store, even if they have similar preferences. You can also adjust the recommendation engine to prioritize different factors. Some businesses want to focus on profit margins, while others prefer to highlight customer satisfaction ratings or inventory levels. The system learns your priorities and adjusts recommendations accordingly. ## Real-World Impact Customers spend more time browsing when they see products they're actually interested in. Smart Menu increases engagement by showing relevant products first, reducing the time customers spend searching for what they want. The personalization also drives higher conversion rates because customers are more likely to purchase products that match their preferences. When every product suggestion feels curated for them, customers trust your recommendations and make more confident purchasing decisions. Smart Menu also helps you understand your customers better by revealing patterns in their preferences and behavior. You can see which product categories resonate with different customer segments, helping you make smarter inventory and marketing decisions. ## Next Steps * [Learn about Customer Data](/guides/CDP/customers) - Understand how customer preferences are captured * [Explore Event Tracking](/guides/CDP/events) - See how behavior data powers recommendations * [Set up Integrations](/guides/CDP/integrations) - Connect Smart Menu with your existing systems *** **Ready to personalize your product experience?** Start showing customers exactly what they want to see, every time they visit. # Onboarding Source: https://docs.masivo.ai/guides/CDP/unify/onboarding Your first steps into unified customer identity # Your Journey to Unified Customer Identity Imagine Sarah, a customer who visits your website on her laptop, signs up for your newsletter on her phone, and makes a purchase using her tablet. Without Identity Resolution, these would appear as three different customers in your system. But with Masivo's Identity Resolution, you can connect these interactions to see Sarah's complete journey. ## Before You Begin Let's make sure you're ready to start connecting your customer data: 1. **Access granted**: You have the right permissions to configure identity rules 2. **Data flowing**: Your customer data is already coming into Masivo from your website, app, or other sources 3. **Fields identified**: You know which customer information (like email or phone) you want to use for matching ## Finding Identity Resolution Your unified customer view is just a few clicks away: 1. Open your **Customers** section in the Masivo dashboard 2. Look for **Identity Resolution** in the side menu 3. Click to enter your identity management center ## Your First Look at Identity Resolution When you first arrive, you'll see something powerful yet simple: your **Default Identity Resolution** section. Think of this as your foundation - the basic rules that help Masivo recognize when different customer records actually belong to the same person. ### What You're Seeing The default rule you see is already working behind the scenes across ALL your connected data sources. Every Masivo account comes with this rule pre-configured, and it automatically applies to every integration you have - your website, mobile app, CRM, email platform, and any other system sending customer data to Masivo. **"Sources"** - This rule looks for email fields in your customer data and uses them to connect related records, no matter which system they came from. ### The Power of Universal Coverage Here's what makes this special: you don't need to set up separate rules for each of your data sources. Whether Sarah signs up on your website, downloads your mobile app, or contacts your support team, the same identity matching logic works across all these touchpoints automatically. ### Why This Matters Every time a customer interacts with your brand: * Signs up with their email on your website * Makes a purchase through your mobile app * Contacts support via your CRM system * Downloads content from your email campaigns This single default rule works across ALL these systems simultaneously, ensuring all these actions are connected to the same customer profile, giving you a complete picture of their relationship with your brand. ### One Rule, All Sources Think of it this way: instead of having to create separate matching rules for your website, mobile app, CRM, email platform, and other integrations, you have one powerful rule that covers everything. This means: * **Instant setup**: Your identity resolution starts working the moment you connect any data source * **Consistent matching**: The same logic applies whether data comes from your website or your mobile app * **No gaps**: Every customer touchpoint is covered automatically * **Simplified management**: One rule to understand and customize, not dozens ## Understanding Your Customer Data Let's continue with Sarah's story. As her interactions grow with your brand, you might notice patterns in your data: * Sometimes she uses "[Sarah.Johnson@email.com](mailto:Sarah.Johnson@email.com)" for business inquiries * Other times "[sarah.johnson@email.com](mailto:sarah.johnson@email.com)" for personal purchases * Her phone number appears in different formats: "+1-555-123-4567" vs "(555) 123-4567" ### Making Sense of the Variations This is where Identity Resolution becomes your detective. The default rules are smart enough to recognize these variations as the same person, but sometimes you might want to customize how matching works. ## Customizing Your Identity Rules ### When You Might Want to Edit Rules Think about editing your default rules when: * You have customers who use multiple email addresses * Your data comes in different formats from various sources * You want to match on phone numbers or other identifiers * You need more precise or more flexible matching ### How to Edit Your Rules Ready to make your rules work better for your specific data? Here's how: 1. **Click "Edit"** on your default rule 2. **Add conditions** - Maybe you want to match on phone numbers too 3. **Choose your logic** - Should it be email OR phone (more flexible) or email AND phone (more precise)? 4. **Consider advanced options** - Need time limits or group size controls? 5. **Save your changes** - Your new rules start working immediately ### Advanced Options (When You Need More Control) For businesses with specific matching needs, you can enable advanced settings: **Smart Protections:** * **Maximum Group Size**: Set a limit (like 5 or 10) to prevent too many profiles from accidentally merging together * **Time Windows**: Only match customers who interacted recently (like "in the last 30 days") **When to use these:** * You have customers with common names (like "John Smith") * Your business is seasonal or event-based * You want extra precision to avoid mixing up different customers * You're dealing with large volumes of customer data **How to enable:** 1. **Check "Enable advanced settings"** when editing a rule 2. **Set your maximum group size** (start with 10, adjust based on your needs) 3. **Add time limits** if your business has seasonal patterns 4. **Test with a small group** before applying to all customers ### Real-World Example: The Busy Restaurant Chain FoodieChain noticed they were accidentally merging different customers named "Maria Garcia" who used the same phone number format. Here's how they fixed it: 1. **Enabled advanced settings** 2. **Set maximum group size to 3** (prevents over-merging) 3. **Added temporal limit**: "occurred in the last 90 days" (seasonal menu changes) 4. **Required both email AND phone** to match (more precise) Result: Clean customer data with no more accidental merges, while still connecting genuine repeat customers. ## Seeing Your Rules in Action ### What Good Rules Look Like Your rules will show up in plain English, making them easy to understand: * "Email field contains 'email'" (matches any record with an email) * "Email field contains 'sarah' AND Phone field equals '+15551234567'" (matches Sarah specifically) * "Email field contains 'gmail.com' OR Phone field equals '+15551234567'" (matches Gmail users or that specific phone) ### The Magic Happens Automatically Once your rules are set up, they work behind the scenes. Every new customer interaction gets checked against your rules, and if it matches an existing customer, their profile gets updated with the new information. ## Growing Your Identity Strategy ### Start Simple, Get Sophisticated The beauty of Identity Resolution is that you can start simple and grow more sophisticated over time: 1. **Week 1**: Use the default email matching (you're already here!) 2. **Week 2**: Add phone number matching for mobile customers 3. **Month 1**: Create more specific rules for different customer types 4. **Month 3**: Fine-tune your matching to reduce false positives ### Signs Your Rules Are Working You'll know your Identity Resolution is successful when: * Customer profiles become richer with more complete data * You see fewer duplicate customers in your system * Your marketing campaigns become more effective with better targeting * Customer service has a complete view of each customer's history ## Your Next Steps Now that you understand the foundation, you can explore: 1. [Advanced configuration options](/guides/unify/space-setup) 2. [Real-world use cases](/guides/unify/use-cases) 3. [Understanding different types of identifiers](/guides/unify/external-ids) Remember: Identity Resolution is not just about technology - it's about understanding your customers better and creating more meaningful relationships with them. # Overview Source: https://docs.masivo.ai/guides/CDP/unify/overview Unified customer identity management across multiple data sources # Identity Resolution Identity Resolution is a system that allows you to unify and resolve your customers' identities across multiple data sources and channels. This functionality uses customizable rules to match customer profiles based on different identifying fields. ## What is Identity Resolution? Identity Resolution is the process of combining data records that refer to the same real entity (in this case, a customer) but may appear in different formats or data sources. In Masivo, this means being able to identify that the same customer is interacting with your brand across different channels, devices, or platforms. ## Main Components ### Default Identity Rules Every Masivo account comes with a pre-configured default rule that automatically applies to all your data sources. This rule cannot be deleted and serves as your foundation for customer matching across every integration you have - whether it's your website, mobile app, CRM, or any other connected system. ### Global Coverage Since the default rule applies to all your data sources automatically, you don't need to configure anything separately for each integration. Whether a customer interacts through your website, mobile app, email campaigns, or any other connected platform, the same identity matching rules will work across all of them. ## Available Field Types The system allows you to match customers using different types of identifying fields: * **Email**: Email address * **Phone**: Phone number * **User ID**: Unique user identifier * **Device ID**: Device identifier * **IP Address**: IP address * **Name**: Customer name * **Custom Fields**: Any other fields from your data sources ## Key Benefits * **Unified customer view**: Combines data from multiple touchpoints * **Enhanced personalization**: Better understanding of the customer journey * **Duplicate reduction**: Prevents duplicate customer records * **More accurate analytics**: Cleaner data for insights and reports ## How It Works Every Masivo account starts with a default identity rule already working for you. This rule automatically scans all your connected data sources - your website, mobile app, email platform, CRM, and any other integrations - looking for matching customer information. The system uses Masivo's Rules Engine to evaluate conditions and determine when two records belong to the same customer. Rules are executed with different operators like "contains", "equals", and more. ### Rule Logic Options **Alternative Conditions (OR logic)** Match customers if ANY of the conditions are met. For example: * Email contains "@company.com" OR Phone equals "+1234567890" **Compound Conditions (AND logic)** Match customers only if ALL conditions are met. For example: * Email contains "@company.com" AND First name equals "John" ## Advanced Control Options When you need more sophisticated customer matching, Identity Resolution offers advanced controls: * **Smart Group Limits**: Prevent too many customer profiles from being merged together (perfect for businesses with common names or emails) * **Time-Based Matching**: Only connect customer interactions that happened recently (great for seasonal businesses or limited-time campaigns) * **Complex Logic**: Combine multiple matching conditions to create precise rules that fit your specific business needs ## Getting Started To set up Identity Resolution: 1. **Access the feature**: Navigate to Customers → Identity Resolution 2. **Review default rules**: Check the existing default matching rules 3. **Create custom rules**: Add source-specific rules if needed 4. **Enable advanced settings**: Add time limits or group size controls if needed 5. **Test your configuration**: Verify rules work as expected 6. **Monitor results**: Review how customers are being matched ## Next Steps * [Onboarding Guide](/guides/unify/onboarding) - Get started with configuring your first identity resolution rules * [Space Setup](/guides/unify/space-setup) - Learn about the configuration interface * [Use Cases](/guides/unify/use-cases) - See examples of rule configurations * [External IDs](/guides/unify/external-ids) - Understand identifier management concepts ## Related architecture * [Registration flow](/resources/data-architecture#registration-flow) — How CDP contacts merge into the customer profile at signup and identification # Accumulating rewards Source: https://docs.masivo.ai/guides/accumulating-rewards Learn how customers can accumulate rewards ## How customers can accumulate rewards In Masivo campaigns are the distribution channel of rewards. When a customer action or event matches the campaigns' rules, the customer automatically receive the reward. ## Facts about accumulation * Customers can receive rewards from **multiple campaigns at the same time** if they meet the rules of each campaign. * Customers won't receive rewards if they are outside the campaign's global tier scope, or, for coupon campaigns, do not meet a **Customer tier** rule condition. * Campaign tier eligibility uses the customer's tier when event processing starts, before the same event can change that tier. * A campaign can contain multiple rules and **each rule can reward the customer** with a different reward. * If some rule contain multiple conditions, the customer must meet **all AND conditions** to receive the reward. * If some rule contain multiple conditions, the customer must meet **at least one OR condition** to receive the reward. * **AND & OR conditions can be combined** in the same rule. Therefore, the customer must meet all AND conditions and at least one OR condition to receive the reward. * Each campaign type comes with its own mechanism to accumulate rewards. For example, **behavior campaigns** accumulate rewards based on customer events, while **coupons campaigns** accumulate rewards when a coupon code is redeemed. ## Test rewards accumulation Currently, the only way to test reward accumulation is by using our [REST API](/api-reference). In the future, we will provide a playground to test reward accumulation. ## Next steps Want to analyze how customers are accumulating rewards? * **View analytics**: Navigate to **Analytics > Rewards** to see accumulation patterns and trends * **Export data**: Learn how to [export analytics tables to CSV](/guides/analytics-exports) for deeper analysis of reward distribution ## Related architecture * [Activity & events](/resources/data-architecture#activity-events) — How qualifying events update wallet balances and tiers # Catalogs Source: https://docs.masivo.ai/guides/catalogs Create catalogs from products and manage selections from the dashboard. ## Dashboard 1. Open **Marketing automation → Catalogs**. 2. Use **New catalog** to pick a brand and products; fields are derived from product data. 3. Open a catalog to view items and create selections (field, operator, value, limit). ## Storefront API Authorize with your API key, then use `GET/POST /catalogs`, item routes under `/catalogs/{id}/items`, and selections under `/catalogs/{id}/selections`. See the API reference for request schemas. # Create templates Source: https://docs.masivo.ai/guides/content-templates Learn how to create template in Masivo ## Templates in Masivo Templates in Masivo are available in **Campaigns, Rewards, and Tiers**. They ensure consistency, save time, and simplify content management. ### How Clients Use Templates Clients integrate with Masivo to retrieve structured data from different entities For more information, please consult our [REST API](/api-reference). One of the key challenges when managing large amounts of content is ensuring that its structure remains consistent across multiple instances. For example, a client may have **over 100 active campaigns** running simultaneously. Instead of manually defining the content structure for each campaign, templates allow them to **predefine a reusable format**, ensuring that all campaigns follow the same content structure. Templates are beneficial because: * They **standardize the structure of campaign content**, making it easier to manage at scale. * Clients don’t need to **manually define the format** for each new campaign. * A single template can be applied across multiple campaigns, ensuring consistency without repetitive effort. ### Where Templates Are Used Templates apply specifically to the **content section** of campaigns, rewards, and tiers. When a client retrieves this data, it follows the predefined template, ensuring that all content maintains the same structure. By using templates, clients can manage content efficiently without having to recreate formats for every new instance. Now you understand how templates structure the content within campaigns, rewards, and tiers, ensuring a reusable and consistent format across multiple integrations. ## Creating a new template To create a new template, navigate to the **Templates** section within the corresponding section (**Campaigns, Rewards, or Tiers**) in the dashboard. Click the **New template** button to start creating a new template. ## Template Configuration Each template consists of the following settings: * **Name**: A descriptive name for the template. Helps distinguish templates in the list. * **Description** *(Optional)*: Additional details about the template. * **Status**: Active or inactive. * **Schema Settings**: Define structured content by adding blocks. ## Adding Blocks to Templates Blocks are used to enforce dynamic content structures within a template. When adding a block, the available settings depend on the selected type: ### Input Block * **Input name**: The field identifier. * **Input placeholder**: A hint or example value. * **Required**: Whether the field must be filled out. ### Textarea Block * **Textarea name**: The field identifier. * **Textarea placeholder**: A hint or example value. * **Required**: Whether the field must be filled out. ### Image Block * **Image name**: The field identifier. * **Required**: Whether the image is mandatory. * **alt** *(Optional)*: Enforce the use of an alternative description (alt) in the image. * **href** *(Optional)*: Enforce the use of a link (href) in the image. After configuring your blocks, click **Save** to finalize the template. ## Using Templates Once created, templates can be used across different sections of Masivo: * **Campaigns** * **Rewards** * **Tiers** A template created in **Campaigns** cannot be used in **Rewards** or **Tiers** To use a template, simply select it from the **Content** section when creating a new entity and customize the values as needed. That's it! You have created a template that can be applied within its corresponding section in Masivo. # Create and manage service forms Source: https://docs.masivo.ai/guides/create-and-manage-review-forms Learn how to create service forms, configure fields, automate tickets, and review submissions in Masivo ## Service forms in Masivo Navigate to **Service forms** in CRM. The section has two tabs: * **Service forms** — list and manage form definitions * **Reviews** — all reviews across forms The Storefront API keeps `/review-forms` in its paths for compatibility. ## Creating a new service form On the **Service forms** tab, click **New form** (requires **review\_forms** write permission). The editor contains **Base Settings**, **Ticket automation**, and **Fields**. ### Base settings Configure: * **Name** — unique per account (used internally and in lists) * **Description** — optional internal notes * **Type** — `Rating`, `Comment`, `Thread`, or `Custom` * **Status** — `Active` or `Inactive` (only active forms are available via the Storefront API) ### Fields Use **Add field** to define each question or input that channels must send when creating a review. For each field set: * **Field name** — API key used in `answers` (for example `score`) * **Label** — display label for your UI * **Type** — Score, Text, Select, or Multi select * **Required** — whether the answer is mandatory Additional settings by type: * **Score** — min and max values (default 1–5) * **Select / Multi select** — use **Add option** for each choice (label and value) * **Images** — optional, up to five per field; use **Add image**, then **Select an image** to pick or upload from your multimedia library, and set **Alt** text Field names must be unique within the form and should stay stable after launch. Clients submit answers keyed by field name, not by label. ### Ticket automation Enable **Create tickets from responses** when submissions should open support work. Choose the pipeline and priority explicitly. Generated tickets enter the normal agent rotation and keep the review linked as their source. **Open a ticket** decides which responses deserve one: * **Every response** — one ticket per submission. * **When conditions match** — use **Add conditions** to open the dedicated condition editor. Save there to return to the service form, where every condition group has edit and delete actions plus a readable summary. Conditions inside a group are combined with **AND**; separate groups are combined with **OR**. Each condition picks a type in the modal: * **Response answer** — evaluates one answer of the form (for example *Rating is at most 2*). Pick the answer from the **Answer** select; it lists the fields defined in this form, and the operators adapt to the field: comparisons for scores, text matching for open answers, and *equal to* / *not equal to* for selects. This condition only appears once the form has fields, so define them first. * **Response sentiment score** — the AI sentiment score of the response, from 0 to 100. * **Response emotion** — an emotion the AI detected, such as *Angry* or *Disappointed*. * **Response risk flag** — a risk the AI detected, such as *Churn risk* or *Delivery issue*. Answers are evaluated the moment the response arrives; conditions that read the AI analysis wait until the response has been analyzed, so those tickets show up a few minutes later. Ticket creation happens after the review is saved. A legacy form that references a missing pipeline cannot create the ticket, but it does not reject the review; the failure is logged for operators. An unavailable roster creates the ticket unassigned for the queue sweep. When you are done, click **Save** in the form actions panel to create the service form. ## Editing and deleting Return to **Service forms** in CRM. In the table, each row shows the form name and actions: * **View** — open reviews for that form only * **Edit** — update settings and fields (requires **review\_forms** write) * **Delete** — soft-delete the form (requires **review\_forms** delete) The edit URL follows `/crm/review-forms/{reviewFormId}/update`. ## Reviewing submissions ### All reviews Open **Reviews** in the secondary navigation (path `/crm/review-forms/reviews`) to see every review for the account. Use table filters and search to narrow results. ### Per service form From the **Service forms** tab, click **View** on a row, or go to `/crm/review-forms/{reviewFormId}`. You see only reviews for that form. The reviews table includes: * **Received** — submission timestamp * **Customer** — `customer_id` or `-` for anonymous * **Source**, **Platform**, **Brand**, **Channel** — attribution dimensions * **Answers** — JSON payload keyed by field names ## Next steps To load service form definitions and submit reviews from your app, follow [Submit reviews](/api-reference/guides/submit-reviews) in the API reference. For domain concepts (field types, events, permissions), see [Service forms](/concepts/review-forms). # Create audiences Source: https://docs.masivo.ai/guides/create-audiences Learn how to create and manage dynamic customer audiences in Masivo Audiences are automatically recalculated to ensure your customer segments stay current and accurate. You can configure how frequently audiences are recalculated based on your business needs ## What you'll learn By the end of this guide, you'll know how to create dynamic customer segments that automatically update based on customer behavior and attributes, enabling you to deliver targeted marketing campaigns and personalized experiences. ## Step 1: Access the audiences section Navigate to **Marketing Automation > Audiences** in your dashboard. This is your control center for creating and managing customer segments that power your automated marketing campaigns. Click the **New audience** button to start building your first dynamic customer segment. ## Step 2: Configure your audience foundation Start by establishing the core settings that will define how your audience operates: **Choose a descriptive name**: Use specific names like "High-Value Customers" or "Cart Abandoners - 24h" instead of generic ones. This makes audiences easy to identify when building journeys and campaigns. **Add a helpful description**: Write a brief explanation of the audience's purpose. For example: "Customers who have spent over \$500 in the last 6 months" or "Users who registered but haven't made their first purchase." **Set brand scope**: Decide whether this audience applies to: * **All brands**: Choose this for universal segments like "VIP Customers" that span your entire business * **Specific brand**: Select this when creating brand-specific segments for targeted campaigns Start with brand-specific audiences for your first segments. They're easier to manage and create more targeted marketing experiences. ## Step 3: Configure audience frequency Set how often your audience should recalculate to stay current with customer behavior: **Choose your update frequency**: * **Never**: For static, one-time segments that don't need updates * **Daily**: For audiences based on recent activity (recommended for most use cases) * **Weekly**: For segments based on weekly patterns or less time-sensitive criteria * **Monthly**: For audiences based on monthly spending or long-term behavior * **Quarterly/Yearly**: For segments based on seasonal patterns or annual metrics More frequent updates provide better accuracy but consume more resources. Choose the frequency that matches your business needs and campaign timing. ## Step 4: Define audience conditions This is where you define who belongs in your audience using powerful condition builders ## What you've accomplished You've created a dynamic customer audience that automatically maintains accurate segments based on real-time customer behavior. Your audience will now continuously update to ensure your marketing campaigns always target the right customers at the right time. ## Related architecture * [Audiences](/resources/data-architecture#audiences) — How membership is built, recalculated, and kept in sync * [Activity & events](/resources/data-architecture#activity-events) — Where profile traits used in conditions come from * [Marketing & destinations](/resources/data-architecture#marketing-destinations) — How audiences drive journeys and destination sync # In-app templates Source: https://docs.masivo.ai/guides/create-in-app-templates Learn how to create and manage in-app message templates in Masivo ## What you'll learn By the end of this guide, you'll know how to design in-app message templates, set delivery priority, and prepare them for audience schedules or journey actions. ## Step 1: Access in-app templates Navigate to **Marketing Automation → In-app templates** in the dashboard. Click **New in-app template** to open the editor. ## Step 2: Choose a message type Select the surface that best fits your campaign: * **Modal** — centered dialog for promotions or announcements * **Fullscreen** — high-impact takeovers * **Slide up** — bottom sheet for secondary actions * **Banner** — lightweight top or bottom alerts ## Step 3: Build the template content Add a descriptive **name**, optional **description**, and **brand** when you manage multiple brands. Enter a **title** and **body**. Add an optional **image URL** for a hero visual and configure **buttons** (primary action, dismiss, deeplink, or external URL). Under **Delivery**, set **priority** when multiple messages are eligible for the same customer. Higher values win. Use the team picker to restrict who sees this template in analytics. Leave empty for account-wide visibility. Use the iOS and Android previews to validate layout before saving. ## Step 4: Test and schedule **Send test** delivers the template to a test audience so you can verify rendering on real devices. **Schedule** materializes messages for a selected audience at a chosen time. Large audiences are subject to the in-app send limit shown in the scheduler. ## A/B testing with variants Use the **A/B testing** section to add up to four versions of the same template (layout, copy, or design). Scheduled sends can split the audience by percentage. Journey in-app actions pick one variant. See [Template variants](/guides/template-variants) for limits, distribution, tests, and analytics. ## Step 5: Use in journeys Add an **In-app** action node in a journey and select your template. Connect the node to an event edge so messages materialize when customers hit that step. For real-time delivery, pair journey in-app nodes with qualifying customer events. Your app should call `GET /inapp/capabilities` to learn which `eventTypes` trigger a refresh. ## Analytics Open **Analytics → In-app** to review delivery, impressions, clicks, and dismissals. ## Next steps * [Integrate in-app messages](/guides/in-app-messages) — connect your mobile app * [Template variants](/guides/template-variants) — A/B test layouts and copy * [Integrate in-app messages](/api-reference/guides/integrate-in-app-messages) — API examples * [In-app messages concept](/concepts/in-app-messages) — lifecycle and configuration reference # Journeys Source: https://docs.masivo.ai/guides/create-journeys Learn how to create and manage automated customer journeys in Masivo ## What you'll learn By the end of this guide, you'll know how to build sophisticated automated workflows that respond to customer behavior in real-time, creating personalized experiences that drive engagement and conversions. ## Step 1: Access the journeys section Navigate to **Marketing Automation > Journeys** in your dashboard. This is your command center for creating automated customer experiences. Click the **New journey** button to start building your first automation workflow. ## Step 2: Define your journey foundation Start by establishing the core parameters that will guide your automation: **Name your journey strategically**: Use descriptive names like "New Customer Onboarding" or "Cart Abandonment Recovery." This helps you quickly identify the purpose when managing multiple journeys. **Choose your audience wisely**: * **Specific audience**: Select this when you want to target customers with particular characteristics (VIP customers, recent purchasers, etc.) * **All customers**: Choose this for universal experiences like welcome sequences or general announcements Start with a specific audience for your first journey. It's easier to create targeted, effective automation when you know exactly who you're reaching. ## Step 3: Build your automation workflow Now you'll create the actual automation using the visual journey editor. Think of this as building a flowchart that responds to customer actions. ### Create your first journey step Every journey starts with a trigger. Here's how to set it up: **1. Choose your trigger event**: Select what customer action will start this automation **2. Set your conditions**: Define who qualifies for this step **3. Configure time delay**: Decide when the action should happen (configured in minutes): * **Fires immediately**: For urgent communications like order confirmations * **Custom wait time**: Add strategic delays (e.g., wait 60 minutes) **4. Add actions**: A new step shows **No actions yet**. Click **Add action** and choose what happens when the customer reaches this step: * **Send email**: Send a personalized email using your templates * **Send push notification**: Deliver a mobile notification. The FCM `data` payload includes `customerId` and does **not** include `notificationId` (unlike dashboard test sends) * **Send in-app message**: Deliver an in-app message from a template * **Send whatsapp message**: Send an approved WhatsApp template * **Send news feed card**: Publish a News Feed card from a template * **Loop**: Send the customer back to an earlier step * **Send event to destination**: Forward an event to a connected destination * **Send to Meta (Customer List Custom Audience)**: Available when a Meta Audiences destination is connected * **Send to Braze (Client Custom Attribute)**: Available when a Braze destination is connected Ticket journeys use a different action list. See [Ticket journey triggers](/guides/ticket-journey-triggers). ## Step 4: Connect your templates Messaging actions use templates you already created: * **Email**: email template, then an **Email variant** when the template has more than one version * **Push**: push template, then a **Push variant** when needed * **In-app**: in-app template, then an **In-app variant** when needed * **WhatsApp**: an approved WhatsApp template, then a **WhatsApp variant** when needed * **News feed**: news feed card template, then a **News feed variant** when needed If you don't have templates yet, create them first in Email, Push, WhatsApp, In-app, or News Feed templates. A journey action cannot be saved until the template (and variant, when required) is selected. ## Multiple actions Each journey step can run **more than one action**. After the first action exists, use **Add action** again to attach another. The step header is **Actions**. The canvas shows the first action in full and `+N more` when additional actions exist. Click the actions list to open the panel, then edit or delete any action. When the customer reaches the step, Masivo runs the actions **in the order you added them**. Each messaging action can use a different template and, when the template has variants, a specific variant. A step can stay with **No actions yet**. The customer can still progress when the step's trigger and wait time are met. ## Template variants in journey actions If the selected template has more than one [template variant](/guides/template-variants), the action form shows **Select a variant**. You must pick one version before **Save** is enabled. That action always sends the chosen variant — journeys do not split traffic by percentage on the template. This is separate from [split variants](#split-variants-ab-paths), which divide customers into different **paths**. ## Split variants (A/B paths) Use split variants when you want to divide customers into different **paths** by percentage (for example, Variant A = 70%, Variant B = 30%). This does not change the copy inside a template. To A/B test message content, use [template variants](/guides/template-variants). ### Where you can create a split * You can create only **one split per journey** * The split can be inserted only on **first-level steps** (direct children of `Start journey`) * After a split exists, you can still add regular nodes, but you cannot insert a second split ### How to add more variants After creating the split, click the split node to open the split form and use **Add variant**. * Do not use the `+` menu to create additional variants * Variant branches are managed from the split form ### Variant rules * Minimum weight: `0` * Maximum weight: `100` * Maximum variants per split: `8` * If variants exist, total weight must be exactly `100%` A variant with `0%` is valid and works as a paused branch while you keep its structure configured. ### How distribution works Customers are assigned to one variant using the configured weights. * Example: A = 70%, B = 30% * If 10,000 customers reach the split, expected distribution is \~7,000 in A and \~3,000 in B Percentages are probabilistic, so short-term numbers may vary slightly. ## Push payload on journey sends A journey **Send push notification** action does not reuse the dashboard test payload. Journey `data` includes `customerId` and `accountId`; it omits `notificationId`. Test sends from the push editor do the opposite. ```json theme={null} { "customerId": "user_abc123", "accountId": "00000000-0000-4000-8000-000000000001", "link": "https://links.example.com/l/XyZ123" } ``` `link` is the node short URL when the journey already mapped one. Otherwise it is the template destination URL. `redirect_*` keys follow [Push settings](/guides/settings/push) when configured. For test, scheduled audience, and manual API payloads, see [FCM data payload](/api-reference/guides/integrate-push-notification#fcm-data-payload). ## Compensate a customer Add **Compensate customer** to an action node to issue a reward directly to the customer executing the journey. A ticket is not required. Configure the reward, amount, validity, cooldown and customer limits in the action dialog. Limits can count compensation from both customer and ticket journeys. Retries deduplicate each action within a step; new entries follow the configured policy. See [compensation settings](/guides/ticket-journey-triggers#compensate-a-customer) for scope, limits, reward availability and failure behavior. ## What you've accomplished You've built an automated customer journey that responds intelligently to customer behavior, delivering personalized experiences at scale. Your journey will now work 24/7 to engage customers at the perfect moments. ## Related architecture * [Activity & events](/resources/data-architecture#activity-events) — How qualifying events enter the loyalty and journey pipeline * [Marketing & destinations](/resources/data-architecture#marketing-destinations) — How journeys and messages fit into the marketing data flow # Links Source: https://docs.masivo.ai/guides/create-links Learn how to create and manage links in Masivo marketing automation Links are the backbone of marketing automation measurement in Masivo. They enable you to track and analyze every marketing flow, whether you're using standalone links or embedding them within push notifications, emails, or journey workflows. ## What you'll learn By the end of this guide, you'll know how to create trackable short links that drive traffic and measure engagement. For better brand recognition, consider setting up your custom domain before creating links. You can configure this in [Links settings](/guides/settings/links). ## Step 1: Access the links section Navigate to **Marketing Automation > Links** in the dashboard. You'll find it in the left sidebar - this is your hub for creating and managing all trackable links. Click the **New link** button to start creating your first trackable link. ## Step 2: Configure your link basics Start by setting up the fundamental properties that define how your link will work: **Create a memorable alias**: Choose a short, descriptive name like "summer-sale" or "app-download." This helps you identify the link's purpose at a glance and makes it more trustworthy for users. **Set your destination URL**: Enter the complete URL where users should land, including `https://`. This could be a product page, landing page, or any web destination that supports your campaign goals. **Choose the right link type** based on your use case: * **Default**: Use for general marketing campaigns, email newsletters, and social media posts * **Ads**: Select when creating links specifically for paid advertising campaigns * **QR**: Choose when you need a scannable QR code for print materials or physical displays ## Step 3: Customize your short link **Select your domain**: Choose between the custom domains you've configured in your account settings. **Create your custom path**: This becomes the end of your short URL. For example, if you enter "holiday-deals", your final link will be `msvo.link/l/holiday-deals`. You can generate a random path using the shuffle button if you prefer, or copy the complete short URL using the copy button for immediate use. ## Step 4: Set up smart redirects (advanced) For mobile app marketing, configure custom redirects to create seamless user experiences: **Enable custom redirects**: Toggle this on when you want different behavior for iOS and Android users. **Configure iOS redirects**: Set where iPhone users go (typically your App Store listing or a specific app screen). **Configure Android redirects**: Define where Android users land (usually your Google Play Store page or app deep link). ### Recover the destination after an app install Normally, a user who doesn't have your app yet just lands on the app store — the original destination (a promo, a specific screen) is lost once they install and open the app for the first time. Deferred deep linking closes that gap: when the app opens, it can ask Masivo "was this install started from a link?" and get routed to the right place automatically. This works differently on each platform: * **Android**: works automatically for every link, no setup needed. Masivo attaches the click to the Play Store redirect, and the app reads it back through the Play Install Referrer API on first open. * **iOS**: requires opt-in per link, since it relies on the clipboard. In **Advanced Settings**, enable **Deferred deep linking via clipboard (iOS)**. Before sending users to the App Store, they'll see a **Get the app** button that copies the link to their clipboard. The first time the app opens, iOS shows a system prompt asking to allow pasting — accepting it lets the app recover the destination. This feature requires your mobile app to integrate the Masivo SDK's deep linking module. Share the [integration guide](/api-reference/guides/integrate-deferred-deep-linking) with your development team if you want to enable it for your app. ## Step 5: Add UTM tracking (optional) Masivo includes a built-in UTM builder if you need it for campaign tracking. Click the UTM settings button next to your destination URL to add campaign tracking parameters: * **Source**: Identify where traffic comes from (e.g., "newsletter", "facebook", "google") * **Medium**: Specify the marketing medium (e.g., "email", "social", "cpc") * **Campaign**: Name your specific campaign (e.g., "summer-sale-2024") * **Term**: Add keywords for paid search campaigns * **Content**: Differentiate between ad variations or email versions These parameters help you track which campaigns drive the most valuable traffic in your analytics tools. ## Step 6: Generate QR codes for offline marketing When you select **QR** as your link type, Masivo automatically creates a scannable QR code perfect for: * Print advertisements and brochures * Product packaging and labels * Event displays and signage * Business cards and flyers The QR code updates automatically whenever you change the destination URL, keeping your offline materials current. ## What you've accomplished You've created trackable links that provide valuable insights into your marketing performance while delivering seamless user experiences. Your links are now ready to drive traffic and measure engagement across all your campaigns. ## Next steps Once your links are active, you can track their performance and export analytics data: * **Configure global link behavior**: Review [Links settings](/guides/settings/links) for domains, redirects, and QR branding * **View analytics**: Navigate to **Analytics > Links** to see clicks, conversions, and traffic sources * **Export data**: Learn how to [export analytics tables to CSV](/guides/analytics-exports) for deeper analysis and reporting ## Advanced link management ### Configure global settings Visit **Marketing Automation > Settings > Links** to set up: Detailed guide: [Links settings](/guides/settings/links) **Custom domains**: Add your own branded domains instead of using `msvo.link` for better brand recognition and trust. **Default redirects**: Set fallback iOS and Android URLs that apply to all links unless you specify custom redirects. **QR code branding**: Upload your logo to appear in the center of all generated QR codes for consistent brand presentation. ## Related architecture * [Marketing & destinations](/resources/data-architecture#marketing-destinations) — How trackable links support journeys, audience sends, and measurement # Push notifications Source: https://docs.masivo.ai/guides/create-push Learn how to create and manage push notification templates in Masivo ## What you'll learn By the end of this guide, you'll know how to create compelling push notification templates that grab attention, drive engagement, and seamlessly integrate with your automated marketing workflows. ## SDK Integration Requirements Push notifications will not work without proper SDK integration. Complete FCM setup before creating templates to ensure functionality. **Required setup**: Your app needs FCM configuration for both iOS and Android platforms. This includes: * Firebase project configuration with proper certificates * Platform-specific setup (APNs for iOS, FCM for Android) * Permission handling for notification access * Token management for device targeting **Testing requirements**: Push notifications must be tested on physical devices with preview builds - they won't work with Expo development servers or emulators. **Helpful resources**: * [React Native Firebase Documentation](https://rnfirebase.io/messaging/usage) - Official implementation guide * [Expo Firebase Setup](https://rnfirebase.io/#your-expo-project) - Required configuration for Expo projects * [Push settings guide](/guides/settings/push) - Configure Firebase SDK and token duration in Masivo ## Step 1: Access the push templates section Navigate to **Marketing Automation > Push templates** in your dashboard. This is where you'll create and manage all your reusable push notification designs. Click the **New push template** button to start creating your first push notification template. ## Step 2: Set up your template foundation Start by establishing the organizational details that will help you manage your templates effectively: **Choose a descriptive name**: Use specific names like "Flash Sale Alert" or "Order Shipped Notification" instead of generic ones. This makes templates easy to find when building journeys. **Add a helpful description**: Write a brief note about when you'll use this template. For example: "Sent when customers abandon their cart for 2+ hours" or "Welcome notification for new app users." ## Step 3: Craft your notification content Now create the actual notification that customers will see on their devices: **Write a compelling title**: This is your headline - make it count. Keep it under 50 characters for optimal display across devices. Examples: * "Your order is on its way!" * "50% off ends tonight!" **Create engaging body text**: This is your main message. Keep it concise but informative, ideally under 120 characters. Focus on value and urgency: * "Track your package and see estimated delivery time" * "Don't miss out - shop your favorites before midnight" **Add visual impact with images**: Upload an image that enhances your message. The image appears as a **rich notification attachment** in the OS tray — it is not your app's launcher icon or logo. Use high-quality visuals that: * Support your notification's purpose * Maintain brand consistency * Display well at small sizes * Follow platform guidelines (JPEG, PNG, or GIF formats) **Configure sound settings**: * Leave the field empty for a silent notification. * Enter `default` to use the device's default notification sound. * Enter a bundled `.wav` filename such as `order_ready.wav` for a custom sound. Custom notification audio cannot be uploaded to or streamed from Masivo. iOS and Android require the file to be included in the installed mobile app. The filename in the template must exactly match that bundled file. See the [mobile integration guide](/api-reference/guides/integrate-push-notification#custom-notification-sounds). **Set up deep linking**: Add a URL that opens a specific screen in your app when users tap the notification: * Product pages for promotional notifications * Order tracking for shipping updates * Specific app sections for engagement notifications ## Step 4: Optimize for different platforms Use the real-time preview to see how your notification appears on both iOS and Android devices: **iOS preview**: Check that your title and text display properly within iOS notification constraints. **Android preview**: Verify that your content works well with Android's notification style and length limits. **Make adjustments**: Refine your content based on how it appears in both previews to ensure optimal display across all devices. ## Step 5: Test and deploy your template Before using your template in campaigns, it's important to test and understand its reach: ### Send test push notifications Test your template to ensure it works correctly across different devices: **Use the test function**: Click the **Send test** button in your template actions to send a preview to your test audience. **Test audience requirements**: Your test group must have customers with registered device tokens. If your test audience is empty or has no device tokens, you'll need to add customers with mobile app installations first. **Physical device testing**: Push notifications must be tested on actual devices with preview builds - they won't work with development servers or emulators. A test send uses a different FCM `data` payload than a journey send: tests set `notificationId` to `"test"` and omit `customerId`. Scheduled sends use the delivery history id as `notificationId`. See [FCM data payload](/api-reference/guides/integrate-push-notification#fcm-data-payload) for the full JSON per origin. ### Schedule push notifications Once your template is ready, you can schedule it for delivery: **Schedule for later**: Use the **Schedule** button to set up automated delivery at specific times. **Choose your audience**: Select which customer segment will receive your push notification campaign. **Set timing**: Pick the optimal time for your audience based on their activity patterns and time zones. The system tracks two key metrics for each audience: total audience size and customers with device tokens. This helps you understand your potential push notification reach before sending campaigns. ## A/B testing with variants Use the **A/B testing** section to add up to four versions of the same template (title, body, image, sound, or deep link). Scheduled sends can split the audience by percentage. Journey push actions pick one variant. See [Template variants](/guides/template-variants) for limits, distribution, tests, and analytics. ## What you've accomplished You've created a professional push notification template that captures attention, communicates value, and drives user action. Your template is now ready for testing and deployment to engage customers effectively through your automated marketing workflows. ## Next steps Once your push notification campaigns are running, you can track their performance and export analytics data: * **Configure channel settings**: Review [Push settings](/guides/settings/push) to manage Firebase credentials and token duration * **View analytics**: Navigate to **Analytics > Push** to see delivery rates, opens, and engagement metrics * **Compare variants**: When a template has more than one version, the template analytics view includes a variants table. See [Template variants](/guides/template-variants#analytics) * **Export data**: Learn how to [export analytics tables to CSV](/guides/analytics-exports) for deeper analysis and reporting ## Related architecture * [Marketing & destinations](/resources/data-architecture#marketing-destinations) — How push templates are sent through journeys and audience campaigns # Create rewards Source: https://docs.masivo.ai/guides/create-rewards Learn how to create rewards in Masivo