Skip to content

[Feature] Store bundles — grouped cosmetic packs #4019

@iiamlewis

Description

@iiamlewis

Summary

Add a Bundles tab to the in-game store allowing players to purchase grouped cosmetic packs at a discounted price compared to buying items individually.

Motivation

Bundles are a proven AOV (average order value) driver in games like Clash of Clans and Fortnite. A player who might not buy three individual items at full price will frequently convert on a bundle at 20–30% off. They also surface items players may not have discovered and reduce decision fatigue.

UI requirements

  • New Bundles tab in the store alongside Packs / Skins / Flags
  • Each bundle card displays: item icons, bundle name, description, strikethrough individual price, bundle price, and a green savings badge ("Save 30%")
  • Epic/Legendary tier bundles have a distinct border colour
  • Masters Bundle is gated — visible only to confirmed tournament participants

Backend requirements

  • Bundle entity in DB: array of item SKUs + bundle price + discount %
  • Atomic purchase — all items granted on single Stripe transaction success
  • Idempotency via Stripe session ID (consistent with existing purchase pattern)
  • Bundles refund as a unit — no partial item refunds

Bundle management (backend API)

Bundles must be fully configurable via the backend API without requiring code changes. The creation flow should work as follows:

  • Create a new bundle (name, price, discount %, active/inactive status)
  • Once created, attach items to the bundle using typed input fields per category:
    • Currency pack — input: Currency Pack ID
    • Cosmetic — input: Cosmetic ID
  • Multiple items of each type can be added to a single bundle
  • As new cosmetic categories are introduced (e.g. emotes, crowns, name styles), new typed input fields should be addable to the bundle builder without schema changes — the item type list should be extensible
  • Removing or reordering items within a bundle should also be supported via the API

Metadata

Metadata

Assignees

Labels

approvedApproved for a PR, if you assigned to the issue.

Type

No type
No fields configured for issues without a type.

Projects

Status
Development

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions