---
title: User Selected Perks
slug: user-selected-perks
icon: 📀
docTags: 
createdAt: 2025-07-26T11:41:44.346Z
---

:::hint{type="info"}
**Who is this for:** Partners who want to let users choose relevant offers before completing a key action such as checkout or registration.

**Outcome:** Implement USP to capture user offer selections during an active session and trigger personalized delivery via webhooks after the desired user action is completed.
:::

# Overview

User Selected Perks (USP) allows users to select relevant offers at critical engagement points, such as checkout, registration, or event participation, before completing a key action. Instead of redirecting users off-site, USP captures their selections during the active session and defers offer delivery until after the desired action is completed.

This workflow increases conversion by maintaining user focus and building anticipation for post-action rewards. Publishers can deliver selected offers via email, SMS, or other channels, triggered by custom events.&#x20;

USP integrates with existing MomentPerks implementations through the JavaScript SDK or MomentPerks API, supporting flexible delivery and seamless user experiences.

## Key Benefits

- Empowers users to select offers most relevant to their interests.
- Drives engagement during critical conversion moments.&#x20;
- Enables follow-up communication workflows based on actual user selections.&#x20;

## Prerequisites

Before using USP, ensure the following:

1. USP must be enabled for your account. Contact your MomentScience account manager to activate it.
2. You must have an existing MomentPerks integration using either the JavaScript SDK or the Moments API.

# How It Works

1. **Display available offers:** Users see a Multi Offer Unit (MOU) with available offers, each with a checkbox.
2. **User selects offers:&#x20;**&#x55;sers choose one or more offers that interest them. Offers can be pre-selected by default, depending on your configuration.
3. **User completes a key action:&#x20;**&#x57;hen users finish a publisher-defined action, such as checkout, registration, or content engagement, your site triggers a confirmation event. This event is fully customizable to your workflow.
4. **Webhook is triggered:&#x20;**&#x54;he MomentScience SDK detects the event and sends a webhook to your configured endpoint. The webhook contains data about the offers the user selected.
5. **Deliver personalized offers:&#x20;**&#x55;se the received data to send offers via email, SMS, or in-app messages, or to initiate other follow-up workflows.

## Example Use Cases

| **Use Case**          | **Description**                                                                                                                                                         |
| --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| E-commerce checkout   | Users select perks before completing checkout, then receive offers via email alongside order receipt after purchase                                                     |
| Event engagement      | Attendees select perks via interactive kiosks or OOH screens, receiving offers via SMS after completing specified event actions (e.g., booth visit, session attendance) |
| Exit-intent retention | Users select offers before leaving your site and receive them after completing a specific action (e.g., account creation, email subscription)                           |
| Account onboarding    | New users select perks during signup and receive selected offers after completing profile setup or verification                                                         |
| App engagement        | Mobile users select perks in-app and receive them after completing key app actions (e.g., completing first order, reaching usage milestone)                             |

## Integration Methods

USP can be layered on top of your existing MomentPerks integration, whether using the JavaScript SDK or the Moments API.

### Option A: JavaScript SDK

- The JavaScript SDK provides the simplest integration path for USP functionality. Important considerations:
- USP currently supports Multi Offer Unit (MOU) only
- Single Offer Unit (SOU) is not supported

### Option B: USP APIs

Use the USP REST API for advanced customization and control. This option is recommended for developers needing custom front-end or delivery logic.

## Configuring USP at the Theme Level&#x20;

USP is configured per theme, allowing you to enable or disable the feature for different implementations. You can have multiple themes with different USP configurations.

## Setting Up the USP Webhook&#x20;

To start receiving USP webhook payloads, follow these steps in the MomentScience Dashboard:

1. In the **MomentScience Dashboard**, navigate to **Settings > Configurations**.
2. Scroll to the **Postbacks and Webhooks** section.
3. Click **Manage** to open the webhook configuration page.
4. Switch to the **Webhooks for User Selected Perks** tab.
5. Choose the HTTP method (POST or GET).
6. Enter the webhook URL.
7. Click **Save** to confirm.

To test the integration, click **Test Endpoint**. This sends a dummy payload to verify the endpoint’s readiness.

:::Iframe{code="<div style=&#x22;position: relative; box-sizing: content-box; max-height: 80vh; max-height: 80svh; width: 100%; aspect-ratio: 1.5555555555555556; padding: 40px 0 40px 0;&#x22;><iframe src=&#x22;https://play.momentscience.com/embed/cmdvjs28f6f589f9664ri66ax?embed_v=2&utm_source=embed&#x22; loading=&#x22;lazy&#x22; title=&#x22;Setting up &#x22;Webhook for User Selected Perks&#x22;&#x22; allow=&#x22;clipboard-write&#x22; frameborder=&#x22;0&#x22; webkitallowfullscreen=&#x22;true&#x22; mozallowfullscreen=&#x22;true&#x22; allowfullscreen style=&#x22;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&#x22;></iframe></div>"}

:::

### Enabling USP in the dashboard

1. Navigate to the **Mo**[mentScience Dashboard.](https://app.momentscience.com/)&#x20;
2. Go to the [Moments Integration page](https://app.momentscience.com/account/integration/customize#customize).&#x20;
3. Select the theme to configure.
4. Open the **Theme Settings** tab.
5. Enable the **User Selected Perks** toggle.
6. Once enabled, a secondary toggle, **Check All Offers for USP (default: false)** appears:
   1. When enabled, all offers will be pre-selected by default.
   2. When disabled, no offers are pre-selected, and users must manually choose.
7. Once you have made your changes, click on "Save" button to apply changes to the seelected theme&#x20;

:::Iframe{code="<div style=&#x22;position: relative; box-sizing: content-box; max-height: 80vh; max-height: 80svh; width: 100%; aspect-ratio: 1.5555555555555556; padding: 40px 0 40px 0;&#x22;><iframe src=&#x22;https://play.momentscience.com/embed/cmdvijw1m6ewl9f960wd48e46?embed_v=2&utm_source=embed&#x22; loading=&#x22;lazy&#x22; title=&#x22;Enabling USP Per Theme.&#x22; allow=&#x22;clipboard-write&#x22; frameborder=&#x22;0&#x22; webkitallowfullscreen=&#x22;true&#x22; mozallowfullscreen=&#x22;true&#x22; allowfullscreen style=&#x22;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&#x22;></iframe></div>"}

:::

## Configuring   Webhook

The User Selected Perks (USP) Webhook sends offer selection data and user metadata to the publisher’s endpoint after action completion. This enables you to store, analyze, or act on offer selections without interrupting the user experience.

```javascript
{
  "body": {
    "campaigns": [
      {
        "campaign_id": 12345,
        "advertiser_name": "Example Store",
        "title": "20% Off Athletic Wear",
        "short_headline": "Save on Sports Gear",
        "short_description": "Get 20% off all athletic wear",
        "offer_description": "Valid on all athletic wear including shoes, clothing, and accessories. Minimum purchase $50.",
        "terms_and_conditions": "Offer expires 30 days from claim date. Cannot be combined with other offers.",
        "click_url": "https://example.com/claim?token=abc123",
        "cta_yes": "Claim Offer",
        "cta_no": "No Thanks",
        "mini_text": "Limited time offer",
        "image": "https://cdn.example.com/campaign-image.jpg",
        "is_loyaltyboost": false,
        "tags": ["retail", "clothing"],
        "creatives": [
          {
            "id": 456,
            "url": "https://cdn.example.com/creative-456.jpg",
            "type": "image",
            "creative_type": "banner",
            "aspect_ratio": 1.5,
            "height": 300,
            "width": 450,
            "is_primary": true
          }
        ]
      }
    ],
    "pub_user_id": "user_12345",
    "selected": 1,
    "session_id": "sess_abc123def456"
  }
}
```

### USP Webhook Payload Structure

| **Field**     | **Type** | **Description**                                                      |
| ------------- | -------- | -------------------------------------------------------------------- |
| `pub_user_id` | String   | Unique user ID provided by the publisher (non-PII).                  |
| `selected`    | Number   | Indicates whether the user selected offers (1 = selected, 0 = none). |
| `session_id`  | String   | Unique session identifier from the SDK.                              |
| `campaigns[]` | Array    | List of selected campaigns. Each object contains:                    |

`campaigns[]`**&#x20;fields**

| **Field**                                        | **Type** | **Description**                                   |
| ------------------------------------------------ | -------- | ------------------------------------------------- |
| `campaign_id`                                    | Number   | Internal campaign ID.                             |
| `advertiser_name`                                | String   | Advertiser name.                                  |
| `title` / `short_headline` / `short_description` | String   | Display metadata.                                 |
| `offer_description`                              | String   | Full description of the offer.                    |
| `terms_and_conditions`                           | String   | Terms of the selected offer.                      |
| `click_url`                                      | String   | Offer destination URL (may include tracking).     |
| `cta_yes `/ `cta_no`                             | String   | Call-to-action text for user selection.           |
| `mini_text`                                      | String   | Additional user-facing notes (e.g., disclaimers). |
| `image`                                          | String   | Default image URL for the offer.                  |
| `pixel` / `adv_pixel_url`                        | String   | Optional tracking pixels.                         |
| `save_for_later_url`                             | String   | URL to return to the offer later.                 |
| `description`                                    | String   | Alternate or extended description.                |
| `is_loyaltyboost`                                | Boolean  | Indicates if the offer is part of LoyaltyBoost.   |
| `loyaltyboost_requirements`                      | Object   | Requirements metadata for LoyaltyBoost (if any).  |
| `offerwall_enabled`                              | Boolean  | Whether this campaign supports Offerwall.         |
| `perkswallet_enabled`                            | Boolean  | Whether this campaign supports PerksWallet.       |
| `tags`                                           | Array    | Optional categorization tags.                     |

`beacons`

| **Field**                 | **Type** | **Description**                      |
| ------------------------- | -------- | ------------------------------------ |
| `beacons.close`           | String   | Tracking beacon for offer closure.   |
| `beacons.no_thanks_click` | String   | Beacon triggered when user opts out. |

`creatives[]`

| **Field**                | **Type** | **Description**                         |
| ------------------------ | -------- | --------------------------------------- |
| `id`                     | Number   | Creative asset ID.                      |
| `url`                    | String   | URL to the asset.                       |
| `type `/ `creative_type` | String   | Media type and creative classification. |
| `aspect_ratio`           | Number   | Aspect ratio of the asset.              |
| `height `/ `width`       | Number   | Dimensions in pixels.                   |
| `user_id`                | Number   | ID of the user associated with upload   |
| `is_primary`             | Boolean  | Whether this is the primary asset.      |

`campaign `(nested object)

| **Field**           | **Type** | **Description**                                                                             |
| ------------------- | -------- | ------------------------------------------------------------------------------------------- |
| `is_product`        | Boolean  | Indicates if the offer is a product-type campaign.                                          |
| `offer_description` | String   | Description specific to the campaign wrapper.                                               |
| `campaign_images[]` | Array    | List of additional or alternate campaign images, (follows same structure as `creatives[]`). |

`useraction_cta `/ `useraction_url`

| **Field**        | **Type**     | **Description**                               |
| ---------------- | ------------ | --------------------------------------------- |
| `useraction_cta` | String/ Null | Optional CTA label for external user actions. |
| `useraction_url` | String/ null | Optional URL for CTA.                         |

:::Iframe{code="<div style=&#x22;position: relative; box-sizing: content-box; max-height: 80vh; max-height: 80svh; width: 100%; aspect-ratio: 1.5555555555555556; padding: 40px 0 40px 0;&#x22;><iframe src=&#x22;https://play.momentscience.com/embed/cmdvjs28f6f589f9664ri66ax?embed_v=2&utm_source=embed&#x22; loading=&#x22;lazy&#x22; title=&#x22;Setting up &#x22;Webhook for User Selected Perks&#x22;&#x22; allow=&#x22;clipboard-write&#x22; frameborder=&#x22;0&#x22; webkitallowfullscreen=&#x22;true&#x22; mozallowfullscreen=&#x22;true&#x22; allowfullscreen style=&#x22;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&#x22;></iframe></div>"}

:::

***

📢 If you're running into any issues while going through the integration process, feel free to contact us at [help@momentscience.com](mailto\:help@Momentscience.com)
