---
title: Campaigns, gift codes and daily rewards
nav: Campaigns
order: 7
---
# Campaigns: give players a reason to visit your store

After your first publish, Studio opens the **Launch kit**. It offers three ready templates:
- a **first-purchase bonus**;
- a **launch discount code**;
- a **gift code**.

Each template follows the same three steps, so nothing reaches players by accident:

1. **Save and preview eligibility.** See which packs and players the campaign applies to.
2. **Run a sandbox test.** A rollback-only test proves the campaign works without touching your live store.
3. **Confirm and launch.** You tick "I confirm these campaign details", and the campaign goes live inside its start and end window (UTC).

**Get share material** gives you a store link with UTM tags, the code, a QR code (PNG) and short, editable text for Discord, X and in-game news.

## First-purchase bonus
- **What it is:** extra currency on a player's first web purchase of the pack you choose, for example +50%.
- **Where it shows:** the store shows "Your offer" on the pack to eligible players.
- **Who is eligible:** decided by your server's signed player data, never by the browser.

## Launch discount code
- **What it is:** a percentage off the packs you select, with a total cap and a per-player cap.
- **Caps on real payments:** when a player opens checkout, Appside reserves one use for 30 minutes. A paid order consumes it; a decline, cancel or expiry releases it. Two players can never use the last remaining code at the same time.

## Gift code
- **What it is:** a code that grants items without payment, for example `LAUNCH` for 100 coins. You set:
  - the reward id and amount (checked against your reward allowlist);
  - a total cap and a UTC window.
- **Limits:** each player can redeem a code once.
- **Where players redeem it:** in the store's "Redeem a code" box. It works for players signed in with a token or with their [Player ID](/docs/player-login/).

Appside delivers the gift through your fulfilment webhook, signed and deduplicated like every purchase:

```json
{"type":"reward.redeemed","event_id":"gift_9c1e…","tenant":"orbit","player_id":"p_123","mode":"production","kind":"gift_code","reward_id":"daily","credits":100,"code":"LAUNCH","campaign_id":"gift:LAUNCH"}
```

Grant the reward once per `event_id`, then answer `2xx`. Retries reuse the same `event_id`.

## Daily rewards
- **What it is:** a free daily gift on a seven-collection calendar, delivered as `reward.claimed`.
- **Turning it on for real players:** Appside first sends a signed test `reward.claimed` with `test: true`, and your game must acknowledge it. Amounts must stay within your allowlist. A pause switch stops claims immediately.
- **Who can claim:** daily claims need a player signed in from your game with a token. Player ID sessions see the calendar but collect from the game.

## Measuring results
- **On orders:** every order made with a campaign records `campaign_id`, which also shows in your webhook's order object.
