How to add an in-game support chat to a Unity game
Players who hit a bug rarely leave the game to write an email. They quit, or they leave a one-star review that says "doesn't work". A chat one tap away from the pause menu catches them while they still care, and it can send your team the device, scene and logs without asking the player for anything.
Published 31 October 2026 by the Inngame team. The first half applies whatever tool you use; the second half shows how it's done with Inngame, which we make.
What a support chat inside a game has to handle
A web chat widget dropped into a game fails in ways a website never shows. Before picking a tool or writing one, check it against this list.
- Every input your game supports. If the game plays on a gamepad or a Steam Deck, the chat has to be navigable with a D-pad and usable with an on-screen keyboard. A chat that needs a mouse is a dead end for half your players.
- The game around it. Opening the chat in the middle of a fight should pause the game, or at least not let the player die while typing. Music and input should come back cleanly when it closes.
- No login wall. The player who can't log in is exactly the one who needs help. The chat should work for an anonymous player, then attach their account when they sign in.
- Context without questions. "What device? Which version? What were you doing?" costs a round trip and loses half the players. The app version, platform, device, OS, active scene and the last log lines should travel with each message.
- Screenshots. One image of a broken screen beats three messages. On desktop, a hotkey; on mobile, a button in the chat. The chat itself must not end up in the capture.
- Bad networks. Messages written in a subway tunnel should wait and leave when the connection comes back, not vanish.
- Replies when the game is closed. Answers arrive hours later. Without a push notification, the player never sees them.
- Languages. A small team can't read Korean and Portuguese. Either you translate both ways, or you only support players who write in your language.
- Data rules. Messages contain personal data. Players in the EU can ask for a copy or for deletion, and the stores expect a privacy policy that says where the data goes.
Building it yourself
The chat window is the easy part. Behind it you need an API that identifies players without trusting the client, storage for messages and images, real-time delivery (WebSocket, with polling for WebGL), a push service for APNs and FCM, an inbox where your team reads and answers, image moderation if players can upload, and a way to export and delete a player's data. Then you maintain it across Unity versions, platforms and input systems.
For a studio with a backend team and specific needs, that can be the right call. For a team of a few people, it is usually weeks taken from the game.
Adding it with Inngame, step by step
Inngame's Unity package covers the list above. It runs on Unity 2022.3 LTS and Unity 6, on iOS, Android, Windows, macOS and Linux (Steam included), with the legacy Input Manager or the Input System. It only depends on uGUI and builds its UI from code on its own canvas, so it works in any render pipeline.
1. Install and configure
Create an app in the inbox to get an app key, add the package (the Unity quickstart has the exact steps), then open Tools → Inngame → Settings, paste the key and click Send test message. The message shows up in your inbox. Or configure it from code in your first scene:
Inngame.Configure("app_XXXXXXXX", new InngameOptions
{
PauseGameWhileOpen = true, // Time.timeScale = 0 while the chat is open
ScreenshotHotkey = KeyCode.F8, // desktop: capture + open the chat
ShakeToReport = true, // mobile: shake to capture + open the chat
});
2. Open the chat from your menus
Put a Help entry where players look for it: the pause menu, the settings screen, the title screen. The chat is full screen on phones and a centered panel elsewhere, and it can be navigated with a gamepad or keyboard.
helpButton.onClick.AddListener(Inngame.OpenChat);
Inngame.UnreadChanged += n => badge.SetActive(n > 0);
3. Say who the player is
Every device starts as an anonymous player, so the chat works before login. Once you know the account, identify it. A plain id labels the player for your team; a token signed by your server, or a Steam ticket, also lets their history follow them to another device.
await Inngame.Identify(player.Id, player.DisplayName);
// or, verified: await Inngame.IdentifyWithToken(jwtFromYourServer);
// or, on Steam: await Inngame.IdentifySteam(GetSteamTicketHex);
4. Add the context only your game knows
Device, OS, GPU, memory, FPS, the current and previous scenes and the last 50 log lines are attached automatically. Your team sees them; the player doesn't. Add what matters in your game:
Inngame.SetContext("level", currentLevel);
Inngame.ContextProvider = () => new Dictionary<string, object>
{
["coins"] = wallet.Coins,
["quest"] = quests.Current?.Id,
};
5. Give players control of their data
Add a "Delete my support data" button in your settings or privacy screen. It removes the player, their conversations and photos on the server, then the local copy.
deleteButton.onClick.AddListener(async () => await Inngame.DeleteData());
Push notifications for replies, translation, cards (items, offers, store review prompts) and events for automations are covered in the quickstart. If you use an AI coding agent, the agents guide gives it a single prompt to do the whole integration.
Before you ship: a test checklist
- Open the chat with each input: touch, mouse, keyboard, gamepad. Reach the send button and the screenshot button without a mouse.
- Open it mid-game: the game pauses, and resumes when the chat closes.
- Send a message in airplane mode, then reconnect: it leaves on its own.
- Send a screenshot and check it arrives without the chat in it.
- Close the game, reply from the inbox, and check the notification on a real device.
- Write in another language and check both sides read their own.
- Press "Delete my support data" and check the player is gone from the inbox.
Questions
Does the chat work in a WebGL build?
Yes. WebGL uses polling instead of a WebSocket, so new replies can take a few seconds longer to appear.
Does it work with the new Input System?
Yes. The package works with the legacy Input Manager, the Input System package, or both enabled.
Can players use it before they create an account?
Yes. Each device starts as an anonymous player. When you identify them later, the conversation they started anonymously stays with them, including when a verified login joins it to an existing account.
What does the player see of the logs and device details?
Nothing. Context is shown to your team only. It's capped at 64 KB per message, and you can turn log capture off with LogLines = 0.
What about Unreal or Godot?
Inngame has SDKs for Unity, native iOS apps and the web. A Godot or Unreal game exported to HTML5 can use the web SDK; for native builds of other engines, the REST API exposes the same endpoints the SDKs use, but you would build the chat UI yourself.
Related: Unity Player.log location and player logs · Support players in every language · Discord or in-game support? · Support chat for an HTML5 game · Player data requests · A Helpshift alternative for indie game studios · Privacy & data · Player identity · Inngame for mobile games · Inngame for PC and Steam games