Linking AppSignal as a source
Let AI connect your sources for you
Skip the manual setup — run this in your project and the wizard auto-detects your databases and APIs and connects them to PostHog.

Contents
This source is currently in alpha. The interface and available tables may change.
The AppSignal connector syncs the monitoring data of one AppSignal app into the PostHog Data Warehouse: exception and performance incidents, error and performance samples, deploy markers, log lines, metrics, and distributed traces. You can then join application health to how people use your product, and see the release or the slow action that a drop in usage follows.
Prerequisites
You need a personal API token and the ID of the app you want to sync. The token inherits the permissions of the AppSignal user who created it, so that user needs access to the app.
Each source connects to one app. To sync more than one app, add one source per app.
Adding a data source
- In PostHog, go to the Sources tab of the data pipeline section.
- Click + New source and click Link next to this source.
- Enter your credentials (see Configuration below) and click Next.
- Select the tables you want to sync, choose a sync method and frequency, then click Import.
Once the syncs are complete, you can start querying this data in PostHog.
When linking AppSignal, you'll need:
- Personal API token – find it in your AppSignal personal settings under API key.
- App ID – the identifier in your app's AppSignal URL:
https://appsignal.com/<organization>/sites/<app ID>.
PostHog checks both values when you connect. If AppSignal rejects them, the connection fails immediately.
The app ID is part of the connection. If you change it, you must enter the token again, so that a stored token cannot read another app.
Sync modes
Each table can be synced in one of several modes, depending on what the source supports:
- Webhook (when available) – the source pushes changes to PostHog in real time. Fastest freshness, lowest ongoing cost, and the only mode that reliably captures updates and deletes.
- Incremental – only new or updated rows are synced on each run, using a cursor field (such as an
updated_attimestamp). Cheaper than a full refresh, but deletes aren't captured. - Append only – new rows are appended using a cursor field; existing rows are never updated. Ideal for immutable, append-only tables like event logs.
- Full refresh – the whole table is reloaded on every sync. Use it when a table has no reliable cursor or when you need deletions reflected.
See sync methods for a full explanation of how each mode works and how to choose between them.
These tables sync incrementally:
error_samples,performance_samples,log_lines,performance_traces, andtrace_spansare append-only. A sample, a log line, and a span never change after AppSignal records them.deploy_markersandmetric_timeseriesmerge rows on each sync instead of appending them. AppSignal keeps updating a marker until the next deploy, and the connector can re-read a metric bucket, so each row must merge onto its key.
The other tables are full refresh only:
exception_incidentsandperformance_incidentsare aggregates whose occurrence count, state, and last occurrence keep changing. The GraphQL API that serves them cannot filter by time, so the connector re-reads the list.appsandmetric_namesare small lookup tables.
The first sync of metric_timeseries reaches back 30 days, and the first sync of performance_traces and trace_spans reaches back 7 days. AppSignal does not report how much history your plan keeps, so the connector uses these bounds instead of asking for all of it. The remaining tables walk your full history, which AppSignal limits to your plan's retention period.
Spans cost one AppSignal request per trace, so trace_spans syncs at most 5,000 traces per run. If your app records more than that, run the sync again and it continues from where it stopped.
Configuration
| Option | Type | Required |
|---|---|---|
Personal API token | password | Yes |
App ID | text | Yes |
Supported tables
| Table | Description | Sync method | Incremental field | Primary key |
|---|---|---|---|---|
exception_incidents | An exception incident: a group of similar errors tracked by AppSignal, with its occurrence count and triage state. | Full refresh | — | — |
performance_incidents | A performance incident: a slow action tracked by AppSignal, with its duration statistics and triage state. | Full refresh | — | — |
deploy_markers | A deploy marker: an application release tracked by AppSignal, with the error rate observed while it was live. | Incremental, Full refresh | created_at | — |
error_samples | An individual error sample: one recorded occurrence of an exception, with request context. | Incremental, Full refresh | time | — |
performance_samples | An individual performance sample: one recorded slow request, with timing breakdown. | Incremental, Full refresh | time | — |
apps | An AppSignal app (site): the lookup that resolves the app ID every other AppSignal table is keyed by, with the organization that owns it. | Full refresh | — | — |
log_lines | A single log line collected by AppSignal log management. Only the Public API V2 serves log lines; the GraphQL API has no field for them. | Incremental, Full refresh | timestamp | — |
metric_names | The metric catalog for an app: one row per metric name, with its type and the tag keys it carries. | Full refresh | — | — |
metric_timeseries | One hourly bucket of one metric series. Covers custom and platform metrics; the GraphQL metrics API is deprecated, so V2 is the supported source. | Incremental, Full refresh | timestamp | — |
performance_traces | A distributed trace recorded for a performance action, summarized at its root span. | Incremental, Full refresh | time | — |
trace_spans | A single span of a distributed trace, with its timing, status and attributes. | Incremental, Full refresh | trace_time | — |
metric_timeseries holds one row per metric series per hour, for both custom and platform metrics. Read it together with metric_names, which lists each metric name, its type, and the tag keys it carries.
Troubleshooting
- If you see a 401 error, the token is invalid or was revoked. Copy a new token from your personal settings, then reconnect.
- If you see a 403 error, the AppSignal user who owns the token cannot read this app. Check the token and the app ID, then reconnect.
- If you see a 404 error, or AppSignal app not found, the app ID is wrong. Copy the identifier from your app's AppSignal URL.
- If
log_linesstays empty, the app has no log sources. Check that your app sends logs to AppSignal log management. - If a metric is missing from
metric_timeseries, check thatmetric_nameslists it. The connector syncs gauge, counter, and measurement metrics, and skips a metric of any other type. - If
trace_spanslags behindperformance_traces, the sync reached the per-run trace limit. Increase the sync frequency until the table catches up.
If your sync is failing or data looks wrong, see the Data warehouse troubleshooting guide. If that doesn't help, contact support – we're happy to help.