SELECT that returns the records you
care about, and map the columns to people, custom objects, and relationships.
This guide walks an admin through the whole setup:
1. Create a read-only user
2. Connect your database
3. Define what to sync
Troubleshooting
Before you begin
A supported database
A read-only user
SELECT-only grants:
snippets below.Network reachability
TLS
Require is the default; use
Verify full to also validate the server certificate against a CA.Step 1: Create a read-only user
Give Boom a dedicated user with read-only access to the tables you want to sync. This keeps the blast radius small and makes the connection easy to audit and revoke. The same snippets are available in-product, next to the connection form.Step 2: Connect your database
Open Integrations → Directory
5432 for
PostgreSQL, 3306 for MySQL).Fill in the connection details
Pick a connection method
Save
Connecting through an SSH bastion
If your database has no public endpoint, Boom can reach it through an SSH bastion (a jump host that is publicly reachable and can connect onward to the database). Choose SSH Tunnel (bastion) as the connection method and fill in the bastion fields:10.0.x.x or an internal DNS name).
Boom dials the bastion, then forwards onward to the database.
AllowTcpForwarding yes in /etc/ssh/sshd_config and reload
sshd) and that the bastion can itself connect to the database host and port.Step 3: Define what to sync
A connection on its own doesn’t move any data. It just proves Boom can reach the database. To actually sync, you add one or more data sources. A source is aSELECT query plus a mapping that tells Boom how to turn each row into a
person, a custom object, or a relationship.
Boom switches syncing on for your connection once it’s saved (ask
support if you don’t see it yet). It then appears
under Integrations → Syncs. Open it and click + Add data to build a
source in four steps: What it becomes, Choose a table,
Query & mapping, and Preview & go live.
Resource kinds
Each source produces one kind of record:SELECT for you, which you can refine and
check with Run preview before Create sync.
Required columns
Every source query must project three columns, whatever else it returns. They’re how Boom keeps the sync correct and incremental:external_id is unique per row: for a join table without a single-column
key, project one (e.g. left_id || ':' || right_id AS external_id).Map your columns
Once the query runs, map the returned columns:Identity (Person sources)
Attributes
Date compares chronologically, a Number
numerically.Descriptions (optional but recommended)
Link records with relationships
Relationships connect a person to an object, or one object to another (a customer whoplaced an order; an order that has_line_item). On a Person or
Custom object source, add a relationship by pointing a foreign-key column at
another source:
left_external_id and right_external_id (plus the three
required columns) and emits one edge per row, useful when the link itself
carries data (a quantity, a redeemed-at timestamp), which becomes the edge’s
attributes.
How syncing runs
Once a source is enabled, Boom keeps it in sync automatically (roughly every 15 minutes) usingsource_updated_at to pull only what changed since
the last run:
- First sync backfills all matching rows. Large tables backfill in batches across several runs; you don’t need to do anything.
- Ongoing syncs are incremental and usually pull a handful of rows (or none).
- Deletions are reconciled by a daily check, and rows flagged with
source_deleted = trueare marked removed as they sync.
Troubleshooting
When a test or sync fails, Boom shows a plain-language message. Here’s what the common ones mean.Authentication failed. Check username and password.
Authentication failed. Check username and password.
'boom_readonly'@'%'.Authentication succeeded but the user lacks permission.
Authentication succeeded but the user lacks permission.
SELECT on the tables (or
schema) you’re syncing. See the read-only snippets above.Host not found. Check the hostname spelling.
Host not found. Check the hostname spelling.
Connection timed out.
Connection timed out.
Connection refused.
Connection refused.
TLS handshake failed.
TLS handshake failed.
Cannot connect to private, loopback, or link-local addresses.
Cannot connect to private, loopback, or link-local addresses.
10.x, 172.16–31.x,
192.168.x), loopback (127.x), and link-local (169.254.x) addresses
for security. Use a publicly reachable host, or connect through an
SSH bastion.Database '…' does not exist on this server.
Database '…' does not exist on this server.
CONNECT on it.Could not reach the database host/port (SSH tunnel).
Could not reach the database host/port (SSH tunnel).
Current limitations
The database-source feature is live, with a few capabilities still on the way. Plan around these:- No static egress IP to allowlist (yet). Boom currently connects from a shared, variable IP range, so it can’t give you a single fixed IP to add to your firewall. If your database can’t be exposed publicly, use an SSH bastion. Static egress IPs are planned.
- No AWS PrivateLink. Private connectivity is via SSH bastion today; PrivateLink is not available yet.
- No customer-managed keys (BYOK). Credentials are encrypted with a Boom-managed key. Bring-your-own-key is not available yet.
- Automated sync is PostgreSQL-first. You can create and test MySQL connections today, but scheduled syncing currently runs for PostgreSQL sources. MySQL syncing is on the roadmap.
- No SSL setting in the form. Every connection uses Require (encrypted, certificate not verified). Contact support if you need the server certificate verified against your own CA.
- Syncing is switched on by Boom. Saving a connection doesn’t create its sync yet; Boom enables it, after which you build sources yourself from Integrations → Syncs.