Features & CustomizationsLoyalty Program

Milestone SKU Rewards

Configure a catalog product (SKU) as a milestone reward in Stash Studio: the tabbed reward picker, adding products and reward types inline, the milestone preview, and how SKU rewards appear on the claim webhook.

A milestone reward does not have to be a currency amount. It can also be an arbitrary product from your catalog, a single item or a bundle, delivered as a SKU. Use SKU rewards when a milestone should grant a packaged product rather than raw currency.

This page covers configuring SKU rewards on a milestone. For the reward types themselves, see Reward types; for the milestone model and claim flow, see Milestones.

The reward picker

A milestone's Reward step uses a tabbed picker with two sources. One selection can mix rewards from both tabs.

TabWhat it listsRow shows
Reward TypesShop reward types (Loyalty XP and in-game currencies)Icon, name, and reward type
Product CatalogPublished catalog productsImage, display name, and the product's external ID (SKU)

Type in the picker to filter the active tab by name or external ID, then Apply to commit the selection. Currency rewards take an amount; product rewards take a quantity, which defaults to 1.

A product reward row shows the product's SKU as a subtitle. For a bundle, it also shows an item count and a tooltip listing the bundle contents.

Only published catalog products can be attached as a milestone reward. A product that is not yet published cannot be selected. See adding a product inline below.

Add a product without leaving the modal

If the product you want does not exist yet, add it inline from the picker's + Add a new product link, without losing your milestone draft.

Enter the product details

Provide a Product ID (your partner SKU, stored as the product's external ID), a Display Name, and a Main Image. For a bundle, add one or more Items rows, each with an image and quantity.

Save

Stash creates the product as a reward-only product and publishes it immediately, then auto-selects it as a product reward on the milestone with quantity 1. Reward-only products are publishable without a price, so they are eligible to attach right away.

If publishing fails, your draft is kept, the product is not auto-selected, and the error is surfaced so you can resolve it in the catalog.

Add a reward type inline

The picker also offers + Add a new reward type, which creates an in-game currency reward type (name and icon) and auto-selects it. A shop has one reward type per currency, so the link is hidden once that reward type exists. Loyalty XP is the progression currency and is not offered as a milestone reward type here.

Preview the milestone

The milestone modal has a Preview step that renders a live, read-only mock of the shop-facing milestone card from your current configuration: the XP-threshold header, the reward image, a reward caption, and the Claim pill. The caption uses the milestone's reward name if set, otherwise it is derived from the first configured reward (for example "Handful of Bucks x2").

If the milestone is incomplete, the preview shows a placeholder card and a checklist of what is missing, with links that jump to the step that fixes each item.

SKU rewards on the claim webhook

A SKU reward appears in LOYALTY_MILESTONE_CLAIMED exactly like a currency reward: an entry in the rewards array with the product SKU as itemId and the configured quantity. Your backend grants the product on receipt.

LOYALTY_MILESTONE_CLAIMED with a SKU reward
"rewards": [
  { "itemId": "starter-bundle-sku", "quantity": 1, "type": "PRODUCT" },
  { "itemId": "gold-coins", "quantity": 500, "type": "IN_GAME_CURRENCY" }
]

See Loyalty webhooks for the full event.

As with all milestone rewards, the rewards array is authoritative server-side configuration, never client input. Grant against the itemId, and de-duplicate on userId + milestoneId so a retry cannot grant a bundle twice.

How is this guide?