openfrontio / openfrontio/OpenFrontIO

[Feature] Store bundles — grouped cosmetic packs

Open
#4,019 0 comments 0 reactions 1 assignee Claimed by @evanpelle View on GitHub
approved
Dominant language
TypeScript
Stars
2.7k
Forks
1.4k
Avg merge
17h 43m
Merged PRs (30d)
310

Description

## 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

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.