Bulk upload invoices

Last reviewed: 2026-08-27 · Last updated: 2026-08-27

Scope: How to upload invoice CSV files, map fields, review results, and submit valid invoices.

Update: Rewritten to match the current upload page, including the two automatic checks and the mapping options.

JomeInvoice supports two invoice modules and four ways to bring invoices in. Here's how it all fits together:

How invoices flow into JomeInvoice

Inbound methods

Created at Jome (Manual Creation) Uploaded at Jome (Direct Upload) SFTP API

Invoice modules

Sales - invoices you issue to customers Self-Billed - on behalf of suppliers

After entry

Approve & Submit → straight to LHDN Save as Inbound Draft → submit later

Both Sales and Self-Billed invoices can be included in the same CSV upload.
How to submit to LHDN →

Direct Upload accepts CSV format only, up to 1 GB per file. You can configure field mapping so your existing CSV headers work even if they differ from the ones JomeInvoice expects.

Before you start

Direct Upload works from a mapping template: the list of which column in your file holds each piece of invoice information. Every upload uses one.

If your workspace has never set one up, the upload page shows No mapping template configured with a Create Default Template button, and you map the fields before you can submit. Setting the mapping up in advance is easier - see Set up your Direct Upload field mapping.

Step-by-step

Prefer to watch first? This demo runs through a CSV upload from the file to the Import Log. It was recorded on an earlier version of the upload page, so some labels and sections differ from what you will see - follow the written steps.

  1. Go to the invoice module Open Sales or Self-Billed from the left navigation - whichever matches your invoice type. You can upload both Sales and Self-Billed invoices in the same CSV file.
  2. Select Uploaded at Jome In the module header, select the Uploaded at Jome tab. Inbound and Outbound both offer the upload.
  3. Click Upload No Upload button? Your role needs permission to create invoices in that module - see User roles and permissions.
    The Direct Upload Invoice popup opens with:
  • a drop zone - Import CSV File, Click to upload, or drag and drop CSV file here, Max file size: 1 GB
  • Configure Mapping - takes you to your mapping templates in Settings
  • Download CSV Template - a CSV whose header row is built from your own mapping template, so the columns match what your workspace already expects. It is not a blank standard template, and it only works once your template has mappings in it.
  1. Prepare and upload your CSV Fill in your invoice information - one row per line item. Everything LHDN requires must be present. If you export from your own system and keep your own column headings, the mapping handles the translation.
    Drag and drop the file, or browse to it. JomeInvoice reads the file and opens the upload page.
  2. Step 1 - Configure Upload Check the settings for this file before you send it:
  • Date format - JomeInvoice pre-fills the format saved on your template and tells you when it has: "Using this template's saved default - confirm it matches your file." Open the file and check a real date before moving on. 2-7-26 is the 2nd of July to one format and the 7th of February to another, and neither file looks broken.
  • Branch and Department - shown when your workspace has more than one. Branch defaults to your HQ.
  • Change file - swaps in a different CSV without leaving the page. Your template, date format, branch and department choices are kept.
  • Edit Mapping - opens the mapping for this upload, covered in step 7.
  1. Check what the two automatic checks tell you JomeInvoice checks the file as soon as it can, and shows the result on the same screen.
  • All the required fields are successfully mapped. - your headers cover everything required. The X/Y Fields count beside it is how many rows of your mapping template have a column assigned, not a score for your data.
  • N required column(s) are missing from your CSV file. - each missing one is listed. Add the column to your file, or map it.
  • N column(s) in your CSV are not mapped in the template and will be ignored. - each ignored column is listed. This is the one to read carefully. Anything on that list is dropped, and this notice is your only warning. If data is missing from your invoices after an upload, check this list first.
  • Checked N row(s) from your file - they match the settings above. - JomeInvoice also tries a few real rows from your file against your mapping and date format. If they do not match you get "Some rows from your file don't match the settings above - check the date format before submitting" with the reason for each row, and Submit stays disabled until you fix it.
  1. Adjust the mapping, if you need to Edit Mapping opens Edit Field Mapping, where you can switch template, search fields, add a field from the field catalog, and set which of your columns feeds each field. Two ways to finish:
  • Use for this upload only - applies to this file and nothing else. Your saved template is untouched. Use this for a one-off file or a file from a different system.
  • Set as new default - saves into the template itself, for every future upload.

    Set as new default saves straight away. There is no confirmation step and no undo, and it replaces the template's mapping rather than adding to it. If this file is a one-off, use Use for this upload only.

  1. Submit - choose upload type Submit offers two choices, and the whole file is submitted either way:
  • Inbound Draft - uploads as consolidated. Use this for B2C monthly consolidation batches.
  • Approve and Submit - submits to LHDN as non-consolidated. Use this for standard B2B invoice submissions.

    Choose the right upload type - Inbound Draft and Approve and Submit follow different submission flows and cannot be easily undone once submitted.

  1. Step 2 - Upload & Process The page reports progress while your file uploads and is processed, and shows the Session and File Transfer ID for this upload. Those are the two references to quote if you contact support about it. If something fails you get Retry, which brings you back to step 1 with your file still loaded.
  2. Step 3 - Upload Results When processing finishes, results appear on the same page:
  • N receipt(s) processed and, in the summary cards, a pass rate as X/Y Passed
  • separate Sales and Self Billed cards, each broken into Invoice, Debit, Credit and Refund
  • a row for every receipt, with Receipt / Invoice, Issue Date, Currency, Amount, Import Status, Receipt Status, Invoice Status and Remark. The receipt or invoice number links to the document itself.
  • Export CSV - downloads your rows with the outcome of each one recorded against them, so you can fix the failures and re-upload just those.
  1. Track it in the Import Log Every upload is recorded in the Import Log under its Direct Upload tab, with columns for File Name, Trans.Type, Import Status, Created On, Import Result, # Receipt and Result. View reopens the results above for that upload.

If some rows did not come through

Rows that fail are not created, and the rest of the file still goes through - a partly successful upload is normal, not an error.

Work from the Remark column, which tells you what happened to each row:

Remark What it means What to do
This is a duplicated invoice that is uploaded before That invoice number already exists from a different file Nothing, if it was already uploaded on purpose. If it was not, check whether the number is reused in your source system.
Reprocessed in a later import A later upload replaced this row Work from the later upload instead
A validation message That row failed a check Fix it in your source file and upload the corrected rows

Use Export CSV to get every row with its outcome, correct the failures there, and upload the corrected file. For error messages you cannot place, see Fixing import and upload errors.

The counts in the summary cards only count invoices this upload created. A duplicate row shows the status of the invoice that already exists, so a file whose only row was a duplicate can read 0/1 Passed while the row beside it looks healthy. That is expected.