Create a company and project
Start here: create your workspace, then give your team access.
Create a company and project
- Sign in with Google or email and verify your email. Without a company you land on the companies page (
Companies & invitationsin the account menu); choosecreate your own companythere. - Complete two steps:
Company(enter theCompany nameand chooseCreate company) andProject(onYour first project, enter theProject nameand chooseCreate project). The support desk opens in the new project. - For another project, choose
changenext to the project name at the top of the sidebar, thenNew project; enter theNameand chooseCreate project. The new project opens right away.Settings → Generalshows its name,Project IDandGame icon: upload the same image as the game’s app icon. The team sees it in the project menu and the widget preview, while players see the icon the SDK reads from the game. Only company owners create and rename projects and set the icon. - Give your team access under
Settings → Teamin each project: press the round+button and enter an email and role. Another company owner is invited underSettings → Members. People join through their invitation; they do not create a separate company.
A game server is not required to create or use the project. Each new project starts with default conversation categories and its own Cluefolk command key; settings are not copied between projects, so configure each project separately.
Sign in and join a company
- Open cluefolk.com, choose
Sign in, thenGoogleorContinue with email; with email, new people register on the next page. Open the verification link from the email and sign in again if requested. - To join a team, sign in with the exact email address that received the invitation. Open the invitation link and choose
Accept invitation, or accept it underCompanies & invitations. - Invitations are checked when you sign in or reload. If an owner or administrator has just invited you, reload the page.
- Without a company you land on the companies page, also opened by
Companies & invitationsin your account menu. If it saysYou haven’t joined a company yet, wait for an invitation or usecreate your own companyto become the owner of a new company.
A Google account or a verified email alone does not grant access to someone else’s company.
Your account, company and project
- Your personal account is separate from your role in a company’s projects. You can belong to several companies and have different roles in each project.
- Before making changes, check the project name at the top of the sidebar, under the Cluefolk logo. To switch, choose
changenext to it: a small menu lists the company’s projects with your role and a check mark on the current one; company owners also seeNew projectthere. A project is one game’s support space: its players, conversations, settings, server connection and keys belong to it alone and are never shared with other projects. - Below the picker,
Support deskholdsInbox,Incidents,PlayersandReports, andViewsopens the inbox with a ready filter. Project admins and company owners also seeSettingsat the bottom of the sidebar: the company’sMembersand the configuration of the selected project. - To keep development builds and QA apart from real players, create a separate project for them, for example “Space Farm” and “Space Farm QA”. Each project has its own project ID, players and conversations.
- To switch companies, open your account menu at the top right (your name). It lists your companies with your role, and a check mark shows the current one; choose another company to open it. The menu also has
Account settings,Companies & invitationsandSign out. The book icon next to it opens this user guide. Account settingsholds your personal preferences:Profile(name and email),Appearancewith the System, Light or Dark theme, andPrivacywithCookie settingsand a link to the cookie policy.- In
Profile, enter your first and last name and pressSave. Your team sees your full name; players see only your first name on your replies, for exampleAnna · Support team. Until you save a name, players seeSupport team.
Access is granted per project. If access is removed, ask a company owner or a project administrator to add you again under Settings → Team.
Company members and owners
- Company owners: open
Settingsat the bottom of the sidebar and chooseMembersin the section named after your company. The page lists the company’s members and role-basedInvitations; members who are not owners do not see it. - Each person’s company role is
OwnerorMember. Owners have full access to every project. A company can have several owners; the last owner cannot be demoted or removed. - Each member’s project access is shown read-only. To give someone access to a project or change their project role, use that project’s
Settings → Team. - In
Settings → Members, invite by email and explicitly choose Owner, Admin or Operator. Admin and Operator also require the projects they may access. No role is selected automatically. RemoveandConfirm removaltake a person out of the company and all its projects. Their account and access to other companies remain.
Removing project access also takes the person out of that project’s queues and clears their assignments.
Who can do what
Support desk is for daily support work. Settings holds the company’s Members (owners only) and the selected project’s configuration; only company owners and project admins see it, operators have none. Personal preferences are under Account settings in the account menu. Company owners can do everything in every project; members get Admin or Operator per project under Settings → Team.
Configure the project
The owner or an administrator configures each project. Connecting a game server is optional.
Players and sign-in
- Select the project you want to configure in the sidebar picker and open
Settings → Server connection. UnderPlayers and sign-in, chooseWho can contact support. Everyone. Players signed in through the game are verified; others write anonymously.is the default. The SDK identifies an anonymous player by their app install, so history survives restarts without a game backend.- To verify players, your game backend signs a short-lived ES256 identity token after the player signs in to the game. Paste the backend’s public key (PEM or JWK) under
Identity signing keysand chooseAdd key. The token issuer (iss) and audience (aud) are shown above the keys. - When a player signs in through the game on the same install, their anonymous conversations move to the verified account.
Only players signed in through the game.requires at least one identity key. Players without a valid identity token then cannot open support.
Cluefolk stores only public keys. Rotate a key by adding the new one, switching your server to it, then removing the old one. The last identity key cannot be removed while sign-in is required.
Connect the game server when needed
- Open
Settings → Server connection. Conversations, anonymous players, identity tokens and manual badges work without a game server URL. - To sync attributes for automatic badges, deliver gifts, receive game events and request notifications, enter the
Game server URL: the HTTPS origin, for examplehttps://api.yourgame.com, without a path or query. - Under
Profile signing keys, add the public key your server uses to sign attribute snapshots and the connection reply. Connecting requires at least one profile key. Cluefolk command keysshows theJWKS URL, issuer and audience. Cluefolk signs every request to your server (gifts, profiles, events, push) with ES256, and your server verifies it against the JWKS URL, cached for up to 5 minutes.Rotate command keyandRotate nowsign new requests with a new key immediately; the previous key stays published.Download server configsavescluefolk-server.jsonwith identifiers, issuers, audiences, the JWKS URL and Cluefolk’s public command keys. It contains no secrets; give it to your backend developer together with the integration guide.- The developer implements
/cluefolk/connect,/cluefolk/profile,/cluefolk/gifts,/cluefolk/eventsand/cluefolk/pushas needed. ChooseCheck connectionto verify the server and import its signed attribute catalog; after that the button becomesRefresh catalog.
Private keys stay on the game backend: never put them in the app, WebView, a public repository or SDK options. Changing the URL requires a new check.
Refresh the attribute catalog
- Open
Settings → Attributes. ThePlayer attributestable shows each attribute’s name, key and type. - Choose
Refresh catalogafter your developer updates the game server. The accepted catalog appears immediately. The same table is available underServer connection. - The backend supplies the attribute definitions and player values. Cluefolk uses those values for player cards and automatic badges; attributes are not created manually.
- Supported types are
string,integer,decimal,boolean,datetimeandenum. If an existing attribute needs a different type, ask the developer to use a new key.
A failed refresh keeps the last accepted catalog. Missing, stale or restricted data should not be treated as a zero or a confirmed negative value.
Automatic and manual badges
- Administrators: open
Settings → Badgesand press+above the list. Enter the name, icon and color; the key and who on the team sees the badge are underMore options. - In
How players get itchooseAutomatically, from game dataand describeWho gets itwith the game server’s attributes, orAn operator sets it on the player card.Check playersshows how many players match.Savekeeps a draft;Publishmakes the badge work. - For a badge the team applies itself, choose
An operator sets it on the player cardand keepEveryone on the projectunderMore options, then save and publish it. Operators filter the Inbox by badges underFilters → Players.
Automatic badges follow only their rules. Operators cannot assign administrator-only badges. Publishing a switch from manual to automatic removes the badge from players it was given to.
Configure gifts and their limits
- Gifts need a connected game server: without it
Settings → Giftsonly explains how to connect it. Administrators: onCatalogchoose+ Create a giftand fill in the name and description players see, the command your game server runs and what to grant (JSON), thenCreate gift. Agree on the command and contents with your game-backend developer. - To change a gift, choose
Change →and save a new version; gifts already sent keep the version they were sent with. - Choose
Limits & approval →.Operators can send this giftdecides whether operators see it at all.Gifts per player (0 = no limit)withinWithin, daysapplies to everyone, administrators included. - For operators set
Gifts per operator per day (0 = no limit), a hard limit, and optionallyAsk an administrator to approve larger volumes: once an operator has sent the chosen number of this gift in 24 hours, further requests wait for approval (0 means every request). A second gift in the same conversation always waits for an administrator. ChooseSave limits.
Administrators never need approval. Disable gift prevents new selections; it does not recall an already queued operation. Gifts reach only players signed in through the game.
Approve gifts and review the report
- Administrators: open
Settings → Gifts → Approvals. The tab counts waiting requests and shows the gift, player, requester and reason. - Choose
Approve and sendto queue delivery, or enter aDecision noteand chooseDecline; declining requires a note.Open conversation ↗shows the context. - Another administrator has to decide on your own request. Per-player limits are checked again when a request is approved.
- Open
Reportand choose a period to see, per operator and gift, how many were granted, pending, declined or failed, and for how many players.
The operator sees the decision in the player’s gift history. A declined request is never delivered.
Add and manage the project team
- Select the intended project in the sidebar picker and open
Settings → Team, the only place to give access to a project. The page lists company owners (read-only, every project), members with their role and this project’sInvitations. - To add someone, press the round
+button (Add to the project), enter theEmail addressin the dialog, choose theRoleand chooseAdd to project. Someone already in the company gets access right away, without an email (“… now has access.”); anyone else gets an email invitation that expires in 7 days (“Invitation sent to …”). Administrators add operators; only a company owner can add an admin. - An invited person signs in with that email and accepts the invitation; they join the company as a member with access to this project.
- Owners can change a member’s role here.
Revoke accessandConfirm revokeremove access to this project only;Revoke invitationcancels a pending invitation.
An Admin configures the project and can work as an operator. An Operator uses the support desk. Company owners manage the company roster and other owners under Settings → Members.
Queues, categories and support settings
- Open
Settings → Queues & workflow. UnderQueuescreate aNew queue, select itsMembers, setOpen conversations per operator, optionally enableAssign automatically, and chooseSave queue. New conversations go to members who have Cluefolk open, the least busy first. - Under
Conversation fieldsadd fields for the team, or withAsk the playerfor the player form. A field’s key and type cannot be changed after creation. - In
Support settingsconfigure rating requests,Reopen window, days,Retention, days,Reply SLA, business minutes,Time zoneandBusiness hours(no windows = 24/7). Player messageslimits how many messages a player can sendPer minuteandPer hour(6 and 60 by default). Messages above the limit are refused, and the widget shows when the player can write again.Conversation categoriesare optional for players. Edit labels, reorder with ↑/↓, add a category with a key and label and+ Category, or uncheck it to disable it. Saved keys stay fixed; disabled categories remain on existing conversations. ChooseSave settings.
The status filter supports multiple choices. All active excludes Resolved; select Resolved to browse history. New unanswered is the initial queue. No conversation opens automatically; × closes only your current view and keeps its draft.
Design the player-facing widget
- Open
Settings → Widget. Set five base colors for each theme:Accent(header and player messages),Action(buttons and links),Background,Surface(cards and team messages) andText. Muted text, borders and text on colored buttons are derived for contrast and shown underDerived. The file holds colors and content only. The logo is the game’s own app icon, read by the SDK (seeLogo); to see it in the preview, upload theGame iconunderSettings → General. Then set up the blocks: welcome, topics and contact. - Each topic opens the chat with one of this project’s conversation categories. Choose its
Category; the list comes fromQueues & workflow. - Check the live preview in light and dark appearance and choose
Saveto keep this version for your team. Download for buildsaves<ID>_widget.json, where<ID>is the first 16 characters of the Project ID. Your developers ship it inside the game build and pass its text to the SDK; players see a change only in the next build that includes the new file.Import fileloads such a file into the editor.
The language menu next to Light/Dark changes only the admin preview. Purchases and Rewards are separate topics; Purchases has a gold outline. Show “Talk to the team” button is off by default and can be enabled in the editor before exporting the theme.
Quick replies
- Use
Settings → Quick repliesfor the team’s saved replies: each has a title, a language and a body. Administrators press+above the list to add one and choose a reply in the list to edit or delete it; operators insert them while composing a reply inInbox.
{{player.id}}, {{conversation.id}} and {{agent.name}} in the text are filled in when the reply is inserted; {{agent.name}} becomes your first name.
Check the project before inviting players
- Decide who may contact support under
Players and sign-in. If you use a game server, confirm that the connection is verified and the expected attribute keys and types are present. - Publish the gifts and badges the team needs, set gift limits, invite operators and verify queue membership.
- Use a test player to send a message, receive a public reply and request a gift. Confirm the actual result in the game, not only the queued status.
- Under
Server connection, reviewGame eventsandNotifications. InTest push,Send testrequests a push through your game server for a player signed in through the game who has a public support reply. - Use
Reportsin the support desk for support activity, includingCountries: a map and list of the countries Cloudflare placed players in when their conversations started. UseSettings → Auditto review recorded changes. If you prepared support in a separate project for development builds, configure and check the release project the same way: settings are not copied between projects.
Cluefolk sends notification requests to your game backend. FCM/APNs credentials and device-token handling belong to the game’s integration, not an operator’s browser.
Work as an operator
For operators: short step-by-step instructions for everything you do during a shift.
Start your shift
- Sign in at cluefolk.com. At the top of the left panel you see the game you are working on. If it is the wrong one, press
changenext to its name and pick the right game. - Open
Inbox. On the left is the list of conversations, in the middle the open conversation, on the right the player card. - Keep the Cluefolk tab open while you work. If your administrator turned on automatic assignment, new conversations go to people who have Cluefolk open, the least busy first.
The status filter supports multiple choices. All active excludes Resolved; select Resolved to browse history. New unanswered is the initial queue. No conversation opens automatically; × closes only your current view and keeps its draft.
Find a conversation
- Statuses:
New— no human reply yet;In progress— the first public reply assigned the conversation;Needs a replyandWaiting for playerare set manually;Awaiting confirmation— the player is deciding;Resolved— saved, read-only history. - The status filter supports multiple choices.
All activeexcludes Resolved; select Resolved to browse history.New unansweredis the initial queue. No conversation opens automatically; × closes only your current view and keeps its draft. - To search, type the player ID, a word from the messages, or the game or phone system version, for example
2.4oriOS 17.⌘K(Mac) orCtrl K(Windows) jumps to the search box. Filterschanges the order (for exampleNewest first) and narrows the list by operator, category, priority or tag. UnderPlayersit narrows by who the player is: press+ Conditionand pick a badge or game data, for exampleLevelAt least10or★ VIPHas. Active filters show as chips under the search;×removes one. To keep a set of filters, type a name inSave as a view…— the view appears in the sidebar underViews.
A name with a person icon on a conversation is its operator. No name means the conversation is free.
Answer a player
- Open a conversation without an operator and read it. The player card on the right shows who the player is (see “Check the player”).
- Make sure the
Replytab is selected above the text box and type your answer. To insert a ready answer, openQuick replyand pick one. - Press Enter or
Send reply. Shift+Enter starts a new line. - Your first public reply assigns the conversation to you and sets
In progress. Later replies keep the manually selected work status.
Operators see their own conversations and unanswered, unassigned New conversations. Only admins and owners may inspect another operator’s conversation. They must take it over before writing a reply or a private note; they may also transfer it.
Pass a conversation to a colleague
- Open a conversation that is yours.
- At the top, open
Operatorand choose a colleague. People markedOwnerorAdmincan answer players too. - Now only the colleague answers the player. You can still write private notes.
- To give the conversation back to the whole team, choose
Unassigned.
Owners and admins can take any conversation by choosing You in Operator. An operator cannot take a colleague’s conversation: ask the colleague or an admin to pass it to you.
Write to your team (private note)
- Above the text box choose
Private note. The box turns yellow: the player does not see this text. - To call a colleague, pick them in
Mention. They find the note underMentioned me. - Press Enter or
Add note.
You can write notes in any conversation, even one that belongs to a colleague.
Check the player
- The player card is on the right. On a narrow screen, press the person icon at the top of the conversation.
✓ Verified player— the game confirmed the account.Anonymous— the player wrote without signing in and is shown asGuestwith a short code.Player ID (not verified)— the player typed the ID themselves; do not rely on it for account questions.- Under
Playeryou see the platform, system version, device, game version and build, language and country. Conversationslists all of the player’s conversations, the newest first. Click one to open it.Game attributesshows data from the game, such as level or purchases. An empty or old value does not mean zero.- Click any value in the card, such as the player ID, to copy it, for example to look the player up in other tools.
Copiedconfirms it.
Mark a player with a badge
- In the player card press
+ Badgeand choose a badge. It appears at once. - To remove it, press the cross on the badge.
Badges without a cross are set automatically from game data; you cannot change them. If a badge you need is not in the list, ask your administrator.
Send a gift
- Gifts are only for players who signed in through the game (
✓ Verified player). In the conversation pressSend a giftunder the text box. - Choose the gift, write the reason for your team (for example “lost purchase, order 123”) and press
Confirm and send gift. - If you see
Sent for approval, an administrator approves it first. The decision appears on theGiftstab of the player card. - The
Giftstab shows whether the game server accepted the gift. Once it accepts, the player sees the gift in the chat; when it appears in the game itself is up to the game.
Do not send the gift again because it is slow: that would be a second gift. If the status is Unknown, press Check delivery again; if it stays stuck, tell your administrator.
Many players with the same problem
- When many players write about one problem (for example, the shop does not open), group their conversations into an incident. Open
Incidents, press+ Create an incident, enter theIncident titleand theAutomatic acknowledgement— the message players get at once — and pressCreate incident. - To add a conversation, open it, press
+ Add to incident, choose the incident and pressAdd. For a new issue chooseNew incident…, enter what is wrong and pressCreate and add. To add several at once, tick them in the conversation list and choose the incident inAdd to incident…. - Players who have not had an answer yet get the automatic message right away.
- To write to all of them, open the incident and use
Message affected players. - Admins can broadcast only to active conversations. Resolving an incident asks each player to confirm their solution. A refusal keeps that player’s conversation open. An incident without active conversations has no broadcast form.
Delete incidentasks for confirmation and preserves conversation history.
Admins can broadcast only to active conversations. Resolving an incident asks each player to confirm their solution. A refusal keeps that player’s conversation open. An incident without active conversations has no broadcast form. Delete incident asks for confirmation and preserves conversation history.
Finish a conversation
- Press the separate
Resolvedbutton when the issue is solved. The player receives a request to confirm the solution. - If the player agrees, they may submit or skip a rating. The conversation then becomes read-only history; the next message starts a new conversation.
- A refusal continues the same conversation, marks it
Needs a replyand records the unsuccessful attempt against the operator who proposed resolution. No response within 24 hours resolves it with a separate timeout outcome. A new message before confirmation cancels the proposal.
The status filter supports multiple choices. All active excludes Resolved; select Resolved to browse history. New unanswered is the initial queue. No conversation opens automatically; × closes only your current view and keeps its draft.
Block an abusive player
- In the player card press
Ban player, write a reason if you like and confirm withBan player. - The player can no longer write to support in this game. Their conversations stay.
- To undo it, press
Unban player.
Export or erase player data
- Owners and administrators: open
Players, choose the player and expandPrivacy. Export player dataprepares a file. When the request showscompleted, pressDownload JSON.- To erase, type the ID the page asks for (the game player ID, or the Cluefolk ID for an anonymous player) and press
Erase player data.
Erasing removes messages, attributes and images and cannot be undone. The player can write again later as a new player.
Integrate the game client
Connect Android, iOS or Unity to the game’s project by its project ID. Players start anonymously; signing in through the game is optional.
Project, identity and SDK lifecycle
- Use the exact project ID shown under
Settings → General(Copycopies it; it ships in the game and is not a secret) and in the server config. If you keep a separate project for development builds, those builds use its ID and release builds use the release project’s ID. The widget is built into the SDK, so only the project ID is required; the API defaults tohttps://cluefolk.com. The widget header shows the game’s app icon; to use another image, pass its resource name (logoResourceon Android,logoImageNameon iOS,LogoResourcein Unity). - Initialize the SDK once and wait for its ready callback. Support then works without any sign-in: the player is anonymous and identified by an install secret kept in protected device storage.
- Ship the
<ID>_widget.jsonfile fromSettings → Widget → Download for buildinside the build, load it with the appearance builder (Appearance.Builder(json).build()) and pass it tosetAppearance(Unity:SetAppearance) after the ready callback and before the first open. The same builder without a file sets colors, texts and screen rotation in code. Without it the widget uses the default appearance: the server never sends one. - Signing in is optional. After the player signs in to the game, your backend signs a short-lived (at most 5 minutes), one-time ES256
cluefolk-identity+jwt:subis the game player ID,issandaudmatchPlayers and sign-in. Pass it tologinWithIdentity; this install’s anonymous history moves to the account. - An identity token provider is optional: when it is set, the SDK asks your already authenticated backend for a fresh token whenever it needs a new session (sessions last 30 days and extend with use). If no token arrives, support stays available anonymously and the error callback receives
IDENTITY_UNAVAILABLE. If the project requires sign-in, anonymous sessions fail withIDENTITY_REQUIRED. openshows the support home.openConversationwith an empty ID opens the player’s current chat; the first message there starts a conversation. Use unread callbacks for the game’s indicator.- Call
logoutwhen the game account signs out or changes;closeonly closes the support UI.
The examples use app-owned variables such as gameApi, identityToken, recentLogText, supportListener, Activity or view controller. These are supplied by your game, not additional Cluefolk methods. The SDKs are open source under the MIT license: Android on Maven Central, iOS through Swift Package Manager or an XCFramework, Unity from a Git URL (github.com/cluefolk).
Android · Kotlin and Java
- Requires Android 7.0 (API 24) or later,
compileSdk34 or later, Android Gradle Plugin 7.4 or later and AndroidX. Addcom.cluefolk:android-sdkfrom Maven Central (below); it brings AndroidX Activity, Core and WebKit and its own R8 rules. - Implement
Cluefolk.EventListenerand register it before initialization. Its callbacks includeonCluefolkReady,onCluefolkUnreadChanged(count),onCluefolkIdentityTokenRequired(requestId)andonCluefolkError(code). Initialize from the UI thread with the Application context. - After
onCluefolkReady, or onceisReady()is true, the support button can callopen(activity)for an anonymous player. If the game has a signed-in player, pass the identity token from the game-login response tologinWithIdentity; a support error must not fail game login. - Initialization loads local credentials asynchronously. Other public methods may be called from any thread; callbacks run on the main looper. Connect push reception and tap handling as described below.
dependencies {
implementation("com.cluefolk:android-sdk:0.3.2")
}import com.cluefolk.sdk.Cluefolk
Cluefolk.setEventListener(supportListener)
Cluefolk.initialize(application, Cluefolk.Options(projectId = "YOUR_PROJECT_ID"))
// Optional: only if your game issues Cluefolk identity tokens.
Cluefolk.setIdentityTokenProvider { callback ->
gameApi.fetchCluefolkIdentity { token, error ->
callback.complete(token, error)
}
}// After onCluefolkReady(); works without sign-in (anonymous player):
Cluefolk.open(activity)
Cluefolk.openConversation(activity, "") // the player's current chat
// Optional, after successful game login:
Cluefolk.loginWithIdentity(identityToken) { error ->
// Do not fail game login because of support.
}
Cluefolk.setConversationContext("""{"screen":"settings"}""")
// Game account sign-out:
Cluefolk.logout()Source code, changelog and releases: github.com/cluefolk/android-sdk (MIT license).
iOS · Swift and Objective-C
- Requires iOS 15 or later. In Xcode choose
File → Add Package Dependencies…, enterhttps://github.com/cluefolk/ios-sdkand add theCluefolklibrary to the app target. Without Swift Package Manager, addCluefolk.xcframeworkfrom the repository's releases withEmbed & Sign. - Keep a strong reference to an object implementing
CluefolkEventListener; the SDK listener property is weak. Register it and callinitialize; the identity-token provider is optional. - Use all public methods on MainActor. Initialization returns while credentials load in the background; wait for
onCluefolkReady()orisReadybefore opening support or signing in. - The support button can then call
open(from:)with a currently presented view controller; the player stays anonymous untilloginWithIdentitysucceeds.onCluefolkUnreadChangedupdates the unread indicator. - For Objective-C/Objective-C++, import
Cluefolk/Cluefolk-Swift.h; the exposed names areCLFCluefolk,CLFOptionsandCLFEventListener. Forward notification events on MainActor.
.package(url: "https://github.com/cluefolk/ios-sdk", from: "0.3.2")import Cluefolk
// MainActor; retain supportListener in your app.
let sdk = Cluefolk.shared
sdk.eventListener = supportListener
try sdk.initialize(CluefolkOptions(projectId: "YOUR_PROJECT_ID"))
// Optional: only if your game issues Cluefolk identity tokens.
sdk.setIdentityTokenProvider { completion in
gameApi.fetchCluefolkIdentity { token, error in
completion(token, error)
}
}// After onCluefolkReady(); works without sign-in (anonymous player):
sdk.open(from: presentingViewController)
sdk.openConversation("", from: presentingViewController) // current chat
// Optional, after successful game login:
sdk.loginWithIdentity(identityToken) { error in
// Do not fail game login because of support.
}
do {
try sdk.setConversationContext(["screen": "settings"])
} catch {
// Report a support configuration error to the app.
}
// Game account sign-out:
sdk.logout()Release builds use trusted HTTPS origins. Source code, changelog and releases: github.com/cluefolk/ios-sdk (MIT license).
Unity 2022.3 LTS and later
- In
Window → Package Managerchoose+ → Add package from git URL…and enterhttps://github.com/cluefolk/unity-sdk.git#0.3.2, or add the line below toPackages/manifest.json. - In Player Settings set Android
Minimum API Levelto 24 andTarget API Levelto 34 or higher, and iOSTarget minimum iOS Versionto 15.0 or higher. Below these the build stops with a message. - Nothing to set up in Gradle or Xcode: Android builds add
com.cluefolk:android-sdkof the same version from Maven Central and switch AndroidX on; iOS builds link and embed the bundledCluefolk.xcframework. - Call the facade from the Unity main thread. Subscribe to
Cluefolk.Event, then initialize. Thereadyevent setsCluefolk.IsReady; after thatOpen()works for an anonymous player, andLoginWithIdentityAsyncoptionally links the game account. SetIdentityTokenProvideris optional. If the provider throws or returns an empty token, the player stays anonymous andEventreportserrorwith codeIDENTITY_UNAVAILABLE. Use theunreadChangedpayloadcountfor the game indicator; unsubscribe your handler when its owner is destroyed.- Facade methods validate their arguments immediately and throw
ArgumentException. Build and test Android/iOS players: Editor and desktop do not open the support WebView, and a C# source compile is not a device or IL2CPP validation.
"com.cluefolk.sdk": "https://github.com/cluefolk/unity-sdk.git#0.3.2"using CluefolkSDK;
Cluefolk.Event += OnCluefolkEvent;
Cluefolk.Initialize(new CluefolkOptions { ProjectId = "YOUR_PROJECT_ID" });
// Optional: only if your game issues Cluefolk identity tokens.
Cluefolk.SetIdentityTokenProvider(
() => GameApi.GetFreshCluefolkIdentityAsync());// After Event("ready", ...); works without sign-in:
Cluefolk.Open();
Cluefolk.OpenConversation(); // the player's current chat
// Optional, after successful game login:
try {
await Cluefolk.LoginWithIdentityAsync(identityToken);
} catch (Exception error) {
// Surface support failure without failing game login.
Debug.LogWarning(error.GetType().Name);
}
Cluefolk.SetConversationContext(
new Dictionary<string, object> { ["screen"] = "settings" });
// Game account sign-out:
Cluefolk.Logout();The Unity package calls the native SDKs; it has no separate WebView, HTTP or session implementation. Source code and releases: github.com/cluefolk/unity-sdk (MIT license).
Push notifications through the game server
- The only route is: public support reply → Cluefolk queue → game backend
/cluefolk/push→ the game’s existing push provider → device. Device tokens, OS permission requests and Firebase/APNs keys stay with the game. - Configure and verify
Settings → Server connection. The game handler verifies the ES256 command JWT against the JWKS URL, its purpose, project, expiry andaction: push.notify; it deduplicates by the stable eventId and persists its push job before acknowledging. - Copy the signed
push.datafields into the mobile notification unchanged. Android receives them as data; iOS receives them as top-level userInfo fields beside aps.playerIdis the internal Cluefolk UUID, not the external game user ID. - Notifications are requested only for players signed in through the game, because the game finds devices by its own player ID. Forward reception and taps through the platform calls below; a tap opens the matching conversation only for the configured project and the authenticated player.
- In
Server connection → Test push, enter the gamePlayer IDof a player with a public support reply, then chooseSend test. CheckNotificationsand then the actual device. At most five tests per minute are accepted.
{
"origin": "cluefolk",
"projectId": "YOUR_PROJECT_ID",
"playerId": "CLUEFOLK_PLAYER_UUID",
"conversationId": "CONVERSATION_UUID",
"messageId": "MESSAGE_UUID",
"status": "open",
"count": "1"
}// Android: receive / notification tap
Cluefolk.handlePush(data)
Cluefolk.openFromPush(activity, data)// iOS: receive / notification tap, on MainActor
Cluefolk.shared.handlePush(userInfo)
Cluefolk.shared.openFromPush(userInfo, from: controller)// Unity: receive / notification tap
Cluefolk.HandlePush(data);
Cluefolk.HandlePush(data, opened: true);Accepted means the game backend durably accepted the event. It does not prove the OS displayed a banner, or that the player read the reply.
Verify the complete integration
- Open support without signing in, send a message and check that the operator sees an anonymous player with device/app context. Then sign in through the game on the same install and check that the conversation moves to the verified player ID.
- Send a public operator reply, then reopen the game: history and unread count must already be available in SDK state. Open the reply and check unread/read updates; private notes must not be visible to the player.
- Connect the backend, refresh the typed catalog and verify an automatic badge against known player data. Separately test an operator-assigned manual badge, a published gift accepted by the game server and a gift that needs approval.
- Test a push while the game is active, in background and during a cold start. Verify project separation (a notification from another project, such as the one for development builds, does not open a conversation) and switch to another player before opening an old notification.
- Test offline/retry, logout and re-login, image attachments, oversized-image errors, the per-minute message limit and, if enabled, required sign-in. Verify on real Android/iOS players, including the Unity toolchains you ship.
A build or a successful server acknowledgement is only part of this check. Record the device, OS, SDK/adapter versions and the actual end-to-end result.
If something is not working
I can’t type a reply: the box is grey
The conversation belongs to a colleague; the line above the box says who. Write a Private note, or ask the colleague or an administrator to pass the conversation to you.
My reply was not sent: “… answered first”
A colleague answered the player a moment before you, so the conversation is theirs now. Your text is still in the box: switch to Private note to send it to the team, or ask the colleague to pass the conversation to you.
I can’t find a conversation
Choose All statuses, open All conversations under Views and clear the search and Filters. Then search by the player ID, a word from the messages, the game version or the phone system.
A gift has not arrived
Open the Gifts tab of the player card. Pending approval waits for an administrator (Settings → Gifts → Approvals). For Unknown, press Check delivery again. Granted means the game server accepted the gift: if the player still does not see it in the game, ask the game team. Do not send the gift again: that would be a second gift.
A badge is missing
Check that it is published, enabled and visible to the team. For an automatic badge, check current server data; for a manual badge, check that it is on the player.
A player cannot write to support
Check whether the player is banned and the Player messages limits in Queues & workflow: messages above the per-minute or per-hour limit are refused with a retry time. If Players and sign-in allows only players signed in through the game, anonymous players cannot open support.
No company or invitation appears
Check the signed-in email. Reload after the invitation is sent; ask for a new invitation if it has expired. If you are already in the company, an owner or a project administrator adds you under Settings → Team. You can also create your own company under Companies & invitations.
The server is not connected
Support works without a game server: players write anonymously and are identified by their app install. To verify players, use game attributes, gifts or notifications, an owner or administrator sets up the connection under Settings → Server connection.
Check connection or catalog refresh fails
Check the game server URL and that at least one profile signing key is registered, then share the error with the game-backend developer. A changed type needs a new attribute key; the last accepted catalog remains available.