MengBotDocs
Security

Usage analytics

Every event and property the optional product analytics can send, how to turn it off, and what is never sent.

MengBot can send anonymous product analytics to PostHog (US cloud, us.i.posthog.com), so its maintainers can see which features people set up and use. This page lists every event and every property the app can send. Nothing else is sent.

What it is

  • posthog-js loads only while the switch is on. With the switch off, the library is never downloaded and nothing is sent.
  • Autocapture, pageviews, surveys and feature flags are off. Events come only from the calls listed on this page, and switching analytics back on sends no event of its own.
  • Every event carries app_version (for example 0.1.112) and surface: local for the desktop app's own window, server for a page a server serves (MengBot Cloud, a self-hosted server, or the app in a browser).
  • PostHog adds its standard device facts to every event: operating system, browser and its version, device type, screen and window size, language and time zone. Like any server, PostHog sees the IP address a request comes from.
  • Events are tied to a random id that PostHog keeps in the page's storage. Nothing ties them to you: the app never sends your email or your name with them.

Turning it off

Settings → General → Usage analytics. When it is off, nothing loads and nothing is sent: no events, no daily snapshot, and none of the snapshot's requests.

The desktop app keeps the switch for this computer's page itself, so it holds whichever port the app serves that page on (it moves to another when its usual one is taken). It is read before anything loads, and before any email is tied to your events. A switch turned off only in the page's storage, before the app kept it, does not hold on another port until the app serves its page on that port again, which moves it to the app; while the app has kept no choice yet, its page on a port other than its first ties no email to your events. Each server page (your MengBot Cloud, a self-hosted server, each browser you use) keeps its own switch in that page's storage. With the switch off in the desktop app, a server page that the app's window shows, My Cloud's included, starts with it off too once that server runs this version; turning it on there lasts until that page reloads. In a browser, switch it off on each server's page.

Never sent

  • API keys, tokens or passwords, or anything derived from them: no length, prefix, hash or last characters.
  • Names of bots, rooms, teams, people, routines, files, devices, models, presets or accounts.
  • Emails.
  • URLs, hosts and addresses. PostHog's own $current_url, $host, $pathname, $referrer, $referring_domain, campaign parameters (utm_*, gclid and the like) and their $initial_* and $session_entry_* copies are removed before an event leaves the app.
  • File paths, and ids of any kind: bot, room, conversation, instance, account or computer.
  • Instructions, prompts, message content, model output and error messages.

Allowed values

Properties are counts, true or false, or words from fixed lists in the app's code (src/lib/analytics-allowlist.ts). A value that is not on its list is sent as other.

ListValues
Key provideranthropic, openai, openrouter, openai_compat, xai, mistral, cerebras, groq, greenference, meta, boat, composio, opencode_go, custom_endpoint, elevenlabs, fish_audio, jev, openrouter_decider, openai_image, custom_image, openai_live, onepassword, treg, postiz
Engineclaude, codex, gemini, cursor, opencode, qwen, hermes, cline, custom_acp, pi, openai_compat, grok, grok_api, kimi, droid, antigravity, minimax, mistral, cerebras, groq, greenference, meta, muse_code, deepseek, copilot
AppThe 24 apps Connected apps lists by default: slack, github, gmail, googlecalendar, googlesheets, googledocs, googledrive, notion, linear, sentry, posthog, discord, twitter, reddit, zapier, hubspot, salesforce, jira, asana, trello, dropbox, airtable, figma, stripe. Every other app is other.
Starting roleassistant, inbox, research, coder, community, ops
Cloud planstarter, personal, pro, max

An engine is named by the kind of engine it is, never by the account or endpoint it runs on: two Claude accounts both report claude. A page that may not list the engines (a member's, a Cloud guest's or a paired device's) names the engines the app ships with, and any engine account added later as other.

The daily snapshot

app_snapshot is one count of what is set up, sent at most once a day. It answers questions such as how many people use their own Boat key, and how many bots run on cloud computers, without sending what anything is called.

  • Only the owner or an admin sends it. A member, a device paired without admin access and a Cloud guest never do.
  • The app checks once it has loaded, then every hour, and sends at most once per UTC day for each app page.
  • It counts what the app has already loaded. It also asks, once: this server for its signed-in devices (counted, never listed) and its connected-app inventory; on the desktop app, the app itself for the number of paired phones and the Cloud plan; and, when a Boat account is set, this server for the number of cloud computers. To answer that, the server lists the computers once at boat.dev with your Boat key, or at MengBot Cloud's relay for computers included with a plan. That listing only reads: it never changes a computer.
  • When a source fails, its properties are left out and the rest is sent.
PropertyTypeMeaning
key_providerslist of key providersProviders with your own key saved: the model providers and an OpenAI-compatible key when set; boat for your own Boat key (not one included with a plan); composio for a self-hosted Composio project; opencode_go; elevenlabs or fish_audio for your own voice key; jev or openrouter_decider for your own decision-model key; openai_image or custom_image for your own avatar-image key (an xAI key counts once, as xai); openai_live for a separate Live call key
key_countcountHow many entries key_providers has
has_boat_keytrue/falseYour own Boat key is saved
cloud_computer_sourceown_key, included, noneWhere cloud computers come from: your own Boat key (it wins when both exist), a Cloud plan, or nowhere
cloud_computerscountCloud computers this install manages for bots and team computers; 0 without a Boat account; left out while the Boat account is changing or when the provider could not be read
team_computerscountTeam computers
botscountBots, not counting archived ones (no bot count below includes them)
bots_cloud_boat, bots_cloud_vpscountBots set to work on a cloud computer, on Boat or on your VPS
bots_local_vm, bots_this_computer, bots_browser, bots_off, bots_autocountBots set to work on a Local VM, on this computer, in the browser only, nowhere, or left on Auto
roomscountRooms
bot_channelscountChannels bots opened with each other
teamscountTeams
routines, routines_enabledcountRoutines, and how many are on; left out while routines are not loaded
routines_cloud, routines_room_goalcountRoutines that run on a cloud computer, and routines that pursue a room goal
routines_once, routines_daily, routines_interval, routines_croncountRoutines by schedule type
webhookscountWebhook triggers; left out where webhooks are not loaded (the desktop app as a remote client)
engineslist of enginesEngines that are ready to use, each named once
engine_countcountReady engine accounts and endpoints
custom_endpointscountOpenAI-compatible servers you added
trial_creditactive, used_up, ended, noneThe Cloud trial's Claude credit
appslist of appsConnected apps with a working account; left out when the inventory could not be read
apps_connectedcountConnected apps with a working account
connectors_modemanaged, self_hosted, unavailableHow connected apps are provided
local_vm_modeshared, per_bot, poolLocal VM isolation
vps_configuredtrue/falseA VPS is set up
voiceelevenlabs, fish, system, chatterbox, xai, noneThe voice provider in use
voice_includedtrue/falseThe voice comes with a Cloud plan
deciderjev, openrouter, offThe decision model
decider_includedtrue/falseThe decision model comes with a Cloud plan
live_callstrue/falseLive calls are set up
phones_pairedcountPhones paired with the desktop app (desktop app only)
paired_devicescountDevices signed in to this server without an email, other than this one
phone_pairedtrue/falseEither count above is more than zero
memberscountPeople signed in to this server with an email, other than you
cloud_hometrue/falseThis server is a MengBot Cloud
cloud_planstarter, personal, pro, max, other, none, unknownThe Cloud plan: none when free or signed out, unknown when the app cannot tell
cloud_trialtrue/falseA Cloud trial is running
editionoss, enterpriseThe edition
org_managedtrue/falseAn organisation manages this desktop
onboardedtrue/falseThe first-run tour was finished
first_turntrue/falseA bot has answered at least once
platformdesktop, browserThe desktop app or a browser
remote_clienttrue/falseThe desktop app is connected to another server

Events

EventWhen it is sentProperties
app_first_openThe first time this app page starts with analytics onplatform: desktop, browser
app_openedEach time this app page starts with analytics onplatform: desktop, browser
app_activeOnce a day you use the app: when this app page starts, comes into view or is focused, or when a check every ten minutes finds a new day while the page is in view and focused. At most once per day by your computer's date for each app page, and never while the page is hiddenplatform: desktop, browser; mode: simple, advanced, the look this app page is in when it counts the day
onboarding_stepA first-run screen is shownstep: meet, chief; replay: true/false
onboarding_completedThe first run ends in the chatreason: completed; at: the screen it ended on; replay: true/false
setup_import_appliedYou bring in the skills and MCP servers found from other AI tools on this computer, in Settings → Importskills, tools: how many were added. Never their names or where they came from
onboarding_cloudYou tap Try Cloud under MengBot's first messages, which opens Add a Cloudaction: start_trial
message_sentYou send a messageTo a bot: driver: engine; queued: true/false. To a room: room: true; mode: chat, goal; queued: true/false
call_startedYou start a call with a botdriver: engine; mode: turns, live
group_call_startedYou start a call with a roommemberCount: count
room_createdYou create a roommembers: count; context: true/false (it was put in a team)
room_members_changedYou change who is in a roommembers, added, removed: counts
team_importedYou import a teammembers: count; source: library, file, github, organization, scout; mode: add, project; format: team, package, backup
team_scoutedThe app suggests a team for a project foldersignals: count
bot_createdYou create a bot with New bot, or from a ready-made bot in Templatessource: blank (New bot), template (a starting role), preset; template: starting role, only when source is template
api_key_savedYou save a key in Settings → API keys, in the Screen panel, in the model picker, on the X card in Apps, from a bot's request in a chat, or by adding an OpenAI-compatible serverprovider: key provider; via: settings, computer_panel, model_picker, apps, chat_request; result: ok (the provider accepted it), rejected (the provider refused it), unverified (saved, not checked), error (not saved)
api_key_removedYou clear a key of your own in Settings → API keys, the Screen panel, the model picker or the X card in Appsprovider: key provider; via: settings, computer_panel, model_picker, apps
engine_signed_inYou finish signing in to an engine inside the appengine: claude, codex, grok, kimi; method: code, device_code, browser
connector_connectA Connect you started in Connected apps endsapp: app; result: connected (the account it added works), failed or expired (that account failed or expired), timed_out (neither within two minutes)
app_snapshotOnce a day, as described aboveThe properties in the snapshot table
cloud_card_shownThe MengBot Cloud card is shownvariant: signed_out, free
cloud_card_actionYou act on the MengBot Cloud cardaction: start, howto, signin, not_now, close
whats_newThe What's new popup (once per person after an update, on this computer's page): a slide comes on screen, counted once per slide each time the popup is up, or you act on itaction: seen, next, back (the slide changed, by its buttons, its dots or the arrow keys), get_pro (Get Pro, which opens Add a Cloud), see_cloud (See the new Cloud, which opens the Cloud website), start_team (Start a Team, which opens the Team plan's checkout on the Cloud website, or Add a Cloud for someone with a plan of their own), not_now, close (the X, Escape or a click outside); slide: the slide it happened on: pro (the new MengBot Cloud), team (Team); audience: no_plan (both slides), own_plan (a Cloud plan of one's own: the Team slide only); signed_in: true/false, signed in to MengBot Cloud in the app; campaign: the popup's campaign, whats-new-2026-11
cloud_howtoThe "Show me how" tip endsresult: no_button, skipped, closed
cloud_dialog_shownThe Add a Cloud dialog openssource: app_card, app_howto, app_menu, app_settings, app_routines, app_whats_new_pro (Get Pro in the What's new popup), app_whats_new_team (Start a Team in it, for someone with a plan of their own), app_onboarding (Try Cloud under MengBot's first messages); view: the dialog's first screen
cloud_dialog_viewThe Add a Cloud dialog reaches a stepview: received, starting, ready
cloud_signinSigning in to MengBot Cloud inside the Add a Cloud dialog takes a stepstep: code_sent (a sign-in code was emailed), signed_in, browser (Continue in browser); source: as for cloud_dialog_shown
cloud_checkout_openedA Cloud checkout opens in the browserplan: Cloud plan; trial: true/false; source: as for cloud_dialog_shown
cloud_add_anotherBuying another Cloud, for someone who has one, takes a stepstep: plan (a plan chosen), checkout_opened, ready; plan: Cloud plan, for plan and checkout_opened
rail_place_openedYou open a place from the rail of Clouds at the window's left edgekind: computer, cloud, team, server
rail_addYou use the rail's +step: opened (its sheet opened), cloud (Buy a Cloud, on this computer's own sheet), link (Paste pairing link), address (Enter its address instead), organization (a new organization added on the Team plan)
cloud_setup_startedA new Cloud starts its first jobnone
cloud_intent_submittedYou tell a new Cloud what to do firstidea: digest, watch, research, plan, or none for your own words; edited: true/false
cloud_intent_skippedYou skip that questionnone
cloud_welcome_stepA step of a new Cloud's welcome is shownstep: bring, engine, files, done
cloud_welcome_endedA new Cloud's welcome endsreason: done, skipped; at: the step it ended on
product_hunt_cardYou act on the Product Hunt cardaction: upvote, not_now, close
boat_offerBoat's credit offer: its one-time card is shown or you act on it, or you act on it on the Boat card in Settings → API keysaction: shown (the card only), get_boat, claim (the drafted email to Boat opened), not_now, close; place: card, settings
simple_mode_promptThe Simple mode popup, shown once in each browser after an update when nothing else is on screen, is shown, its Simple mode switch is flipped, or it is closed (Done, the X, Escape or a click outside)action: shown, toggled, closed; mode: simple, advanced, the mode it was shown or closed in, or the one a flip turned on
grok_move_popupThe one-time Move from Grok Bot popup is shown or you act on itaction: shown, start, not_now, close
two_places_cardYou act on the card that says your bots live in two places (this computer and a server of your own, or My Cloud)action: bring, not_now; kind: server, cloud, the place it offered

api_key_saved reports ok for a key the server checks with its provider before saving it (Boat, Composio, ElevenLabs, Fish Audio), and for a model provider key whose test passed right after saving. A key nothing checks before it is used (OpenCode, OpenAI images, an added OpenAI-compatible server, an xAI key from a chat request) reports unverified.

On this page