EasyJobsManager can bulk-import jobs from a CSV file you prepared yourself — a spreadsheet export, a feed from your applicant tracking system, or a simple file you built by hand. The CSV importer lives under Components → EasyJobsManager → Jobs → Job Import as the CSV Upload tab.
The Job Import screen shows two rows of tabs:
- Row 1 — source: CSV Upload · CareerJet — pick which importer to work with.
- Row 2 — surface: Import · Presets · History — switch between the wizard, the list of saved presets for the current source, and the log of past runs.
Presets and History no longer appear as separate sidebar entries; they live inside Job Import via the second tab row. Switching the source row preserves the surface, so if you're on CSV → Presets and click CareerJet, you land on CareerJet → Presets.
Key features:
- Upload any delimited file (comma, semicolon, tab, pipe)
- Import a file that already lives on the server (picked from the Media manager) — no upload needed
- Preview the first rows before committing
- Map each CSV column to a job field, including custom fields
- Auto-map suggestion based on column names
- Save repeatable mappings as presets
- Create missing companies / places / industries on the fly
- Skip or update duplicates using the External reference column
- See every import in the Import History log
Quick start
- Click Download sample CSV on the upload screen to grab a ready-to-edit template (
jobs_sample.csvinmedia/com_easyjobsmanager/samples/). - Replace the sample rows with your own data — keep the header row intact.
- Upload the file, click Auto-map headers, then Next.
- Review the options, click Start import.
Step 1 — Upload
| Option | Description |
|---|---|
| Import source | Upload from computer (default) or File on server. The second option imports a file that is already on the website server — see Importing a file already on the server below. |
| CSV file | Shown for the Upload from computer source. The file to import; max size is limited by PHP's upload_max_filesize. |
| Server file | Shown for the File on server source. Click Select to pick the file from the Media manager (the path cannot be typed by hand). |
| Auto-detect settings | Toggle (on by default). When on, EasyJobsManager samples the file when you click Parse CSV and figures out the delimiter, enclosure, and header row for you — the three manual dropdowns disappear to keep the screen uncluttered. Flip it off if you need to set them by hand. |
| Delimiter | Only visible when Auto-detect is off. Comma, semicolon, tab, or pipe. |
| Enclosure | Only visible when Auto-detect is off. Double quote or single quote — used to wrap values that contain the delimiter. |
| First row is header | Only visible when Auto-detect is off. Leave Yes if your file has a header row. Column names will drive the auto-mapper. |
| Load a saved preset | Optional — preloads the delimiter, enclosure, header setting, column mapping, and options from a previous run. Selecting a preset turns Auto-detect off (so the preset's own parse settings are used) and reveals the Upload & import button. After you choose your file, the saved mapping is shown on the mapping screen exactly as it was saved — it is not replaced by a fresh auto-map. |
After submission, the first five data rows are parsed and shown on the mapping screen so you can sanity-check the file. If Auto-detect was on, a banner at the top of the mapping screen reports what was detected — Detected: delimiter = Comma (,) · enclosure = Double quote · header row = Yes (confidence: high) — with a yellow tint when the confidence is low so you know to go back and pick values manually.
Importing a file already on the server
If the file you need to import is already on the website server — uploaded by FTP, dropped there by another system, or refreshed nightly by a feed — switch Import source to File on server. Click Select to open the standard Media manager picker and choose a .csv, .tsv, or .txt file from one of the Media manager folders (by default images/ and files/; these are configured in System → Plugins → FileSystem - Local). Files outside those folders cannot be imported.
From there the wizard works exactly as with an upload. Two differences worth knowing:
- The file stays on the server after the import (only the importer's temporary working copy is removed), so the same path can be imported again any time — just overwrite the file with fresh data and re-run.
- The chosen path is saved with presets. A preset saved while File on server is active remembers both the source and the full path, which makes a recurring import truly one click (see below).
One-click import with a preset
When a preset is selected, an Upload & import button appears next to Parse CSV. Choose your file and click it to run the whole import in one step — the preset's mapping, options, and parse settings are applied and the import starts immediately, skipping the mapping/options review screens. This makes a recurring import as simple as pick preset → pick file → one click.
For a preset saved with the File on server source, the button reads Run import from server file and there is nothing left to pick at all — the preset already knows the path, so running the latest version of the server file is literally a single click (or use the Run import button next to the preset on the Presets list).
The mapping is stored by column position, so the file you upload must keep the same column order as when the preset was saved. (Same-source exports — e.g. a nightly feed — always match.) If you change the layout, use Parse CSV instead and re-save the preset.
Step 2 — Map columns
Each CSV column gets a row in the mapping table with three controls:
- Map to — the job field, salary field, or custom field that should receive the values. Pick Do not import to ignore a column.
- Create if missing — only appears for lookup fields (Company, Place, Industry, Time type, Contract type, Length of employment). When enabled, an unknown value becomes a new lookup row; when disabled, the row fails with a clear error.
- Sample values — previews what will be imported so you can verify the mapping before running.
Available mapping targets
- Core fields — Title, Description, External URL, Address, Latitude, Longitude, Responsibilities, Requirements, Offer, Start / Finish publishing, External reference, Meta keywords, Meta description, Hours per week, Required education, Required languages, Language, Published, Job from / to.
- Lookups — Company, Place, Industry, Time type, Contract type, Length of employment. Matched by title; creatable on the fly. A value created on the fly is saved published and public, so it shows up straight away in the job editor's drop-downs and on the public site. (If a job's Industry/field is later unpublished in the Categories manager, the job editor still shows it as the current selection rather than blanking it.)
- Nested Place / Industry values. For Place and Industry you can import a two-level value in a single column using the
Parent > Childformat — for exampleFlorida > Jacksonville(state → city) orAgriculture, Forestry, Fishing and Hunting > Crop Production(category → sector). With Create if missing enabled, the importer creates the parent (if needed) and then the child nested under it. Plain values without>import as a normal top-level entry, exactly as before. (>is used as the separator because commas commonly appear in real location and industry names.)
- Nested Place / Industry values. For Place and Industry you can import a two-level value in a single column using the
- Salary — Salary min / max, Currency (ISO code), Salary type, Salary display. Salary display accepts either the numeric mode id (0=Range, 1=From only, 2=Up to, 3=Fixed, 4=Negotiable, 5=Hidden) or a label such as
negotiable,from,up to,fixed, orhidden; unmapped or unknown values default to Range. - Custom fields — Any custom field published under the
com_easyjobsmanager.jobcontext (Jobs → Custom Fields). Calendar (date) fields are recognised automatically: the importer normalises parseable date strings toYYYY-MM-DDso the value renders through Joomla's calendar plugin; unparseable strings (e.g. locale-ambiguous15/05/2026) are stored as-is without dropping the row.
Auto-map
Click Auto-map headers to let EasyJobsManager match each CSV header to the best target based on normalised names and a list of aliases. You can still override any row manually.
Meta description can be filled in automatically. When the Generate meta description option (Step 3, on by default) is enabled and a row has no Meta description (column not mapped, or blank), the importer derives one from the first 150 characters of the job's Description — the same thing that happens when you save a job by hand — so imported jobs aren't left with an empty SEO description. Mapping the column yourself always takes precedence, and the toggle is saved with presets. Turn it off if you'd rather leave meta descriptions empty.
Location coordinates (latitude / longitude)
When the map feature is enabled and a Google Maps API key is set (Job Manager → Options → Map), the importer fills in coordinates so map pins and radius search work for imported data:
- Jobs — if you map the Latitude/Longitude columns, those exact values are used. Otherwise the importer geocodes the job's Address to set the job's coordinates (the same thing that happens when you save a job by hand).
- Places — a newly-created Place (location) gets coordinates too: from the row's Latitude/Longitude columns if present, otherwise by geocoding the place name. This is what makes radius search find jobs in imported locations. A Place that already has real coordinates is never overwritten, so re-importing won't disturb places you've positioned manually.
If the map feature is off or no API key is set, coordinates are only written when your CSV explicitly provides Latitude/Longitude columns — exactly as before.
Step 3 — Options
| Option | Default | Notes |
|---|---|---|
| If a job with the same reference already exists | Skip | Matching uses the mapped External reference column. Switch to Update to overwrite existing jobs. |
| Default published state | Published | Applied when the Published column is not mapped. Jobs imported as Published with no Start publishing date are automatically set to go live today. |
| Default language | * (all languages) |
Joomla language tag. |
| Rows per batch | 50 | The import is run in chunks; increase for speed, lower if your server times out. |
| Generate meta description | On | When a row has no mapped/blank Meta description, fill it from the first 150 characters of the Description (matches saving a job by hand). Turn off to leave it empty. |
The duplicate key is the job's xreference column — the same field used when you type in an External reference in the job editor.
Save a preset
On the Options step, once the mapping and options are dialled in, click Save mapping as preset (next to Start import), give it a name, and confirm. Because you save from this step, the preset captures the options you actually chose — If a matching job already exists (skip/update), Match existing jobs by, default published state, default language, rows per batch, and the Generate meta description toggle — rather than the defaults. A preset therefore captures everything needed to repeat the import: the parse settings (delimiter, enclosure, header), the full column mapping, all options, and the import source — including the server file path when File on server was used. Next time, just select it on Step 1 and use Upload & import for a one-click run (see One-click import with a preset above). Presets are shared across all admins and live under the Presets sub-tab of Job Import (with CSV selected as the source) — where each published preset also has a Run import button that opens the wizard with that preset preselected, so all that's left to do is pick the file (or nothing at all for a server-file preset).
Why imported jobs might not show on the site: a job only appears on the public listing once it has a Start publishing date that is in the past or present. The importer fills this in automatically (today's date) for any job imported as Published that has no date in your file, and leaves Finish publishing empty so the job does not expire unless your file supplies an end date. Note that the global Job activation setting (Options → Job Item) does not affect imports — it only controls jobs that employers post through the website front end.
Step 4 — Run
The wizard kicks off the import chunk-by-chunk. A live progress bar and log show exactly what happens to every row:
- imported — a brand new job was created.
- updated — an existing job (same external reference) was overwritten.
- skipped — the row was a duplicate and the Skip option was chosen.
- error — the row could not be processed; the reason is printed next to the row number.
When the import completes, the importer's working copy of the file is deleted from the server. For an Upload from computer run that is the uploaded file itself; for a File on server run only the temporary copy is removed — the original file stays where it is. Click View imported jobs to jump to the Jobs list, or View import history to open the full log.
Running the import automatically (cron)
Everything above happens in the browser. If your CSV is refreshed on a schedule — a nightly feed dropped into files/ by another system, for example — you can have the server run the import for you, with no one logged in.
This uses Joomla's own command line tool. It needs the Console - Easy Jobs Manager plugin enabled (it is enabled automatically when you install the package) and shell access to the server.
/usr/local/bin/php /home/public_html/yoursite/cli/joomla.php \
easyjobsmanager:import:csv --preset="Nightly feed" --file=files/jobs.csv
Add that line to your hosting control panel's cron scheduler (or a crontab) at whatever interval you need.
| Option | Required | What it does |
|---|---|---|
--preset |
Yes | The preset to use — its exact title (in quotes if it contains spaces) or its numeric id. Capitalisation doesn't matter. |
--file |
Yes | Path to the CSV, relative to the site root, e.g. files/jobs.csv. An absolute path also works. |
--user |
No | Id of the user credited as the author of the imported jobs. Defaults to the first Super User. |
--chunk |
No | Rows processed per batch (default 100). Lower it if the job hits a memory or time limit. |
Everything else — delimiter, enclosure, header row, the column mapping, and the duplicate-handling options — comes from the preset, exactly as you saved it in the wizard. Create the preset in the browser first, run it once by hand to confirm the mapping is right, then point cron at it.
The same rules as the browser apply: the file must sit inside a Media manager folder (images/ or files/ by default), the original file is left untouched so the same path can be re-imported every night, and the run is recorded in Import history with its full per-row log.
Reading the result
The command prints a summary you can have cron email you:
Preset: Nightly feed (id 3)
File: files/jobs.csv
User: 842
---------- ------------
Imported 12
Updated 3
Skipped 140
Errors 2
History import #57
---------- ------------
row 18: Company ACME Widgets does not exist. Enable Create if missing or pre-create it.
row 91: Missing required field: Title
[WARNING] 2 of 157 rows failed. Full log and error CSV: Admin -> Jobs -> Import History -> import #57.
It also sets an exit code, so monitoring tools can tell a clean run from a broken one:
| Code | Meaning |
|---|---|
0 |
Finished, every row processed cleanly. |
1 |
Finished, but one or more rows failed. The rest were imported. |
2 |
Nothing was imported — bad preset name, missing file, or a database error. |
No password or secret key is needed, and you should not invent one. Anyone able to run this command already has shell access to your server, so a key in the crontab line would add no protection — it would only leak into process listings, shell history, and backups. If you need to trigger an import from a URL instead (because your host offers no shell), that is a different mechanism; contact support.
Cron troubleshooting
Command "easyjobsmanager:import:csv" is not defined.— the Console - Easy Jobs Manager plugin is disabled. Enable it under System → Plugins, then check it appears inphp cli/joomla.php list.- "No published import preset matches …" — the command lists the presets it can see. Check the spelling, and that the preset is published.
- Nothing happens / "command not found" — use the full path to the PHP CLI binary, which is often not the same PHP your website runs on. Your host can tell you the correct path.
Import history
The History sub-tab of Job Import (with CSV selected) lists every run with counts for total, imported, updated, skipped, and errors. Click a row for the full per-row log and to download error rows back as CSV for troubleshooting or retry.
A Source column tells you how each run was started:
| Badge | Meaning |
|---|---|
| Manual | Started from the Import wizard in the browser — an upload, a server file, or a one-click preset run. |
| CLI | Started from the command line by easyjobsmanager:import:csv, i.e. your cron job. |
Use the - All sources - dropdown to show only one kind — handy for checking at a glance that last night's cron actually ran, without the manual runs getting in the way. The column is sortable, and the detail page spells the source out in full.
Runs recorded before you upgraded to the release that added this column all show as Manual. That is accurate rather than a guess: the CLI command did not exist then, so every one of them was started from the browser.
Troubleshooting
- "Only .csv, .tsv, and .txt files are accepted" — rename the file or re-export. Excel's
.xlsxis not supported; save as CSV first. - "That server path is not allowed" — server-file imports can only read from the Media manager folders (
images/,files/by default). Move the file into one of those folders, or add its folder in System → Plugins → FileSystem - Local. - CSV files don't show in the server file picker — the Media manager only lists extensions allowed in its options.
csvandtxtare allowed by default; for.tsvadd it to Legal Document Extensions under Content → Media → Options. - "Company "…" does not exist" — enable Create if missing on the Company column, or pre-create the advertiser under Companies.
- All rows end up in "skipped" — the External reference is already in the database. Switch the duplicate option to Update if you meant to refresh existing jobs.
- Import stops halfway — lower the Rows per batch (e.g. to 20) to stay under PHP execution limits.