You can move all your existing invoices into Cybooks in one go. Upload a CSV file and Cybooks creates the invoices, customers (if they don't exist yet), and the matching journal entries — exactly as if you had typed each invoice by hand.
Invoice import is a Premium feature. You can import up to 1,000 rows per file.
Before you start
Get a few things ready so the import runs cleanly:
The currency of every invoice must match your tenant's default currency. Foreign currency rows are rejected in this version.
The tax rule code on every line must be a sales tax rule (codes
L,M,N,O,P,Q,R,S,OSS, orT).The chart of account code on every line must be a postable income account (depth-2 account in the 4xxx range).
You can only import invoices with status
draftorawaiting_payment.paidis not supported in this version — record the payment in the UI after import.
Step 1: Download the template
Go to Imports → Invoices.
Click Download CSV template.
Open the file in Excel, Numbers, or Google Sheets.
Screenshot needed: The Imports → Invoices landing page with the "Download CSV template" button highlighted.
Step 2: Fill in the CSV
The template has columns for the invoice header, the customer, and one line per row. Multi-line invoices share the same invoice_number across rows — Cybooks groups them automatically.
Required columns
Every row must have these filled in:
Column | What to enter |
| Your existing invoice number, e.g. |
| Name of the customer. If no match is found, Cybooks creates the customer. |
| The invoice date. Accepted formats: |
| ISO currency code, e.g. |
|
|
| The description shown on the invoice line. |
| Quantity. Decimals supported (locale-aware). |
| Unit price excluding VAT. |
| One of the sales tax rule codes — see the table below. |
Optional invoice columns
Column | What to enter |
| The payment due date. Same date formats as |
| Free-text reference (PO number, etc.). |
| Per-line discount as a percentage (0–100). |
| Chart of account code — see the table below. Falls back to the import's default income account when blank. |
| OSS classification — see the OSS (One Stop Shop) imports section below for the full rules. |
Customer columns
These columns are used to match an existing customer (by VAT ID, email, then name). If no match is found, Cybooks creates the customer using whatever fields you've filled in.
Column | What to enter |
|
|
| Registered legal name (companies). |
| Your internal account/customer number. |
| Used for individual customers and as the display name when no |
| Primary email address. Also used for matching existing customers (second priority after VAT ID). |
| VAT registration number, e.g. |
| Contact details and free-text notes saved on the customer record. |
| Company registration number (e.g. |
| Bank details saved on the customer record. |
| Tax Identification Code (Cyprus). |
| Whether the customer is part of a triangular EU transaction. Accepted values: |
| A contact person on the customer. If you fill in any of these, you must fill in all three. |
| Billing address. |
| Shipping address. Same country format as billing. If left blank, the billing address is reused as the shipping address. |
Important: If you list the same invoice_number across several rows, every row in the group must validate. If one row fails, the whole invoice is rejected — Cybooks never imports a partial invoice.
Sales tax rule codes
Use the code in the line_tax_rule_code column. Only sales codes are valid for invoices.
Code | Name | Rate | Use for |
| 19% (VAT on Income) | 19% | Standard-rated Cyprus sales |
| 9% (VAT on Income) | 9% | Reduced-rate Cyprus sales (hotels, catering, etc.) |
| 5% (VAT on Income) | 5% | Super-reduced Cyprus sales (food, books, etc.) |
| 0% (VAT on Income) | 0% | Zero-rated Cyprus sales |
| Exempt Sales | 0% | VAT-exempt sales (financial services, education, etc.) |
| EU Sales of Goods (Reverse Charge) | 0% | Goods sold to a VAT-registered EU business |
| EU Sales of Services (Reverse Charge) | 0% | Services sold to a VAT-registered EU business |
| Export Non EU | 0% | Sales to customers outside the EU |
| OSS (EU B2C) | destination rate | Distance sales or digital services to EU consumers — requires |
| No VAT | 0% | Use only when your company is not VAT-registered |
Income chart of accounts
Use the code in the line_account_code column. Only postable income accounts (4xxx range) are valid for invoice lines.
Code | Account name |
| Discounts/Refunds Given |
| Non-Profit Income |
| Other Primary Income |
| Revenue - General |
| Revenue - General |
| Sales - retail |
| Sales - retail |
| Sales - wholesale |
| Sales - wholesale |
| Sales of Product Income |
| Billable Expense Income |
| Sales (default postable account) |
| Sales of Product Income |
| Uncategorised Income |
| Service/Fee Income |
| Unapplied Cash Payment Income |
| Unapplied Cash Payment Income |
| Dividend income |
| Dividend income |
| Interest earned |
| Interest income |
| Gain/Loss on Disposal of Assets |
| Gain/Loss on Disposal of Assets |
| Other Investment Income |
| Other Miscellaneous Income |
| Other operating income |
| Other operating income (expenses) |
| Tax-Exempt Interest |
| Unrealised loss on securities, net of tax |
| Unrealised loss on securities, net of tax |
If you don't know which account to use, leave line_account_code blank and pick a default account in step 3 of the wizard. 4110 — Sales is a safe choice for most businesses.
OSS (One Stop Shop) imports
Use OSS to flag invoices issued to private consumers in another EU member state. Cybooks looks up the destination country's standard VAT rate, applies it to every line, and posts the VAT to the OSS VAT control account so it lands on your OSS return rather than your domestic VAT return.
For background on how OSS works in Cybooks, see OSS Returns (One Stop Shop).
Before importing OSS rows
Your company must be EU VAT registered — turn on EU destination country tax in Settings → Organisation Profile → Private VAT.
Your company must be in an EU member state.
The customer must be a private consumer — set
customer_typetoperson(orindividual), and leavecustomer_vat_idblank. For VAT-registered EU businesses, use reverse charge codesQorRinstead.The customer must have an address with a country in another EU member state — see the address rules below.
How to flag a row as OSS
Two columns work together on every OSS line:
Column | Value | What it does |
|
| Marks the line as an OSS supply. Cybooks ignores the rule's nominal rate and uses the destination country's standard rate instead. |
|
| Physical goods shipped cross-border. Destination country is read from the customer's shipping address. |
| Digital services (software, e-books, SaaS). Destination country is read from the customer's billing address. | |
| Alias for |
One supply type per invoice. All rows that share an invoice_number must use the same oss_supply_type (or all leave it blank). Mixed values reject the whole invoice.
OSS validation rules
A row with oss_supply_type filled in is rejected if any of these are true:
line_tax_rule_codeis notOSS.oss_supply_typeis not one ofdistance_sales,services, orelectronic_services.Your company is not EU VAT registered, or your company is not in an EU country.
The customer is a business with a VAT ID — OSS does not apply to B2B sales.
The customer's billing address (for services) or shipping address (for distance sales) has no country.
The customer is in the same country as your company (domestic sale).
The customer is outside the EU.
No standard VAT rate is published for the destination country on the invoice date.
If line_tax_rule_code is OSS but oss_supply_type is left blank, the row imports without OSS classification — it lands on the regular VAT return instead of the OSS return, and the wizard shows an amber warning so you can spot it.
What the preview shows
When a row is correctly flagged, the preview grid shows an OSS badge with the supply type — either OSS: distance sales or OSS: services — so you can verify which rows will land on the OSS return before you run the import.
Step 3: Upload and preview
Go to Imports → Invoices and click Start import.
Drop your CSV onto the upload zone.
Pick a default income account for any rows that leave
line_account_codeblank.Cybooks shows a row-by-row preview with three colours:
Green — ready to import.
Amber — imports, but with a warning (e.g. duplicate invoice number — that row is skipped).
Red — has errors. Fix them in the CSV and re-upload, or the whole invoice group will be rejected.
Screenshot needed: Step 2 of the wizard showing the colour-coded preview rows with green/amber/red badges.
Step 4: Run the import
When you're happy with the preview, click Run import.
The import runs in the background. You can leave the page — Cybooks will email you when it's done.
Open Imports → Invoices → History to see the result and download an error CSV for any rejected invoice groups.
Imported invoices behave exactly like hand-keyed invoices: journal entries post immediately, the audit trail is recorded, and document templates apply on download.
Common errors and fixes
Error | What to do |
"line_tax_rule_code must be a sales tax rule" | You used a purchase code (A–K). Switch to a sales code (L, M, N, O, P, Q, R, S, OSS, T). |
"Chart of account code must be a postable income account" | You picked a non-income account or a parent/header account. Use a 4xxx postable code from the table above. |
"Currency must match the tenant default" | Foreign currency invoices are not supported in this version. Convert to your tenant currency before import. |
"Paid status not supported in v1" | Set status to |
"Invoice number already exists — skipped" | An invoice with that number is already in Cybooks. The row is safely skipped — no duplicate is created. |
"customer_type must be one of [person, organisation]" | Use one of the accepted values: |
"customer_is_triangular must be yes/no, true/false, or 1/0" | Replace any other value with one of the accepted boolean tokens. |
"customer_billing_country / customer_shipping_country must be a valid country ISO code or country name" | Use ISO-2 ( |
"customer_contact_person_* is required when importing a contact person" | Contact person is all-or-nothing. Fill in first name, last name, and email — or leave all three blank. |
"oss_supply_type must be one of [distance_sales, services, electronic_services]" | Replace the value with one of the three accepted strings. |
"oss_supply_type requires line_tax_rule_code to be OSS" | Either change the line code to |
"OSS is only available for EU-registered companies" / "OSS is only available for companies in EU member states" | Enable EU destination country tax in Settings → Organisation Profile, and check that your company country is set to an EU member state. |
"OSS cannot be applied to business customers with a VAT ID. Use reverse charge instead." | Switch the line to code |
"OSS requires the customer to have a billing/shipping address with a country" | Fill in the relevant address country for the customer — billing for services, shipping for distance sales. |
"OSS does not apply to domestic sales (same country as company)" | The customer is in your own country. Use a domestic code like |
"OSS only applies to customers in EU member states" | Customer is outside the EU. Use code |
"oss_supply_type must be the same on every line for invoice X" | All rows that share an invoice number must agree on the supply type. Pick one and apply it to every line of that invoice. |
"No standard OSS VAT rate found for {country} on {date}" | The destination VAT rate isn't published for that date. Check the invoice date is correct and that the destination country is up to date in our EU VAT rate table. |
What happens to customers
For each invoice, Cybooks looks up the customer in this order:
VAT ID match (if
customer_vat_idis filled in).Email match (if
customer_emailis filled in).Name match (case-insensitive).
If no match is found, Cybooks creates the customer using the details in the CSV — name, type, contact person, addresses, IBAN, VAT ID, and so on. If you re-import the same file, existing customers are reused (no duplicates) and existing invoice numbers are skipped.
