Cancel expenses safely at any lifecycle stage
Reverse posted and paid HR expenses with a full accounting-impact preview, a separated delete flow, per-role permissions, and a persistent audit log — no more manual journal cleanup.
The problem
Odoo's native expense workflow moves Draft to Submitted to Approved to Posted to Paid, but once a journal entry is posted there is no safe way to undo it. Reversing a wrong approval means an accountant manually reversing journal entries, unreconciling payments, and resetting state fields outside the standard UI — slow, error-prone, and out of reach for most approvers.
The solution
Cancel HR Expense adds a full-lifecycle cancellation flow that works from Draft all the way through Paid. Every cancellation opens a preview showing exactly which journal entries, payments, and reconciliations will be reversed before anything happens, and a persistent audit log records who cancelled what, when, and why.
Everything you need to safely reverse an expense
Every capability below is implemented in the module.
Cancel at any stage
Cancel a Draft, Submitted, Approved, Posted, or Paid expense in one action — the one gap Odoo's native reset and refuse buttons leave open once a journal entry is posted.
Preview before you cancel
Every cancellation opens a preview listing the exact journal entries, payments, and reconciliations that will be reversed or cancelled, so nothing happens to your books blind.
Separate, higher-friction Delete
Delete sits apart from Cancel with its own dedicated wizard, a danger warning, and a confirmation checkbox that gates the button — accidental deletion stays hard to trigger.
Reset to Draft for resubmission
A cancelled expense can be reset straight back to Draft for correction and resubmission, turning cancellation into a productive workflow step instead of a dead end.
Mandatory reason capture
Every cancel, refuse, or delete requires a reason, captured on the expense and in the audit log for compliance and dispute resolution.
Mixed-outcome bulk review
Select a batch of expenses and assign a different outcome to each — approve some, refuse or cancel others, reset the rest — all from a single review session.
Per-role permission gating
Dedicated Cancellation and Deletion security groups control exactly who can cancel, reset, or delete expenses, keeping the feature safe to deploy for finance teams.
Persistent audit log
A dedicated Cancellation Log records every cancel, refuse, reset, and delete with actor, timestamp, and reason — entries survive even if the expense itself is deleted.
Configurable journal handling
A Settings toggle enables or disables the feature at the organization level, with a choice between reversing journal entries (keep history) or cancelling them outright.
How it works
Select an expense
Open any Draft through Paid expense, or select several from the list view for a bulk action.
Review the preview
The Cancel wizard shows every journal entry, payment, and reconciliation that will be affected before you confirm.
Confirm with a reason
Enter a mandatory reason and confirm — Delete requires an extra checkbox for its higher-friction flow.
Track in the audit log
Every action is logged with who, when, and why, and cancelled expenses can be reset to Draft for resubmission.
Frequently asked
No sales fog. If your question isn't here, email us and we'll answer it the same way.
Yes. Unlike Odoo's native reset and refuse actions, which refuse to act once a journal entry is posted, this module can cancel an expense at any stage from Draft through Paid, reversing or cancelling the linked journal entry and payment as needed.
Buy it on the Odoo App Store
Purchase, download and install directly from the official Odoo Apps Store — you'll always get the latest supported build.
Cancel HR Expense - Full-Lifecycle Cancellation with Preview
Cancel, reset or delete an expense at any stage from Draft to Paid — with an accounting-impact preview, per-role permissions and an audit log that survives deletion.
Buy on Odoo App Store