# Pag-configure ng Premyo

Ang lucky-draw games (Spin the Wheel, Gachapon, Grid Box, Scratch Card, Card Pull, at Claw Machine)
ay gumagamit ng prize configuration system. Ipinapaliwanag ng gabay na ito kung paano mag-set up, pamahalaan, at subaybayan ang mga premyo.

## Mga Uri ng Premyo

Ang bawat prize slot ay dapat isa sa anim na uri:

| Uri                | Ano ang nakukuha ng manlalaro                          | Fulfillment                          |
| ------------------ | --------------------------------------------- | ------------------------------------ |
| **Voucher Set**    | Unique code na kinukuha mula sa managed set       | Automatic (tracked)                  |
| **Voucher**        | Fixed code string (hal., "SAVE20")          | Ipinapakita nang direkta sa manlalaro             |
| **Item**           | Named physical/digital prize                | Manual (ikaw ang magfu-fulfill)                 |
| **External Link**  | URL kung saan magre-redeem ang manlalaro nang hiwalay     | Sinusunod ng manlalaro ang link                  |
| **Custom Voucher** | Code na inilabas ng external provider         | Automatic via webhook (iyong sistema)  |
| **No Prize**       | "Try again" — walang gantimpala                 | N/A                                  |

![Pag-configure ng premyo](/img/prize/prize-customization-voucher.jpg)

### Kailan gagamitin ang bawat uri

- **Voucher Set** — Pinakamainam para sa mga campaign na may maraming unique codes (isa bawat nanalo). Awtomatikong itinatalaga ang codes mula sa iyong inventory at sinusubaybayan.
- **Voucher** — Gamitin para sa isang shared code na nakikita ng lahat ng nanalo (hal., unibersal na discount code).
- **Item** — Pisikal na merchandise, libreng produkto, o service upgrades na nangangailangan ng manual fulfillment.
- **External Link** — Magdala ng traffic sa landing page, partner offer, o redemption portal.
- **Custom Voucher** — Pinakamainam kapag nasa ibang platform ang iyong codes (hal., e-commerce store o loyalty system). Humihiling ang DailyPlay ng code mula sa iyong provider sa claim time sa pamamagitan ng webhook, kaya nananatili ang inventory sa sarili mong sistema.
- **No Prize** — Mahalaga para sa pagbabalanse ng probabilities. Kung walang "try again" slots, ang bawat play ay nagreresulta sa panalo.

---

## Custom Voucher (Webhook-Connected)

Itinatakda ng Custom Voucher type ang fulfillment sa isang **external provider**. Sa halip na kumuha ng code mula sa DailyPlay voucher set, nagti-trigger ang claim ng manlalaro ng webhook sa iyong provider, na nagbabalik ng totoong code. Gamitin ito kapag pinamamahalaan ang iyong codes sa labas ng DailyPlay.

:::note[Prerequisite]
Available lang ang Custom Voucher prize kapag may naka-set up na **voucher webhook connection** ang organization admin. Kung walang connection, hindi lalabas ang opsyon sa prize editor. Tingnan ang [Connections](/fil/connections/overview) para mag-set up.
:::

### Provider vs. Connection

May dalawang layer sa likod ng prize type na ito:

| Layer          | Ano ito                                                                                                          |
| -------------- | ------------------------------------------------------------------------------------------------------------------ |
| **Provider**   | Template na nagtatakda kung anong fields ang kailangan ng provider at paano hugis ang webhook nito (hal., store integration).   |
| **Connection** | Ang live, credentialed instance ng provider ng iyong organisasyon — ang aktwal na webhook URL at credentials.            |

Ang provider ang definition; ang connection ang naka-configure mong hookup dito. Maaaring may higit sa isang connection ang organisasyon sa parehong provider (halimbawa, hiwalay na "Staging" at "Production" stores).

### Pagpili ng Connection

Sa prize **Type** selector, ang bawat active voucher webhook connection ay lumalabas bilang sarili nitong button kasama ang standard types. Kapag pumili:

- Naka-bind ang premyo sa connection na iyon at sa provider nito
- Auto-fill ang prize name gamit ang connection name (kung blangko pa ang pangalan)
- Ipinapakita ang **Voucher fulfillment** panel para sa provider settings at quantity

Kung may maraming connection ang iyong organisasyon, ang bawat isa ay ipinapakita bilang hiwalay na button para mapili mo kung alin ang magfu-fulfill ng premyo.

### Provider Settings (Fields)

Ang ilang provider ay nangangailangan ng karagdagang configuration bawat premyo — halimbawa, discount o cart-rule identifier. Awtomatikong nagre-render ang mga field na ito sa ilalim ng **Provider settings** kapag pinili mo ang connection. Ang bawat field ay maaaring:

- Text, number, o yes/no value
- Minarkahan bilang **required** (hindi mase-save ang premyo hanggang mapunan)
- Constrained ng minimum/maximum values, length, o format (hal., email)

Bineberipika ng DailyPlay ang mga field na ito sa editor at muli sa server-side bago mag-save, at sinusuri muli na may access pa rin ang iyong organisasyon sa provider.

### Quantity at Inventory

Gumagamit ang Custom Voucher prizes ng parehong **Prize limits** controls gaya ng iba pang winnable prize types (tingnan ang [Quantity at Inventory](#quantity-at-inventory) sa ibaba):

| Field              | Paglalarawan                                                                                                          |
| ------------------ | -------------------------------------------------------------------------------------------------------------------- |
| **Total quantity** | Maximum na bilang ng beses na maaaring manalo ang premyong ito sa buong campaign. Iwanang walang laman para sa unlimited (max 1,000,000).        |
| **Daily limit**    | Maximum wins bawat org calendar day. Nagre-reset sa midnight sa timezone ng iyong organisasyon. Iwanang walang laman para sa unlimited.      |
| **Remaining**      | Read-only. Ipinapakita ang `remaining / total`. Para sa bagong premyo, sinusundan nito ang total; pagkatapos mag-save, sinasalamin nito ang live wins.      |
| **Remaining today**| Read-only. Ipinapakita ang `remaining today / daily limit` kapag may naka-set na daily limit.                                          |

Kapag naabot ng Custom Voucher prize ang total o daily cap nito, hindi ito isasama sa draws hanggang mag-reset ang inventory (total) o ang susunod na org day (daily limit). Mulang ipinamamahagi ang probability sa mga natitirang eligible prizes — tulad ng iba pang prize types.

### Paano Gumagana ang Fulfillment

1. Nanalo ang manlalaro ng Custom Voucher prize at kino-claim ito
2. Nagpapadala ang DailyPlay ng webhook sa connected provider, kasama ang provider settings ng premyo at player context
3. Tumutugon ang provider gamit ang aktwal na voucher code
4. Ibinabalik ang code sa manlalaro

---

## Pag-set Up ng Mga Premyo

### Sa Game Editor

Kapag gumagawa o nag-e-edit ng lucky-draw game, aabot ka sa hakbang na **Prizes** sa editor. Ang bawat premyo ay isang "slot" na idinadagdag at kino-configure. Ang core flow para sa isang slot ay:

1. I-click ang **Add Prize Slot** — lalabas ang bagong slot card
2. Maglagay ng **Name** — ang display name na nakikita ng mga manlalaro (hal., "10% Off")
3. Pumili ng **Type** — pumili ng isa sa mga prize types (Voucher Set, Voucher, Item, External Link, Custom Voucher, o No Prize)
4. Itakda ang **Win Chance (%)** — ang probability ng slot sa draw
5. Ulitin para sa bawat premyo, pagkatapos siguraduhing umabot sa 100% ang lahat ng chances

Awtomatikong lumalabas ang type-specific fields (voucher set, external URL, provider settings, atbp.) kapag pinili mo ang tumutugmang uri.

**Halimbawa: Paano mag-set up ng voucher code prize sa laro:**

<video autoplay loop muted playsinline preload="none">
  <source src="/vdo/prize/voucher-code-prize.mp4" type="video/mp4" />
</video>

**Halimbawa: Paano mag-set up ng item prize sa laro:**

<video autoplay loop muted playsinline preload="none">
  <source src="/vdo/prize/add-code-to-game-voucher.mp4" type="video/mp4" />
</video>

### Prize Slot Fields

| Field              | Paglalarawan                                                                                                          | Required |
| ------------------ | -------------------------------------------------------------------------------------------------------------------- | -------- |
| Name               | Display name na ipinapakita sa manlalaro (max 50 chars)                                                                      | Yes      |
| Description        | Karagdagang detalye (max 200 chars)                                                                                     | No       |
| Type               | Isa sa 6 na prize types sa itaas                                                                                       | Yes      |
| Win Chance (%)     | Probability ng panalo sa slot na ito (1–100%)                                                                            | Yes      |
| Total quantity     | Campaign-wide win cap (iwanang walang laman para sa unlimited; max 1,000,000). Hindi ipinapakita para sa **No Prize**.                        | No       |
| Daily limit        | Max wins bawat org calendar day (nagre-reset sa midnight sa org timezone; iwanang walang laman para sa unlimited). Hindi para sa **No Prize**. | No    |
| Min Score          | Minimum score na kailangan para maging eligible                                                                                | No       |
| Voucher Set        | Aling set ang kukuhanan ng codes (voucher set type lang)                                                                 | Conditional |
| External URL       | Redemption link (external link type lang)                                                                              | Conditional |
| Image              | Custom prize image (max 10 MB, ni-resize sa 256×256)                                                                   | No       |

### Display Order

Ang order ng pag-aayos mo ng mga premyo sa editor ang direktang kumokontrol kung paano sila lilitaw sa laro (hal., wheel segments, grid cells). Gamitin ang Move Up/Down buttons para ayusin ang mga ito. Ang display order ay **hindi** nakakaapekto sa win probability — ang chance percentage lang ang mahalaga para sa odds.

<video autoplay loop muted playsinline preload="none">
  <source src="/vdo/prize/reorder-prize.mp4" type="video/mp4" />
</video>

---

## Mga Panuntunan sa Probability

Ang lahat ng prize chances sa isang laro ay dapat umabot sa **100% o mas mababa**.

### Mga Panuntunan sa Validation

- Ang bawat slot ay dapat may chance na higit sa 0%
- Ang kabuuan ng lahat ng slots ay hindi maaaring lumampas sa 100%
- Bineberipika ng DailyPlay sa editor at sa server-side bago mag-save

Kapag hindi valid ang total, nagpapakita ang editor ng inline warning at hinaharang ka mula sa pagpapatuloy hanggang maayos ito.

<video autoplay loop muted playsinline preload="none">
  <source src="/vdo/prize/prize-validiation-prize.mp4" type="video/mp4" />
</video>

### Halimbawa: Spin the Wheel (8 slots)

| Slot | Premyo          | Uri        | Chance | Total | Daily limit |
| ---- | -------------- | ----------- | ------ | ----- | ----------- |
| 1    | $50 Gift Card  | Voucher Set | 5%     | 10    | 2           |
| 2    | 20% Off        | Voucher Set | 10%    | 50    | Unlimited   |
| 3    | 10% Off        | Voucher     | 15%    | Unlimited | Unlimited |
| 4    | Try Again      | No Prize    | 20%    | —     | —           |
| 5    | Free Shipping  | Voucher     | 10%    | Unlimited | Unlimited |
| 6    | Try Again      | No Prize    | 15%    | —     | —           |
| 7    | Visit Our Blog | External Link | 15%  | Unlimited | Unlimited |
| 8    | Try Again      | No Prize    | 10%    | —     | —           |
| —    | **Total**      |             | **100%** |       |             |

### Halimbawa: Gachapon (6 capsules)

| Capsule | Premyo       | Uri        | Chance | Total | Daily limit |
| ------- | ----------- | ----------- | ------ | ----- | ----------- |
| Gold    | $50 Voucher | Voucher Set | 2%     | 10    | 1           |
| Silver  | $20 Voucher | Voucher Set | 8%     | 50    | 5           |
| Bronze  | $10 Voucher | Voucher Set | 20%    | 100   | Unlimited   |
| Blue    | 10% Off     | Voucher     | 30%    | Unlimited | Unlimited |
| Green   | 5% Off      | Voucher     | 25%    | Unlimited | Unlimited |
| Gray    | Try Again   | No Prize    | 15%    | —     | —           |

:::caution[Invalid Configuration]
Kung lumampas sa 100% ang chances, haharangin ng DailyPlay ang pag-save. Kung mas mababa sa 100% ang total, ang natitirang percentage ay magiging implicit na "no win" outcome sa panahon ng draw.
:::

---

## Minimum Score Requirements

Para sa mga larong pinagsasama ang skill at swerte, maaari kang magtakda ng **minimum score** bawat prize slot. Dapat makamit ng mga manlalaro ang score na iyon bago maging eligible ang premyo sa draw.

**Paano ito gumagana:**

1. Natatapos ng manlalaro ang laro na may score
2. Nagsi-filter ang server ng mga premyo — ang mga may `min_score ≤ player's score` lang ang isinasama
3. Nangyayari ang weighted random draw sa mga eligible prizes lang

**Halimbawa:**

| Premyo        | Chance | Min Score |
| ------------ | ------ | --------- |
| Grand Prize  | 5%     | 1000      |
| Runner Up    | 15%    | 500       |
| Consolation  | 30%    | 0         |
| Try Again    | 50%    | 0         |

Ang manlalarong may score na 750 ay eligible para sa Runner Up, Consolation, at Try Again — pero hindi para sa Grand Prize.

![Pag-configure ng minimum score](/img/prize/minimum-score-voucher.jpg)

:::tip[Score gates]
Gamitin ang min score para gantimpalaan ang skilled players ng access sa mas magagandang prize tiers habang binibigyan pa rin ang lahat ng tsansa sa mas maliliit na premyo.
:::

### Highest Tier Only

Para sa mga larong sumusuporta ng minimum scores, lumalabas ang **Highest Tier Only** toggle sa itaas ng prize editor. Kapag naka-enable, kumukuha lang ang manlalaro mula sa **pinakamataas na score tier na kwalipikado sila**, sa halip na mula sa bawat eligible tier na pinagsama.

- **Off (default):** Pinagsasama-sama ang lahat ng premyo na may `min_score ≤ player's score` para sa draw.
- **On:** Ang mga premyo sa iisang pinakamataas na tier na na-unlock ng manlalaro lang ang eligible — hindi isinasama ang mas mababang tiers.

Gamitin ito kapag gusto mong mag-compete ang top performers para sa pinakamahusay na rewards lang, sa halip na dilutin ang kanilang odds ng consolation prizes.

![Highest Tier Only toggle](/img/prize/highest-tier-only.png)

<video autoplay loop muted playsinline preload="none">
  <source src="/vdo/prize/highest-tier-only-prize.mp4" type="video/mp4" />
</video>

---

## Quantity at Inventory

Ang bawat prize type maliban sa **No Prize** ay may seksyong **Prize limits** sa editor na may dalawang opsyonal na caps at dalawang read-only counters.

| Field               | Paglalarawan                                                                                                          |
| ------------------- | -------------------------------------------------------------------------------------------------------------------- |
| **Total quantity**  | Campaign-wide maximum wins. Iwanang walang laman para sa unlimited (max 1,000,000).                                               |
| **Daily limit**     | Maximum wins bawat org calendar day. Nagre-reset sa midnight sa **organization timezone**. Iwanang walang laman para sa unlimited.  |
| **Remaining**       | Read-only `remaining / total` kapag may naka-set na total cap.                                                             |
| **Remaining today** | Read-only `remaining today / daily limit` kapag may naka-set na daily limit.                                                 |

:::tip[Ipamahagi ang high-value prizes sa iba't ibang araw]
Gamitin ang daily limit nang walang total cap para i-pace ang giveaways (hal., "5 grand prizes per day"). Pagsamahin ang dalawa para i-cap ang buong campaign at i-throttle ang daily volume (hal., 100 total, 10 per day).
:::

### Mga Panuntunan sa Validation

- Ang bawat limit ay dapat positive integer kapag naka-set, o walang laman para sa unlimited
- Ang **Daily limit** ay hindi maaaring lumampas sa **Total quantity** kapag parehong naka-set
- Nalalapat ang limits sa lahat ng winnable prize types (Voucher Set, Voucher, Item, External Link, Custom Voucher) — hindi sa **No Prize**

### Limited Quantity (Total)

Magtakda ng total quantity para sa high-value o finite-inventory prizes:

- Bumababa ang `remaining_quantity` sa bawat panalo
- Kapag umabot sa 0, hindi isasama ang premyo sa future draws hanggang taasan mo ang cap
- Awtomatikong inaayos nang proporsyonal ang probabilities ng natitirang premyo

### Daily Limit

Magtakda ng daily limit para i-cap kung ilang beses maaaring manalo ang isang premyo sa isang org day:

- Kina-count ang wins mula midnight hanggang midnight sa timezone ng iyong organisasyon
- Kapag naabot ang daily cap, nilalaktawan ang premyo para sa natitirang araw
- Awtomatikong nagre-reset ang counter sa susunod na org midnight — hindi nagbabago ang total inventory
- Kapaki-pakinabang para i-pace ang flash campaigns o protektahan ang fulfillment capacity

### Unlimited Prizes

Iwanang walang laman ang parehong fields para sa mga premyong palaging maaaring i-fulfill:

- Digital codes, voucher sets na may malaking inventories, external links
- Walang kinakailangang inventory o daily tracking

### Ano ang Mangyayari Kapag Naabot ang Cap

1. Nilalaktawan ang capped prize sa panahon ng draw (naubos ang total o naabot ang daily limit)
2. Mulang ipinamamahagi ng sistema ang probability sa mga natitirang eligible prizes
3. Kung **lahat** ng premyo ay ineligible, walang premyong ibabalik ang laro
4. Ang premyong hinarang ng **daily limit** ay magiging eligible muli pagkatapos ng org midnight kung may natitirang total inventory

---

## Active / Inactive Prizes

Ang bawat premyo ay may `is_active` flag:

- **Active** — Kasama sa draws, ipinapakita na may green badge sa dashboard
- **Inactive** — Hindi kasama sa draws, ipinapakita na may gray badge

Gamitin ito para pansamantalang i-disable ang premyo nang hindi tinatanggal (hal., i-pause ang promosyon, magpalit ng premyo sa gitna ng campaign).

---

## Paano Gumagana ang Draw

Gumagamit ang DailyPlay ng **server-side cryptographic draw** — hindi maaaring manipulahin ang pagpili ng premyo mula sa frontend:

1. Tumatawag ang laro sa draw endpoint gamit ang game ID
2. Kinukuha ng server ang lahat ng active, eligible prizes (inventory, daily limit, at score checks)
3. Pumipili ang **weighted random selection** ng nanalo base sa chance percentages
4. Gumagawa ng **signed token** (HMAC-SHA256) na naglalaman ng resulta
5. Valid ang token nang **30 minuto**
6. Kapag nag-claim ang manlalaro, bineberipika ng server ang token signature bago igawad

### Claim Processing ayon sa Uri

| Prize Type     | Ano ang nangyayari sa claim                                           |
| -------------- | --------------------------------------------------------------- |
| Voucher Set    | Itinatalaga ang susunod na available code, minamarkahan ang voucher bilang `claimed`          |
| Voucher        | Ibinabalik ang fixed code string sa manlalaro                            |
| Item           | Ipinapakita ang prize name, pinupunan ng manlalaro ang claim form                   |
| External Link  | Ibinabalik ang URL, nire-redirect ang manlalaro sa external redemption          |
| Custom Voucher | Ipinapadala ang webhook sa iyong provider, ipinapakita ang ibinalik na code sa manlalaro    |
| No Prize       | Ipinapakita ang mensaheng "Try again"                                       |

### Connection Events

Ang bawat prize claim ay nagti-trigger ng outbound integrations kung naka-configure:

- Zapier, Braze, Mailchimp, HubSpot, Salesforce, Segment, o custom webhooks
- Kasama sa event payload: game ID, player UUID, score, prize name, prize type, voucher code

Alamin pa sa [Connections](/fil/connections/overview).

---

## Prizes Dashboard

I-access mula sa **Organization → Prizes** para subaybayan ang lahat ng prize activity.

### Stats Cards

| Metric           | Paglalarawan                         |
| ---------------- | ----------------------------------- |
| Total Prizes     | Lahat ng naka-configure na prize slots          |
| Active Prizes    | Mga slot na kasalukuyang eligible para sa draws  |
| Total Wins       | Mga premyong iginawad all-time             |
| Wins Today       | Mga premyong iginawad sa nakaraang 24 oras |
| Vouchers Awarded | Voucher codes na ipinamahagi           |

### Per-Game Breakdown

Ipinapakita ng bawat laro ang:

- Bilang ng naka-configure na prize slots
- Total chance percentage (berde kung 100%, pula kung sobra)
- Collapsible table na may lahat ng premyo: name, type, chance %, remaining quantity, remaining today (kapag naka-set), active status
- Quick edit link sa game editor

---

## Mga Best Practice

### Probability Balance

**Inirerekomendang distribution para sa player engagement:**

| Tier         | Chance Range | Layunin                       |
| ------------ | ------------ | ----------------------------- |
| High-value   | 2–10%        | Lumilikha ng excitement at aspiration |
| Medium       | 15–30%       | Pinapanatiling rewarded ang pakiramdam ng mga manlalaro |
| Low-value    | 25–40%       | Madalas na maliliit na panalo           |
| No prize     | 20–40%       | Lumilikha ng anticipation para mag-retry |

:::tip[Win rate]
Layunin ang 50–70% overall win rate (may premyo, kahit maliit). Kung nangingibabaw ang "no prize", mabilis na magdi-disengage ang mga manlalaro.
:::

### Visual Appeal

- Mag-upload ng custom images para sa bawat premyo — nakikita ito ng mga manlalaro sa game UI
- Ang high-value prizes na may compelling images ay nagtutulak ng higit pang engagement
- Awtomatikong ni-resize ang images sa 256×256px

<video autoplay loop muted playsinline preload="none">
  <source src="/vdo/prize/example-upload-image-prize.mp4" type="video/mp4" />
</video>

### Pagsubok Bago Mag-launch

1. Laruin ang laro nang maraming beses sa preview mode
2. Beripikahin na tama ang pagpapakita ng lahat ng prize types (codes, links, names)
3. Suriin na talagang nagbibigay ng code ang voucher set prizes
4. Kumpirmahin na tama ang pagbaba ng total at daily limits (suriin ang **Remaining** at **Remaining today**)
5. Subukan gamit ang scores na mas mababa at mas mataas sa min_score thresholds (kung ginagamit)

---

## Troubleshooting

### Nanalo ang manlalaro pero walang code na ipinakita

1. Suriin na mayroon pang `available` codes ang naka-link na voucher set
2. Beripikahin na hindi pa nag-expire ang set
3. Maaaring naabot ng premyo ang **total** o **daily** limit — suriin ang **Remaining** at **Remaining today** sa editor

### Mukhang mali ang probabilities

- Beripikahin na pantay sa 100% ang totals sa editor
- Natural na magmumukhang skewed ang maliliit na sample sizes — subukan nang 50+ plays
- Kung naubos ang ilang premyo o naabot ang daily cap, epektibong mas mataas ang chances ng natitirang premyo

### Hindi lumalabas ang premyo sa laro

1. Kumpirmahin na active ang premyo (hindi inactive/disabled)
2. Suriin na hindi 0 ang **Remaining** at hindi 0 ang **Remaining today** (kung may daily limit)
3. Siguraduhing published ang laro (hindi nasa draft mode)
4. Kung gumagamit ng min_score, beripikahin na natutugunan ng score ng manlalaro ang threshold

### "Token expired" sa claim

Valid ang draw token nang 30 minuto. Kung masyadong matagal ang paghihintay ng manlalaro sa pagitan ng pagkakita sa resulta at pag-claim, mag-e-expire ang token. Bihira ito sa normal na gameplay.

---

## Mga Susunod na Hakbang

- [Mag-set up ng Voucher Sets →](/fil/rewards/vouchers) para magbigay ng codes para sa iyong mga premyo
- [Ibahagi ang iyong laro →](/fil/sharing/share) kapag naka-configure na ang mga premyo