Troubleshooting
Common problems and how to fix them.
Plugin does not load
Check the server console for errors on startup. TheBrewingMarket logs its initialization under the prefix [TheBrewingMarket]. Common causes:
| Error in console | Cause | Fix |
|---|---|---|
Could not load plugin: Vault |
Vault is missing or loaded after TheBrewingMarket | Install Vault and make sure it is in plugins/ before starting |
[TheBrewingMarket] Missing TBP/BreweryX. Disabling. |
Neither brewing plugin is installed (at least one is required) | Install TheBrewingProject or BreweryX — not both (see Installation) |
Unsupported Java version or class file errors |
Java version below 25 | Upgrade your server JDK to Java 25 |
Unknown dependency or plugin ignored |
Running on Spigot or CraftBukkit | Switch to Paper 1.21.9+ — Spigot is not supported |
No economy provider found
Vault is installed but the sell command does nothing or returns an economy error. This means Vault cannot find an economy plugin to connect to.
Brews are not recognized / wrong price
A player tries to sell a brew but gets an error, or it sells at the default fallback price instead of the expected one.
- Open
config.ymland check the recipe ID undermarket.prices. It must match the recipe identifier in your brewing plugin exactly (lowercase, underscores, no spaces). - The item must be a valid brew crafted by TheBrewingProject or BreweryX. Regular potions or other items cannot be sold.
- If the recipe ID is correct but the price is still wrong, the brew may have a very low quality score — brews that failed fermentation or distillation often have quality near
0.01, which multiplies the base price down significantly. - If both TheBrewingProject and BreweryX are installed, TheBrewingMarket uses TheBrewingProject exclusively. Brews from BreweryX will not be recognized in that case.
GUI does not open
Running /thebrewingmarket does nothing or returns "no permission".
- The player needs the
thebrewingmarket.usepermission (granted to everyone by default). Check your permissions plugin for an accidental negation (-thebrewingmarket.use). - Confirm the plugin loaded successfully — run
/pluginsand look for TheBrewingMarket in green.
Config changes not applying
You edited config.yml but the server still uses the old values.
/thebrewingmarket reload (requires thebrewingmarket.admin). A full server restart also works.
Database connection error (MySQL / MariaDB)
The plugin loads but logs a database error and sell history does not record.
- Double-check
host,port,user,password, anddatabaseindatabase.yml. - Make sure the database server is reachable from the Minecraft server (firewall, bind address).
- The database user must have
CREATE,INSERT, andSELECTprivileges on the target database. - If you recently switched from SQLite to MySQL, remember that history data is not migrated automatically.
Placeholders return nothing or stay as %tbm_...%
You added a TheBrewingMarket placeholder to a hologram, scoreboard or chat plugin, but it either shows an empty string or the raw %tbm_...% text.
- Make sure PlaceholderAPI 2.11+ is installed and listed in
/plugins. Without it, TheBrewingMarket silently skips expansion registration. - On startup the console should print
PlaceholderAPI expansions registered: tbm, thebrewingmarket. If it does not, PAPI was not present when TheBrewingMarket loaded — install PAPI and restart. - Run
/papi info tbmto confirm the expansion is live. If the command replies "unknown expansion", the registration failed. - Placeholders are case-sensitive. Use
%tbm_daily_earned%, not%TBM_Daily_Earned%. - Per-recipe placeholders like
%tbm_price_wine%require the recipe ID to match yourconfig.ymlexactly. Unknown recipes return an empty string.
Lifetime or global placeholders show 0
%tbm_lifetime_earned% or %tbm_global_total_today% return 0 even though sales exist in the database.
- Lifetime stats are cached per player and seeded on join. For players who were already online when the plugin was first installed or reloaded, the cache fills on their next login.
- Global analytics refresh asynchronously once every 60 seconds. A fresh sale will not show up in
%tbm_global_*%placeholders until the next refresh tick. - Confirm that
sell_historyis actually being written — if the history table is empty, all lifetime/global placeholders will legitimately read as 0. See the database section above.
Still stuck?
Open an issue on the GitHub repository and include the relevant lines from your server console and your database.yml (remove passwords before posting).