Usage reporting
Once a day, your team's Jelly sends us, the people who make Jelly, a short report about how it's being used: how much mail there is, what the team has set up, and which parts of Jelly people use. For example: the team has 5 people and 3 labels, 212 messages arrived since yesterday, and people searched 14 times. We use these figures to decide what to build next and what to leave alone.
This page starts with what is never in the report, then covers where it goes, what else we keep about a team we host, and how a team that runs its own Jelly turns it off. The complete list of what's sent is at the end.
What is never sent
- No message, sent or received, and no subject line.
- No name: not a person's or a contact's. The team's name isn't sent
either, but your Jelly's web address is, and on Jelly's own hosting
that usually contains it (
acme.letsjelly.com). - No email address.
- No note, draft, search, label name or rule.
- Nothing anyone typed, and nothing that arrived in the mail.
If Jelly hosts your team, we also keep a short record of who the team is: see a team Jelly hosts. That record stays with us. It never goes to PostHog.
Where it goes
The report goes to PostHog, a service for counting how software is used, on its servers in the EU.
If your Jelly is connected to our service, it sends us the same report as well, so we can read it beside your team's plan. Every team Jelly hosts is connected. So is a self-hosted Jelly that has been connected for Google accounts, iPhone and Mac notifications, or support.
A team Jelly hosts
When Jelly hosts your team, the daily report is part of the service, and there's no switch for it. Settings → Housekeeping says so, in the place where a self-hosted team has its switch.
We also keep a short record of who your team is. We need it to run the team, and to help when you ask. It holds:
- the team's name;
- each member's name, email address and role, when they joined, and when they last used Jelly (see below);
- each address the team sends and receives as, the kind of account that sends it (Gmail, your own mail server, or ours), and whether it's verified;
- whether Google sign-in is switched on for the team (in the
record,
google_signin), so that the sign-in page atjoin.letsjelly.comknows whether to offer it.
The record is updated once a day, with the report. It's also updated whenever the team's membership changes (someone accepts an invitation, or is removed, restored or given another role) and whenever someone signs in. That update carries the record alone, and none of the report's figures.
"Last used Jelly" means the last time someone opened Jelly in a browser or in Jelly's phone app. Claude, the Jelly CLI and other apps your team connects don't count, because those are programs acting for the person. Jelly keeps this time on its own, so it doesn't reset when someone signs out. The record stays with us and never goes to PostHog. It holds nothing from the mail itself: no message, no subject, no contact and no note.
Each person's answer to Email from Jelly goes to our service too, with their address and when they gave it. That way one answer holds for every team they're on, and every email Jelly sends is checked against it. Our service keeps Jelly's newsletter list, at Buttondown, in step with it. None of it goes to PostHog.
When you choose a plan, cancel it, or your trial ends, our service notes the change of plan, with no names attached. If you cancel and choose a reason when Stripe asks, the reason goes with it. Anything you type in the box beside it is read by the people who make Jelly, and goes nowhere else.
Turning it off
A team that runs its own Jelly can turn the report off. A team Jelly hosts can't (see above).
Only Admins and the Owner can do this. Go to Settings → Housekeeping and, under Usage reporting, turn off Send usage figures once a day. It saves as you flip the switch, and Jelly says Usage reporting is off. Nothing more will be sent.
When you turn it off, your Jelly sends one last message saying so, so that we know the silence is on purpose. After that it sends nothing, to PostHog or to our service, connected or not. If you turn it back on, the daily report starts again.
If Housekeeping says This instance has nowhere to report usage to, your Jelly sends nothing, and there's no switch. A sandbox team is always one of these, wherever it runs.
What is sent
Almost every figure in the report is one of three kinds:
- a count, such as how many labels the team has;
- yes or no, such as whether an automatic BCC is set;
- a word from a fixed list, such as
person_addressfor the from-name format.
Many counts cover the time since the last report, usually a day.
Three values are ordinary text rather than a word from a fixed list:
origin_host: your Jelly's web address, without thehttps://. On Jelly's own hosting this is often your team's name followed by.letsjelly.com, so it can show your team's name.release: the version of Jelly you're running.environment: normallyproduction. Whoever runs your server can set it to any word.
The report also carries your Jelly's instance id: a random code made when it was set up, so that one Jelly's reports can be told from another's. It's shown at the bottom of Settings → Housekeeping.
Every figure is listed below, in groups. The right-hand column gives each figure's name in the report itself, for anyone who wants to match them up.
About your Jelly
| What it says | In the report |
|---|---|
| The instance id | distinct_id |
Its web address, without https:// |
origin_host |
| The version it runs | release, $lib_version |
The name of the software, always jam (Jelly's internal name) |
$lib |
| Whether it's a live or a test instance | environment |
| How many days old it is | age_days |
| How many hours this report covers | period_hours |
| Whether it's a development build, and whether it allows the development sign-in | dev_tools, dev_signin |
| Whether this report was asked for by hand (development builds only) | requested |
| Whether the setup checklist is finished | setup_done |
| How many whole days since anyone on the team last used Jelly. Left out until someone has. Once it's there it stays, because that time never goes back | last_seen_days |
Which features are switched on
| What it says | In the report |
|---|---|
| Whether the team has a name (never the name) | team_named |
Which from-name format the team uses: person_address, person, address or other |
from_name_format |
| Whether an automatic BCC is set (never the address) | auto_bcc |
| The undo-send window, in seconds | send_delay_seconds |
| Whether the default autoresponder is on, and whether it has any words | autoresponder, autoresponder_written |
| Whether relayed senders are set | relay_senders |
| Whether Postmark is set up | postmark |
| Whether a receiving domain is set up | receiving_domain |
| Whether the server is set up for Google sign-in, Gmail, Gmail's instant delivery, Slack and Discord | google_signin, gmail_ready, gmail_push, slack_ready, discord_ready |
How many people are on the team
| What it says | In the report |
|---|---|
| How many people are on the team, how many are Admins or the Owner, and how many are former members | members, members_admins, members_gone |
| How many invitations are waiting | invitations_pending |
| How many people on the team used Jelly in the last day, week and month | members_seen_1d, members_seen_7d, members_seen_30d |
| How many people have a password | passwords |
| How many people have a second step at sign-in: an authenticator app or a passkey | members_two_factor |
| How many people did anything, and how many replied to someone, since the last report and over the last week. These show whether one person answers everything or the work is shared | members_acted_period, members_acted_7d, members_replied_period, members_replied_7d |
Which preferences people chose
| What it says | In the report |
|---|---|
| How many people get email notifications, and how many hear about every new conversation | profiles_notify_email, profiles_notify_new |
| How many load remote images automatically | profiles_load_remote_images |
| How many use the 12-hour clock | profiles_clock_12 |
| How many put Send & archive first | profiles_send_archive_first |
| How many put Forward & go back first | profiles_forward_go_back_first |
| How many use the classic layout | profiles_classic_layout |
| How many keep the conversation sidebar pinned open | profiles_contact_pane_pinned |
| How many use the full width of the window | profiles_full_width |
| How many changed their peek widths | profiles_peek_widths |
| How many are set as away | profiles_away |
| How many uploaded a picture | profiles_with_picture |
| How many linked their Slack account | profiles_slack_linked |
| How many labels people follow, in total | label_follows |
| How many devices get pop-up notifications, and how many people they belong to | push_devices_all, push_members_all |
How much mail there is
| What it says | In the report |
|---|---|
| How many conversations are in the inbox, archived, snoozed, in spam, in the trash and in the vault | conversations_inbox, conversations_archived, conversations_snoozed, conversations_spam, conversations_trash, conversations_vaulted |
| How many conversations began since the last report | conversations_new |
| How many conversations were split off from another, or imported from the older Jelly | conversations_split, conversations_imported |
| How many messages came in and went out: ever, since the last report, and in the last 30 days | messages_in, messages_out, messages_period_in, messages_period_out, messages_30d_in, messages_30d_out |
| How many messages the team has sent since this Jelly was set up, leaving out autoresponder replies and mail imported from the older Jelly | messages_out_native |
| How many files are attached to mail, and to notes | attachments, note_attachments |
| How many contacts there are, and how many are blocked | contacts, contacts_blocked |
| How many drafts there are, and how many are scheduled | drafts, drafts_scheduled |
| How many notes and reactions there are | notes, reactions |
| How many notifications Jelly made since the last report | notifications_period |
What the team has set up
| What it says | In the report |
|---|---|
| How many addresses, how many are verified, and how many send through Postmark, Gmail and SMTP | addresses_all, addresses_verified, addresses_by_postmark, addresses_by_gmail, addresses_by_smtp |
| How many Gmail accounts, IMAP accounts and SMTP servers are connected | gmail_connections, imap_accounts, smtp_servers |
| Whether an IMAP account copies sent mail to its Sent folder | imap_sent_sync |
| How many mailboxes, how many of them the team added, and how many labels and saved replies | mailboxes, mailboxes_custom, labels, saved_replies |
| How many autoresponders, and how many are on | autoresponders, autoresponders_enabled |
| How many rules, how many are on, and how many match any one condition | rules_all, rules_active, rules_any |
| How many rules that are on have more than one condition, or match a pattern | rules_advanced |
| How many rule actions of each kind: label, assign, archive, spam, spam and block, forward, mailbox, autoresponder | rule_actions_label, rule_actions_assign, rule_actions_archive, rule_actions_spam, rule_actions_spam_block, rule_actions_forward, rule_actions_mailbox, rule_actions_autoresponder |
| How many rule conditions look at each part of a message: From address, To address, Cc/Bcc address, Any address, Forwarding address, Received at, Subject, Body and Anywhere | rule_fields_from, rule_fields_to, rule_fields_cc, rule_fields_any, rule_fields_forwarding, rule_fields_address, rule_fields_subject, rule_fields_body, rule_fields_anywhere |
| How many rule conditions match words, and how many match patterns | rule_modes_contains, rule_modes_regex |
| How many API tokens are live, and how many apps (such as Jelly for iOS) are signed in | api_tokens, app_grants |
| How many apps the team has registered, and how many sign-ins they hold | app_clients, app_client_grants |
| How many webhooks, how many are on, and how many deliveries they made since the last report | webhooks_all, webhooks_active, webhook_deliveries_period |
| How many Slack and Discord connections, and how many of the Discord ones are still on | slack, discord, discord_active |
| How many imports from the older Jelly have finished | jelly_imports_done |
When the team first did things
Each of these is a number of whole days after your Jelly was set up: 0 is the first day. A figure is left out until the thing has happened. None of them is a date or a time.
| What it counts | In the report |
|---|---|
| The first verified address | first_address_days |
| The first teammate: the first invitation, or the second person to join, whichever came first | first_invite_days |
| The first message the team sent, leaving out the autoresponder | first_reply_days |
| The first conversation assigned, or taken with I got this | first_assignment_days |
| The first note | first_comment_days |
| The first rule | first_rule_days |
| The first saved reply | first_saved_reply_days |
Mail, notes and assignments imported from the older Jelly don't count here. Rules, saved replies and addresses that came with an import count as day 0.
What people did since the last report
Each of these is a count of how many times it happened, from the
activity record. Every name starts with
did_.
| What it counts | In the report |
|---|---|
| Messages received and sent | did_received, did_sent |
| Notes written | did_commented |
| Assigning, unassigning and I got this | did_assigned, did_unassigned, did_claimed |
| Labels added and removed, and labels deleted | did_labelled, did_unlabelled, did_label_deleted |
| Archiving and unarchiving | did_archived, did_unarchived |
| Snoozing and unsnoozing | did_snoozed, did_unsnoozed |
| Marking as spam and not spam | did_spam, did_unspam |
| Moving to the trash and back | did_trashed, did_restored |
| Moving to the vault and back out | did_vaulted, did_unvaulted |
| Setting a conversation aside | did_ignored |
| Adding to, moving between, taking out of and setting mailboxes | did_mailbox_add, did_mailbox_move, did_mailbox_remove, did_mailbox_set |
| Setting or clearing a conversation field | did_field_set |
| Changing a subject | did_renamed |
| Splitting a conversation | did_split, did_split_off |
| Unwrapping a forwarded email, and putting it back | did_unwrapped, did_rewrapped |
| Reporting a problem with a message, and what happened to the report | did_reported, did_report_withdrawn, did_report_answered, did_report_closed |
| Autoresponder replies sent | did_autoresponded |
| Conversations forwarded | did_forwarded |
| Following and unfollowing | did_followed, did_unfollowed |
| Taking over a colleague's draft | did_draft_editing_taken_over |
| Everything above that a rule or the autoresponder did | did_by_rule_all |
Which parts of Jelly people used since the last report
Each of these counts how many times something was used. Every name
starts with used_. Each one is sent as 0 when nobody used it, except
the lists in the last row, which are left out instead.
| What it counts | In the report |
|---|---|
| Searches, and searches sorted newest first | used_search, used_search_recent |
| Actions on several conversations at once, and undoing them | used_bulk, used_bulk_undo |
| Undoing a send | used_undo_send |
| Scheduling a reply to go out later | used_send_later |
| Opening a row's menu | used_row_menu |
| Opening New message | used_compose |
| Viewing a message's original source | used_message_source |
| Opening the activity, contacts and notifications pages | used_activity, used_contacts, used_notifications |
| Pressing Got it on a hint | used_hint_dismissed |
| Pressing Run the sweep now | used_sweep_now |
| Searching the attachments page | used_attachments_search |
| Opening each list: the inbox, all mail, archived, snoozed, spam, trash, sent, drafts, scheduled, bookmarks, attachments, and any label's list (all labels count as one; never which label) | used_view_inbox, used_view_all, used_view_archived, used_view_snoozed, used_view_spam, used_view_trash, used_view_sent, used_view_drafts, used_view_scheduled, used_view_bookmarks, used_view_attachments, used_view_label |
When reporting is turned off
The last message, sent once when an Admin turns reporting off, is
called usage reporting. It carries the instance id, $lib, the
version and environment described above, and on: false. Nothing
else.
Advanced: for whoever runs the server
These settings in the server's environment change what your Jelly reports:
JAM_USAGE_REPORTING=offstops all reporting, whatever the switch on Housekeeping says.JAM_POSTHOG_KEYreplaces the PostHog key built into a release.JAM_POSTHOG_HOSTsends the report to a different address, such as your own domain in front of PostHog. It must be anhttporhttpsaddress, or Jelly won't start.JAM_SENTRY_ENVIRONMENTsets theenvironmentword.
A copy of Jelly built from source without a PostHog key reports nothing.