Skip to content

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 1

Taibles (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 2

Taibles (2)

  • • Product Catalog
  • • Order Processing

Accounts (2)

  • • Anthropic API Key
  • • HubSpot OAuth

Users (2)

  • • dave@clientB.com
  • • eve@clientB.com
🏢

Organization C

Agency Client 3

Taibles (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:

  1. Create an account (like "Production OpenAI")
  2. Store the credentials securely (encrypted)
  3. Reference that account in any column that needs it
  4. 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

  1. Click your profile picture in the top-right corner
  2. Select "Settings"
  3. Navigate to "Integration Accounts"

Integration Accounts

Manage OAuth and API key accounts for third-party services

🤖

Production OpenAI

OpenAI

active
☁️

Production Salesforce

Salesforce

active
🎯

HubSpot Marketing

HubSpot

active

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):

  1. Select the service type (e.g., "OpenAI")
  2. Give it a descriptive name (e.g., "Production OpenAI")
  3. Paste your API key
  4. Click "Save Account"

For OAuth Services (like Salesforce):

  1. Select the service type (e.g., "Salesforce")
  2. Give it a descriptive name (e.g., "Production Salesforce")
  3. Click "Connect with OAuth"
  4. A popup opens with the service's login page
  5. Log in and authorize Taibles
  6. Popup closes and account is saved
Connect Salesforce

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:

  1. Open column configuration
  2. Find the "Account" or "AI Account" field
  3. Select from dropdown (shows all accounts of the correct type)
  4. Save the column
  5. 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 OpenAI

Never 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:

  1. Go to Settings → Integration Accounts
  2. Find the account you want to update
  3. Click "Edit"
  4. Update the API key or other credentials
  5. Click "Save Changes"

Result: All columns using this account immediately use the new credentials.


To Re-authenticate OAuth:

  1. Go to Settings → Integration Accounts
  2. Find the OAuth account
  3. Click "Reconnect" or "Re-authenticate"
  4. Complete the OAuth flow again
  5. New tokens are stored

Result: Connection is refreshed with new tokens.


To Delete an Account:

  1. Go to Settings → Integration Accounts
  2. Click "Delete" on the account
  3. 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"
  4. Confirm deletion
  5. 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":

  1. Click "+ Add Column"
  2. Choose "Manual" → "User Select"
  3. Name it (e.g., "Assigned To" or "Owner")
  4. Save

Step 2: Assign Users to Rows

  1. Click on a cell in the user column
  2. A dropdown appears showing all users in your organization
  3. Select a user
  4. The assignment is saved

Filtering by User

To see only your rows:

  1. Click the filter button
  2. Add a filter: Assigned To = your@email.com
  3. Apply filter
  4. Grid shows only rows assigned to you

To see all rows:

  1. Remove the filter
  2. Grid shows all rows again

Support Tickets

Viewing:john@company.com
Ticket IDSubjectAssigned ToStatus
TICK-001Login issuejohn@company.comIn Progress
TICK-003API errorjohn@company.comIn Progress
Showing 2 tickets assigned to john@company.com

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:

  1. New tickets arrive via webhook (unassigned)
  2. Manager assigns tickets to support agents
  3. Each agent filters to see only their tickets
    • Filter: assigned_agent = john@company.com
  4. Agents work on assigned tickets
  5. 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

  1. Click the three-dot menu (⋮) in the column header
  2. Select "Hide Column"
  3. The column disappears from the grid

The column still runs - it just doesn't show in the view.


Step 2: Show Hidden Columns

  1. Click "Manage Columns" in the toolbar
  2. A modal opens showing all columns
  3. Check the boxes for columns you want visible
  4. Uncheck boxes for columns you want hidden
  5. Click "Apply"

Manage Column Visibility

email(Input)
company_name(Output)
lead_score(Output)
raw_api_response(Intermediate)
Hidden
debug_log(Intermediate)
Hidden
send_email(Action)
ℹ️

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 shown

Important: 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! 👥

Built with VitePress