Skip to content

Working with reimbursements

When someone pays for a business expense from their own pocket, Payhawk records it as a reimbursement — an expense paid back to the person rather than charged to a corporate card. For that to work end-to-end, Payhawk needs to know who your reimbursable people are and how to pay them. The Payhawk × Odoo connector syncs that directory for you.

Pick: Users or Employees

In Odoo there are two related models that can stand for "a person":

Odoo modelWhat it is
res.usersA user who can log into Odoo
hr.employeeAn employee on the payroll, with HR fields (manager, bank account, contract…)

They are usually the same people but not always. A contractor might be an employee without a login. An external accountant might be a user without being on payroll.

In Settings → Payhawk, the Reimbursement subjects option picks which model gets synced to Payhawk:

OptionSync sourceWhen to pick it
UsersEvery active res.users recordYou don't use the HR app; reimbursable people log into Odoo
EmployeesEvery active hr.employee recordYou use the HR app (Pro tier and up); payroll bank accounts live on the employee record

Pick Employees if HR is installed — the bank-account-number field is on the employee record, and that's where finance teams keep payroll banking details. Pick Users only if HR isn't installed.

Where the bank account comes from

The payout uses the bank account number stored on the synced record:

MappingBank account read from
Usersres.users.partner_id.bank_ids (the user's contact has a related bank account)
Employeeshr.employee.bank_account_id — the Private Information tab on the employee form

Bank account must be set before sync

An employee with no bank account number syncs to Payhawk just fine, but the reimbursement payout step in Payhawk will have no destination IBAN. Populate the field on the Odoo side first, then sync.

How it flows

Person in your company submits a reimbursable expense in Payhawk


Reviewer approves → Payhawk knows who, how much, which IBAN
                    (IBAN already synced from Odoo)


Payhawk schedules the payout to the employee's IBAN


Expense posts back to Odoo as a vendor bill (or receipt) against
the employee's partner record — not against an external vendor

The person shows up in Payhawk's picker on every reimbursement, with their name, role, and IBAN already attached. No retyping per expense.

Initial sync

After changing Reimbursement subjects:

  1. Settings → PayhawkSync now (full sync) — or specifically Sync Employees / Sync Users depending on which mapping you chose
  2. Wait ~30 seconds
  3. In Payhawk → Settings → People — confirm the list matches what you'd expect from your Odoo data

The scheduled sync (every 15 minutes) keeps things current after that. New employees in Odoo appear in Payhawk on the next sync; archived employees are deactivated in Payhawk.

Payhawk login is separate

A person synced to Payhawk is a record in Payhawk's directory — it does not automatically give them a Payhawk login. Whether they can sign in to Payhawk and submit their own reimbursements is a separate choice in Payhawk → Settings → People → invite-by-email.

This is intentional: the reimbursement payout still works for any synced person regardless of whether they have Payhawk login access. A submitter who isn't a Payhawk user has their expense entered by a reviewer on their behalf.

Common gotchas

IssueFix
Reimbursement appears in Payhawk but IBAN is blankThe Odoo record has no bank_account_id (or partner_id.bank_ids for User mapping). Fill it, then re-sync.
Employees missing from Payhawk after syncThey are archived or not marked Active in Odoo — Payhawk syncs active records only
User mapping picks the company bank account, not the personal oneOn the user's partner record, ensure the personal bank account is set; remove or unmark the company account on that partner
Names in Payhawk don't matchThe sync uses hr.employee.name (or res.users.name) verbatim. Update in Odoo and force a sync.

Switching mappings after going live

Changing from UsersEmployees (or back) is supported but disruptive:

  1. Records under the old mapping are archived in Payhawk on the next sync
  2. Records under the new mapping appear
  3. Open reimbursements assigned to old records do not move automatically — settle them under the old mapping first, or expect a manual cleanup

Best to pick the right mapping at setup and stick with it. If you must switch, schedule a maintenance window with the Payhawk reviewers.

Where to read more

© PLANA Digital Ltd.