> For the complete documentation index, see [llms.txt](https://doc.var-fivem.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://doc.var-fivem.com/coins-shop/configuration/identifier.md).

# Identifier

## Identifier resolution

If your server uses a non-standard primary identifier (custom `citizenid`, Discord ID, account UUID, etc.) you can override how the script resolves players.

### Default behavior

The default lookup order, configurable in `shared/config.lua`:

```lua
Framework = {
  IdentifierPriority = { "license2", "license", "fivem", "discord", "steam" }
}
```

The script tries each of these on the player's identifiers and uses the first match.

### Override resolveIdentifier(source)

Edit `server/framework/hooks.lua`:

```lua
VarShop = VarShop or {}
VarShop.FrameworkOverrides = VarShop.FrameworkOverrides or {}

function VarShop.FrameworkOverrides.resolveIdentifier(source)
  -- Use QBCore citizenid as the primary key
  local Player = QBCore.Functions.GetPlayer(source)
  if Player then
    return Player.PlayerData.citizenid
  end
  return nil -- nil = fall back to the default resolver
end
```

### Override resolveIdentifierInput(input)

Used when an admin types something like `/addcoins #ABC1234 500` and you want the hash-prefix shorthand to resolve to a citizenid:

```lua
function VarShop.FrameworkOverrides.resolveIdentifierInput(input)
  if type(input) == "string" and input:match("^#") then
    local Player = QBCore.Functions.GetPlayerByCitizenId(input:sub(2))
    return Player and Player.PlayerData.citizenid or nil
  end
  return nil -- fall back to the default resolver
end
```

The default resolver already accepts:

* Online server ID (`42`)
* Online player by any framework identifier (`steam:xxx`, `fivem:xxx`, etc.)
* An existing account in the database
* An alias previously registered for an offline player
* A raw string as last resort

{% hint style="info" %}
Returning `nil` from a hook means "I have nothing to say, use the default". Returning a string means "this is the canonical identifier, use it".
{% endhint %}
