The EDI Orders app reads CSV files from your suppliers, marketplaces, or ERP system and writes the data straight into your J2Commerce store. Each import template you create targets one kind of data — order statuses, stock levels, prices, customers, products, or product images — and remembers the column mapping, file source, and safety settings so you can run the same import again and again without re-configuring it.
Requirements
- Joomla 6.x
- J2Commerce 6.x
- PHP 8.1 or later
Purchase and Download
This app is a separate add-on available from the J2Commerce Extensions Store. It is not included with the core J2Commerce 6 component.
- Visit www.j2commerce.com and navigate to Apps.
- Find EDI Orders, click View Details, then Add to Cart and complete checkout.
- Go to My Downloads under your profile menu, then click Available Versions -> View Files -> Download Now to save the ZIP file.
Install the App
- In the Joomla admin, go to System -> Install -> Extensions.
- Upload the
plg_j2commerce_app_edi.zipfile using the upload panel, or use Install from URL. - Joomla installs and enables the plugin automatically.
Enable the App
- In the Joomla admin, go to J2Commerce -> Apps.
- Find EDI Orders in the list. If the status icon shows red, click it to enable the app.
Open the App
Click the EDI Orders title in the Apps list. The app opens with three tabs:
- Dashboard — a summary of recent import runs.
- Templates — where you create and manage import templates.
- Logs — a row-by-row history of what each run imported, skipped, or refused, with reasons.
Creating an Import Template
- Open the Templates tab and click New.
- Under Basic Information, give the template a Title and choose an Import Entity — the kind of data this template will write. See Import Entities below.
- Fill in Import Options, File Source, and CSV Settings for how the file arrives and how it is parsed.
- Open the Column Mapping step and map each column in your CSV file to a target field. The fields available here change depending on the Import Entity you chose.
- Save the template.
Test with Run Preview first
Every template can be run in two ways: Run Preview checks the whole file and reports what would happen without changing anything in your store. Run Live Import writes the changes for real. Always run a preview first, especially the first time you use a new template.
Import Entities
Choose the Import Entity that matches what your CSV file contains. Each entity only shows the column-mapping targets that make sense for that kind of data.
| Import Entity | What it does |
|---|---|
| Order Status Update | Updates the status of existing orders (for example, from Processing to Shipped). |
| Order Shipment | Attaches tracking numbers and carrier details to existing orders, and can move the order to a chosen status. |
| Product Stock Level | Updates stock quantities on existing products, and can also flip a product's in-stock/out-of-stock status. |
| Product Price | Updates pricing on existing products. |
| Category | Creates or updates product categories. |
| Manufacturer | Creates or updates manufacturers/brands. |
| Customer | Creates or updates customer accounts. |
| Customer Address | Creates or updates addresses on existing customer accounts. |
| Product | Creates new products or updates existing ones, matched by SKU or product ID. |
| Product Variant | Updates existing product variants (SKU-level records) by their own SKU, optionally narrowed to one parent product. See Product Variant below. |
| Product Images | Attaches a main image and additional images to a product that already exists, matched by SKU or product ID. See Product Images below. |
| Custom (Any Table/Column) | An advanced mode for mapping CSV columns to any table and column your import doesn't fit a dedicated entity for. |
For Order Shipment, choose the status the order should move to after the tracking number is recorded under Move Order To Status — if you leave this blank, the tracking is saved but the order's status does not change.
For Product Stock Level, turn on Update Stock/Availability Status if you also want a quantity of zero to flip the product to out-of-stock (and a positive quantity to flip it back).
For Customer, choose how new accounts get a password under Password Mode, whether new customers must reset their password on first login, and which customer group new accounts join.
Existing Products (Product, Product Variant, and Product Images)
The Product, Product Variant, and Product Images entities share a set of settings under the Existing Products fieldset:
| Setting | Description | Default |
|---|---|---|
| Match Products By | The column that identifies a product already in your store. Product ID matches the J2Commerce product ID. SKU matches the SKU of the product's main variant. If a SKU matches more than one product, the row is skipped — the app never guesses. | SKU |
| Overwrite Existing Product IDs | Product and Product Variant only. When No, a row that matches an existing product is skipped. When Yes, matching rows update the existing product. | No |
| When a Product Already Exists | Product and Product Variant only. Fill missing fields only writes into empty fields. Overwrite replaces existing values with the file's values. | Fill missing fields |
Product Images always updates an existing product (it never creates one), so it uses its own When Product Images Exist setting instead — see below.
Product Variant
The Product Variant import entity updates existing variants (SKU-level records) — it never creates a new one. Map a column and check it as the Lookup Key against the variant's own SKU; the app finds the matching variant and updates the columns you've mapped onto it.
Narrowing to a Parent Product
You can optionally map a second column to the variant's Product ID field to narrow the match to one parent product. This column accepts either value, and the app detects which one you've supplied:
- A plain number is treated as the literal J2Commerce product ID.
- Anything else is treated as the parent product's own SKU — specifically, the SKU of that product's main (master) variant — and resolved to a product ID automatically. If that SKU matches more than one product, the row is skipped as ambiguous, the same rule Match Products By uses elsewhere.
This is useful when your supplier file identifies the parent product by its own SKU rather than its J2Commerce product ID, so you don't need a separate lookup step to convert one to the other before importing.
Product Images
The Product Images import template attaches a main image, main image alt text, and a list of additional images (with their own alt texts) to products that already exist in your store. It never creates a product. Use a Product template to import your catalog first, then run a Product Images template afterward, using a file with the same SKU or product ID column plus image columns, to attach photos.
How Matching Works
Product Images uses the same Match Products By setting described above (Product ID or SKU). If the SKU or product ID in a row doesn't identify exactly one product, that row is skipped and noted in the log — the app never guesses which product a photo belongs to.
Column Mapping
A Product Images template can map only these four target columns, plus the lookup column (product ID or SKU) used for matching:
| Column | Description |
|---|---|
main_image | Path or URL to the product's main image. |
main_image_alt | Alt text for the main image. If left blank, the app uses the product's own title. |
additional_images | One or more additional image paths/URLs. |
additional_images_alt | Alt text for each additional image, in the same order. |
Multiple additional images in one column. List more than one additional image in a single CSV
cell using the Additional Images Separator (default |, pipe) — for example:
photo2.jpg|photo3.jpg. Alternatively, map several CSV columns to additional_images (and the
matching alt columns to additional_images_alt) instead of using a separator; the app reads them
in mapping order.
If you supply fewer alt texts than images, the missing ones fall back to the product's title. Extra alt texts with no matching image are ignored.
Updating only alt text. You can map main_image_alt and/or additional_images_alt on their own,
without mapping the matching image column at all. The app updates just the alt text on the product's
existing images and leaves the image files themselves untouched — a quick way to fix alt text across
your catalog without re-supplying every image.
Template Settings
These settings live under the Product Images fieldset on the template form.
| Setting | Description | Default |
|---|---|---|
| Image Source | Where the image values in your file point. Files on this site reads paths relative to the site root. Download from URLs fetches http and https addresses. Both (detect per value) accepts either, per row. Only Super Users can turn on downloading. | Files on this site |
| Local Image Folder | Local image paths must resolve inside this folder (and it must itself be inside your images folder). | images |
| Image Folder | The folder imported images are saved to, inside your images folder — never your original files. Thumbnail and tiny images are created automatically in its thumbs and tiny subfolders. To browse imported images in the product form's image gallery, add this folder to Image Directories under J2Commerce's Image Upload options. | images/com_j2commerce/products |
| Process Images | When Yes, images are resized, converted to WebP, and thumbnail/tiny versions are generated automatically, using the same Image Upload settings as J2Commerce -> Options -> Image Upload. | Yes |
| When Product Images Exist | Fill missing fields only adds images to products that don't have any yet — the safest choice. Append adds the file's additional images after the ones the product already has. Overwrite replaces the images entirely. | Fill missing fields |
| Additional Images Separator | The character used to list more than one additional image in a single CSV cell. | | (pipe) |
| Maximum Image Size (MB) | The largest image file the app will accept. | 10 |
| Download Timeout (seconds) | How long to wait for a remote image to download before giving up. Only shown when Image Source allows downloads. | 15 |
| Allow Multi-Row Products | Turn this on for exports (like Shopify's) that list one product per row, followed by extra rows that carry only more images with no SKU or product ID repeated. With this on, a row with an empty SKU/product ID attaches its images to the product named on the row directly above it. Leave it off when every row names its own product — rows with an empty SKU/product ID are then skipped. | No |
Allow Multi-Row Products survives a paused scheduled run
When a scheduled run stops partway through a large file and picks up again on its next tick (see Scheduled Imports below), the app remembers which product the last processed row belonged to. A chain of image-only rows is never broken just because a run happened to pause between them.
Time and Size Limits Apply Within a Row, Not Just Between Rows
Every import run has an overall time and download-size budget, shared across every image it downloads. This budget is checked between each image, not just between each row — so a single row that lists many remote images (see Additional Images Separator above) can't quietly use up the whole run's budget on its own before the next row even starts. If the budget runs out mid-row, the remaining images in that row are refused and the row is logged accordingly; already-placed images from earlier in the run are kept.
What Happens to Replaced Images
When When Product Images Exist is set to Overwrite, the old image files are kept on disk — they are never deleted, so nothing is lost by accident. Over time this can leave unused files behind; periodically review your Media Manager and remove any images you no longer need.
Security Notes
- Only image files are accepted. JPG, PNG, GIF, and WebP files are allowed. Anything else — including SVG files — is rejected, even if the file extension is disguised.
- Downloading from URLs is restricted to Super Users. Any other administrator who saves a template with Download from URLs turned on will have it automatically reset to Files on this site.
- Downloads never reach your internal network. The app only fetches from public internet addresses — it refuses local, private, and internal network addresses, so a malicious URL in a CSV file cannot be used to probe your server or network.
- Validate Only performs a true dry run. Running a Product Images template with Run Preview checks the file, the product matches, and every image reference without downloading, writing, or changing anything.
- Downloaded image URLs are redacted in the import log. If a remote image address includes a
query string — for example a signed download token some suppliers attach to their URLs — that
part is replaced with
?[redacted]wherever the value appears in the Logs tab. The address itself (scheme, host, and path) still shows, so you can tell which image a row referred to.
Typical Workflow
- Import your catalog first using a Product template — this creates the products.
- Prepare a second file with the same SKU or product ID column, plus your image columns
(
main_image,main_image_alt,additional_images,additional_images_alt). - Create a Product Images template, map those columns, and set your Image Source and folder settings.
- Run Run Preview to confirm the report looks correct.
- Run Run Live Import to attach the photos.
Unreferenced Images Report
Over time, an Overwrite run on a Product Images template can leave old image files on disk that no product uses any more (see What Happens to Replaced Images above). The Unreferenced Images report finds those files for you.
Where to Open It
On the Dashboard tab, open the Templates button in the toolbar and choose Unreferenced Images.
What It Lists
The report scans every Image Folder configured on your Product Images templates — including
their thumbs and tiny subfolders — for image files that no product's image record references. It
shows each file's path, size, and last-modified date, and you can search or sort the results.
It's Read-Only
There is no delete action on this screen, and running it never deletes, moves, or changes anything. The EDI Orders app never deletes image files during a normal import either — an Overwrite run keeps the old files on disk rather than removing them — so this report exists purely to help you find files worth reviewing yourself in the Media Manager.
Who Can See It
This report is available to administrators who hold both the Edit Products permission and Access Administration Interface on the J2Commerce component — a stricter bar than the plain Edit Products permission every other Product Images screen uses, since this report reads across every configured Image Folder rather than acting on one already-identified product.
Scan Limit
The scan stops after 20,000 files across all folders combined. If your store has more image files than that, the report tells you the scan was capped — run it again after clearing some files, or narrow your templates' Image Folders.
Running a Template
- Open the template from the Templates tab.
- Click Run Preview to check the file without changing anything, or Run Live Import to write the changes.
- Review the results on the Logs tab — every row is recorded as imported, skipped, or failed, with a reason.
Run Live Import cannot be undone from this dialog
Run Live Import writes directly to your database. Always run Run Preview first and review the results before running the live import.
Deleting a log. Deleting an import log — on its own or as part of a bulk delete — requires the same permission the log's import type itself required to run. For example, deleting a log from an Order Status or Order Shipment import requires the Edit Orders permission on J2Commerce; deleting a log from a Customer or Customer Address import requires the Configure permission on the Users component, the same permission that import needed to create the accounts in the first place. This keeps a log's row-by-row detail (which can include customer or order data from the original file) visible only to administrators who could act on that data in the first place.
Scheduled Imports
Import templates set to run on a schedule are covered under Import Options -> Trigger Mode when creating a template, and need a one-time Joomla scheduled task — set this up from System -> Scheduled Tasks -> New and choose EDI: Run Imports.
A large file can take longer to import than a single scheduled run allows. The Rows Per Scheduled Run setting, under the template's Scheduled Runs fieldset, caps how many rows one scheduled run processes before it stops and picks up where it left off on the next run. You can also click Resume on an incomplete run's entry in the Logs tab to continue it immediately, without waiting for the next scheduled tick.
- Resume can't overlap a scheduled run for the same file. If you click Resume at the same moment a scheduled run is already processing that file, the app safely skips one of the two rather than letting both write at once — try Resume again in a moment.
- A missing uploaded file closes out its run instead of blocking future imports. If the file behind an incomplete scheduled run has been removed (moved, cleared from the processed-files folder, and so on) before the run could finish, the app can no longer resume it. Rather than leaving that run stuck and blocking every later scheduled import for the same template, it closes the run out as failed and lets your schedule continue normally from the next file.
Troubleshooting
A Product Images row is skipped as "ambiguous"
Cause: The SKU or product ID in that row matches more than one product image record, or more than one product, in your store.
Solution: Open the affected products in J2Commerce -> Catalog -> Products and confirm the SKU is unique, or switch Match Products By to Product ID if your file includes it.
Product images don't appear in the product form's image gallery
Cause: The gallery only lists folders configured under Image Directories in J2Commerce's Image Upload options. The imported images are still saved and shown on the product page and storefront.
Solution: Go to J2Commerce -> Options -> Image Upload and add your template's Image Folder to Image Directories.
"Only Super Users can turn on image downloading" warning
Cause: An administrator without Super User access tried to save a Product Images template with Image Source set to Download from URLs or Both.
Solution: Have a Super User configure the template, or use Files on this site and place the images on the server yourself (for example via FTP) before importing.
An image is refused during import
Cause: The file is not one of the accepted types (JPG, PNG, GIF, WebP), is larger than Maximum Image Size (MB), or the source path/URL could not be reached.
Solution: Check the row's reason in the Logs tab, fix the file or the file reference in your CSV, and re-run the template.