//Data
Contacts and supporter CRM
Facts checked against official sources · September 9, 2026
The voter database holds everyone who can vote for you. Contacts holds the people who have already raised a hand: the neighbor who asked for a yard sign, the retiree who wants to make calls, the business owner who said she would write a check. Contacts keeps those relationships in the same system as the file instead of in a spreadsheet and a group text.
What it is
A contact is one person with a contact type of Supporter, Volunteer, or Donor: a supporter follows the campaign and may vote for you, a volunteer is ready to knock doors and make calls, a donor has contributed or may. The type is a single choice; tags carry everything else.
Each record carries name, email, phone, company and job title, street address with city, state, and ZIP, two yard sign flags (Wants a yard sign and Sign given), notes, and comma-separated tags, plus its source (manual, CSV import, the public form, or a webhook), a link to the voter record once one is matched, and a link to the person's Culper login when they are on your team.
Contacts are not district-restricted. The voter universe is hard-scoped to your office, but a donor across the county line is a real relationship, so the list accepts anyone from anywhere. It is private to your campaign, protected by row-level security, and never visible to another campaign.
How it works: the Contacts screen
Contacts sits in its own sidebar group with Team and Integrations. The list opens on the 200 most recently added contacts, newest first, with stat chips for the rows on screen (total, volunteers, supporters, donors, yard signs still needed), a search box over name, email, and company, and type chips. Each row carries the type badge and flags for team role, login, voter match, and yard sign.
- Add contact is a four-step form: who they are (type tiles, name, email, phone), where they live (used for matching; contacts outside the district are supported), professional info (company and title), and yard sign, notes, and tags. Only first name is required.
- The contact page shows click-to-email and click-to-call, the address, professional details, a Voter record card, and notes, with Edit, Delete, and Invite to team in the header. Delete asks for a second click, then soft-deletes the record.
- Donors, under Fundraising, is the same list filtered to the Donor type, with employer and occupation stacked in one column, city and state in another, and chips for total donors and voter linked. Add donor pre-selects the type; Export there pulls donors only.
How it works: matching a contact to a voter record
When you save a contact with a street address, matching runs in the background. The address and city are normalized and compared against voter records on the current county roll; off-roll registrations are never offered. An exact street-plus-ZIP match scores 95 percent, a street match with a different or missing ZIP scores 80, and up to fifteen candidates are kept. A lone 95 candidate is linked provisionally and the row shows Match pending; otherwise the candidates wait on the contact page under Match needs confirmation.
Each candidate shows the voter's name, address, percentage, and reason beside a Confirm button; None of these, reject all closes the question. A confirmed link turns the flag to Voter linked and adds a View voter record jump. Matching runs on manual saves, CSV imports, and team sync; a contact from the join page or a webhook is matched the first time you save it with an address.
How it works: getting people in
Four intake paths, all landing in the same list with the source recorded.
Import CSV. Drop a .csv file; common headers (name, email, phone, company, title, address, city, state, zip, contact type, notes, tags) are auto-detected, every column gets a dropdown to map or skip, and First Name must be mapped before Import activates. Up to 2,000 rows per file, matched on email within your campaign so an existing contact is updated rather than duplicated. The finish screen reports imported and skipped counts.
Public join page. Every campaign has a shareable form at /join/your-campaign: first name (required), last name, email, phone, a text-message opt-in that stays disabled until a phone number is typed, an I want to choice (Show my support, Volunteer, or Donate) that sets the type, a yard sign checkbox, and a message. A checked opt-in is written to the consent log.
Webhook tokens. On the Integrations page you create labeled bearer tokens (Zapier, Website) and delete them with a confirm click. An outside system posts JSON to /api/webhooks/contacts with the token in the Authorization header, your campaign id, and up to 500 contacts per request with the same fields as the form. Rows are upserted on email, and each token shows when it was last used.
Team sync. Opening Contacts makes sure every active team member exists as a contact. Volunteers and staff become Volunteer contacts, the candidate and managers become Supporters, each gets the tags Campaign Team plus their role, the record is linked to their login, and the phone from their volunteer profile is copied in. Someone already on the list keeps the higher type; a donor is never downgraded.
Invite to team and the role gates
Any contact with an email shows Invite to team on their row and page, with a menu of Volunteer, Staff, or Campaign Manager. It sends the same 14-day invite the Team page sends and disappears once the person carries the Campaign Team tag. Inviting is a candidate and campaign manager action, and the join page never creates accounts, so this is the bridge from a form submission to a login and the mobile app.
Viewing and editing is open to the candidate, campaign manager, and staff; volunteers and precinct chairs are sent back to their walks. Export produces a CSV of every non-deleted contact in 18 columns, and only the candidate and campaign manager can pull it, the same rule as the voter export. Webhook tokens sit behind a manager-level database policy, so treat Integrations as a candidate and manager screen.
| Role | View, add, edit, import | Confirm voter matches | Invite to team | Export CSV |
|---|---|---|---|---|
| Candidate | Yes | Yes | Yes | Yes |
| Campaign manager | Yes | Yes | Yes | Yes |
| Staff | Yes, when the Contacts tab is in their sidebar | Yes | No | No |
| Precinct chair | No | No | No | No |
| Volunteer | No | No | No | No |
How a local campaign uses it
School board trustee, 1,400 sign-ups. The join link collects 1,400 contacts: 1,050 chose Show my support, 280 Volunteer, 70 Donate, and 410 asked for a yard sign. The join page does not ask for an address, so the sign crew calls the 410, types the address into the record, and matching links most of them to a voter record. The Yard signs needed chip is the crew's working number.
City council at-large, house parties. Your finance chair keeps 380 donors and prospects in a spreadsheet with employer and occupation. She maps its columns in the importer, points the type column at Donor, and tags the file host-2026. The Donors screen becomes her working list, and the 310 with a confirmed voter link let her see who actually votes in municipal elections before asking for a second gift.
County party, volunteer intake. The party's website already has a volunteer form. A webhook token labeled Website lets it post straight into Contacts as Volunteer records tagged by precinct. The coordinator invites the reliable ones to the team so they get walk assignments and the mobile app, and exports the rest for the phone tree.
Why it matters
A local race is a few thousand votes, and the people who volunteer, host, and give are the same people who vote early and bring a neighbor. Campaigns lose them in the gap between the voter file and the spreadsheet: a supporter gets a persuasion mailer, a volunteer gets a cold text, a donor is asked twice. A confirmed link between contact and record closes that gap. The arithmetic is in How many votes to win a local election, and Campaign finance basics for local candidates explains why employer and occupation belong on a donor record from the first gift.
The join page's opt-in is the other half. A supporter who checks the text-message box on a form you control is documented consent, which the political texting rules require before a campaign texts anyone.
What it does not do
Honest boundaries, so you can plan around them.
- It does not process donations. Online donation processing through Stripe Connect is in development and shows as Coming Soon in the dashboard; the Donor type and Donors screen are a contact list.
- Outreach channels send to saved voter lists, not to the contact list. SMS, email, peer-to-peer texting, phone banks, and direct mail all start from the voter database, so a contact is reached through their linked voter record or the export.
- A confirmed link does not tag the voter record by itself; open the record and apply the tag you want lists and walks to see.
- Yard sign flags are not pins on the sign map, event RSVPs do not write to a contact record, and there is no embeddable form yet: Integrations shows an embed snippet, but the hosted join link is the path to rely on.
- Matching is address-based only; a contact with no street address is never matched, and one outside the voter records you hold shows no match.
- Limits: the list shows the 200 most recent matching contacts, imports take 2,000 rows per file, the webhook takes 500 contacts per request, and one record per email per campaign means rows without an email cannot be deduplicated on re-import.
Works with
Contacts is the people layer on top of the voter database; a confirmed link opens the record so you can apply the tags every list and walk honors. Invite to team feeds volunteer coordination, the join page belongs to the campaign page, the yard sign flags serve yard signs and field assets, the opt-in is the consent that SMS outreach and peer-to-peer texting check, and the export rules follow compliance and data security.
Frequently asked questions
Is a contact the same thing as a voter?
No. A voter is a row from the registration file, scoped to your district. A contact is a person who has a relationship with the campaign: a supporter, volunteer, or donor, from anywhere. When a contact's address matches a voter record on the current roll, you confirm the link on the contact page, and the two records point at each other. Many contacts are voters; not every voter is a contact.
Can I import my existing supporter spreadsheet?
Yes. Save it as a CSV and drop it on the Import page. Common headers are auto-detected, every column gets a dropdown to map or skip, and only First Name is required. Each import takes up to 2,000 rows; split a bigger file. Rows are matched on email within your campaign, so re-importing an updated file refreshes existing contacts instead of duplicating them, as long as the rows carry an email.
What does Voter linked mean, and why should I confirm matches?
Voter linked means someone confirmed which voter record this contact is. The system proposes candidates by normalized address (95 percent for street plus ZIP, 80 percent for street alone) and a person clicks Confirm or rejects them all. Confirming gives you a one-click jump to the voter's history and precinct, tells you which record to tag so your lists and walks treat a known supporter differently, and feeds the Voter linked count on the Contacts and Donors screens.
Can my website or Zapier add contacts automatically?
Yes. Create a token on the Integrations page and have the outside system POST JSON to /api/webhooks/contacts with the token as a bearer credential, your campaign id, and up to 500 contacts per request. Contacts arrive with the source webhook and are deduplicated on email. If you do not have a developer, share the hosted join link instead; anyone who fills it out becomes a contact with the same fields.
Can staff download the contact list?
No. Staff can view, add, edit, import, and confirm voter matches when the Contacts tab is in their sidebar, but the CSV export is limited to the candidate and campaign manager, the same rule that applies to the voter export. Volunteers and precinct chairs do not see Contacts at all.
Does Contacts track donations?
Not yet. The Donor type and the Donors screen keep the people, with employer and occupation for your compliance filings, but online donation processing through Stripe Connect is in development and appears as Coming Soon in the dashboard. Until it ships, record gift amounts in the contact's notes or in your finance system.
Bring the spreadsheet. Keep the relationships.
Keep reading