Netvisor accounting integration#

ELT’s accounting is done in Netvisor, but task invoicing, payroll, and inventory management are done in Odoo. The bridge between them is the netvisor_integration module.

What flows in which direction#

DirectionWhatScheduleStatus
NV → OdooPurchase invoicesDaily 06:00✅ Active cron
NV → OdooPayment statusDaily 07:00✅ Active cron
Odoo → NVSales invoicesAutomatic + manual
Bi-directionalCustomer syncManual wizard
Bi-directionalProduct syncManual wizard
Odoo → NVPayrollMonthly, 1st day at 08:00⚠ Cron off, manual activation
Odoo → NVExpenses as purchase invoices⚠ Cron off

Settings (admin only)#

Settings → Netvisor Integration.

Required credentials:

  • Partner ID — partner identifier from Netvisor
  • Partner key — from Netvisor (secret)
  • Customer ID — the user shown in Netvisor → Settings → API identifiers
  • Customer key — the API key of the user above
  • Organisation ID (Y-tunnus) — in 1234567-8 form
  • API base URL — default https://integration.netvisor.fi/ — don’t change unless testing
**`Test connection` button** on the Settings page fetches the day's purchase invoices from Netvisor. Returns OK or an error message. Run any time credentials are entered / changed.

Purchase invoices Netvisor → Odoo#

Cron 06:00 daily fetches yesterday’s purchase invoices from Netvisor and creates them as vendor bills in Odoo. Duplicates are detected via Netvisor ID.

Handling:

  1. Accounting → Vendor Bills lists new rows like “From Netvisor: 2026-05-23”.
  2. Each row is in state Draft — not yet posted.
  3. Office reviews (PO matching, account allocation, cost distribution) and clicks Post.
  4. Payment is handled on the Netvisor side, status flows back to the next payment sync.

Manual run#

Settings → Netvisor Integration → “Run import now” button. Fetches today’s invoices (not already present). Use if:

  • The cron was missed (server down at 06:00).
  • You want to test the integration is alive.
  • You just entered credentials and want to verify.

Payment status Netvisor → Odoo#

Cron 07:00 daily checks Netvisor for paid invoices. Matching Odoo invoices are marked payment_state = paid.

Check window is 90 days — older payments aren’t tracked anymore.

Sales invoices Odoo → Netvisor#

When an invoice is confirmed in Odoo (account.move state = “posted”), it can be sent to Netvisor automatically or manually.

Automatic sending#

Settings → Netvisor → “Auto-send invoices on confirm” flag → the confirm override calls Netvisor sending.

**Keep this off until you've tested manually!** Only after you know XML builds correctly and Netvisor accepts the invoices in its own technical checks (business IDs, VAT, etc.) should you turn on auto-send. Otherwise you get bad rows in customer logs.

Manual test#

  1. Open Accounting → Customer Invoices, pick one confirmed invoice.
  2. Top action menu → “Send to Netvisor”.
  3. On success: account_move.netvisor_invoice_id gets the Netvisor ID. Verify in Netvisor that the invoice is there.
  4. On error: check chatter — error is logged there.

Resend#

If the invoice has netvisor_payment_synced=True, the system blocks resending. Use action_resend_to_netvisor() which clears the flag.

Customer and product sync#

Bi-directional wizard for both.

  • Customers: Odoo Contacts ↔ Netvisor Customer. Match by business ID (for non-individuals). Individuals matched by name + address.
  • Products: Odoo Product ↔ Netvisor Product. Match by Odoo product code (default_code).

Run both once a month or when adding significant new data.

Payroll (cron off by default)#

Payslips should be reviewed before Netvisor sending — that’s why the cron is off by default. Options:

  1. Manual sending per payslip: HR → Payroll → individual payslip → “Send to Netvisor”.
  2. Auto via payslip-done state: Settings → Netvisor → “Auto-send payslip on confirm” flag. Triggered in payslip.action_payslip_done.
  3. Enable the cron: Settings → Technical → Crons → “Send payslips to Netvisor” → Active = True.

Recommendation: manual first, until you’ve verified XML builds correctly.

Troubleshooting#

‘Settings → Netvisor’ is blank / crashes
If the Settings page crashes entirely ("Failed to compile template… Unexpected identifier 'ctx'"), this is a JS bundler error. Fixed in 18.0.1.12.1+. If you still see it: 1. Check installed version: **Apps → Netvisor → Update** 2. Clear asset cache: `psql ... DELETE FROM ir_attachment WHERE url LIKE '/web/assets/%'` and restart
‘Test connection’ gives ‘authentication failed’
- Check Partner ID/Key and Customer ID/Key carefully — copy errors are typical. - Business ID must be in `1234567-8` form (with a dash). - API base URL is `https://integration.netvisor.fi/` (trailing slash). - Netvisor may be in maintenance — try in a couple of hours.
Sales invoice not sending to Netvisor
- Customer's **business ID** or **personal ID** must be filled in. Netvisor requires one. - Products must have a **default_code** (Internal Reference). - VAT classes must be mapped in **Account Tax → Netvisor** tab. - Chatter message usually gives the exact error.
Invoice appears differently in the two systems
Usually **VAT differences**: Odoo computes per-line VAT at a different precision than Netvisor (e.g. rounding rules). A few-cents difference may occur. A larger discrepancy (tens of euros) is always a fault. Compare rows from the two systems side by side.