Import jobs from CSV or XML

Bulk import jobs from a CSV or XML file with AI column mapping, location resolution, and multi-layer deduplication.

Upload a spreadsheet or XML feed and Cavuno maps columns, resolves locations, deduplicates against existing listings, and posts the batch in the background. This is the path for migrations, ATS exports, and employers the scraper cannot backfill.

For an always-on feed URL that stays in sync on a schedule, see Recurring XML feeds.

Before you begin

Prepare a UTF-8 CSV with a header row or a well-formed XML feed no larger than 10 MB. Include stable application URLs or external IDs where the source provides them, and begin with a representative sample containing the locations, descriptions, and optional fields you need mapped.

Open the importer

  1. Go to Jobs in the sidebar
  2. Click Import
  3. Upload a .csv or .xml file (max 10 MB)

The import runs in the background. You can leave the page while it processes.

File formats

CSV

Use a standard CSV with a header row, UTF-8 encoding, and comma delimiters. Column names do not need to match Cavuno field names. AI maps them on the first upload from a given source and reuses that mapping on later uploads when the header fingerprint matches.

Common columns include title, company, location, description, salary, employment type, application URL, and external ID. Unrecognized columns can still be mapped if the AI recognizes them, or left unmapped.

XML

Drop in a flat job feed (<source><job>…</job></source>) or an RSS-style channel feed (<rss><channel><item>…</item></channel></rss>). Nested elements become dotted paths (salary.min), attributes become @-prefixed keys, and namespace prefixes are stripped so <gj:title> reads as title. HTML inside CDATA is preserved through sanitization.

What happens on import

  • AI column mapping: header (or XML field) names map to Cavuno job fields. Repeat uploads from the same shape reuse the previous mapping
  • Location resolution: locations geocode to canonical cities, regions, and countries so browse pages stay consistent
  • Deduplication: three layers: application URL, external ID / reference number, then company + normalized title, location, and description fingerprint. Re-import updates the existing listing instead of creating a duplicate
  • Background processing: large files process without blocking the UI. Progress streams as rows land
  • Automatic expiry: imported jobs expire if the apply link is dead. See Expired jobs

When to use import vs backfill

GoalUse
Migrate from another board or ATS exportOne-shot CSV/XML import
Keep a partner or aggregator feed in syncRecurring XML feed
Continuously pull from company careers pagesBackfill
Company careers page is custom or LinkedIn-onlyOne-shot or recurring import of their export

Verify the import

Compare the created, updated, and skipped counts, then open representative listings from Jobs to check company, location, description, status, and application URL. Re-import a small unchanged sample and confirm it updates or matches the existing jobs rather than creating duplicates.

Troubleshooting

  • The importer maps a field incorrectly: correct the source header where possible and retry with a small sample; keep the sample and observed mapping when contacting support.
  • A row is skipped: check required job data, the application URL, and whether the job already matches an existing listing.
  • A location is unexpected: inspect the original location string and use an unambiguous city, region, and country in the source file.
  • The batch appears stuck: keep the file name and approximate upload time, then contact support rather than repeatedly uploading the full batch.

Frequently asked questions