# POS Keyboard Shortcuts

> Reusable keyboard-shortcut profiles for the Point of Sale, shared across registers, with per-payment-method keys and an on-screen cheat sheet.

- **What it is:** Reusable keyboard-shortcut profiles for the Point of Sale, shared across registers, with per-payment-method keys and an on-screen cheat sheet.
- **For:** Point of Sale
- **Odoo versions:** 17.0, 18.0, 19.0, 20.0 - Community and Enterprise
- **Runs on:** Odoo.sh or Odoo you host yourself - not Odoo Online, which accepts no third-party apps
- **Price:** 49 EUR, one-time, on the Odoo Apps Store
- **Technical name:** bambooforge_pos_hotkeys
- **Not for:** Shortcuts apply to the product, payment, receipt and customer screens.; Function keys reserved by the browser cannot be captured.; The cheat-sheet lists shortcuts for the current screen only.
- **Manual:** https://docs.bambooforge.dev/bambooforge_pos_hotkeys/
- **Live demo:** https://demo20.bambooforge.dev/odoo/action-bambooforge_pos_hotkeys.action_bf_pos_hotkey_profile
- **Store page:** https://apps.odoo.com/apps/modules/20.0/bambooforge_pos_hotkeys
- **Manual last updated:** 2026-10-15

---
# POS Keyboard Shortcuts

## Overview

BambooForge POS Hotkeys lets cashiers drive the Odoo Point of Sale from the keyboard.
You define a **shortcut profile** once and reuse it on every register, assign a key to
**each payment method**, and press-and-hold a modifier to see an on-screen **cheat-sheet**
of every shortcut available on the current screen.

It solves two things the built-in POS and older shortcut add-ons do not:

- **Reuse.** One profile can be shared by any number of registers. Change it once and every
  register that uses it follows — no more re-typing the same keys shop by shop.
- **Duplicate payment methods.** The shortcut key lives on the payment method itself, so a
  register with several cash methods or several bank methods gives each one its own key.
  Older solutions only bound the *first* method of a kind.

The dispatcher is written with the native POS component API (OWL), not DOM tricks, so it keeps
working when you reskin or extend the Point of Sale.

## Requirements

- Odoo 20.0.
- The **Point of Sale** application (`point_of_sale`). No other dependency.

## Installation

1. Copy `bambooforge_pos_hotkeys` into your addons path.
2. Update the apps list (Apps → Update Apps List).
3. Search for **BambooForge POS Hotkeys** and click *Install*.

A ready-to-use profile named *Default Shortcuts* is created on install.

## Configuration

### Enable the feature per register

1. Go to **Point of Sale → Configuration → Settings**.
2. Pick the register at the top of the page.
3. Turn on **Keyboard Shortcuts** and choose a **Shortcut Profile**
   (the shipped *Default Shortcuts* is selected by default).
4. Save.

### Reuse a profile on several registers

Open the same profile on each register's settings, or select it in
**Point of Sale → Configuration → Hotkey Profiles** and see every register that uses it in the
*Used by registers* field. Editing the profile updates all of them at once.

### Assign keys to payment methods

1. Go to **Point of Sale → Configuration → Payment Methods**.
2. Open a method and set **POS Shortcut Key** (e.g. `C` for Cash, `B` for Bank).
3. Give a *different* key to every method used on the same register.

Use letters for payment keys — digits are reserved for typing the amount on the payment screen.

## Using the shortcuts

- On each screen, press the configured key to run its action
  (go to payment, select customer, search, quantity/discount/price mode, print, …).
- **Hold Ctrl** at any time to show the cheat-sheet of shortcuts for the current screen; release to hide it.
- On the payment screen, press a payment method's key to add that payment line.

## Questions people ask

****Which Odoo versions does it run on?****

Odoo 17.0, 18.0, 19.0, 20.0, on the series you buy it for; each series is its own listing.

****Community or Enterprise?****

Both. It needs no Enterprise app.

****What does it need?****

The standard Point of Sale app. No extra Python package.

****Where does it show up?****

Under the **Hotkey Profiles** menu.

****Does anything leave my server?****

No. It makes no call outside your Odoo server: no telemetry, no licence check, no third-party service.

****What happens if I uninstall it?****

Odoo drops the app's own tables and fields; the standard records it worked on (contacts, orders, products) stay as they are.

## Troubleshooting

### Shortcuts do nothing

Check that **Keyboard Shortcuts** is enabled for *this* register and a profile is selected,
then close and reopen the POS session so the new configuration is loaded.

### A key does nothing on one screen but works on another

Shortcuts are per screen. Make sure the action you expect exists on that screen
(for example, *Print Receipt* only applies to the receipt screen).

### Two actions share a key

The profile refuses to save two identical keys on the same screen and tells you which two fields
clash. Give one of them another key.

### Two payment methods share a key

Saving the register raises an error naming the two methods. Give each method a distinct key.

### Digits do not select a payment method

That is by design: on the payment screen digits type the tendered amount. Use a letter as the
payment method's key.

### A shortcut clashes with the browser (F5, F11, F12, …)

The browser reserves some function keys. Avoid `F1`, `F5`, `F11` and `F12`; the
defaults use safe keys only.

### Typing in a search box triggers a shortcut

It should not — shortcuts are ignored while the focus is in a text field. If you still see it,
click once outside the field and retry.

### The cheat-sheet does not appear

Hold the **Ctrl** key (do not tap it). It only shows while the key is held and only when the
register has shortcuts enabled.

### After changing the profile nothing changed in the POS

The POS loads its configuration when a session opens. Close the session and reopen it, or reload
the POS tab.

## Frequently asked questions

**Can several registers share one profile?**
Yes — that is the point. Select the same profile on each register.

**Can I have per-register keys too?**
Payment-method keys are per method (shared through the method). Screen action keys come from the
profile; make a second profile if a register needs different action keys.

**Does it work with two cash or two bank methods?**
Yes. Each method carries its own key, so every method on a register is reachable.

**Will it survive a POS theme or another POS add-on?**
Yes. It calls the POS component API rather than clicking DOM elements, so a reskin does not break it.

## Limits

- Shortcuts apply to the product, payment, receipt and customer screens.
- Function keys reserved by the browser cannot be captured.
- The cheat-sheet lists shortcuts for the current screen only.

## How we make sure it works

Before every release, **14 automated checks** run against this app on Odoo 17, 18, 19 and 20.
Among them:

- Multiple same type methods keep own keys.
- Till loads no profile when disabled.
- Duplicate key same screen raises.
- Same key different screen ok.
- Default profile assigned to new config.

The complete list is in the source you receive.

## Support

This app is designed to run without vendor support: the steps above cover setup, daily use and
every common issue. For licensing questions contact [support@bambooforge.dev](mailto:support@bambooforge.dev).

## Upgrading & version compatibility

This build targets **Odoo 20.0**. Each Odoo major series (17.0, 18.0, 19.0, 20.0) has its
own dedicated build of this module — always install the build that matches your Odoo
version. Mixing a build with a different Odoo series is not supported.

### Patch upgrades (same series, e.g. 20.0.1.0.0 → later)

1. **Back up** your database and filestore first.
2. Replace the module folder with the newer build.
3. Restart Odoo with the module updated:
   
   ```
   ./odoo-bin -c your.conf -u bambooforge_pos_hotkeys -d your_db
   ```
4. Odoo applies any schema/data changes automatically. Your existing records and
   configuration are preserved.

### Cross-version migration (moving to a newer Odoo)

Upgrading Odoo itself is a database migration handled by Odoo's standard upgrade
tooling. When you migrate the database to the next Odoo series, install the matching
build of this module for that series. Data created by this module carries over with
the database migration.

## Uninstallation

You can remove this module at any time from **Apps → (this module) → Uninstall**,
or from the command line. Uninstalling is clean and reversible by reinstalling —
but note what is and is not deleted.

### What is removed

- The module's own tables and every record in them (1 model, prefixed `bf.*`) — this is the data this module created.
- The menus, actions, views and reports this module installed.

### What is preserved

- Your standard Odoo data (partners, products, sales, invoices, inventory moves) is
  **not** deleted — this module only reads and annotates it; the underlying records stay.
- Attachments and chatter messages on standard records are kept.

As always, take a database backup before uninstalling in production.

## Changelog

### 20.0.1.1.1

- Built for Odoo 20: record rules and access rights rewritten onto Odoo 20's single ir.access model, the screens rebuilt on Owl 3, and every icon moved to the icon set Odoo 20 ships.

### 20.0.1.0.0

Current release for Odoo 20.0. This build includes:

- Reusable keyboard-shortcut profiles for Odoo POS. Share one profile across every register, per-payment-method keys (works with multiple cash/bank methods), and an on-screen cheat-sheet. OWL-native, no jQuery.

Feature additions and fixes ship as new builds on the Odoo Apps store; this page and
the module's `version` reflect the current published release. Always keep the build
matched to your Odoo series (see *Upgrading & version compatibility*).
