EzShops – The Ultimate Minecraft Shop Plugin
EzShops is the all-in-one shop solution for Minecraft servers, offering advanced shop menus, dynamic pricing, sign trading, player marketplaces, and seamless API integrations. Designed for Paper, Purpur, Spigot, and Bukkit (1.7–26.1+), EzShops empowers server owners to deliver a polished, feature-rich economy experience with minimal setup.
Check our latest project: PvPIndex


- Requires Vault & compatible economy plugin
- Dynamic pricing engine & persistent market state
- ShopPriceService API for plugin integration
- Full documentation: EzShops Docs
Note: Vault and an economy plugin are required for currency transactions.
Join our Discord for support & community
⭐ Why this shop plugin?
- Modern Shop Menus: Intuitive GUIs with category icons, quantity selectors, bulk buy/sell, and customizable lore.
- Dynamic Pricing: Prices automatically adjust based on player activity, with persistent state across restarts.
- Rotating Specials: Schedule daily or timed specials with weighted or random rotations, no manual recoding needed.
- Sign Shop Integration: Create buy/sell signs that mirror menu prices and formats, perfect for towns and markets.
- Player Shops: Let players run their own chest shops with secure, branded signs, automatic stock management, and smart item labels — sign names automatically show potion effects and enchantment details.
- Stock Market System: Enable real-time, demand-driven pricing for select items, with admin controls and persistent overrides.
- Instant Config Reload: Use
/shop reloadto update all configs and menus live, no server restart required. - Sell boosts: Option for sell boosts through integration with our EzBoost plugin - see the EzBoost integration docs.
- API Ready: Integrate with other plugins or custom features using the robust ShopPriceService API.

⚡ Key features of EzShops
- Easy Setup: Auto-generates default configs, categories, and layouts on first run.
- Flexible Customization: Edit categories, item prices, menu layouts, and sign formats to match your server’s branding.
- Advanced Permissions: Fine-tune access for shop, stock market, sign creation, and player shop management.
- Localization: Multi-language support, just set your preferred language in
config.yml. - Performance Optimized: Designed for large servers with async operations and caching.
🛒 Powerful Shop & Stock Market Commands
/shop– Open the shop GUI or browse all items./shop buy <item> [amount]– Buy items directly from chat./shop sell <item> [amount]– Sell items directly from chat./sellhand,/sellinventory– Quick-sell items or entire inventories./price <material>– Check live buy/sell prices./shop reload– Reload all configs instantly./shopadmin reseed [mode]– Restore missing bundled category defaults (all modes or one mode) without overwriting existing files./stock buy <item> <amount>– Buy stock market items at the current price./stock sell <item> <amount>– Sell your stock market items./stock overview– View all stock market items and their current prices./stockadmin– Full admin controls for the stock market.
See the full command list and permissions.
🛠️ Configuration & Customization
- Categories & Items: Organize your shop with unlimited categories and custom item settings.
- Dynamic Pricing: Enable per-item or global dynamic pricing for a living, player-driven economy.
- Rotations: Schedule daily specials or timed offers with easy YAML config.
- Sign Shops: Mirror menu offers on signs, perfect for player towns and spawn markets.
- Player Shops: Empower your community to create secure, automated chest shops.
- Localization: Support for English, Spanish, Dutch, Chinese, and more.
Full setup and config details: Configuration Guide - including shop items, menu layout, and localization.
🪧 Sign Shops & Player Shops

📦 API & Plugin Integration
- ShopPriceService API: Query prices, execute transactions, and integrate with other plugins.
- Stock Market API: Real-time price updates, player holdings, and admin controls.
- Ready for EzAuction & EzEconomy: Out-of-the-box integration with other EzPlugins.
🚀 Get Started in Minutes
- Install Vault and an economy plugin.
- Drop
EzShops.jarinto yourplugins/folder. - Restart your server to auto-generate configs.
- Edit
shop.ymland category files to customize your shop. - Grant permissions to your staff and players as needed.
Deliver a next-level shop experience on your Minecraft server with EzShops!
Looking for more? Try EzAuction and EzEconomy for a complete economy suite!
All Versions
+ Add Version| Name | Game version | Platforms | Published | Downloads | Actions |
|---|---|---|---|---|---|
| 5h ago | 1 | ||||
| 5h ago | 1 | ||||
| 5h ago | 1 | ||||
| 5h ago | 1 | ||||
| 5h ago | 1 | ||||
| 5h ago | 1 | ||||
| 5h ago | 1 | ||||
| 5h ago | 1 | ||||
| 5h ago | 1 | ||||
| 5h ago | 1 | ||||
| 5h ago | 1 | ||||
| 5h ago | 1 | ||||
| 5h ago | 1 | ||||
| 5h ago | 1 | ||||
| 5h ago | 1 | ||||
| 5h ago | 1 | ||||
| 5h ago | 1 | ||||
| 5h ago | 1 | ||||
| 5h ago | 1 | ||||
| 5h ago | 1 | ||||
| 5h ago | 1 | ||||
| 5h ago | 1 | ||||
| 5h ago | 1 | ||||
| 5h ago | 1 | ||||
| 5h ago | 1 | ||||
| 5h ago | 1 | ||||
| 5h ago | 1 | ||||
| 5h ago | 1 | ||||
| 5h ago | 1 | ||||
| 5h ago | 1 |
### Added
- Manual category default reseed command** — added
/shopadmin reseed [mode]to restore missing bundled category defaults on demand without overwriting existing files. Omittingmodereseeds all bundled modes; providing a mode (e.g.prison,smp) reseeds only that mode.
### Changed
- Bootstrap architecture cleanup** — startup and shutdown orchestration now lives in the
bootstrappackage (EzShopsBootstrap), whileEzShopsPluginis reduced to a thin lifecycle entry point (onEnable/onDisabledelegation). - Runtime component access moved to registry** — component/debug/reseed accessors are now provided by
EzShopsRegistry, removing lifecycle/state getters fromEzShopsPlugin.
### Fixed
- Default category file persistence across restarts** — bundled category defaults are now seeded per mode directory (
shop/{mode}/categories/*.yml) and are no longer recreated automatically for existing mode directories when server owners intentionally delete them. - Mode support for default seeding** — bundled shop resource discovery now works across available packaged modes (including future bundled modes), rather than relying on prison-only default category handling.
### Fixed
- Config persistence after reloads** —
/shop reloadnow reloadsconfig.ymlfrom disk before refreshing pricing/features, and setup GUI toggles now reload config before saving. This prevents stale in-memory values from being written back over server-owner edits. - Shop category parser resilience** — category parsing now isolates failures per category so one malformed entry can no longer break loading of the category set.
- Duplicate-material shop entries** — when multiple items intentionally share the same material (for example splash potion variants), pricing keys are now resolved per-item to prevent collisions that could cause broken/empty category behavior.
- List-style
on-buy/on-sellhooks now execute** — command hook parsing now accepts both list syntax (on-buy: - "cmd") and nested syntax (on-buy.commands) for compatibility with the documented format, preventing silent no-op purchases foritem-type: COMMANDentries.
Through time we've made the stock market more stable, by doing this the documentation got outdated and configuration options that existed before got phased out. This version there was focus on updating the documentation and adding back options that got phased out in a more stable way.
### Added
- Configurable stock price-engine parameters** -
volatility-min,volatility-max,demand-multiplier,min-price, andupdate-intervalare now realconfig.ymloptions under thestock:section. The plugin reads them on startup and applies them to the price engine. All defaults match the previously hardcoded values so existing behaviour is preserved.
### Fixed
- Incorrect stock-market configuration documented** -
docs/configuration/main-settings.mdanddocs/shops/pricing/stock-market.mdpreviously documented a non-existentstock-market:config block. Both pages now document the realstock:section (enabled,cooldown-millis,blocked,overrides,categories). Price-engine parameters (volatility-min,volatility-max,demand-multiplier,min-price,update-interval) are now implemented as real config options (see Unreleased → Added). /sellcommand missing from documentation** - the Quick Sell GUI command (/sell) is now documented in the Commands reference with its behavior and permission node./shopadmincommand missing from documentation** -/shopadmin [browse|market]is now documented under Admin Commands including both the player-shops and team-market views./teamshop marketsubcommand missing from documentation** - the team P2P market subcommand is now documented in Commands, the TeamsAPI integration page, and the tab-completion list for/teamshop.- Missing permission nodes in documentation** - the following nodes were present in
plugin.ymlbut absent from the Permissions reference; they are now documented: ezshops.shop.admin(open/shopadminGUI)ezshops.teamshop.market(access team P2P market)ezshops.pricing.admin.set,ezshops.pricing.admin.disable,ezshops.pricing.admin.list(granular pricing-admin nodes)
### Fixed
on-sellcommands not executing foritem-type: COMMANDitems** —sell()no longer checks or removes physical items from the player's inventory when the item's delivery type isCOMMAND. Previously the transaction exited early with "insufficient items" because the player had no material to hand over, preventing sell commands from running at all.on-sell execute-asoverridden byon-buy execute-as** —ShopPricingManagernow tracksexecute-asindependently for theon-buyandon-sellblocks. Previously a single shared flag meant that settingon-buy: execute-as: playerwould silently overrideon-sell: execute-as: console, causing sell commands to run as the player instead of the console.
### Added
- Code coverage reporting** — JaCoCo is now configured in the Maven build (
jacoco-maven-plugin 0.8.12). Coverage reports (jacoco.xml) are generated on everymvn testrun and uploaded to Codecov by the CI workflow for both unit-test and feature-test jobs.
### Fixed
- Quick Sell GUI "Nothing to sell" after shift-click** —
handleConfirmnow calls a newShopTransactionService.sellDirect()method that skips the player-inventory item count/removal steps. Previously, shift-clicking items into the GUI moved them out of the player's inventory, so the oldsell()path found zero items and reported nothing to sell. - Quick Sell GUI shows "Nothing to sell" when sell fails after shift-click** —
handleConfirmnow distinguishes between a genuinely empty GUI and a GUI that has items but whosesellDirectcall failed (e.g. economy down, dynamic price driven to $0.00 by a previous sale, rotation expired). The actual failure reason is shown to the player instead of the misleading "No items to sell." message. Items that failed to sell remain in the GUI so the player can retry. - Quick Sell GUI rejects rotation items even when directly sellable** —
sellDirectandisSellableboth applied a rotation-visibility check that belongs only in the main shop menu. The Quick Sell GUI is designed to accept any item with a configured sell price; rotation restrictions are now only enforced insell(), which is the path used when a player types/sellor/sellhand. - Legacy
shop.ymlitem keys not found when using lowercase material names** —loadLegacyEntriesnow normalises every price key toMaterial.name()(e.g.BIRCH_LOG) before registering it in the price map. Previously, a config entry written asbirch_log:was stored under the lowercase key, sogetPrice(Material.BIRCH_LOG)could not find it, silently treating the item as unpriced.
### Added
- Stripped log variants in the wood category** — all 9 stripped log types (
STRIPPED_OAK_LOG,STRIPPED_SPRUCE_LOG,STRIPPED_BIRCH_LOG,STRIPPED_JUNGLE_LOG,STRIPPED_ACACIA_LOG,STRIPPED_DARK_OAK_LOG,STRIPPED_MANGROVE_LOG,STRIPPED_PALE_OAK_LOG,STRIPPED_CHERRY_LOG) are now included in the defaultwood.ymlconfig so players can sell stripped logs with/sellhandand the Quick Sell GUI out of the box. - Wood (all-bark) block variants in the wood category** — all 9 wood block types (
OAK_WOOD,SPRUCE_WOOD,BIRCH_WOOD,JUNGLE_WOOD,ACACIA_WOOD,DARK_OAK_WOOD,MANGROVE_WOOD,PALE_OAK_WOOD,CHERRY_WOOD) are now included. Previously, attempting to/sellhanda "Birch Wood" block (as opposed to a "Birch Log") would return "That item is not configured in the shop." - Plank variants in the building category** — all 9 plank types (
OAK_PLANKS,SPRUCE_PLANKS,BIRCH_PLANKS,JUNGLE_PLANKS,ACACIA_PLANKS,DARK_OAK_PLANKS,MANGROVE_PLANKS,PALE_OAK_PLANKS,CHERRY_PLANKS) are now included in the defaultbuilding.ymlconfig.
### Fixed
- TeamTreasury transaction safety** —
depositnow refunds the player's Vault balance if the YAML save fails, preventing money from being lost on a failed write.withdrawdebits the treasury *before* paying the player so a failed save aborts the operation without creating currency from nothing. - TeamStockManager negative-amount guard** —
removeTeamStocknow returnsfalseimmediately whenamount <= 0, preventing invalid stock mutations.
### Fixed
- TeamsAPI optional integration** —
NoClassDefFoundErrorno longer crashes plugin startup when TeamsAPI is absent from the classpath. The availability check is now wrapped in aNoClassDefFoundErrorcatch block so the integration degrades gracefully whether the JAR is missing entirely or the plugin is simply not loaded.
### Added
- Folia support** — EzShops now runs on Folia servers. All scheduler calls are routed through a new
SchedulerAdapterthat transparently delegates toGlobalRegionScheduler/AsyncScheduleron Folia and toBukkitScheduleron Paper/Spigot/Bukkit. Thefolia-supported: trueflag has been added toplugin.yml.
### Changed
- EzBoost engine improvement** — reflective access to EzBoost's price-multiplier API is now cached after the first lookup.
Class.forName,getMethod, andgetPluginare no longer called on every transaction; instead, resolvedMethodreferences are reused for the lifetime of the server.
> 🌙 Automated nightly beta build from
main (May 11, 2026).>
> Built from [
b711ac3](https://github.com/ez-plugins/EzShops/commit/b711ac36875f0fc3c8f89c0793a0dfd418880e2d)This version we focussed on adding **Team Shops**, a full team-based economy layer built on top of [TeamsAPI](https://modrinth.com/plugin/teams-api). Teams get their own market, shared treasury, stock pool, and role-based pricing, all accessible through a new
/teamshop command.
### Added
- TeamsAPI integration** — EzShops now integrates with [TeamsAPI](https://modrinth.com/plugin/teams-api) as a soft dependency; all features degrade gracefully when TeamsAPI is absent.
- Role-based sell multipliers** — MEMBER, ADMIN and OWNER each receive a configurable sell price bonus when selling to the shop (
teams-integration.sell-multiplierinconfig.yml). - Role-based buy discounts** — MEMBER, ADMIN and OWNER each receive a configurable buy price reduction when purchasing from the shop (
teams-integration.buy-discountinconfig.yml). - Team treasury** — a shared balance funded automatically by a configurable percentage of every sell transaction (
teams-integration.treasury-split). Members can deposit and withdraw funds through the treasury GUI. - Shared team stock** — stock quantities are pooled per team; all members draw from and contribute to the same pool (
teams-integration.shared-stock). /teamshopcommand** — opens the team shop dashboard showing team info, current multipliers and quick links./teamshop treasury— opens the team treasury GUI (deposit / withdraw; requiresezshops.teamshop.treasury.withdraw)./teamshop stocks— browse all items your team currently has in stock.- Permissions**:
ezshops.teamshop(default: true) — access the team shop dashboard.ezshops.teamshop.treasury.withdraw(default: true) — withdraw from the team treasury.ezshops.teamshop.admin(default: op) — administrative team stock commands.- Automatic data cleanup** — team stock and treasury data are deleted automatically when a team is disbanded via the
TeamDeleteEvent.
- fix: solve configuration override in https://github.com/ez-plugins/EzShops/pull/55
- Fixed issue: Bukkit's
getMinecraftVersion() >= 14failed because of new26.1version format
- Replaced hardcoded back-button config with configurable GUI button in https://github.com/ez-plugins/EzShops/pull/49
- Added
/sellquick sell GUI in https://github.com/ez-plugins/EzShops/pull/51

- Removed sell portal from default shop in https://github.com/ez-plugins/EzShops/pull/52
- Full Changelog**: https://github.com/ez-plugins/EzShops/compare/2.3.1...2.4.0
- Added Github Packages publish CI: [https://github.com/ez-plugins/EzShops/packages/2933718](https://github.com/ez-plugins/EzShops/packages/2933718)
/pricingadmin command- Added new
/pricingadmincommand for managing the shop prices - Added
/pricingadmin set <item> <price>subcommand withezshops.pricing.admin.setpermission for setting the price of an item in the shop - Added
/pricingadmin reset <item>subcommand withezshops.pricing.admin.resetpermission for resetting the dynamic pricing of an item in the shop - Added
/pricingadmin resetallsubcommand withezshops.pricing.admin.resetallpermission for resetting all dynamic prices of the shop
## New
/shop <category> subcommand- Added
/shop <category>subcommand to open category GUIs directly - Added missing configurable messages
## What's Changed
- Refactor monolithic configuration documentation into sections by @stefkotidis-prog in https://github.com/ez-plugins/EzShops/pull/39
- Shop API builder tools by @ez-plugins in https://github.com/ez-plugins/EzShops/pull/36
- Category gui subcommand by @ez-plugins in https://github.com/ez-plugins/EzShops/pull/42
- docs: add pricingadmin command docs and permissions by @ez-plugins in https://github.com/ez-plugins/EzShops/pull/45
## New Contributors
- @stefkotidis-prog made their first contribution in https://github.com/ez-plugins/EzShops/pull/39
- Full Changelog**: https://github.com/ez-plugins/EzShops/compare/2.2.3...2.3.0
2.2.2 as stable version for now.- Changes**
- ([#34](https://github.com/ez-plugins/EzShops/pull/34)) Added buy price discount boost for [EzBoost](https://modrinth.com/plugin/ezboost) integration (by [matheusherman](https://github.com/matheusherman))
- ([#35](https://github.com/ez-plugins/EzShops/pull/35)) Added multi language not-in-rotation message
- ([#35](https://github.com/ez-plugins/EzShops/pull/35)) Added new check for each buy/sell feature and if item is not available, but sometimes is in rotation send this new message instead of actually still buy/selling.
- New NBT filter options for sell prevention ( by [@matheusherman](https://github.com/matheusherman) in [#27](https://github.com/ez-plugins/EzShops/pull/27) )
- Added NBT data whitelist
- Added NBT data blacklist
- Default
config.ymlsettings**
yaml
sell:
# Ignore items with NBT (custom tags/metadata) during /sellhand and /sellinventory
# When enabled, only plain items without NBT will be sold.
# For example: if you have a "Supreme Bone" (with NBT) and normal bones,
# only the normal bones will be sold when using /sellinventory.
# Default: false
ignore-items-with-nbt: false
# NBT tag filter for more granular control
# Mode: 'off', 'whitelist', or 'blacklist'
# - 'off' (default): Ignore the filter, use ignore-items-with-nbt setting only
# - 'whitelist': Only allow items with NBT tags in the whitelist
# - 'blacklist': Block items with NBT tags in the blacklist
nbt-filter:
mode: "off"
whitelist: []
blacklist: []
``- Added
item-typeoption to make it easier to prevent normal shop execution ITEM— Default. The player receives the configured ItemStack when they buy the item.COMMAND— The player is charged and pricing/dynamic effects are applied, but no ItemStack is given. Any configuredon-buycommands (orbuy-commands) will be executed.NONE— The player is charged and pricing/dynamic effects are applied, but no ItemStack is given and no commands are executed. Useful for non-physical purchases (tokens, permissions, etc.).
- Added toggle in configuration to disable player-shop protection
yaml
# When true, other players cannot open or break player shop chests/signs.
# Set to false to allow other players to open the chest and break the sign.
protection-enabled: true
``- Added automated testing in Github project
- Added CI to run feature and unit tests when pull request is created in Github project
- Added CI to validate YML configuration files in Github project
- Fixed typing quantity in chat for creating new
/playershop - Fixed typing price in chat for creating new
/playershop
- Improved pagination logic
- Added
preserve-last-rowoption to preserve the row with actions for the actions only - Added pagination documentation
- Added command autocomplete for configured
price-ids to show when using/shop buy <material>and/shop sell <material>
price-id) (optional)To allow multiple independent price entries for the same Minecraft
Material (for example two different shop items that both use EXPERIENCE_BOTTLE), items may declare an optional price-id string in their configuration. When present, the plugin uses this price-id as the pricing key (and as the dynamic-pricing state key stored in shop-dynamic.yml) instead of the material name.### Notes:
price-idis optional; if omitted the material name (e.g.DIAMOND,EXPERIENCE_BOTTLE) is used and pricing remains material-scoped (backwards compatible).price-idmust be unique across your shop configuration if you want independent pricing/multipliers for two items that share the same material.- Dynamic state (multipliers) are saved by
price-idinshop-dynamic.ymlwhen present; legacy material keys continue to be supported.
- Example (category item):**
``
yaml
my-exp-bottle-item:
material: EXPERIENCE_BOTTLE
price-id: exotic_exp_1 # optional unique key to separate pricing
buy: 10.0
sell: 5.0
dynamic-pricing:
starting-multiplier: 1.0
min-multiplier: 0.5
max-multiplier: 3.0
buy-change: 0.01
sell-change: 0.01
``- Added pagination in shop category detail GUI
- Added custom
{translation:TRANSLATION_KEY}placeholders to use translated values from themessages/system.
``
yaml
{translate:hooks.player-lacking-permission-message}
`
- Moved player shop class
SignFormat in new class for reusability purposesUpdated all configuration files through AI to implement translation placeholders in the language files. Added command execution on shop buy or selling
`yaml
categories:
enchantments:
name: "{translate:shop.categories.enchantments.name}"
...
display-name: "{translate:shop.common.menu.fill-display-name}"
items:
sharpness_v:
...
on-buy:
execute-as: console
commands:
- "broadcast test 1 2 3"
enchantments:
sharpness: 5
``- Fixed custom inventory title check for stock overview GUIs
- Fixed issue: 1 dynamic pricing looks strange buy price (https://github.com/ez-plugins/EzShops/pull/8)
- Fixed issue: Prevent item dragging in stock GUIs (https://github.com/ez-plugins/EzShops/pull/10)
- Fixed Discord notification formatting (https://github.com/ez-plugins/EzShops/pull/11)
- Fixed [issue in dynamic pricing](https://github.com/ez-plugins/EzShops/issues/1).
- Fixed [pagination issue in All Stocks GUI](https://github.com/ez-plugins/EzShops/issues/4)
- Added [dynamic pricing documentation on Github](https://github.com/ez-plugins/EzShops/blob/main/docs/shops/pricing/dynamic-pricing.md)
- Added bulk pricing to All Stock GUI
- Added [EzBoost](https://modrinth.com/plugin/ezboost) integration for sell boosts
- Refactored storage features with
StorageAdapterstructure with repositories. This to easily support MySQL and other storage types later on. - Improved stock features
- Added confirmation GUI for buying stocks
- Added confirmation GUI for selling stocks
- Added GUI of
/stock overview - Added "All Stocks" GUI
- Added link between "Player Stocks" GUI and "All Stocks" GUI
- Made most of the options in the GUIs configurable through a new
stock-gui.yml - Improved auto complete
- Fixed bug stock overview only loading overridden stocks
- Added support barrels for player shops
- Added API for stock features
- Added general API class to combine all API features
- Added MiniMessage support through new
MessageUtilfor most configurable messages - Added
CompatibilityUtilfor easier compatibility management
- Solved issue in double triggering player shop sign buys.
- Optimized cooldown cache storage to remove players that are not online. This saves temporary memory.
- Solved issue in removing player shops when they are located in unloaded worlds
- Solved issue in loading stock base price overrides
- Added stock market features
- Added price type based on stock market value
- Added admin control for freezing stock markets
- Added /stock command
- Improved configurable messaging
- Improved configuration cache implementation
- Improved default configuration files
- Improved fail/error handling

