CSV Field Mapping

Visitor/Cookie Export — Admin vs Client. Column filtering is implemented in vi-portal/src/index.js (lines 1581–1671).

54
Client columns
13
Admin-only columns
67
Total columns
R2
Storage layer

Client CSV 54 columns

Served to non-admin accounts via DuckDB-WASM parquet export in browser. Controlled by CLIENT_COLUMNS array (line 1581).

#HeaderSource ColumnNotes
Contact Information
1First Namefirst_name
2Last Namelast_name
3Business Emailbusiness_email
4Personal Emailpersonal_emails
5Additional Emailsadditional_personal_emails
6Mobilemobile_phone
7Direct Phonedirect_number
8Personal Phonepersonal_phone
9LinkedIn Profilelinkedin_url
Company Information
10Company Namecompany_name
11Company Domaincompany_domain
12Company Citycompany_city
13Company Statecompany_state
14Company Zip Codecompany_zip
15Company Addresscompany_address
16Company Countrycompany_country
17Company Phonescompany_phone
18Company LinkedIn Profilecompany_linkedin_url
Professional Details
19Titlejob_title
20Job Title Normalizedjob_title_normalized
21Seniority Levelseniority_level
22Seniority Level 2seniority_level_2
23Departmentdepartment
24Department 2department_2
25Professional Cityprofessional_city
26Professional Stateprofessional_state
27Professional Zipprofessional_zip
28Professional Address 1professional_address
29Professional Address 2professional_address_2
Firmographics
30Revenue Levelcompany_revenue
31Employees Levelcompany_employee_count
32Primary Industryprimary_industry
33Company Descriptioncompany_description
34Related Domainsrelated_domains
42NAICScompany_naics
43SICcompany_sic
Demographics
35Gendergender
36Age Rangeage_range
37Marital Statusmarried
38Childrenchildren
39Income Rangeincome_range
40Net Worthnet_worth
41Homeowner Statushomeowner
Personal Address
44Personal Addresspersonal_address
45Personal Citypersonal_city
46Personal Statepersonal_state
47Personal Zippersonal_zip
Identity & Behavior
48IP Addressip_address
49Hashed Email (SHA256) HEMsha256_lc
50Last Page Visitedpage_urlAggregated from visit events
51Pages Visitedpages_visitedSTRING_AGG of distinct paths
52Last Visitlast_visit_dateMAX(event_date)
53Visit Countvisit_countCOUNT(*) per trovo_id
54Top ReferrerreferrerMAX(referrer)

Admin-Only Columns +13 columns

Admin sees everything — all client columns plus these. From Object.keys(FRIENDLY_NAMES) (line 1939).

#HeaderSource ColumnWhy Admin-Only
1Professional Zip 4professional_zip4Too granular for client use
2Work Historywork_historyNot needed unless selling to recruiters
3Education Historyeducation_historyNot needed unless selling to recruiters
4Social Connectionssocial_connectionsCurrently empty across all records
5Result Typeenrichment_pathInternal — direct_upid / hem_upid / unenriched
6Person IDup_idInternal — Universal Person identity key
7Enriched Atenriched_atInternal timestamp
8Site IDpixel_idInternal pixel identifier
9CC IDcc_idInternal cookie/trovo_id
10Last Updatedlast_updatedInternal timestamp
11Business Email Validationbusiness_email_validation_statusInternal QA field
12Programmatic Business Emailsprogrammatic_business_emailsInternal
13Historical Programmatic Emailshistorical_programmatic_emailsInternal

How Column Filtering Works

R2 Parquet Written by EC2 — contains ALL columns, no filtering at write time
vi-portal API GET /api/visitors/parquet-urls
if (admin): Object.keys(FRIENDLY_NAMES) — all 67 cols
else: CLIENT_COLUMNS — 54 cols
Response: { urls, columns, friendly_names }
Browser DuckDB-WASM via HTTP range reads
Table display: shows only columns from API response
CSV export: uses columns + friendly_names for headers
Key difference from Market Pulse: Visitor filtering happens at the API response layer (tells browser which columns to show). Market Pulse filtering happens at EC2 export (writes a separate filtered CSV).

Visitor vs Market Pulse Export

AspectVisitor ExportMarket Pulse Export
Where filtering happens vi-portal API → browser renders subset EC2 resolve → separate filtered CSV file
Parquet/CSV has all cols? Yes — browser filters No — client CSV only has client cols
Friendly headers Applied in browser via FRIENDLY_NAMES map Applied in DuckDB SQL via AS "Header" aliases
Admin-only columns 13 extra columns 7 excluded columns
Column control CLIENT_COLUMNS array in vi-portal CLIENT_COLUMNS SQL string in ec2-resolve
Status DONE — deployed DONE — deployed 2026-03-15
Admin-only — excluded from client view
Client-visible — included
Planned/new — being added