12.1 Data Security
Security is built into every layer of Taibles. This section explains how your data is protected, how credentials are stored securely, and how you can control access to your information.
Overview: How Taibles Keeps Your Data Safe
Multiple Layers of Protection
Taibles protects your data at several levels:
1. Organization Isolation
- Your organization's data is completely separate from all other organizations
- No one outside your organization can see your taibles, rows, or accounts
- Automatic enforcement - no configuration needed
2. Secure Credentials
- API keys and OAuth tokens stored encrypted
- Credentials never exposed in your browser
- Easy to rotate and update in one place
3. Access Controls
- Track which users work with which data
- Filter rows by assigned user
- Hide columns to simplify the interface
4. Encryption Everywhere
- Data encrypted when stored in the database
- All communication uses secure HTTPS
- API calls made securely from servers
Organization Isolation: Your Private Workspace
What It Means
Every organization gets its own completely isolated workspace.
Think of it like separate buildings with locked doors - no one from Organization A can peek into Organization B's building, even by accident.
What's isolated:
- All your taibles and their data
- All your rows and columns
- All your integration accounts (API keys, OAuth tokens)
- All your team members
- All your dashboards and settings
Organization A
Agency Client 1Taibles (3)
- • Lead Qualification
- • Email Campaigns
- • Customer Support
Accounts (2)
- • OpenAI API Key
- • Salesforce OAuth
Users (3)
- • alice@clientA.com
- • bob@clientA.com
- • carol@clientA.com
Organization B
Agency Client 2Taibles (2)
- • Product Catalog
- • Order Processing
Accounts (2)
- • Anthropic API Key
- • HubSpot OAuth
Users (2)
- • dave@clientB.com
- • eve@clientB.com
Organization C
Agency Client 3Taibles (4)
- • Content Calendar
- • Social Media Posts
- • Analytics Dashboard
- • Workflow Automation
Accounts (3)
- • OpenAI API Key
- • Google OAuth
- • Slack OAuth
Users (4)
- • frank@clientC.com
- • grace@clientC.com
- • henry@clientC.com
- • iris@clientC.com
Complete Data Isolation
Each organization is completely isolated. Users in Organization A cannot see, access, or interact with data from Organizations B or C. All taibles, rows, accounts, and credentials are private to each organization.
How It Protects You
✅ Privacy: Your data never mixes with other customers' data
✅ Compliance: Meets requirements for GDPR, HIPAA, and SOC 2
✅ Multi-tenancy: Share the platform, not the data
✅ Zero configuration: It just works - you don't need to set anything up
Real-World Examples
Example 1: Marketing Agency with Multiple Clients
You run a marketing agency and manage automation for 5 different clients.
Setup:
- Create separate organization for each client
- Each client's campaigns, leads, and credentials stay private
- No risk of accidentally using Client A's data in Client B's automation
Result: Each client's data is completely isolated and secure.
Example 2: Enterprise with Departments
You work at a large company with multiple departments.
Option A: Single Organization (Most Common)
- All departments share one organization
- Everyone can see all taibles (unless you use naming conventions)
- Shared integration accounts
- Easier collaboration between teams
Option B: Separate Organizations
- Each department gets its own organization
- Complete data isolation between departments
- Separate credentials per department
- Higher security, but less collaboration
Recommendation: Most companies start with a single organization for easier teamwork. Only split into multiple organizations if you need strict separation for security or compliance reasons.
Secure Credential Storage
The Problem: Where Do Credentials Go?
When columns need to call external services, they need credentials:
- API keys (like OpenAI, Anthropic, Clearbit)
- OAuth tokens (like Salesforce, HubSpot, Google)
- Service passwords (like email servers)
❌ NEVER do this:
- Don't paste API keys directly in column configuration
- Don't share credentials in plaintext
- Don't store secrets in templates
- Don't hardcode credentials anywhere
The Solution: Integration Accounts
Store credentials once, use them everywhere.
Taibles provides a secure account system where you:
- Create an account (like "Production OpenAI")
- Store the credentials securely (encrypted)
- Reference that account in any column that needs it
- Update credentials in one place when needed
Benefits: ✅ Encrypted storage - credentials encrypted in the database ✅ Reusable - one account used by many columns ✅ Easy updates - change credentials once, applies everywhere ✅ Automatic refresh - OAuth tokens refreshed automatically
Managing Integration Accounts
Step 1: Go to Account Settings
- Click your profile picture in the top-right corner
- Select "Settings"
- Navigate to "Integration Accounts"
Integration Accounts
Manage OAuth and API key accounts for third-party services
Production OpenAI
OpenAI
Production Salesforce
Salesforce
HubSpot Marketing
HubSpot
Step 2: Create a New Account
Click "+ Add Account" to create a new integration account.
Create New Account
Security Best Practice
Credentials are encrypted and stored securely. They can be reused across multiple columns and taibles.
For API Key Services (like OpenAI):
- Select the service type (e.g., "OpenAI")
- Give it a descriptive name (e.g., "Production OpenAI")
- Paste your API key
- Click "Save Account"
For OAuth Services (like Salesforce):
- Select the service type (e.g., "Salesforce")
- Give it a descriptive name (e.g., "Production Salesforce")
- Click "Connect with OAuth"
- A popup opens with the service's login page
- Log in and authorize Taibles
- Popup closes and account is saved
What happens next?
A popup window will open where you'll log in to Salesforce and authorize Taibles to access your account.
Using Accounts in Columns
When you configure a column that needs to call an external service, you'll see an account selection dropdown.
Column Configuration
This column will use the selected account for all Salesforce API calls
Account connected
Production Salesforce is authenticated and ready to use.
How it works:
- Open column configuration
- Find the "Account" or "AI Account" field
- Select from dropdown (shows all accounts of the correct type)
- Save the column
- The column now uses that account's credentials
Need a new account?
- Click the "+ Add New Account" button
- Create the account in the modal
- It automatically appears in the dropdown
- Select it and continue configuring
Account Types
1. API Key Accounts
Used for services that require an API key:
- OpenAI (GPT models)
- Anthropic (Claude models)
- Clearbit (company data)
- Hunter (email verification)
- Many others
How to manage:
- Create once with your API key
- Update the key when you rotate it
- All columns automatically use the new key
2. OAuth Accounts
Used for services that use OAuth authentication:
- Salesforce
- HubSpot
- Google (Gmail, Sheets, Drive)
- Microsoft (Outlook, Excel)
- Slack
- Many others
How to manage:
- Click "Connect with OAuth"
- Log in to the service
- Tokens refresh automatically when they expire
- Click "Re-authenticate" if connection is lost
3. Service Account Credentials
Used for services with username/password:
- SMTP email servers
- IMAP email servers
- Database connections
- Custom APIs
How to manage:
- Enter username, password, server details
- Update when credentials change
- Used for email sending and receiving
Security Best Practices
✅ DO:
Use descriptive names
- ✅ "Production OpenAI" (clear and specific)
- ❌ "OpenAI 1" (confusing)
Separate production and development
- Create "Production OpenAI" account for live data
- Create "Development OpenAI" account for testing
- Prevents accidental usage of test data in production
Rotate credentials regularly
- Update API keys every 90 days
- Re-authenticate OAuth if you see unusual activity
- Update passwords on schedule
Use the account system for everything
- Never paste credentials directly in configuration
- Always create an account first
❌ DON'T:
Never hardcode credentials
❌ WRONG: Paste API key in field: sk-1234567890abcdef
✅ CORRECT: Select account: Production OpenAINever share accounts between organizations
- Each organization must have its own accounts
- Can't share credentials across organizational boundaries
- Create separate accounts for each organization
Never store credentials in templates or custom code
- The system handles credentials automatically
- You never need to access them in code
Editing and Deleting Accounts
To Update Credentials:
- Go to Settings → Integration Accounts
- Find the account you want to update
- Click "Edit"
- Update the API key or other credentials
- Click "Save Changes"
Result: All columns using this account immediately use the new credentials.
To Re-authenticate OAuth:
- Go to Settings → Integration Accounts
- Find the OAuth account
- Click "Reconnect" or "Re-authenticate"
- Complete the OAuth flow again
- New tokens are stored
Result: Connection is refreshed with new tokens.
To Delete an Account:
- Go to Settings → Integration Accounts
- Click "Delete" on the account
- If the account is used by columns, you'll see a warning:
- "This account is used by 3 columns in Lead Enrichment"
- "Deleting will break these columns"
- Confirm deletion
- Go update those columns with a different account
User Tracking and Assignment
What It Is
Track which team member is responsible for which data.
You can:
- Assign rows to specific users
- Filter to see only your assigned rows
- Distribute workload across your team
- Track who's working on what
Setting Up User Assignment
Step 1: Add a User Column
When creating or editing a taible, add a column with type "User Select":
- Click "+ Add Column"
- Choose "Manual" → "User Select"
- Name it (e.g., "Assigned To" or "Owner")
- Save
Step 2: Assign Users to Rows
- Click on a cell in the user column
- A dropdown appears showing all users in your organization
- Select a user
- The assignment is saved
Filtering by User
To see only your rows:
- Click the filter button
- Add a filter:
Assigned To = your@email.com - Apply filter
- Grid shows only rows assigned to you
To see all rows:
- Remove the filter
- Grid shows all rows again
Support Tickets
| Ticket ID | Subject | Assigned To | Status |
|---|---|---|---|
| TICK-001 | Login issue | john@company.com | In Progress |
| TICK-003 | API error | john@company.com | In Progress |
Example: Customer Support Ticket Assignment
Setup:
Create a taible called "Support Tickets" with columns:
ticket_id(text)customer_email(text)issue_description(text)assigned_agent(user select)status(text)resolution(AI-generated response)
Workflow:
- New tickets arrive via webhook (unassigned)
- Manager assigns tickets to support agents
- Each agent filters to see only their tickets
- Filter:
assigned_agent = john@company.com
- Filter:
- Agents work on assigned tickets
- Manager sees all tickets (no filter)
Benefits:
- Clear ownership of each ticket
- No confusion about who handles what
- Easy workload distribution
- Track performance by agent
Column Visibility: Simplify Your Interface
What It Is
Hide columns you don't need to see in the grid.
Hidden columns:
- Still execute and process data
- Still pass data to dependent columns
- Just don't appear in the grid view
- Can be shown again anytime
When to hide columns:
- Intermediate processing steps
- Debug information
- Raw API responses
- Technical data users don't need to see
How to Hide Columns
Step 1: Hide a Column
- Click the three-dot menu (⋮) in the column header
- Select "Hide Column"
- The column disappears from the grid
The column still runs - it just doesn't show in the view.
Step 2: Show Hidden Columns
- Click "Manage Columns" in the toolbar
- A modal opens showing all columns
- Check the boxes for columns you want visible
- Uncheck boxes for columns you want hidden
- Click "Apply"
Manage Column Visibility
Hidden Columns Still Execute
Hiding a column only removes it from the grid view. The column still processes data and feeds results to dependent columns.
Example: Lead Enrichment Pipeline
Scenario: You're enriching leads with data from multiple sources.
Visible Columns (what users see):
- ✓
email- Input - ✓
company_name- Output - ✓
company_size- Output - ✓
industry- Output - ✓
lead_score- Final score
Hidden Columns (still executing):
- ☐
clearbit_raw- Raw API response - ☐
hunter_raw- Raw API response - ☐
linkedin_raw- Raw API response - ☐
company_data_merged- Intermediate processing
Why hide them?
- Users only care about final results
- Raw API responses clutter the interface
- Intermediate steps aren't relevant to end users
- Cleaner, simpler grid
How data flows:
email (visible)
↓
clearbit_raw (hidden) → executes normally
↓
hunter_raw (hidden) → executes normally
↓
company_data_merged (hidden) → executes normally
↓
company_name (visible) → extracted and shown
company_size (visible) → extracted and shown
industry (visible) → extracted and shown
↓
lead_score (visible) → calculated and shownImportant: Hiding is NOT Security
⚠️ Column hiding is for user experience, not security.
What hiding DOES:
- ✅ Removes column from grid view
- ✅ Improves user experience
- ✅ Reduces visual complexity
- ✅ Keeps intermediate data out of the way
What hiding does NOT do:
- ❌ Does NOT restrict data access
- ❌ Does NOT prevent API access to the data
- ❌ Does NOT encrypt or secure the data
- ❌ Does NOT control who can see it
For true security:
- Don't store sensitive data in columns at all
- Use separate taibles with restricted access (future: role-based permissions)
- For PII/sensitive data, process it and discard rather than storing
Column Editability
What It Controls
Whether cells can be manually edited in the grid.
Editable Columns (Manual types):
- Text
- Number
- Boolean (checkbox)
- Date
- User select
Behavior: Click cell → Edit directly in the grid
Non-Editable Columns (Calculated types):
- AI columns
- API call columns
- Custom code columns
- All node-backed columns
Behavior: Click cell → Opens sidebar showing result (read-only)
Why not editable? These values are calculated by the system. If you manually edited them, they'd be overwritten the next time the column runs.
System Columns (Always Read-Only)
Some columns are managed by the system and can never be edited:
Row ID (_id):
- Unique identifier for each row
- Automatically generated
- Used for internal references
Parent Row ID (_parent_row_id):
- Links child rows to parent (in sub-taibles)
- Set automatically when creating child rows
- Critical for data integrity
Deleted At (_deleted_at):
- Timestamp when row was deleted
- Used for soft-delete and trash functionality
- Managed by the system
Data Encryption
At Rest (Stored Data)
Everything is encrypted when stored:
- Database is encrypted at the infrastructure level
- Account credentials encrypted in the database
- File uploads encrypted in object storage
You don't need to do anything - it's automatic.
In Transit (Data Moving)
All communication is encrypted:
- All web pages use HTTPS
- WebSocket connections use WSS (secure WebSockets)
- API calls to third-party services use HTTPS
You don't need to do anything - it's automatic.
API Calls to External Services
When your columns call external APIs:
- Taibles acts as a secure proxy
- Credentials are never sent to your browser
- API calls are made from secure servers
- Responses are returned through encrypted connections
Security benefit: Your team never sees or handles API keys directly. They're safely stored on the server.
Summary
You now understand how Taibles keeps your data secure:
✅ Organization Isolation
- Complete separation between organizations
- No cross-organization access possible
- Automatic enforcement
✅ Secure Credential Storage
- Integration accounts for API keys and OAuth
- Encrypted storage
- Reusable across columns and taibles
- Easy credential rotation
✅ User Tracking
- Assign rows to team members
- Filter by user
- Distribute workload effectively
✅ Column Visibility
- Hide columns for cleaner interface
- Hidden columns still execute
- Show/hide anytime in settings
✅ Encryption Everywhere
- Data encrypted at rest
- HTTPS/TLS for all communication
- Secure API proxying
✅ Best Practices
- Always use the account system
- Never hardcode credentials
- Rotate credentials regularly
- Use descriptive account names
Next Steps
You've completed Section 12.1: Data Security! You understand:
- How organization isolation protects your data
- How to securely store and manage credentials
- How to track users and control visibility
- How encryption keeps your data safe
Next: Section 12.2: Authentication → Learn how to manage team members, invite users, and configure access controls.
Let's set up your team! 👥