Security

If our database were stolen, there would be no LinkedIn sessions in it.

You are handing us your clients' LinkedIn accounts. That deserves a specific answer, not a badge wall. This page describes how sessions are actually handled, what we store, what we deliberately do not, and where we still have work to do.

01 · LinkedIn Sessions

Your session cookie is never written to our database.

Most tools in this category keep your LinkedIn cookie in their database and load it into a cloud browser on demand. We removed that pattern entirely. The cookie exists in exactly one place: an encrypted browser profile on our automation server. There is no cookie column anywhere in our schema, and a regression test fails our build if one is ever added.

1
You connect an account
Your LinkedIn session cookie is sent to our server in a single request, over TLS.
2
It is consumed on arrival
The cookie goes straight into a dedicated Chrome browser profile for that account. Nothing is written to the application database at any point.
3
The profile lives in an encrypted vault
Every browser profile sits on a gocryptfs encrypted volume. On disk, your session is ciphertext.
4
Actions run inside that profile
Every automation for your account runs as a tab in its own durable browser, on its own dedicated residential proxy. The session never travels anywhere else.
The vault key never leaves the server
The encryption passphrase lives in a root-protected file on the server, read only by the system service that mounts the vault. It is never in source control, never in the application's process environment, and never appears on a command line.
Fails closed
An account without a bootstrapped encrypted profile cannot run anything. There is no fallback path that accepts a raw cookie at job time.
Optional recovery credentials, encrypted
If you opt in to automatic session recovery, your LinkedIn email and password are stored encrypted with a dedicated rotatable key, bound to your account, and are never returned by any client-facing query.
02 · What We Store

Three categories, no fine print.

Never stored
  • Your LinkedIn session cookie, in any form, even temporarily
  • A password for your CampaignStack account (sign-in is passwordless)
  • Proxy credentials or API keys in logs
  • Message bodies or scraped content in our log pipeline
Stored encrypted
  • LinkedIn login credentials, only if you opt in to automatic session recovery (AES-GCM, dedicated rotatable key)
  • Ad platform OAuth tokens and app secrets (AES-256-GCM)
  • Email app passwords (AES-256-GCM)
Stored as application data
  • Your name, email, and workspace settings
  • Lead and company data your campaigns work with
  • Campaign, workflow, and conversation history
03 · Disconnecting

Disconnect means destroy.

When you disconnect a LinkedIn account, the encrypted browser profile on our server is destroyed, the account record is deleted, any stored recovery credentials are wiped, and the deletion is retried automatically until the server confirms it. The account's proxy goes back to the pool with a fresh IP, so the next customer never inherits an address with your account's history.

Profile destroyed on the server
The encrypted profile directory is deleted, ciphertext included. If the server is momentarily unreachable, deletion retries until it succeeds.
Credentials wiped
Stored recovery credentials for the account are deleted in the same operation, not flagged for later cleanup.
Proxy IP rotated
The freed proxy is replaced with a fresh IP before anyone else can use it.
04 · Client Isolation

Shared where it helps you, walled where it matters.

Public professional data (people, companies, public posts) lives in one shared database, the same model Apollo uses, so every customer benefits from enrichment work already done. Everything that is yours stays yours: campaigns, ICPs, lead lists, tags, notes, conversations, and anything derived from your outreach is scoped to your workspace and gated on membership. Other customers can never see who you contacted, what you sent, who replied, or that your workspace exists.

Activity containment
Nothing derived from your outreach (sends, replies, meetings) is ever visible to another tenant. Not even as an anonymous signal.
Untrusted imports stay private
CSV imports and manually entered data land in workspace-private tables. One customer's data entry can never contaminate the shared database.
Per-client seats
Each client workspace has its own membership, its own accounts, its own budgets. Team members see exactly the workspaces they were invited to.
05 · Logs

Logs leave the machine through an allowlist.

Our log shipper is built the opposite way from most: instead of removing sensitive fields from log records, it copies out a fixed list of operational fields (timing, error class, job id, outcome) and drops everything else by construction. Message content, scraped data, cookies, tokens, and HTTP bodies cannot reach the log vendor because no field carries them. References to your data appear as opaque database ids, not names or URLs.

06 · The Part Others Skip

LinkedIn automation is against LinkedIn's rules. Ours too.

Every LinkedIn automation tool operates against LinkedIn's User Agreement, including this one. Vendors who imply their limits are somehow approved are selling you a story. What we can honestly offer: per-account daily budgets capped below observed platform limits, gradual warm-up for new accounts, human-hours pacing, one dedicated residential IP per account, and automatic pauses the moment an account shows risk signals. Those measures reduce risk. They do not eliminate it, and nobody can.

07 · Your Account

Passwordless by default.

You sign in with a one-time email code, a magic link, or Google SSO. We never hold a password for your CampaignStack account, so there is no password database to breach. Payments run entirely on Stripe; your card details never touch our servers.

08 · Subprocessors

Who touches your data, and why.

The complete list of vendors involved in running CampaignStack. If this list changes, this page changes.

VendorWhat it does for you
ConvexApplication database and backend functions
OVHcloudThe server that runs browser automation and holds the encrypted profile vault
WebshareStatic residential proxies, one per connected LinkedIn account
StripePayments and billing. Card details never touch our systems
ResendTransactional email (sign-in codes, notifications)
Anthropic, OpenAI, DeepSeek, PerplexityAI drafting and analysis. Prompts include the lead context needed to write a message
SentryError tracking
AxiomOperational logs, restricted to an allowlist of technical fields
PostHogProduct analytics, gated behind cookie consent on the website
09 · Where We Are Honest About Gaps

What we do not have yet.

No SOC 2 or ISO 27001 yet
We are a young company and have not been through a certification audit. If your procurement process requires one, we are not ready for you yet, and we would rather say so than imply otherwise.
No MFA on CampaignStack accounts yet
Sign-in is a one-time email code, a magic link, or Google SSO. There is no additional second factor on top of those today.
No third-party penetration test yet
The architecture decisions on this page are real and verifiable in our behaviour, but no external firm has audited them. Planned once revenue supports it.
Profile vault is deliberately not backed up
A backup of encrypted sessions is itself a credential store, so we chose not to keep one. If our server were lost, your data is safe in the database and you would reconnect your LinkedIn account in about two minutes.
10 · Found Something?

Report a vulnerability.

Write to security@campaignstack.io and you will get a human answer, fast. We publish a security.txt at the standard location. We do not run a paid bounty program yet, but we credit reporters who want credit and we fix what you find.

security@campaignstack.io
Lands in the founder's own inbox and gets read the same day.
/.well-known/security.txt
Machine-readable disclosure contact, per RFC 9116.

Get started

Start building your stack.

Your LinkedIn accounts will be safer with CampaignStack than doing it by hand. That's not a pitch. It's a measurable claim.