Linking Virtuous 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
The Virtuous connector syncs your nonprofit CRM data – contacts, gifts, recurring gifts, pledges, projects, campaigns, events, and more – into PostHog, so you can analyze donor and fundraising data alongside your product data.
Prerequisites
You need a Virtuous CRM+ account with API key access. Create an API key in Virtuous under Settings > Connectivity > API keys. The key's permission group determines which tables it can read.
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 Virtuous:
- API key – Paste the API key you created in Virtuous. The key is stored securely and used to authenticate all requests.
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.
Most Virtuous tables support incremental sync using the modifiedDateTimeUtc field. Incremental syncs include a one-day lookback window because Virtuous compares the "Last Modified Date" filter in the organization's time zone, and day-level precision means a short overlap is needed to avoid missing records near the boundary.
The following tables only support full refresh because they lack a reliable modified timestamp:
gift_designationstaskstagsorganization_groupssegments
Configuration
| Option | Type | Required |
|---|---|---|
API key | password | Yes |
Supported tables
| Table | Description | Sync method | Incremental field | Primary key |
|---|---|---|---|---|
contacts | Contacts (households, organizations, foundations and other donor records) with full details. | Incremental, Full refresh | modifiedDateTimeUtc | — |
contact_individuals | Individuals: the people that belong to a contact. | Incremental, Full refresh | modifiedDateTimeUtc | — |
contact_notes | Notes recorded on contacts. | Incremental, Full refresh | modifiedDateTimeUtc | — |
gifts | Gifts (donations) with full details, including designations, premiums and payments. | Incremental, Full refresh | modifiedDateTimeUtc | — |
gift_designations | Gift designations: the part of a gift's amount assigned to a project. | Full refresh | — | — |
gift_asks | Gift asks: requests for a gift made to a contact. | Incremental, Full refresh | modifiedDateTimeUtc | — |
planned_gifts | Planned gifts, such as bequests and other future commitments. | Incremental, Full refresh | modifiedDateTimeUtc | — |
pledges | Pledges: promises to give an amount over time. | Incremental, Full refresh | modifiedDateTimeUtc | — |
recurring_gifts | Recurring gifts: repeating donations on a schedule. | Incremental, Full refresh | modifiedDateTimeUtc | — |
premiums | Premiums: items given to donors in exchange for a gift. | Incremental, Full refresh | modifiedDateTimeUtc | — |
campaigns | Campaigns: fundraising efforts that group communications and segments. | Incremental, Full refresh | modifiedDateTimeUtc | — |
projects | Projects: the funds, programs and causes gifts are designated to. | Incremental, Full refresh | modifiedDateTimeUtc | — |
events | Events the organization runs, such as galas and fundraisers. | Incremental, Full refresh | modifiedDateTimeUtc | — |
event_attendees | Event attendees: invitations to events, with RSVP and attendance status. | Incremental, Full refresh | modifiedDateTimeUtc | — |
grants | Grants the organization applies for or receives. | Incremental, Full refresh | modifiedDateTimeUtc | — |
tasks | Tasks assigned to users, often linked to a contact. | Full refresh | — | — |
tags | Tags that can be applied to contacts. | Full refresh | — | — |
organization_groups | Organization groups: groups of contacts, such as churches, chapters or teams. | Full refresh | — | — |
segments | Segments: the audiences of a campaign communication that gifts are attributed to. | Full refresh | — | — |
| Table | Description | Incremental sync |
|---|---|---|
contacts | Contacts (households, organizations, foundations and other donor records) | ✅ |
contact_individuals | Individuals: the people that belong to a contact | ✅ |
contact_notes | Notes recorded on contacts | ✅ |
gifts | Gifts (donations) with full details, including designations, premiums, and payments | ✅ |
gift_designations | The part of a gift's amount assigned to a project | ❌ |
gift_asks | Requests for a gift made to a contact | ✅ |
planned_gifts | Planned gifts, such as bequests and other future commitments | ✅ |
pledges | Promises to give an amount over time | ✅ |
recurring_gifts | Repeating donations on a schedule | ✅ |
premiums | Items given to donors in exchange for a gift | ✅ |
campaigns | Fundraising efforts that group communications and segments | ✅ |
projects | The funds, programs, and causes gifts are designated to | ✅ |
events | Events the organization runs, such as galas and fundraisers | ✅ |
event_attendees | Invitations to events, with RSVP and attendance status | ✅ |
grants | Grants the organization applies for or receives | ✅ |
tasks | Tasks assigned to users, often linked to a contact | ❌ |
tags | Tags that can be applied to contacts | ❌ |
organization_groups | Groups of contacts, such as churches, chapters, or teams | ❌ |
segments | The audiences of a campaign communication that gifts are attributed to | ❌ |
Troubleshooting
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.





