Skip to content

Troubleshooting

Start at Settings → Payhawk → Sync Log. Entries are colour-coded; red = error, amber = warning, green = success.

"Payhawk API key not set!"

The API key for the current API Mode is empty. Check you entered the key for the selected mode (Sandbox vs Production keys are stored separately).

"Payhawk account not set!" / Account ID stays empty

The first sync could not reach /accounts. Usually a wrong API key or a network/firewall issue. Verify the key in Payhawk and that the Odoo server can reach api.payhawk.com.

"Could not create custom field odoo_internal_data in Payhawk"

You are on a Payhawk group account but the Group ID and Group API key fields in Odoo are blank. The connector uses the per-account API key to read expenses and the group key to create the odoo_internal_data custom field that links each expense back to its Odoo bill — without the group key, Payhawk returns 403 on every group-level write.

Fix:

  1. In Payhawk, generate a Group API key — see Get an API key → Group (multi-entity) accounts.
  2. In Odoo, Settings → Payhawk → Group accounts, paste the Group ID and Group Key for the active mode (Sandbox / Production are stored separately) — see Configuration → Group accounts.

    Odoo 19 specific

    Group ID and Group Key are company-dependent in v19 — make sure you're filling them for the active company (top-right company switcher). Each company in a multi-company database holds its own group settings.

  3. Re-run the sync. The custom field is created on the next attempt.

If you are NOT on a group account, this error shouldn't appear — contact PLANA support with the event_id from the log entry.

"403 Client Error: Forbidden for url: https://api.payhawk.com/api/v3/accounts/.../custom-fields"

Same root cause as "Could not create custom field odoo_internal_data" above: the per-account API key cannot write at the group level. Follow the steps in that section to add the missing Group ID + Group API key and re-sync.

Any other 403 Forbidden from api.payhawk.com that is not on /custom-fields is usually an expired or revoked API key — regenerate it in Payhawk and paste the new value into the active API Mode's slot in Odoo.

A supplier is skipped (warning, not error)

Common causes, all non-fatal:

  • Invalid email — Payhawk rejects malformed addresses; the supplier is skipped and flagged. Fix the email in Odoo and re-sync.
  • Duplicate name — a same-named supplier already exists in Payhawk; the connector links by name instead of creating a duplicate.

"Value with the same full label exists"

Two analytic accounts resolve to the same Payhawk label. The connector appends the Odoo record ID to disambiguate (e.g. BP-General (4)). No action needed, but you can rename the analytic account in Odoo to a unique label if you prefer clean names.

Currency errors when creating fund journals

A Payhawk fund account uses a currency that is missing or inactive in Odoo. Enable the currency (Accounting → Configuration → Currencies) and re-sync.

Webhooks not arriving

  • Confirm Enable Webhooks is on (Miscellaneous tab).
  • Confirm the URL registered in Payhawk matches https://<domain>/payhawk/webhooks/<secret> exactly, with the current secret.
  • An unknown secret returns 401; a disabled toggle returns a disabled status.
  • Check the Odoo server logs for Payhawk webhook data: entries.

Nothing pulls / "No new expenses"

The connector pulls expenses created after the last success log entry. If you expect older expenses, edit the date on the latest success entry to an earlier time and re-run the sync (see First sync).

Error reporting to PLANA

Unless you tick Disable Error Reporting, error-level log entries are sent to PLANA Solutions (company name, user, module version, DB name, base URL, and the log entries) so we can troubleshoot and fix proactively. Disable it only if your policy forbids this.

Still stuck?

Note the event_id shown on the log entries (it groups one sync run) and contact PLANA support with it — it lets us find the exact run in our diagnostics.

© PLANA Digital Ltd.