Why Bedrock players matter to your store
A Bedrock player who joins your Java server through Geyser doesn’t play under their gamertag. Floodgate puts a dot in front of it and turns its spaces into underscores, so Cool Guy plays as .Cool_Guy. A rank bought for “Cool Guy” reaches nobody. Here is how those names work, what breaks in a store, and how to set things up so Bedrock players get what they paid for.
Bedrock is the edition of Minecraft on phones, tablets and consoles: Android, iOS, Xbox, PlayStation and Nintendo Switch, as well as Windows. Java Edition runs only on Windows, Mac and Linux. On their own, the two editions can’t play together, because they use different servers.1
Geyser bridges that gap: it lets Bedrock players join Java servers.2 Its companion plugin, Floodgate, lets them in with their Bedrock (Microsoft) account, without a paid Java account.3 For a Java server, that means crossplay: players on phones and consoles can join, and buy ranks too.
Phones are everywhere in the Philippines. GSMA Intelligence figures, published by DataReportal, put the country at 137 million mobile connections at the end of 2025, about 117 percent of the population, since many people have more than one.4 That is not a count of Minecraft players, but it is a good reason to make sure your store works for phone players. If your server runs Geyser, look at your player list: with the default prefix, the names that start with a dot are your Bedrock players.
This is a guide to how these tools behave, not a promise about your setup. Plugins and their defaults change, so check your own configs against the sources listed at the end.
How Floodgate names a Bedrock player
Everyone on a Java server needs a Java-style name. When a Bedrock player joins, Floodgate builds one from their Xbox gamertag. Its code does it like this today:5
It adds a prefix. Floodgate’s username-prefix setting goes in front of the gamertag. The default is a dot, ".". The config’s own note recommends a prefix that isn’t a letter or a number, so Bedrock and Java names can’t clash.6
It keeps to 16 characters. Java names have a limit of 16 characters, and the prefix counts. Floodgate keeps as much of the gamertag as fits after the prefix, so a long gamertag loses its end.5
It replaces spaces. A Java name can’t hold a space, so with replace-spaces on, which is the default, every space becomes an underscore.5, 6
It makes a UUID from the Xbox ID. A Floodgate player’s UUID is their Xbox user ID (XUID) with zeros in front: 00000000-0000-0000-….5, 7 Those zeros make a Floodgate player easy to spot by UUID alone.
A linked player plays as their Java account. A Bedrock player who has linked their Xbox account to a Java account joins with the Java account’s name and UUID instead.5 With Geyser’s Global Linking, which should be on by default on every Floodgate 2.0 server, one link works on every server that has it. A linked player also uses the Java account’s inventory and location.8
| Xbox gamertag | Floodgate prefix | Name on your server |
|---|---|---|
| Steve | . (the default) | .Steve |
| Cool Guy | . | .Cool_Guy |
| Cool Player 123 | . | .Cool_Player_123, exactly 16 |
| Cool Player 123 | BE_ | BE_Cool_Player_1, cut to 16 |
| Cool Guy, linked | None: plays as the linked Java account | Ben_Builds |
What goes wrong in a store
A store sells to a name. The buyer types it at checkout, and your server runs your command with that name in it, such as lp user {player} parent add vip. When the name isn’t the one Floodgate gave the player, this is what happens.
The rank reaches nobody. A Bedrock buyer types their gamertag, Cool Guy, the way it looks in their own game. The command runs for a name nobody on your server has, and .Cool_Guy gets nothing.
The rank goes to someone else. If a Java player already owns the spelling, a Bedrock Steve who types “Steve” pays for the Java Steve’s rank. Without a prefix it gets worse, because the two players then have the same name on your server. Floodgate’s FAQ advises against removing the prefix unless you’re sure no one will share a username.7
LuckPerms refuses the name. Out of the box, LuckPerms only accepts usernames made of letters, numbers and underscores, so lp user .Cool_Guy is turned away as an invalid name even when it’s right.9, 10 Floodgate’s known-issues page has the fix, in step 2 below.11
LuckPerms can’t find the player. With its default settings, LuckPerms finds a player by name only if they have joined since LuckPerms was installed.9 A rank bought for a Bedrock player before their first visit can fail even with the right name.
Items go to an empty room. Commands that hand items to a character need the player online. If the delivery runs while they’re away, there is nobody to hand the items to.
A linked player is bought for under the wrong name. On your server, the linked Cool Guy is Ben_Builds. A rank bought for .Cool_Guy goes to a name that player never uses.
Setting it up right
Mind the dot, and most of the problems above go away. Six steps, most of them one line of config:
- Keep Floodgate’s prefix simple. Leave
username-prefix: "."andreplace-spaces: truein Floodgate’sconfig.yml.6 Floodgate’s known-issues page says a prefix such as*can make commands need quotes around the name, and that.avoids it. If the old prefix still shows after a change, it says to deleteusercache.jsonand restart.11 - Let LuckPerms accept the name. Set
allow-invalid-usernames: truein LuckPerms’config.yml, as Floodgate’s known-issues page advises.11 Names must still be 16 characters or fewer, which Floodgate’s always are.9, 5 On a network, change it wherever LuckPerms runs your store’s commands. - Use the placeholder, never a typed name. Write commands with your store’s player placeholder (
{player}on KantoPay), as inlp user {player} parent add vip, so the name the buyer confirmed goes in exactly. - Wait for the player when it matters. Item commands should wait until the player is online. Rank commands can run straight away for a player your server already knows, but for someone who may not have joined yet, waiting is safer, because LuckPerms only finds players who have joined.9
- Tell players what to type. On a store that turns a gamertag into your server’s name (KantoPay’s does, see below), Bedrock players type their Xbox gamertag, spaces and all. On a store that doesn’t, they type the name your server shows them, dot and underscores included, such as
.Cool_Guy. Linked players type their Java name, the one they play under. Java players type their Java username. One pinned line in your Discord saves a lot of questions. - Offer linking to players on both editions. On Geyser’s Global Linking server,
link.geysermc.org, a player joins with both accounts, runs/linkaccounton one, then/linkaccountwith the code it shows on the other. Linked players use the Java account’s inventory and location, so Geyser suggests moving items to the Java side first.8
How KantoPay handles it
On KantoPay, the plugin and the store do most of this for you, from plugin 3.6.0 onwards. The plugin is at 3.7.1 today.12 It runs on Paper, Spigot, Purpur and Folia, Minecraft 1.8 and newer.
Your server tells your store. When the plugin starts, and on /kantopay reload, it reports whether the server has Floodgate and which prefix it uses. With the store’s Bedrock setting on Auto, the default, that switches on a Java or Bedrock choice in your store’s name box, with the right prefix. You don’t need to know what username-prefix means.
Behind a proxy too. When Floodgate runs only on the proxy, the servers behind it can’t read its config. The plugin still knows a Bedrock player by Floodgate’s zeros at the start of their UUID, or by the prefix, and the first Bedrock player who joins with a dot or a dash in front of their name teaches the store its prefix. To switch Bedrock on before then, set floodgate-prefix in the plugin’s config.yml, or pick Java + Bedrock on the Servers page of your dashboard.
Buyers type what they know. A Bedrock buyer picks Bedrock and types their gamertag, spaces and all. Before they pay, the box shows the name your server will see. A name with a space can’t be a Java name, so the box moves to Bedrock by itself, and the store never changes a name without showing it first.
Players your server has seen. As players join, the plugin reports each name and whether it is Java or Bedrock. Then Cool Guy, Cool_Guy and .Cool_Guy all find the same player, and the box says “Bedrock player on this server: .Cool_Guy”.
A gamertag check that doesn’t block. For a player your server hasn’t seen, the store asks GeyserMC’s API whether it knows the gamertag. GeyserMC answers from its own cache, and today a gamertag it hasn’t cached comes back unconfirmed,13 so a miss can be a typo or a real player it hasn’t seen yet. The buyer sees one gentle warning, “We could not confirm that gamertag”, and can still continue.
No sale to a name that can’t exist. If your server reports a prefix that can’t go into a command, such as *, the store tells Bedrock buyers “This store can’t deliver to Bedrock players yet.” instead of taking their money, and your dashboard asks you to set username-prefix to "." and restart. Java buyers aren’t affected.
Waiting for the player. Each product has a “Wait until the player is online” switch. Unless you change it, item commands wait, and rank, permission and economy commands such as lp run straight away. Turn it on for a rank if your Bedrock buyers often pay before their first visit.
Links in game. /kantopay link gives a player a store link with their name and edition already filled in. Bedrock chat can’t open links, so Bedrock players get the address written out, to read or type into a browser.
Quick fixes
A Bedrock player says they paid and got nothing? Start here. After fixing the cause, give the rank or items from your console, using the name your server shows for that player.
| What you see | Likely cause | What to do |
|---|---|---|
| LuckPerms says the name is invalid | LuckPerms turns away names with a dot by default10 | Set allow-invalid-usernames to true and restart11 |
| LuckPerms can’t find the user | The player hasn’t joined since LuckPerms was installed9 | Give the rank after they join; for next time, make the rank wait until the player is online |
| The rank went to a Java player with the same name | The buyer typed their gamertag as a Java name | Move the rank by hand, and make sure your store asks Java or Bedrock |
| The store never asks Java or Bedrock | The store is set to Java only, the plugin is older than 3.6.0 or has bedrock-detection: off, or Floodgate is only on the proxy and no Bedrock player has joined yet (or its prefix is letters, such as BE_, which the store can’t read from a name) | Update the plugin, set floodgate-prefix in its config, or pick Java + Bedrock on the Servers page |
| “This store can’t deliver to Bedrock players yet.” | Your server reported a prefix, such as *, that can’t go into a command | Set username-prefix: "." in Floodgate and restart |
| Items never arrived | The command ran while the player was offline | Turn on “Wait until the player is online” for that product |
| “We could not confirm that gamertag” | GeyserMC hasn’t cached it: a typo, or a player it hasn’t seen yet13 | Check the spelling; if it’s right, continue |
| A linked player’s rank went to a dotted name | Linked players play under their Java name5 | Buy for the Java name |
| The old prefix still shows after a change | The server remembers names it has seen | Delete usercache.json and restart11 |
Sources
Last checked . Geyser, Floodgate and LuckPerms change; if something here is out of date, write to support@kantopay.com and we’ll correct it. Minecraft is a trademark of Mojang, and Xbox of Microsoft. Geyser, Floodgate and LuckPerms are independent projects, named here only to describe them.
- Minecraft, Minecraft Java or Bedrock Edition (published October 25, 2021)
- GeyserMC, home page
- GeyserMC wiki, Floodgate overview
- DataReportal, Digital 2026: The Philippines (figures from GSMA Intelligence)
- Floodgate source code, HandshakeDataImpl.java (name, UUID and linked players) and Utils.java (UUID from XUID)
- Floodgate, default config.yml (
username-prefix,replace-spaces) - GeyserMC wiki, Floodgate FAQ (changing the prefix, Bedrock UUIDs)
- GeyserMC wiki, Linking (Global Linking)
- LuckPerms, default config.yml (
use-server-uuid-cache,allow-invalid-usernames) - LuckPerms source code, DataConstraints.java (which characters a username may hold)
- GeyserMC wiki, Floodgate known issues (LuckPerms and prefixes, running commands, the prefix not changing)
- KantoPay, plugin version information; the
bedrock-detectionandfloodgate-prefixsettings are explained in the comments of the plugin’sconfig.yml, and the Bedrock setting is on the Servers page of the dashboard - GeyserMC, Global API (Get the xuid from a gamertag); the store’s own lookups on
KantoPay