> AI agents: this is one page from PostHog's docs. Full index of Markdown docs for LLMs: https://posthog.com/llms.txt # Linking Virtuous as a source Canonical URL: https://posthog.com/docs/data-pipelines/sources/virtuous > **Cloud region:** This page uses US Cloud hosts. For an EU Cloud project, use `https://eu.posthog.com` instead of `https://us.posthog.com` or `https://app.posthog.com` (app host for links). ## On this page - [Prerequisites](#prerequisites) - [Adding a data source](#adding-a-data-source) - [Sync modes](#sync-modes) - [Configuration](#configuration) - [Supported tables](#supported-tables) - [Troubleshooting](#troubleshooting) ![](https://res.cloudinary.com/dmukukwp6/image/upload/texture_tan_9608fcca70) ![](https://res.cloudinary.com/dmukukwp6/image/upload/texture_tan_dark_a92b0e022d) 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. `npx @posthog/wizard warehouse` ![PostHog Wizard hedgehog](https://res.cloudinary.com/dmukukwp6/image/upload/wizard_3f8bb7a240.png) ![](https://res.cloudinary.com/dmukukwp6/image/upload/wizard_3f8bb7a240.png)Let AI connect your sources for you 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 1. In PostHog, go to the [Sources tab](https://app.posthog.com/data-management/sources) of the data pipeline section. 2. Click **\+ New source** and click **Link** next to this source. 3. Enter your credentials (see [Configuration](#configuration) below) and click **Next**. 4. 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_at` timestamp). 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](https://posthog.com/docs/data-pipelines/sources.md#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_designations` - `tasks` - `tags` - `organization_groups` - `segments` ## 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](https://posthog.com/docs/data-warehouse/troubleshooting.md). If that doesn't help, [contact support](https://us.posthog.com/#panel=support%3Asupport%3Adata_warehouse%3A%3Atrue) – we're happy to help.