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.

Learn more
PostHog Wizard hedgehog

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

  1. In PostHog, go to the Sources tab of the data pipeline section.
  2. Click + New source and click Link next to this source.
  3. Enter your credentials (see 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 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

OptionTypeRequired
API keypasswordYes

Supported tables

TableDescriptionSync methodIncremental fieldPrimary key
contacts

Contacts (households, organizations, foundations and other donor records) with full details.

Incremental, Full refreshmodifiedDateTimeUtc—
contact_individuals

Individuals: the people that belong to a contact.

Incremental, Full refreshmodifiedDateTimeUtc—
contact_notes

Notes recorded on contacts.

Incremental, Full refreshmodifiedDateTimeUtc—
gifts

Gifts (donations) with full details, including designations, premiums and payments.

Incremental, Full refreshmodifiedDateTimeUtc—
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 refreshmodifiedDateTimeUtc—
planned_gifts

Planned gifts, such as bequests and other future commitments.

Incremental, Full refreshmodifiedDateTimeUtc—
pledges

Pledges: promises to give an amount over time.

Incremental, Full refreshmodifiedDateTimeUtc—
recurring_gifts

Recurring gifts: repeating donations on a schedule.

Incremental, Full refreshmodifiedDateTimeUtc—
premiums

Premiums: items given to donors in exchange for a gift.

Incremental, Full refreshmodifiedDateTimeUtc—
campaigns

Campaigns: fundraising efforts that group communications and segments.

Incremental, Full refreshmodifiedDateTimeUtc—
projects

Projects: the funds, programs and causes gifts are designated to.

Incremental, Full refreshmodifiedDateTimeUtc—
events

Events the organization runs, such as galas and fundraisers.

Incremental, Full refreshmodifiedDateTimeUtc—
event_attendees

Event attendees: invitations to events, with RSVP and attendance status.

Incremental, Full refreshmodifiedDateTimeUtc—
grants

Grants the organization applies for or receives.

Incremental, Full refreshmodifiedDateTimeUtc—
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——

TableDescriptionIncremental sync
contactsContacts (households, organizations, foundations and other donor records)✅
contact_individualsIndividuals: the people that belong to a contact✅
contact_notesNotes recorded on contacts✅
giftsGifts (donations) with full details, including designations, premiums, and payments✅
gift_designationsThe part of a gift's amount assigned to a project❌
gift_asksRequests for a gift made to a contact✅
planned_giftsPlanned gifts, such as bequests and other future commitments✅
pledgesPromises to give an amount over time✅
recurring_giftsRepeating donations on a schedule✅
premiumsItems given to donors in exchange for a gift✅
campaignsFundraising efforts that group communications and segments✅
projectsThe funds, programs, and causes gifts are designated to✅
eventsEvents the organization runs, such as galas and fundraisers✅
event_attendeesInvitations to events, with RSVP and attendance status✅
grantsGrants the organization applies for or receives✅
tasksTasks assigned to users, often linked to a contact❌
tagsTags that can be applied to contacts❌
organization_groupsGroups of contacts, such as churches, chapters, or teams❌
segmentsThe 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.

Still have questions?

Was this page useful?