Importing companies
The import wizard turns a CSV or Excel sheet of target companies into tracked rows that the sync engine watches for buying signals. Four stages — upload, map, import, sync.
1. Upload
- Drag-and-drop or click to pick a
.csv,.xlsx, or.xlsfile. - We read it client-side — your file never hits a third-party service.
- Up to ~10,000 rows handled in-browser. Bigger sheets: split + run twice.
What columns to include
At minimum you need a Company name column. Anything else is optional; if a column exists, you can map it. Common useful fields:
| Field | Why it matters |
|---|---|
| Company name | Required. Used as the display label across the app |
| LinkedIn URL | Lets the linkdapi source resolve the company. Without this, LinkedIn posts won't fetch |
| Website | Powers the Company-newsroom source (tries /feed, /rss, /news/feed) |
| Industry | Filters in the dashboard + Importing data modal |
| Country | Filters + Slack summary grouping |
| Owner | Maps to "account owner" — shown on send dialogs so you know which rep to send to |
| Organisation | Optional grouping label (parent organisation, region, division) — used to filter signals across the dashboard |
| Priority | high / medium / low — drives the smart-sync planner's budget order |
| Description | Used by Claude when classifying — helps with ambiguous signals |
| Create date / Last activity date | Tracked for filters; not used by sync |
Columns we don't have a slot for get ignored.
2. Map
After upload, the wizard shows your file's columns on the left and our schema fields on the right. For each schema field, pick which of your columns to source from.
- Required field unmapped → import button stays disabled
- Mapping persists per session — close + reopen the wizard and your mapping is remembered
- Edit cells inline in the preview table before importing if a row needs fixing
Same filter bar as everywhere else
Search + priority + industry + owner filters work over the mapped preview so you can scope to "only high-priority rows" or "only the medical-device industry" before clicking Import.
Validation
Rows that fail validation (no company name, malformed LinkedIn URL, etc) are highlighted in red and skipped from import. The wizard tells you exactly how many rows are valid vs invalid before you commit.
3. Import
Click Import N valid rows. We POST /api/companies/import with the validated payload. Backend deduplicates by:
- exact match on LinkedIn URL slug (
/company/<slug>) - case-insensitive company name match
Duplicates are skipped silently with a per-row reason returned. Your existing tracking history is preserved — re-importing the same company doesn't reset its signal feed.
Successful imports immediately appear in:
- The dashboard's signal feed (once a sync runs)
- The Companies page
- The Onboarding wizard's company table preview
4. Sync
Last wizard step. We default to company_site, google_news, openfda, and crunchbase sources for a first-time sync (skipping LinkedIn since most rows won't have it warmed up yet). You can override sources + lookback before clicking Sync now.
Skip the sync and the cron picks it up at the next interval (if auto-sync is ON). New orgs have auto-sync OFF — see the Auto-sync docs.
Files vs the Settings → Import path
The onboarding wizard + Settings → Import use the same dialog. The only difference is post-import behaviour:
- Onboarding wizard: shows the imported table + lets you continue to "Signal types" step
- Settings → Import: closes the dialog + drops you back into Settings
Common gotchas
| Symptom | Likely cause |
|---|---|
| "Required field unmapped" | Company name column not selected on the map step |
| Most rows invalid | Sheet has a junk header row; remove the title row above the column headers |
| LinkedIn URLs marked invalid | Must look like https://www.linkedin.com/company/<slug> — linkedin.com/in/... (personal profile) won't pass |
| Some rows dropped silently | Already imported earlier — backend deduped by slug or name match |
| Sync fires no signals for a company | No LinkedIn URL + no website → only Google News + Regulatory have anything to query |
Re-running the import
You can re-upload anytime via Settings → Import companies. Existing rows are preserved; only new ones get inserted.