# reward.fulfilled

> Sent when a batch of rewards becomes available to a loyalty member, with the member's profile, their points and the rewards.

Breadcrumb: Webhooks › reward.fulfilled · Updated: 2026-11-04
Docs index: https://docs.cevoid.com/developers/llms.txt

## When it fires

- Once per batch of rewards fulfilled together.

## Receive it

Pick `reward.fulfilled` in a webhook destination's events, or tick All events. See [Create a destination](https://docs.cevoid.com/developers/webhooks/set-up.md#create-a-destination).

To filter it or wait before sending, send it from a Flow on the _Reward fulfilled_ trigger instead. See [Send from a Flow](https://docs.cevoid.com/developers/webhooks/set-up.md#send-from-a-flow).

## Payload

```json title="Example payload"
{
  "created_at": "2026-11-02T09:30:00.000Z",
  "data": {
    "fulfillment": {
      "rewards": [
        {
          "awarded_at": "2026-01-15T09:30:00.000Z",
          "description": "Get 10% off your next order.",
          "discount_code": {
            "code": "SUMMER10",
            "expires_at": "2026-12-31T23:59:59.999Z",
            "external_discount_code_id": "discount-code-12345",
            "one_time_use_per_customer": true,
            "value_type": "PERCENTAGE"
          },
          "fulfilled_at": "2026-01-15T10:00:00.000Z",
          "fulfillment_status": "FULFILLED_AUTO",
          "icon_url": "https://cdn.cevoid.com/rewards/reward-icon.png",
          "id": "rwd_01hzy3d4mk8w2q",
          "title": "10% Off Reward",
          "type": "DISCOUNT_CODE",
          "usages": []
        }
      ],
      "source": "REDEEMABLE_REWARD",
      "source_id": "rrd_01hzy3d4mk8w2q"
    },
    "points": {
      "expiring_30d": 400,
      "expiring_60d": 650,
      "expiring_90d": 750,
      "lifetime_earned": 5400,
      "lifetime_spent": 4150,
      "next_expiration_at": "2026-12-31T00:00:00.000Z",
      "pending": 100,
      "spendable": 1150,
      "total": 1250
    },
    "profile": {
      "avatar_url": "https://cdn.cevoid.com/avatars/prf_sarah/profile.jpg",
      "bio": "Lifestyle creator and photography enthusiast",
      "birthday": "1992-04-18",
      "country": "US",
      "created_at": "2026-01-15T09:30:00.000Z",
      "email": "sarah.johnson@example.com",
      "external_id": "customer_7391056823401",
      "first_name": "Sarah",
      "id": "prf_sarah",
      "language": "en",
      "last_name": "Johnson",
      "location": "San Francisco, CA",
      "name": "Sarah Johnson",
      "notes": "VIP customer; prefers email communication",
      "social_instagram_handle": "sarah.lifestyle",
      "social_tiktok_handle": "sarah.creates",
      "social_x_handle": "sarah_j",
      "updated_at": "2026-01-20T14:22:15.000Z"
    },
    "tier": {
      "current_tier": {
        "expires_at": "2026-12-31T23:59:59.999Z",
        "icon_url": "https://cdn.cevoid.com/tiers/silver.png",
        "id": "tier_silver",
        "name": "Silver"
      },
      "next_tier": {
        "entry_rewards": [
          {
            "icon_url": "https://cdn.cevoid.com/rewards/reward-icon.png",
            "title": "10% Off Reward",
            "type": "DISCOUNT_CODE"
          }
        ],
        "icon_url": "https://cdn.cevoid.com/tiers/gold.png",
        "id": "tier_gold",
        "milestones": [
          {
            "current": 750,
            "percent_complete": 75,
            "remaining": 250,
            "required": 1000,
            "type": "POINTS"
          }
        ],
        "name": "Gold",
        "perks": [
          {
            "value": "Exclusive early access to launches"
          }
        ]
      }
    }
  },
  "id": "evt_m3p82kdq5xw7tz4c",
  "type": "reward.fulfilled",
  "version": 1
}
```

- `version` (`number`, required): The version of this event type. A published version only gains fields, so ignore fields you do not use; a breaking change is a new version.
- `id` (`string`, required): Stable event id (`evt_` plus 16 characters), also sent as the `webhook-id` header. Retries and manual replays send the same id, so ignore an event whose id you have already processed.
- `type` (`string`, required): What `data` describes. New types are added over time, and an endpoint on "All events" receives them, so ignore any type you do not handle.
- `created_at` (`string<date-time>`, required): When the event happened, as an ISO 8601 timestamp.
- `origin` (`object`): Why your endpoint received the event. Omitted when the event was forwarded without a Flow of your own.
  - `origin.flow` (`object`, required): The Flow that sent the event.
    - `origin.flow.id` (`string`, required): The Flow id, shown in the Flow URL.
    - `origin.flow.name` (`string`, required): The Flow name at the time of sending.
  - `origin.trigger` (`string`, required): The event that started the Flow. One of `order.fulfilled`, `order.delivered`, `product-review.submitted`, `company-review.submitted`, `product-review.replied`, `company-review.replied`, `upload.completed`, `post.approved`, `profile.program-joined`, `profile.program-left`, `tier.earned`, `reward.fulfilled`, `tier.evaluation-approaching`, `points.expiration-approaching`.
- `data` (`object`, required): The resources the event carries, keyed by resource name. `type` decides which resources are included, and resources your plan does not include are left out.
  - `data.fulfillment` (`object`)
    - `data.fulfillment.source` (`string`, required): What granted the rewards: an activity, a redeemed reward, a tier, or a purchase incentive. One of `ACTIVITY`, `REDEEMABLE_REWARD`, `TIER`, `PURCHASE_INCENTIVE`.
    - `data.fulfillment.source_id` (`string`): Cevoid ID of the activity, redeemable reward, tier, or purchase incentive named by `source`. Omitted when it no longer exists.
    - `data.fulfillment.rewards` (`object[]`, required): Rewards fulfilled together, as the member rewards API returns them.
      - `data.fulfillment.rewards[].id` (`string`, required): Cevoid earned reward ID.
      - `data.fulfillment.rewards[].title` (`string`, required): Reward title at the time it was awarded.
      - `data.fulfillment.rewards[].description` (`string`): Member-facing reward description.
      - `data.fulfillment.rewards[].type` (`string`, required): Reward type. One of `BADGE`, `DISCOUNT_CODE`, `CUSTOM`, `POINTS`, `PRODUCT`.
      - `data.fulfillment.rewards[].icon_url` (`string<uri>`): Reward icon URL.
      - `data.fulfillment.rewards[].svg_icon` (`string`): Inline SVG icon markup.
      - `data.fulfillment.rewards[].fulfillment_status` (`string`, required): Current fulfillment state. One of `UNFULFILLED`, `IN_PROGRESS`, `RETRYING`, `FAILED_AUTO`, `FAILED_THIRD_PARTY`, `FULFILLED_MANUAL`, `FULFILLED_AUTO`, `FULFILLED_THIRD_PARTY`, `CANCELLED`, `EXPIRED`.
      - `data.fulfillment.rewards[].fulfilled_at` (`string<date-time>`): Timestamp when fulfillment completed.
      - `data.fulfillment.rewards[].failed_reason` (`string`): Reason fulfillment failed.
      - `data.fulfillment.rewards[].awarded_at` (`string<date-time>`): Timestamp when the reward was awarded.
      - `data.fulfillment.rewards[].invalidated_at` (`string<date-time>`): Timestamp when the reward was invalidated.
      - `data.fulfillment.rewards[].badge` (`object`): Badge-specific reward details.
        - `data.fulfillment.rewards[].badge.type` (`string`, required): Badge presentation type. One of `DEFAULT`, `CUSTOM`.
        - `data.fulfillment.rewards[].badge.location` (`string`): Badge placement metadata.
        - `data.fulfillment.rewards[].badge.icon` (`string`): Badge icon identifier.
        - `data.fulfillment.rewards[].badge.color` (`string`): Badge accent color.
      - `data.fulfillment.rewards[].points` (`object`): Points-specific reward details.
        - `data.fulfillment.rewards[].points.amount` (`number`, required): Points granted by the reward.
      - `data.fulfillment.rewards[].discount_code` (`object`): Discount-code reward details.
        - `data.fulfillment.rewards[].discount_code.code` (`string`, required): Discount code granted to the member.
        - `data.fulfillment.rewards[].discount_code.external_discount_code_id` (`string`): Discount code identifier in the source system, when applicable.
        - `data.fulfillment.rewards[].discount_code.expires_at` (`string<date-time>`): Timestamp when the discount code expires.
        - `data.fulfillment.rewards[].discount_code.one_time_use_per_customer` (`boolean`, required): Whether the member can use the code only once.
        - `data.fulfillment.rewards[].discount_code.value_type` (`string`): Discount value type. One of `FIXED_AMOUNT`, `PERCENTAGE`, `FREE_SHIPPING`.
      - `data.fulfillment.rewards[].product` (`object`): Product reward details.
        - `data.fulfillment.rewards[].product.id` (`string`): Cevoid product ID. Omitted when the historical product can no longer be resolved.
        - `data.fulfillment.rewards[].product.code` (`string`, required): Product reward code granted to the member.
        - `data.fulfillment.rewards[].product.product_url` (`string<uri>`): Resolved storefront URL for the rewarded product.
        - `data.fulfillment.rewards[].product.external_discount_code_id` (`string`): Discount code identifier in the source system, when applicable.
        - `data.fulfillment.rewards[].product.expires_at` (`string<date-time>`): Timestamp when the product reward code expires.
        - `data.fulfillment.rewards[].product.one_time_use_per_customer` (`boolean`, required): Whether the member can claim the reward only once.
      - `data.fulfillment.rewards[].usages` (`object[]`, required): Recorded reward usages.
        - `data.fulfillment.rewards[].usages[].order_id` (`string`): Cevoid order ID. Omitted when a historical order cannot be resolved.
        - `data.fulfillment.rewards[].usages[].order_number` (`string`): Human-readable Order number.
        - `data.fulfillment.rewards[].usages[].domain` (`string`): Store domain where the reward was used.
        - `data.fulfillment.rewards[].usages[].external_order_id` (`string`): Order identifier in the source system, when applicable.
        - `data.fulfillment.rewards[].usages[].used_at` (`string<date-time>`): Timestamp when the usage was recorded.
  - `data.profile` (`object`)
    - `data.profile.id` (`string`, required): Cevoid profile ID.
    - `data.profile.external_id` (`string`): Identifier this profile carries in the workspace source system, when known.
    - `data.profile.name` (`string`): Display name of the profile.
    - `data.profile.first_name` (`string`): First name of the profile.
    - `data.profile.last_name` (`string`): Last name of the profile.
    - `data.profile.email` (`string`): Email address for the profile.
    - `data.profile.avatar_url` (`string`): Profile image URL.
    - `data.profile.country` (`string`): Country code associated with the profile.
    - `data.profile.language` (`string`): Preferred language code associated with the profile.
    - `data.profile.location` (`string`): Free-form location associated with the profile.
    - `data.profile.social_instagram_handle` (`string`): Instagram handle associated with the profile.
    - `data.profile.social_tiktok_handle` (`string`): TikTok handle associated with the profile.
    - `data.profile.social_x_handle` (`string`): X handle associated with the profile.
    - `data.profile.birthday` (`string<date>`): Birthday in YYYY-MM-DD format.
    - `data.profile.bio` (`string`): Profile biography text.
    - `data.profile.notes` (`string`): Merchant notes about the profile.
    - `data.profile.created_at` (`string<date-time>`, required): ISO 8601 timestamp when the profile was created.
    - `data.profile.updated_at` (`string<date-time>`, required): ISO 8601 timestamp when the profile was last updated.
  - `data.points` (`object`)
    - `data.points.total` (`number`, required): Total active and pending points.
    - `data.points.spendable` (`number`, required): Active points available to spend.
    - `data.points.pending` (`number`, required): Earned points not active yet.
    - `data.points.expiring_30d` (`number`, required): Points expiring within 30 days.
    - `data.points.expiring_60d` (`number`, required): Points expiring within 60 days.
    - `data.points.expiring_90d` (`number`, required): Points expiring within 90 days.
    - `data.points.lifetime_earned` (`number`, required): Points earned over the membership lifetime.
    - `data.points.lifetime_spent` (`number`, required): Points spent over the membership lifetime.
    - `data.points.next_expiration_at` (`string<date-time>`): Earliest upcoming active-points expiration.
  - `data.tier` (`object`)
    - `data.tier.current_tier` (`object | null`, required): Current tier, or null.
      - `data.tier.current_tier.id` (`string`, required): Cevoid tier ID.
      - `data.tier.current_tier.name` (`string`, required): Display name of the tier.
      - `data.tier.current_tier.icon_url` (`string`): Optional icon representing the tier.
      - `data.tier.current_tier.expires_at` (`string<date-time>`): When the current tier expires, if tier evaluations expire.
    - `data.tier.next_tier` (`object | null`, required): Next reachable tier, or null.
      - `data.tier.next_tier.id` (`string`, required): Cevoid tier ID.
      - `data.tier.next_tier.name` (`string`, required): Display name of the tier.
      - `data.tier.next_tier.icon_url` (`string`): Optional icon representing the tier.
      - `data.tier.next_tier.milestones` (`object[]`, required): Progress required for the next tier.
        - `data.tier.next_tier.milestones[].type` (`string`, required): Metric used to qualify for the next tier. One of `POINTS`, `AMOUNT_SPENT`, `NUMBER_OF_PURCHASES`.
        - `data.tier.next_tier.milestones[].required` (`number`, required): Required amount for the next tier. AMOUNT_SPENT values use major currency units.
        - `data.tier.next_tier.milestones[].current` (`number`, required): Current progress. AMOUNT_SPENT values use major currency units.
        - `data.tier.next_tier.milestones[].remaining` (`number`, required): Remaining amount. AMOUNT_SPENT values use major currency units.
        - `data.tier.next_tier.milestones[].percent_complete` (`number`, required): Progress percentage, capped at 100.
      - `data.tier.next_tier.entry_rewards` (`object[]`, required): Rewards granted at the next tier.
        - `data.tier.next_tier.entry_rewards[].type` (`string`, required): Reward type granted when the tier is reached.
        - `data.tier.next_tier.entry_rewards[].title` (`string`, required): Human-readable reward title.
        - `data.tier.next_tier.entry_rewards[].icon_url` (`string`): Optional icon representing the reward.
      - `data.tier.next_tier.perks` (`object[]`, required): Perks associated with the next tier.
        - `data.tier.next_tier.perks[].value` (`string`, required): Human-readable perk text.

## Related articles

- [tier.earned](https://docs.cevoid.com/developers/webhooks/tier-earned.md)
- [Event types](https://docs.cevoid.com/developers/webhooks/event-types.md)

---

Canonical: https://docs.cevoid.com/developers/webhooks/reward-fulfilled
