Personal Space
Context and Purpose of the Addendum
This document is the first addendum to the GoWeBa Operations Bible (version 1.0, published on May 6, 2026). It documents all changes introduced by the "Personal Space" project, deployed in three phases between May 6 and May 7, 2026. The Personal Space is a foundational feature that introduces the concept of personal organization within GoWeBa, allowing each user to separate their personal activities from their professional ones, while accessing both from a single interface.
Scope of the Addendum
This addendum covers:
- Automatic creation of a Personal Space for each user (Phase 1)
- Cross-organization email composition and contact filtering tabs (Phase 2)
- Webabox message aggregation across all user organizations (Phase 3)
- Data schema modifications (OrgType enum, orgType field)
- New API endpoints introduced
- New translation keys (i18n) in French, English, and Spanish
- Impact on existing Operations Guide modules
Document Conventions
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Overview — Personal Space Concept
The Personal Space is a private area automatically created for each GoWeBa user. It functions as a full-fledged organization, but dedicated to the user's personal activities.
Why a Personal Space?
Before the introduction of the Personal Space, a GoWeBa user could only belong to professional organizations (companies, teams). This posed several issues:
- Mixing personal and professional contacts
- Inability to receive personal emails without sharing them with the team
- No separation between private data and company data
- Confusion when switching between multiple mandates/clients The Personal Space solves these problems by creating a natural partition while allowing a unified view when desired.
PERSONAL vs STANDARD Organization
Visual Concept Diagram
Multi-organization structure of a GoWeBa user: ┌─────────────────────────────────────────────────────┐ │ GoWeBa User │ │ │ │ 🏠 Personal Space (PERSONAL) │ │ ├── My personal contacts │ │ ├── My personal email inbox │ │ └── My personal Webabox │ │ │ │ 🏢 Organization A — GoWeBa.com (STANDARD) │ │ ├── Team contacts │ │ ├── Shared email inbox │ │ └── Team Webabox │ │ │ │ 🏢 Organization B — AlainBessette.com (STANDARD) │ │ ├── Team contacts │ │ ├── Shared email inbox │ │ └── Team Webabox │ │ │ │ ◀═══ Organization Selector (switcher) ═══▶ │ └─────────────────────────────────────────────────────┘
Phase 1 — Architecture and Automatic Creation
Phase 1 lays the foundations for the Personal Space: the organization type (OrgType), automatic creation upon registration, and the updated organization selector.
Data Schema Modification
A new OrgType enum was added to the Prisma schema:
Enum definition in the schema: enum OrgType { PERSONAL STANDARD } Field on the Organization model: orgType OrgType @default(STANDARD) ⚠️ The migration is additive and compatible with existing data. All organizations created before Phase 1 automatically retain the STANDARD type.
Automatic Personal Space Creation
When a new user registers, the system automatically creates:
- A user account — email, password, name
- A personal organization — with orgType = PERSONAL
- A membership — OWNER role, linking the user to their personal space Personal organization naming rules:
Handling Existing Users
For users who existed before Phase 1, a migration script was executed to retroactively create a Personal Space for each of them. Users affected during initial deployment:
Organization Selector (Org Switcher)
The organization selector in the sidebar has been updated to display two distinct sections:
Selector behavior:
- Click on the organization selector in the left sidebar
- The dropdown displays with two separated sections
- The 🏠 (Personal Space) section appears first
- The 🏢 (Organizations) section displays your professional organizations
- Click on an organization to switch to it
- The interface updates instantly to reflect the selected organization 💡 The selector displays a visual separator between the two sections for clear distinction. ✅ The organization selector is functional and deployed in production.
Modified Files — Phase 1
Phase 2 — Cross-Org Composition and Contact Tabs
Phase 2 introduces two key features: the ability to compose emails from any organization, and contact filtering by organization.
Cross-Organization Composition
Before Phase 2, a user could only send emails with the active organization's email accounts. With Phase 2, the compose modal displays all email accounts from all user organizations, grouped by organization. How it works:
- Click "Compose" in the Webabox
- The compose modal opens
- In the "From" (sender) selector, accounts are grouped by organization
- Each group displays the organization name with its icon (🏠 or 🏢)
- Select the email account you want to send from
- Write your email normally
- Click "Send" Example of grouping in the "From" selector:
New API Endpoint — Cross-Org Accounts
A new API endpoint was created to retrieve email accounts from all user organizations:
Response structure: { "accounts": [ { "id": "...", "emailAddress": "alain@goweba.com", "displayName": "Alain Bessette", "type": "PERSONAL_EMAIL", "status": "active", "isDefault": true, "organizationId": "...", "organizationName": "Alain Bessette", "orgType": "PERSONAL" } ] }
Filtering Tabs — Contacts Module
The Contacts module has been enriched with tabs to filter contacts by organization:
How tabs work:
- Open the Contacts module from the side menu
- The filtering tabs appear above the contacts list
- By default, the "All organizations" tab is selected
- Click "Current organization" to filter by the active organization
- The contacts list updates instantly
- The contact counter reflects the active filter 💡 Contact tabs are particularly useful when you have many contacts spread across your personal space and professional organizations.
Modified Files — Phase 2
Phase 3 — Cross-Org Webabox Aggregation
Phase 3 is the most impactful: it allows the Webabox (unified inbox) to display messages from all user organizations simultaneously, with a tab system to filter by organization.
Concept — Multi-Organization Unified View
Before Phase 3, the Webabox only displayed messages from the active organization. The user had to switch organizations to see their other messages. With Phase 3, a "scope" system allows displaying:
Webabox Tabs
The Webabox now displays a tab bar above the message list: Example for a user with 3 organizations:
Tab behavior:
- By default, the "All" tab is selected (scope=all)
- Click a tab to filter messages for that organization
- Messages, counters, and statistics update in real time
- The scope is passed to all API calls (threads, snapshot, search)
- Changing tabs does NOT change the active organization — it only filters the view ⚠️ Changing tabs in the Webabox is NOT the same as switching organizations in the selector. The tab filters the view, while the selector changes the application's global context.
resolveOrgIds Function — Scope Resolution
A new utility function resolveOrgIds was added to Webabox API endpoints. It resolves the scope parameter into a list of organization identifiers: Resolution logic:
Modified API Endpoints — Phase 3
Two existing endpoints were modified to support the scope parameter:
API call example with scope: GET /api/inbox/threads?tab=inbox&scope=all&page=1&limit=20 GET /api/inbox/snapshot?scope=all
Modified UI Components — Phase 3
Several Webabox components were modified to support cross-org aggregation:
Modified Files — Phase 3
Impact on Existing Modules
The introduction of the Personal Space modifies the behavior of several modules documented in the Operations Bible. Here is the detailed impact per module:
Module 02 — Contacts & CRM
Impact: MODERATE
- Addition of "All organizations" and "Current organization" filtering tabs
- Contacts are now siloed by organization
- A contact created in the Personal Space is private and invisible to professional organizations
- Contact search can span all organizations ("All" tab) Module 02 sections to update:
- Section 3 (Interface) — Mention filtering tabs
- Section 4 (Features) — Add cross-org behavior
Module 03 — Webabox / Inbox
Impact: MAJOR
- The Webabox now displays organization tabs above the message list
- The scope (all, current, orgId) is passed to all API calls
- Email composition uses a sender selector grouped by organization
- Counters (unread message badges) reflect the active scope Module 03 sections to update:
- Section 3 (Interface) — Add organization tabs
- Section 4.1 (Compose an email) — Document cross-org selector
- Section 5 (Use cases) — Add multi-organization use case
Module 00 — Functional Scope
Impact: MINOR
- Add Personal Space to the list of modules/features
- Update the architecture diagram to include the PERSONAL type
Module 20 — System Administration
Impact: MINOR
- Document the new PERSONAL organization type
- System administrators see both types in the admin panel
- Personal organizations cannot be deleted by administrators
Unaffected Modules
The following modules are not affected by the Personal Space:
Complete Technical Reference
Data Schema Modifications
New API Endpoints
Modified Endpoints
Created Files
Modified Files
Added Dependencies
Translation Keys (i18n)
The following translation keys were added to support the Personal Space in GoWeBa's three languages:
Keys — Phase 1 (Personal Space)
Keys — Phase 2 (Cross-org + Contacts)
Troubleshooting Guide
Here are the most common issues related to the Personal Space and their solutions:
Version History
Upcoming updates planned:
- Advanced telephony features integration
- Sales pipeline enhancements
- New AI-based automations
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
GoWeBa — Operations Bible — Addendum 01 Personal Space — Phases 1, 2, and 3
| # | Section | Page |
|---|---|---|
| 1 | Context and Purpose of the Addendum | 3 |
| 2 | Overview — Personal Space Concept | 3 |
| 3 | Phase 1 — Architecture and Automatic Creation | 4 |
| 4 | Phase 2 — Cross-Org Composition and Contact Tabs | 6 |
| 5 | Phase 3 — Cross-Org Webabox Aggregation | 8 |
| 6 | Impact on Existing Modules | 10 |
| 7 | Complete Technical Reference | 11 |
| 8 | Translation Keys (i18n) | 13 |
| 9 | Troubleshooting Guide | 14 |
| 10 | Version History | 15 |
| Convention | Meaning |
|---|---|
| 💡 | Tip or trick for better usage |
| ⚠️ | Warning — important point of attention |
| ✅ | Confirmation — operational feature |
| 🏠 | Icon identifying the Personal Space in the interface |
| 🏢 | Icon identifying a professional organization |
| Cyan text | Step numbering and technical elements |
| Characteristic | PERSONAL (Personal Space) | STANDARD (Standard Organization) |
|---|---|---|
| Creation | Automatic upon registration | Manual by an administrator |
| Name | First Name Last Name (of the user) | Company/team name |
| Slug | firstname-lastname-personal | company-slug |
| Owner | The user (sole member) | One or more administrators |
| Members | One only (the owner) | Multiple members possible |
| Contacts | Private personal contacts | Shared team contacts |
| Emails | Private personal inbox | Shared team inbox |
| Icon | 🏠 House | 🏢 Building |
| Deletion | Cannot be deleted | Deletable by admin |
| orgType field | PERSONAL | STANDARD |
| Element | Detail | Impact |
|---|---|---|
| OrgType Enum | PERSONAL | STANDARD | New data type |
| orgType field | On the Organization model | Default value: STANDARD |
| Migration | Additive (compatible) | No data loss |
| Property | Value | Example |
|---|---|---|
| Name | First Name Last Name (of the user) | Alain Bessette |
| Slug | firstname-lastname-personal | alain-bessette-personal |
| OrgType | PERSONAL | — |
| Owner | The user themselves | — |
| User | Personal Space Created | |
|---|---|---|
| Alain Bessette | alain@goweba.com | ✅ alain-bessette-personal |
| Mathieu Villeneuve | mathieu@goweba.com | ✅ mathieu-villeneuve-personal |
| Mariève Émond | marieve@goweba.com | ✅ marieve-emond-personal |
| John Smith | john@goweba.com | ✅ john-smith-personal |
| Section | Icon | Content | Position |
|---|---|---|---|
| Personal Space | 🏠 | The user's personal organization | Top |
| Organizations | 🏢 | Professional organizations | Below |
| File | Modification Type |
|---|---|
| prisma/schema.prisma | Added OrgType enum, orgType field on Organization |
| app/api/auth/signup/route.ts | Auto-creation of personal org on signup |
| components/layouts/org-switcher.tsx | 🏠/🏢 sections, OrgType filtering |
| scripts/seed.ts | Personal spaces for existing users |
| lib/i18n/locales/fr.json | Translation keys for Personal Space |
| lib/i18n/locales/en.json | Translation keys (English) |
| lib/i18n/locales/es.json | Translation keys (Spanish) |
| Organization | Icon | Available Accounts |
|---|---|---|
| Alain Bessette (Personal) | 🏠 | alain@goweba.com |
| GoWeBa.com | 🏢 | support@goweba.com, info@goweba.com |
| AlainBessette.com | 🏢 | alain@alainbessette.com |
| Property | Detail |
|---|---|
| Method | GET |
| URL | /api/inbox/accounts/all |
| Authentication | Required (user session) |
| Description | Returns all email accounts from all user organizations |
| Parameters | None — organizations are resolved from the session |
| Tab | Behavior | Usage |
|---|---|---|
| All organizations | Displays contacts from all your organizations | Global view |
| Current organization | Displays only contacts from the active organization | Filtered view |
| File | Modification Type |
|---|---|
| app/api/inbox/accounts/all/route.ts | NEW — Cross-org accounts endpoint |
| app/(app)/inbox/compose-modal.tsx | "From" selector grouped by organization |
| app/(app)/contacts/page.tsx | Organization filtering tab support |
| app/(app)/contacts/contacts-table.tsx | Tab bar UI in table |
| lib/i18n/locales/fr.json | Keys: contacts.allOrgs, contacts.currentOrg, inbox.compose.defaultOrg |
| lib/i18n/locales/en.json | Same keys (English) |
| lib/i18n/locales/es.json | Same keys (Spanish) |
| Scope | Behavior | Use Case |
|---|---|---|
| all | Displays messages from all organizations | Panoramic view of all your messages |
| current | Displays only messages from the active org | Focused work on one organization |
| <orgId> | Displays messages from a specific organization | Targeted consultation of one org |
| Tab | Icon | Scope Sent to API |
|---|---|---|
| All | — | scope=all |
| Alain Bessette (Personal) | 🏠 | scope=<personal_orgId> |
| GoWeBa.com | 🏢 | scope=<goweba_orgId> |
| AlainBessette.com | 🏢 | scope=<alain_orgId> |
| Scope Received | Resolution | Organizations Returned |
|---|---|---|
| null / "current" | User's active organization | [currentOrgId] |
| "all" | All user organizations | [orgId1, orgId2, ...] |
| "<orgId>" | Verifies access, returns specific org | [orgId] or [currentOrgId] if no access |
| Endpoint | Added Parameter | Behavior |
|---|---|---|
| GET /api/inbox/threads | scope=all|current|<orgId> | Filters threads by scope |
| GET /api/inbox/snapshot | scope=all|current|<orgId> | Filters counters by scope |
| Component | Modification | Role |
|---|---|---|
| inbox/page.tsx | Loads user organizations on page load | Org data injection |
| inbox/inbox-shell.tsx | Accepts userOrgs and activeOrgId props | Pass-through to child components |
| inbox/webabox-client.tsx | orgScope state management, tab bar, scope in API calls | Main user interface |
| File | Description | Phase |
|---|---|---|
| app/api/inbox/threads/route.ts | Added scope param + resolveOrgIds function | Phase 3 |
| app/api/inbox/snapshot/route.ts | Added scope param + resolveOrgIds function | Phase 3 |
| app/(app)/inbox/page.tsx | User org loading (server-side) | Phase 3 |
| app/(app)/inbox/inbox-shell.tsx | userOrgs + activeOrgId props | Phase 3 |
| app/(app)/inbox/webabox-client.tsx | orgScope state, tabs, scope in API calls | Phase 3 |
| Module | Reason |
|---|---|
| OG_01 — Getting Started | No change in the visible registration process |
| OG_04 — WEBA AI Assistant | AI functions independently of the organization |
| OG_05 — Sales Pipeline | Pipeline remains tied to the active organization |
| OG_06 — Forms | Forms remain tied to the active organization |
| OG_07 — Automations | Automations remain tied to the active organization |
| OG_08 — Telephony | Telephony remains tied to the active SIP account |
| OG_09 — Reports | Reports are generated per active organization |
| OG_10 — Billing | Billing is per organization |
| OG_11 — WEBA Comm | Communication is independent of org type |
| OG_12 — Integrations | Integrations are per organization |
| OG_13 — SMS Marketing | SMS marketing is per organization |
| OG_14 — Templates | Templates are per organization |
| OG_15 — Calendar | Calendar is per organization |
| OG_16 — Tasks | Tasks are per organization |
| OG_17 — Websites | Websites are per organization |
| OG_18 — Reputation | Reputation is per organization |
| OG_19 — Social Media | Social media is per organization |
| Element | Type | Values | Model | Migration |
|---|---|---|---|---|
| enum OrgType | Enum | PERSONAL | STANDARD | — | Additive |
| orgType | Field | OrgType @default(STANDARD) | Organization | Additive |
| Endpoint | Method | Description | Phase |
|---|---|---|---|
| /api/inbox/accounts/all | GET | Email accounts from all user organizations | Phase 2 |
| Endpoint | Added Parameter | Values | Phase |
|---|---|---|---|
| GET /api/inbox/threads | scope | all | current | <orgId> | Phase 3 |
| GET /api/inbox/snapshot | scope | all | current | <orgId> | Phase 3 |
| File | Description | Phase |
|---|---|---|
| app/api/inbox/accounts/all/route.ts | Cross-org accounts endpoint | Phase 2 |
| File | Description | Phase |
|---|---|---|
| prisma/schema.prisma | OrgType enum + orgType field | Phase 1 |
| app/api/auth/signup/route.ts | Auto-creation of personal org | Phase 1 |
| components/layouts/org-switcher.tsx | 🏠/🏢 sections | Phase 1 |
| scripts/seed.ts | Existing users' personal spaces | Phase 1 |
| app/(app)/inbox/compose-modal.tsx | Cross-org selector | Phase 2 |
| app/(app)/contacts/page.tsx | Filtering tabs | Phase 2 |
| app/(app)/contacts/contacts-table.tsx | Tab bar UI | Phase 2 |
| app/api/inbox/threads/route.ts | scope param + resolveOrgIds | Phase 3 |
| app/api/inbox/snapshot/route.ts | scope param + resolveOrgIds | Phase 3 |
| app/(app)/inbox/page.tsx | User org loading | Phase 3 |
| app/(app)/inbox/inbox-shell.tsx | userOrgs/activeOrgId props | Phase 3 |
| app/(app)/inbox/webabox-client.tsx | orgScope state, tabs, API scope | Phase 3 |
| lib/i18n/locales/fr.json | i18n keys (FR) | Phases 1-2 |
| lib/i18n/locales/en.json | i18n keys (EN) | Phases 1-2 |
| lib/i18n/locales/es.json | i18n keys (ES) | Phases 1-2 |
| Package | Version | Reason | Phase |
|---|---|---|---|
| @dnd-kit/utilities | ^3.2.2 | Missing dependency (drag & drop inbox) | Phase 3 |
| pdfjs-dist | ^4.4.168 | Missing dependency (PDF preview) | Phase 3 |
| react-markdown | ^9.0.1 | Missing dependency (markdown rendering) | Phase 3 |
| Key | FR | EN | ES |
|---|---|---|---|
| org.personalSpace | Espace Personnel | Personal Space | Espacio Personal |
| org.organizations | Organisations | Organizations | Organizaciones |
| org.personalOrg | Mon Espace Personnel | My Personal Space | Mi Espacio Personal |
| Key | FR | EN | ES |
|---|---|---|---|
| contacts.allOrgs | Toutes les organisations | All organizations | Todas las organizaciones |
| contacts.currentOrg | Organisation courante | Current organization | Organización actual |
| inbox.compose.defaultOrg | Organisation par défaut | Default organization | Organización predeterminada |
| Issue | Likely Cause | Solution |
|---|---|---|
| My Personal Space doesn't appear in the selector | Bug during account creation | Contact the system administrator to verify the presence of the PERSONAL org in the database |
| I don't see email accounts from my other organizations in the composer | Email accounts are not configured in the other organizations | Check email account configuration in each organization via Settings > Email |
| The "All" tab in the Webabox is slow | Large number of messages across multiple organizations | Use per-organization tabs for a more targeted and faster view |
| My Personal Space contacts appear in my professional organization | The "All organizations" tab is selected | Switch to the "Current organization" tab to filter by active org |
| I can't delete my Personal Space | Normal behavior — by design | The Personal Space is permanent and cannot be deleted. Contact the administrator if needed |
| The unread message badge doesn't reflect all my messages | The badge shows the active scope (not necessarily "All") | Switch the tab to "All" to see the global counter |
| Version | Date | Description | Author |
|---|---|---|---|
| 1.0 | May 6, 2026 | Initial publication of the Operations Bible (20 modules) | GoWeBa |
| 1.1 | May 7, 2026 | Addendum 01 — Personal Space (Phases 1, 2, and 3) | GoWeBa |