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#
| Direction | What | Schedule | Status |
|---|---|---|---|
| NV → Odoo | Purchase invoices | Daily 06:00 | ✅ Active cron |
| NV → Odoo | Payment status | Daily 07:00 | ✅ Active cron |
| Odoo → NV | Sales invoices | Automatic + manual | ✅ |
| Bi-directional | Customer sync | Manual wizard | ✅ |
| Bi-directional | Product sync | Manual wizard | ✅ |
| Odoo → NV | Payroll | Monthly, 1st day at 08:00 | ⚠ Cron off, manual activation |
| Odoo → NV | Expenses 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-8form - 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:
- Accounting → Vendor Bills lists new rows like “From Netvisor: 2026-05-23”.
- Each row is in state
Draft— not yet posted. - Office reviews (PO matching, account allocation, cost distribution) and clicks Post.
- 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#
- Open Accounting → Customer Invoices, pick one confirmed invoice.
- Top action menu → “Send to Netvisor”.
- On success:
account_move.netvisor_invoice_idgets the Netvisor ID. Verify in Netvisor that the invoice is there. - 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:
- Manual sending per payslip: HR → Payroll → individual payslip → “Send to Netvisor”.
- Auto via
payslip-donestate: Settings → Netvisor → “Auto-send payslip on confirm” flag. Triggered inpayslip.action_payslip_done. - Enable the cron: Settings → Technical → Crons → “Send payslips to Netvisor” → Active = True.
Recommendation: manual first, until you’ve verified XML builds correctly.