CSV Format
Required Column
Headers are matched case-insensitively against known aliases. Besides the phone aliases above,
email/email_address, first_name/firstname/first/fname, last_name/lastname/last/lname, carrier, line_type/linetype/type, source/network_source, campaign_id/network_id, and the consent_date aliases listed below are detected automatically. Any header that isn’t a recognized alias must be mapped to the right field manually during import.Optional Columns
Custom fields are set via the API’s
custom_fields object when creating or updating contacts, not via CSV columns. See the API reference for details.Providing
consent_date preserves the original opt-in date for contacts you collected outside of Trackly (e.g. migrated from another platform or a legacy form). This is part of the TCPA consent evidence trail — see Opt-In Tool Data & Retention for how Trackly records consent for opt-ins captured through the platform.Example CSV
Import Process
Contacts can be imported via CSV through the dashboard or the bulk API endpoint.Phone Number Normalization
The import process automatically handles various phone number formats:
Numbers are assumed to be US (+1) unless they include a country code.
Duplicate Handling
When importing contacts that already exist:Import Limits
CSV imports through the dashboard accept up to 1,000,000 rows and 250MB per file. The bulk contacts endpoint (POST /v2/contacts/bulk) accepts up to 1,000 contacts per request.
Import Validation
Each contact is validated during import:Validation Rules
The import itself only skips contacts who are already unsubscribed on this list. Other delivery blocks — carrier rejections and STOP replies recorded against your sending number — are enforced when you send, not at import time.
Import Report
After import, you receive a report showing:skipped counts only active opt-out refusals. duplicate covers both
in-file repeats and the race-condition case where a concurrent importer
already added the contact to this list between your upload and ours.
Triggering Welcome Journeys
When creating contacts via the API, setuse_journeys: true on individual contacts to enroll them in active welcome journeys for the list. Enrollment is skipped if the contact previously opted out with a keyword such as STOP — that carrier-level block clears only when they text START — and, unless you send skip_journey_if_exists: false, if the contact is already in an active journey.
Best Practices
Validate before importing
Validate before importing
Clean your CSV before importing. Remove obviously invalid numbers and test a small batch first.
Use consistent custom field naming
Use consistent custom field naming
Establish custom field naming conventions (e.g.,
source, campaign, cohort) and use them consistently across imports.Include source custom fields
Include source custom fields
Always include a
source custom field indicating where contacts came from. This helps with attribution and analysis.Don't re-import opted-out contacts
Don't re-import opted-out contacts
Opted-out contacts cannot be resubscribed via import. This is by design for compliance.
Troubleshooting
Import stuck at 0%
Import stuck at 0%
Large imports can take time to start. Wait a few minutes. If still stuck, check file encoding (use UTF-8).
High skip rate
High skip rate
Check the report — rows land in different buckets. Invalid phone format and bad number length are counted as errors, not skips; skipped rows are contacts already unsubscribed on this list. Landlines are never skipped — they import like any other number.
Custom fields not appearing
Custom fields not appearing
Ensure custom fields are passed in the
custom_fields object when using the API. See the API reference for the correct format.Wrong country code
Wrong country code
If numbers are non-US, include the full E.164 format with country code in the CSV.
Common Pitfalls
Why are rows failing during import?
Why are rows failing during import?
Common causes for import row failures:
- Phone number format: Numbers are normalized automatically — a 10-digit number is given a
+1prefix, and any other digit string is given a leading+. Only numbers that still don’t match E.164 format after that are rejected. - Duplicate phone numbers: If the same phone number appears multiple times in your CSV, only the first occurrence is imported. Subsequent duplicates are skipped.
- File encoding: CSV files must be UTF-8 encoded. Files saved with Windows-1252 or other encodings may produce garbled characters or parsing errors.
- Column mapping: Ensure your CSV headers match the expected field names. Unrecognized columns are silently ignored.
- Row limit: CSV imports support up to 1,000,000 rows and 250MB per file.
Next Steps
Custom Fields
Organize imported contacts
Audiences
Segment your contacts
Journeys
Automate onboarding