Per-email threads visibility toggle (shared / private) #20946
Replies: 2 comments 7 replies
|
@petrbaloun This is a really good call-out here. Very very very important issue, most CRMs don't do a great job of this, TwentyCRM has the foundation to do this best in class, but not as its currently built, as you called out really clearly here. @FelixMalfait I don't know the scope of work to support this change, but feels like a small amount of effort to enable a huge amount of value. One of the biggest reasons TwentyCRM is special is because its open-source and self-hosted, unlocking regulated industries use cases. The current way email works in Twenty makes it nearly impossible to deploy in a regulated industry, it risks exposing sensitive emails, or locking down emails globally in the account so they produce no value. |
|
Adding a migration use case to this discussion. We are migrating an existing CRM to Twenty Cloud, including the business email history already stored in the source CRM. We want that history to remain readable by the team in the native Emails tab, with its original senders, recipients, dates and links to contacts. In a small API import test, we created a MessageThread, a Message with its original body, the participants and the link to the contact. The source text and relationships were verified after import. The thread appears on the contact, but shows "Not shared" because it has no MessageChannelMessageAssociation. A mailbox is already connected in the target workspace; the missing step is how to give the imported historical records the intended visibility. One practical example is an email sent by one teammate that also exists in another teammate's mailbox. The migration needs to preserve the original sender, consolidate the source copies into one message and make the selected business history readable by the team. It also needs to reconcile that message with ongoing mailbox sync so that the same email is not created again later. A sharing setting on the message or thread would let us explicitly mark the selected historical records as shared during import, while keeping unrelated mailbox content subject to its existing privacy settings. Converting these emails into notes would lose the native email experience we are trying to preserve. Is there a supported API migration pattern for this today? If channel associations are required, what is the recommended way to map existing historical messages to them, preserve the intended sharing and avoid duplicates when the source CRM export does not contain Gmail or Outlook message IDs? And could explicit sharing of imported threads be covered by the permissions work discussed here? |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Per-email visibility toggle (shared / private)
Problem
Currently, email visibility in Twenty is configured at the account (message channel) level —
users choose one of three options globally:
This creates a real-world privacy problem: a connected mailbox contains both business-relevant
emails (client conversations, deals, proposals) and personal or sensitive emails
(service registrations, password resets, bank notifications, 2FA codes, SaaS onboarding emails, etc.).
With the current global setting, users must choose between:
There is no middle ground.
Proposed Solution
Add a per-email (per-thread) visibility toggle that allows users to explicitly mark individual
email threads as shared with the workspace — defaulting to private.
Default behavior: All synced emails are private to the user who owns the connected account.
Action required: The user explicitly marks a thread as shared to make it visible to teammates.
This gives users full control over what enters the shared CRM context, without requiring a
separate mailbox or restrictive global settings.
Why This Makes Sense Technically
The infrastructure for this already partially exists in the codebase:
EmailThreadNotSharedcomponent exists in/packages/twenty-front/src/modules/activities/emails/components/isSharedprop is already passed toEmailThreadPreviewThe missing piece is moving the visibility decision from the account level to the
thread level — adding a
sharedWithWorkspace: booleanfield on the message threadrecord, and exposing a toggle in the email thread UI.
User Story
Suggested UX
workspace members (respecting the existing visibility level — metadata, subject, or full content)
EmailThreadNotShared) is shown onprivate threads so the user knows the thread is only visible to them
Impact
conversation, not an algorithm
Related
All reactions