This document defines the canonical global fields in VRM’s Unified Voter Profile (UVP). It is the authoritative field-level reference for database schema design, API contracts, and UI rendering.

Relationship to SKILL.md: The main skill file defines HOW the system works (data flow, priorities, visibility). This file defines WHAT specifically goes where (field names, types, validation).

This is a living document. New fields are added as they are promoted from custom fields (see Section 5.3 of the main spec) or defined by Politogy.


Table of Contents

  1. Naming Conventions
  2. Data Types
  3. Identity Core Fields
  4. Contact Info Fields
  5. Geographic Fields
  6. Vote History Fields
  7. Enrichment Fields
  8. Relationship Data Fields
  9. Campaign Data Fields
  10. Petition Data Fields
  11. Aggregate Intelligence Fields
  12. Custom Field Namespace

Naming Conventions

All canonical field names follow these rules:

  • Prefix: voter_ for voter-level data, acct_ for account-scoped data, ai_ for computed/AI-generated data
  • Format: snake_case, lowercase, no abbreviations (except standard ones: dob, id, reg)
  • Canonical name is immutable. Once a field is promoted to global, its canonical name NEVER changes. Display labels can be adjusted.
  • No collisions: Canonical names must be unique across all layers.

Data Types

TypeDescriptionExample
textFree-form string, max 500 charsVoter name, notes
long_textFree-form string, max 10,000 charsContact log entries
numberInteger or decimalAge, score
dateISO 8601 date (YYYY-MM-DD)DOB, registration date
datetimeISO 8601 datetimeTimestamp of contact
booleantrue/falseSigned petition?
dropdownSingle-select from defined valuesParty affiliation
multi_selectMulti-select from defined valuesIssue interests
addressStructured address objectResidential address
phoneE.164 format phone number+15035551234
emailEmail addressvoter@example.com
geo_idReference to a geographic entityPrecinct ID, district ID
score0.0–1.0 float with confidenceAI propensity scores
computedRead-only, system-generatedAI outputs

Identity Core Fields

These fields are sourced from the state voter file. Read-only for customer-tier users.

Canonical NameDisplay LabelTypeRequiredNotes
voter_reg_idVoter IDtextYesPrimary key. State voter registration ID.
voter_first_nameFirst NametextYesLegal first name from voter file
voter_middle_nameMiddle NametextNo
voter_last_nameLast NametextYesLegal last name from voter file
voter_name_suffixSuffixtextNoJr., Sr., III, etc.
voter_dobDate of BirthdateYes
voter_partyParty AffiliationdropdownYesValues: DEM, REP, IND, LBT, GRN, OTH, NAV
voter_reg_statusRegistration StatusdropdownYesValues: ACTIVE, INACTIVE, SUSPENDED, CANCELED
voter_reg_dateRegistration DatedateYes
voter_genderGenderdropdownNoValues per state voter file conventions

Contact Info Fields

Multi-source. Subject to priority rules (user > enrichment > voter file).

Canonical NameDisplay LabelTypeRequiredDefault Exposure
voter_residential_addressResidential AddressaddressYesAlways Visible
voter_mailing_addressMailing AddressaddressNoAlways Visible
voter_phone_primaryPrimary PhonephoneNoTier-Gated
voter_phone_secondarySecondary PhonephoneNoTier-Gated
voter_email_primaryPrimary EmailemailNoTier-Gated
voter_email_secondarySecondary EmailemailNoTier-Gated
voter_preferred_namePreferred NametextNoAlways Visible

Geographic Fields

Derived from voter file + geocoding. Updated on voter file refresh or address change.

Canonical NameDisplay LabelTypeNotes
voter_countyCountygeo_id
voter_precinctPrecinctgeo_id
voter_congressional_districtCongressional Districtgeo_id
voter_state_house_districtState House Districtgeo_id
voter_state_senate_districtState Senate Districtgeo_id
voter_cityCitytext
voter_zipZIP Codetext5-digit or ZIP+4
voter_school_districtSchool Districtgeo_id
voter_wardWardgeo_idWhere applicable
voter_latLatitudenumberGeocoded from address
voter_lngLongitudenumberGeocoded from address

Vote History Fields

Array/collection per voter. One entry per election.

Canonical NameDisplay LabelTypeNotes
voter_election_idElection IDtextUnique election identifier
voter_election_dateElection Datedate
voter_election_typeElection TypedropdownPRIMARY, GENERAL, SPECIAL, RUNOFF
voter_vote_methodVote MethoddropdownIN_PERSON, MAIL, DROP_OFF, EARLY, PROVISIONAL
voter_ballot_statusBallot StatusdropdownACCEPTED, REJECTED, CHALLENGED, PENDING

Enrichment Fields

Sourced from third-party providers. Controlled per field. Always carries confidence score.

Canonical NameDisplay LabelTypeDefault Exposure
voter_estimated_incomeEst. Household IncomedropdownInternal Only
voter_estimated_educationEst. Education LeveldropdownInternal Only
voter_estimated_ethnicityEst. EthnicitydropdownInternal Only
voter_household_sizeHousehold SizenumberTier-Gated
voter_homeowner_statusHomeowner StatusdropdownTier-Gated
voter_donor_historyDonor Historylong_textAccount-Specific
voter_social_handlesSocial Mediamulti_selectInternal Only
voter_consumer_interestsConsumer Interestsmulti_selectInternal Only

Relationship Data Fields

Account-scoped. Created by customer-tier users in Relationship Mode.

Canonical NameDisplay LabelTypeNotes
acct_tagsTagsmulti_selectUser-defined tags
acct_notesNoteslong_textFree-form contact notes (append-only log)
acct_relationship_scoreRelationship Scorenumber0–100, user-assigned or computed
acct_last_contact_dateLast ContactdatetimeAuto-set on contact log entry
acct_assigned_toAssigned TotextTeam member assignment
acct_contact_logContact Loglong_textStructured log of all contact attempts

Campaign Data Fields

Account-scoped. Created in Campaign Mode.

Canonical NameDisplay LabelTypeNotes
acct_turf_assignmentTurftextAssigned walk/call turf
acct_canvass_resultCanvass ResultdropdownValues: CONTACT, NOT_HOME, REFUSED, MOVED, DECEASED, INACCESSIBLE
acct_canvass_dateCanvass Datedatetime
acct_survey_responsesSurvey Responseslong_textStructured survey Q&A
acct_call_resultCall ResultdropdownANSWERED, VOICEMAIL, WRONG_NUMBER, NO_ANSWER, BUSY
acct_call_dateCall Datedatetime

Petition Data Fields

Account-scoped. Created in Petition Mode.

Canonical NameDisplay LabelTypeNotes
acct_petition_idPetitiontextWhich petition
acct_signature_statusSignature StatusdropdownSIGNED, DECLINED, PENDING, INVALID
acct_signature_dateSignature Datedatetime
acct_signature_collectorCollectortextWho collected the signature
acct_signature_verifiedVerifiedbooleanPost-collection verification

Aggregate Intelligence Fields

Politogy-computed. Read-only for all users. Writable only by system processes. Subject to exposure controls for monetization.

Canonical NameDisplay LabelTypeDefault ExposureRefresh Cadence
ai_sentiment_compositeSentiment ScorescoreInternal OnlyDaily
ai_propensity_votePropensity to VotescoreAccount-SpecificWeekly
ai_propensity_respondPropensity to RespondscoreAccount-SpecificWeekly
ai_propensity_switchPropensity to Switch PartyscoreInternal OnlyMonthly
ai_propensity_signPropensity to Sign PetitionscoreAccount-SpecificWeekly
ai_persuadabilityPersuadability IndexscoreInternal OnlyMonthly
ai_contact_freshnessContact FreshnessscoreTier-GatedDaily
ai_issue_positionsEstimated Issue Positionslong_textInternal OnlyWeekly
ai_segment_clusterSegment ClustertextTier-GatedWeekly
ai_model_versionLast Model VersiontextInternal OnlyOn compute

Custom Field Namespace

User-created fields follow these rules:

  • Prefix: custom_ + account ID + _ + user-defined name (e.g., custom_acct123_timber_policy_position)
  • Stored against the UVP but tagged with creating account ID, creating user ID, creation timestamp
  • Visible to Politogy for cross-account analysis and field promotion detection
  • Invisible to other accounts
  • Supported types: text, number, date, boolean, dropdown, multi_select
  • No validation rules (unlike global fields) — users define freely
  • Promotable: When Politogy promotes a custom field to global, existing data migrates and the custom field is retired

Provenance Metadata Schema

Every field value (global or custom) carries this metadata:

{
  "field": "voter_phone_primary",
  "value": "+15035551234",
  "source": {
    "type": "user_input",           // voter_file | enrichment | user_input | ai_computed
    "provider": null,                // enrichment provider name, if applicable
    "account_id": "acct_456",       // if user_input
    "user_id": "user_789",          // if user_input
    "model_id": null,               // if ai_computed (e.g., "contact-freshness-v1.2")
    "model_inputs": null            // if ai_computed, array of input field references
  },
  "confidence": null,               // 0.0–1.0, required for enrichment and ai_computed
  "timestamp": "2026-05-02T14:30:00Z",
  "superseded_by": null,            // reference to replacing value, if overridden
  "status": "active"                // active | superseded | archived
}

Last updated: May 2026 Document owner: Politogy LLC