Inngame / Guides

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.

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

Start the 14-day trial

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