A shop and currencies that never lose a purchase
Multi-currency wallets, a validated catalogue with sales and limited items, a daily rotating shop that matches on every server, purchases that charge once or refund, Robux receipts granted exactly once, Game Passes, and a shop UI built in code.
For: Roblox developers adding a shop, currencies, Robux products and passes.
See it work: real output from the shipped code
The example's daily shop, 7 days from 12 Oct 2026
From Rotation:Current(os.time()): every server computes the same 3 items for the day, with no DataStore, and an item never repeats from yesterday.
Frost Trail
Neon Halo
Ember Trail
Bubble Aura
Frost Trail
Leaf Cape
Ember Trail
Pixel Hat
Frost Trail
Neon Halo
Ember Trail
Pixel Hat
Frost Trail
Leaf Cape
A player's purchases through Shop:Buy()
| Item | Result | Charged / reason |
|---|---|---|
| Grapple Hook | Refused | requires speed_coil |
| Speed Coil | Bought | 750 Coins |
| Speed Coil | Refused | sold out |
| Grapple Hook | Bought | 2500 Coins |
| 2x Coins Potion ×2 | Bought | 600 Coins (25% off) |
| Star Wings | Refused | not enough Gems |
| Luck Potion ×30 | Refused | refused: 30 is over the 10-per-purchase limit |
Requirements, one-time limits, the timed 25% sale and per-purchase limits are all checked before the wallet is touched.
What's inside
| Module | Runs on | What it does | Lines |
|---|---|---|---|
| Shop | Server | The server purchase flow. | 180 |
| Wallet | Server | One player's currencies with caps, atomic multi-currency spending and a change signal. | 149 |
| Catalog | Shared | Every item you sell, validated at startup: prices, sales, time windows, limits, Robux links. | 167 |
| Rotation | Shared | A rotating item shop that shows the SAME items on every server, refreshing on a schedule. | 142 |
| RobuxStore | Server | Developer Product receipts that are granted exactly once, and Game Passes that are granted on join and the moment they are bought. | 124 |
| Format (free) | Client | Short numbers and countdowns for shop and HUD labels (1.25K, 3.4M, 2h 05m). | 72 |
| Signal (free) | Shared | A tiny event object so your UI and systems can react to purchases and balance changes. | 49 |
| Example script | Type | Put it in |
|---|---|---|
| StallwrenConfig | ModuleScript | ReplicatedStorage |
| StallwrenServer | Script | ServerScriptService |
| StallwrenClient | LocalScript | StarterPlayer > StarterPlayerScripts |
Tested like real software
27 automated tests run in a real Luau VM against a Roblox engine mock, on two runtimes (luau-web and native Luau 0.740). They ship in the zip: cd tests && npm install && node run.mjs.
| Spec | Passing | For example |
|---|---|---|
| core | 11/11 | Format: short numbers never round up past a suffix … |
| demo | 1/1 | demo: a week of the example's daily shop + a purchase log |
| example | 3/3 | example server: join, buy gear through the remote, leaderstats + tool update … |
| shop | 12/12 | Shop: buy charges once and grants through the kind handler … |
Install in 5 minutes
- Drag
Stallwren.rbxmxonto ReplicatedStorage in Roblox Studio. - Drag
StallwrenExamples.rbxmxin and move the three scripts to the services above. - Turn on Studio access to API services and press Play.
INSTALL.mdwalks through an example place step by step.
FAQ
Is this allowed on Roblox?
Yes. It's ordinary Luau using Roblox's own services (DataStoreService, MarketplaceService, Players). Nothing bypasses Roblox rules.
Why not a free model from the Toolbox?
Free models are a fine start. Stallwren ships its tests (27 of them, run on two Luau runtimes), validates every remote argument, and is original code with a clear licence.
Do I need Rojo?
No. Drag the .rbxmx files into Roblox Studio. A Rojo project file is included if you use it.
Can I use it in a game I sell or a client's game?
Yes: unlimited experiences, commercial or not, for you or your clients. You can't resell or share the code itself.
Is CyberMax affiliated with Roblox?
No. Roblox and Roblox Studio are trademarks of Roblox Corporation, named only to describe compatibility.