> Documentation index: https://docs.beetl.io/llms.txt

# Connect your data

> The ways data gets into Beetl: integrations, webhooks, files, and data read in place.

Source: https://docs.beetl.io/sources/
Last updated: 2026-11-10

Data reaches Beetl in one of five ways. Three of them copy data into a dataset that Beetl writes
and keeps up to date. The other two read data where it already sits, so nothing is copied.

| Way in             | What it is                                                                            | Data is       | Who sets it up                                                 | Page                                                                              |
| ------------------ | ------------------------------------------------------------------------------------- | ------------- | -------------------------------------------------------------- | --------------------------------------------------------------------------------- |
| Integration        | A connection to a system through an installed Connect package, with one or more syncs | Copied        | An admin installs the package, then any user connects          | [Integrations](https://docs.beetl.io/sources/integrations)                                             |
| Webhook            | A URL and a token that your system POSTs JSON to                                      | Copied        | Any user                                                       | [Webhook](https://docs.beetl.io/sources/webhook)                                                       |
| File Set           | A folder of files you upload: CSV, NDJSON or Parquet, or documents and spreadsheets   | Copied        | Any user                                                       | [File Sets](https://docs.beetl.io/sources/file-sets), [Documents and spreadsheets](https://docs.beetl.io/sources/documents) |
| Registered dataset | Delta, Parquet, CSV or JSON files already in an object store the tenant uses          | Read in place | Any user                                                       | [Registered datasets](https://docs.beetl.io/sources/registered-datasets)                               |
| External dataset   | A table in a live PostgreSQL database                                                 | Read in place | An admin adds the database, then any user registers its tables | [External datasets](https://docs.beetl.io/sources/external-datasets)                                   |

All five start on Home. Right-click the canvas and choose **New connection** for an integration,
a webhook or a PostgreSQL database, or **Register data set** for files in your object store.
File Sets have their own File sets card on the canvas, and **New file processor** starts from a
processor that reads the files you add to it.

## Which one to use

Use an **integration** when the data lives in a system with an API, such as a SaaS application,
and you want Beetl to fetch it on a schedule. Each integration is a Connect package that a
TenantAdmin installs in the tenant. If the system you need has no package yet, a developer can
write one; see [Build integrations](https://docs.beetl.io/connect).

Use a **webhook** when your system can push events as they happen. Nothing needs installing, and
nothing of Beetl's runs on your side.

Use a **File Set** for exports, one-off loads and anything that arrives as files. CSV, NDJSON and
Parquet files are imported as they are. For PDFs, Word files, images and other documents, a file
processor reads each document into one record, and for Excel workbooks with a fixed layout you can
map cells to columns instead. See [Documents and spreadsheets](https://docs.beetl.io/sources/documents).

Use a **registered dataset** when the files are already in your own bucket and you do not want a
second copy. Use an **external dataset** when the data sits in a PostgreSQL database and you want
every query to see its current state. Each query then runs against your database, so heavy use
adds load there.

## How copied data lands

A webhook connection, a sync and a File Set's processor each write to exactly one dataset. The dataset shows
as Pending on Home until its first successful write, then as Initialized. A run that fails leaves
the dataset as it was, and an incremental sync never skips records because of a failed run.

New datasets are written to the object store marked as Beetl storage. That is Beetl's hosted
store unless an admin has chosen your own bucket instead; see
[Tenants and roles](https://docs.beetl.io/concepts/tenants-and-roles#where-your-data-is-stored).

The rules behind this, including write modes, partitioning, limits and what deleting a
producer does, are on [Connection types, connections and syncs](https://docs.beetl.io/concepts/connections-and-integrations).

## Reaching your systems

Integrations and external datasets connect out from Beetl, so the system has to be reachable
from the public internet. Integrations reach their providers over HTTPS. A system that only
exists inside your private network cannot be reached directly. Export from it into a File Set,
or have it push to a webhook.

## In this section

| Page                                                | What it covers                                                                          |
| --------------------------------------------------- | --------------------------------------------------------------------------------------- |
| [Integrations](https://docs.beetl.io/sources/integrations)               | Connections from an installed Connect package: credentials, OAuth, syncs and schedules. |
| [Webhook](https://docs.beetl.io/sources/webhook)                         | Receive JSON events at a per-connection endpoint.                                       |
| [File Sets](https://docs.beetl.io/sources/file-sets)                     | Named folders of uploaded files, turned into datasets by a file processor.              |
| [Documents and spreadsheets](https://docs.beetl.io/sources/documents)    | Turn PDFs, Word files, spreadsheets and other documents into dataset rows.              |
| [Registered datasets](https://docs.beetl.io/sources/registered-datasets) | Files already in your object store, read in place.                                      |
| [External datasets](https://docs.beetl.io/sources/external-datasets)     | A live PostgreSQL table, read in place.                                                 |

## Related

- [Connection types, connections and syncs](https://docs.beetl.io/concepts/connections-and-integrations): The objects behind copied data, and the rules they follow.

- [Tenants and roles](https://docs.beetl.io/concepts/tenants-and-roles): What an admin sets up, and where your data is stored.

- [Build integrations](https://docs.beetl.io/connect): Writing a Connect package for a system that has none.
