Title: Purchase Orders, Suppliers &amp; Multi-Warehouse Inventory for WooCommerce — Free
Author: opsassistrsa
Published: <strong>20.05.2026</strong>
Last modified: 01.08.2026

---

Поиск плагинов

![](https://ps.w.org/opsassist-data-bridge-for-woocommerce/assets/icon.svg?rev=3541147)

# Purchase Orders, Suppliers & Multi-Warehouse Inventory for WooCommerce — Free

 Автор: [opsassistrsa](https://profiles.wordpress.org/opsassistrsa/)

[Скачать](https://downloads.wordpress.org/plugin/opsassist-data-bridge-for-woocommerce.1.5.60.zip)

 * [Детали](https://ru.wordpress.org/plugins/opsassist-data-bridge-for-woocommerce/#description)
 * [Отзывы](https://ru.wordpress.org/plugins/opsassist-data-bridge-for-woocommerce/#reviews)
 *  [Установка](https://ru.wordpress.org/plugins/opsassist-data-bridge-for-woocommerce/#installation)
 * [Разработка](https://ru.wordpress.org/plugins/opsassist-data-bridge-for-woocommerce/#developers)

 [Поддержка](https://wordpress.org/support/plugin/opsassist-data-bridge-for-woocommerce/)

## Описание

**Run a complete supplier-to-shelf workflow inside WordPress — free, with no monthly
fee and no SaaS account required.** Built specifically for WooCommerce stores that
have outgrown basic stock management but don’t want to pay enterprise prices for
inventory software.

Create purchase orders by SKU, send them to suppliers, receive stock in one click,
and watch WooCommerce stock counts update automatically — including per-warehouse
counts if you run multiple locations or use OpenPOS. All from a clean new **WC-Manager**
menu in your WordPress admin.

#### Free forever. Why?

We build a paid SaaS dashboard at [wc-manager.com](https://wc-manager.com) that 
adds AI insights, reports, restock forecasting and live POS feeds on top of the 
same data. The procurement modules in this plugin stay free for everyone — most 
stores need basic purchase orders before they need analytics, and we’d rather earn
your trust now than charge you for the basics.

#### What you get, for free

**Purchase Orders**
 * Build a PO by SKU — variations fully supported. * Mark as
draft, send, partial, received or cancelled with a clear status workflow. * Receive
in one click — WooCommerce `stock_quantity`, `manage_stock` and `stock_status` are
bumped automatically. * Per-warehouse stock updates if the receiving warehouse is
mapped to an OpenPOS outlet (the `_op_qty_warehouse_{id}` meta OpenPOS uses). * 
Auto-generated PO numbers (`PO-00001`, `PO-00002`, …). * Notes, line-item costs 
and a running subtotal.

**Suppliers directory**
 * Name, email, phone, payment terms and lead time. * Keep
all your supplier contacts in one place — no more digging through emails or spreadsheets.

**Warehouses / stock locations**
 * Define your physical stock locations. * Optionally
map each one to an existing OpenPOS outlet so receives write to the same per-location
meta key OpenPOS already uses — no double counting, no drift.

**Secure REST API**
 * Endpoints under `/wp-json/woo-manager/v1/` for suppliers,
warehouses and purchase orders (GET, POST, PUT, DELETE). * Authenticates with your
existing **WooCommerce REST consumer key** — no new connection key, no WordPress
Application Password. * Read-only data endpoints for OpenPOS outlets/registers, 
TeraWallet/WooWallet balances and WooCommerce Memberships (data WooCommerce’s standard
REST API can’t see).

**OpenPOS terminal panels (optional)**
 * **Members panel** — cashiers look up a
customer at the register and see their active WooCommerce Memberships. * **Stock
Take panel** — run a category-by-category count at the register; counts auto-save.

**Telegram alerts (free)**
 * Real-time notifications for every new WooCommerce 
order to any Telegram chat — group, channel or DM — via the WC-Manager bot. * Hooks`
woocommerce_new_order` (and optionally `woocommerce_order_status_changed`) and forwards
instantly — sub-second alerts on every checkout. * Manage chats from WP admin (WC-
Manager → Telegram): chat ID, events (new / completed / refunded / PO received /
low stock / new customer), order-status filter, **POS-only vs Online-only** filter(
when OpenPOS is detected), minimum order total, custom HTML template. * Same config
syncs with the WC-Manager dashboard — manage from either place. * Customer notes&
tags syncing (VIP, wholesale, prefers WhatsApp, at risk, etc.) keyed by email so
guest checkouts are annotatable too — managed under _WC-Manager → Customer Notes_.

Install once, activate. There is nothing to configure for the free procurement features.

#### Problems this plugin solves

 * «I can’t manage purchase orders inside WooCommerce.»  Built-in PO module, free.
 * «I lose track of which supplier sent which order.»  Suppliers directory linked
   to every PO.
 * «Stock at my second outlet is invisible from WP admin.»  Multi-warehouse, with
   OpenPOS outlet sync.
 * «Receiving stock means hand-editing every product.»  One-click receive bumps 
   WC stock automatically.
 * «I want to know the second an order comes in.»  Free Telegram alerts to your 
   phone, group, or warehouse screen — sub-second.
 * «Different staff use different spreadsheets.»  One source of truth, in WordPress,
   with the rest of your store.

#### Optional upgrade — WC-Manager dashboard

Want analytics and AI on top of all this? Connect a free WC-Manager account at [wc-manager.com](https://wc-manager.com)
and the same suppliers, POs and warehouses sync both ways with our hosted dashboard,
which adds:

 * **AI Insights** — plain-English summary of your sales, customers and POS data
   with action list and business valuation.
 * **AI product descriptions** — generate SEO-ready copy in your chosen tone and
   push to WooCommerce in one click.
 * **Reports** — profit by month or year, units sold, order-timing heatmap, repeat-
   buyer rate and customer lifetime value.
 * **Multi-location stock transfers** — move inventory between warehouses with full
   audit trail.
 * **Restock Predictor** — velocity-based reorder forecasts so you never run out
   of best sellers.
 * **Spreadsheet product editing** — bulk-edit prices, stock, supplier prices and
   meta fields.
 * **Live POS feed** — real-time sales view across all outlets and registers.
 * **Membership management, category stock takes, full activity log, team access.**

Free plan available. No credit card to start.

#### Works great with

 * **OpenPOS** — outlets, registers, the in-terminal Members & Stock Take panels,
   and per-warehouse stock that stays in sync with the same meta key OpenPOS uses(`
   _op_qty_warehouse_{id}`).
 * **WooCommerce Memberships** — read plans and per-customer memberships.
 * **TeraWallet / WooWallet** — read store-credit balances.
 * **Telegram** — instant order notifications via the WC-Manager bot ([@wc_manager_bot](https://t.me/wc_manager_bot))—
   add it to any group, channel or DM, send `/id`, paste into the plugin’s Telegram
   page.
 * Works on any store running standard WooCommerce too — the optional integrations
   only activate when their host plugin is present.

#### REST endpoints

All endpoints authenticate with your existing **WooCommerce REST consumer key** (
or any logged-in user with the `manage_woocommerce` capability). No separate connection
key needed.

**Procurement (free):**

 * `GET, POST /wp-json/woo-manager/v1/suppliers` — list / create suppliers.
 * `GET, PUT, DELETE /wp-json/woo-manager/v1/suppliers/{id}` — read / update / delete
   one supplier.
 * `GET /wp-json/woo-manager/v1/warehouses` — list warehouses.
 * `GET, POST /wp-json/woo-manager/v1/purchase-orders` — list / create POs.
 * `GET, DELETE /wp-json/woo-manager/v1/purchase-orders/{id}` — read / delete one
   PO.
 * `POST /wp-json/woo-manager/v1/purchase-orders/{id}/send` — mark a PO as sent.
 * `POST /wp-json/woo-manager/v1/purchase-orders/{id}/cancel` — cancel a PO.
 * `POST /wp-json/woo-manager/v1/purchase-orders/{id}/receive` — receive stock (
   updates WooCommerce stock + per-warehouse meta).
 * `POST /wp-json/woo-manager/v1/purchase-orders/{id}/sync-receive` — bump `qty_received`
   without touching WooCommerce stock (used when the dashboard already updated stock
   itself).

**OpenPOS, wallet & membership reads:**

 * `GET /wp-json/woo-manager/v1/openpos-outlets` — OpenPOS outlets (`_op_warehouse`
   posts).
 * `GET /wp-json/woo-manager/v1/openpos-registers` — OpenPOS registers (`_op_register`
   posts).
 * `GET /wp-json/woo-manager/v1/terawallet/balances` — users with a non-zero TeraWallet
   balance.
 * `GET /wp-json/woo-manager/v1/terawallet/balance/{user_id}` — a single user’s 
   TeraWallet balance.
 * `GET /wp-json/woo-manager/v1/memberships/plans` — WooCommerce Memberships plans.
 * `GET /wp-json/woo-manager/v1/memberships/user/{user_id}` — a user’s memberships.

#### OpenPOS panels (optional)

 * **Members** — cashiers can look up a customer at the register and see their active
   WooCommerce Memberships.
 * **Stock Take** — run a category-by-category stock count at the register; counts
   auto-save and sync to the WC-Manager web app.

#### External service

The Stock Take panel communicates with the WC-Manager web app at **https://wc-manager.
com** to load and save stock takes for your organisation. It authenticates with 
a per-organisation «plugin token» you paste into the plugin’s settings page (WooCommerce
WC-Manager Stock Take). No data is sent until you configure that token and use the
Stock Take panel. WC-Manager’s terms and privacy policy: [https://wc-manager.com/terms](https://wc-manager.com/terms)
and [https://wc-manager.com/privacy](https://wc-manager.com/privacy).

The REST endpoints, the Members panel, and TeraWallet/membership reads make no external
requests — they only respond to authenticated requests into your own site.

#### Privacy

This plugin does not collect, store, or transmit personal data on its own beyond
the Stock Take sync described above, which only sends the stock-count data you create
to your own WC-Manager account. See [https://wc-manager.com/privacy](https://wc-manager.com/privacy).

#### Note on trademarks

WooCommerce is a registered trademark of Automattic Inc. This plugin is an independent
companion plugin and is not affiliated with or endorsed by Automattic. OpenPOS and
TeraWallet are products of their respective owners. WC-Manager is a separate product
by Ops Assist.

## Установка

 1. Install via _Plugins  Add New_ in your WordPress admin (search «WC-Manager») or
    upload the plugin zip.
 2. Activate. A new **WC-Manager** menu appears in the WordPress sidebar.
 3. Go to **WC-Manager  Suppliers** to start adding suppliers, then **Purchase Orders**
    to create your first PO. No further configuration required.
 4. (Optional) Sign up for a free [WC-Manager dashboard](https://wc-manager.com) account
    if you want AI insights, reports and a SaaS view of your data. Your suppliers and
    POs will sync both ways automatically using your existing WooCommerce REST consumer
    key — no new connection key, no Application Password.
 5. (Optional) To use the Stock Take panel inside the OpenPOS terminal, go to **WC-
    Manager  Stock Take** and paste your plugin connection token from the WC-Manager
    dashboard.

## Часто задаваемые вопросы

### Are the procurement features really free?

Yes. Purchase orders, suppliers, warehouses and one-click receive are 100% free,
with no usage limits, forever. We make money from the optional WC-Manager dashboard(
AI insights, reports, multi-location transfers) — but the procurement workflow in
WP admin is yours to use at no cost.

### Do I need a WC-Manager account to use the purchase orders?

No. The free procurement modules work entirely inside WordPress with no account,
no API call out and no payment. Connect a WC-Manager account only if you want the
optional dashboard features on top.

### Does it work with stock-managed products and variations?

Yes. POs accept any WooCommerce product or variation by SKU (or by product/variation
ID). Receiving updates `stock_quantity`, sets `manage_stock`, and recomputes `stock_status`
automatically. WooCommerce product transients are cleared so the front-end stays
accurate.

### Can I manage inventory across multiple warehouses or outlets?

Yes. Define warehouses under **WC-Manager  Warehouses**. If a warehouse is mapped
to an OpenPOS outlet, receives also write to the per-outlet meta key OpenPOS uses(`
_op_qty_warehouse_{id}`) — so OpenPOS sees the new stock instantly with no sync 
step.

### How is this different from a WooCommerce inventory plugin like ATUM or Stock Manager?

This plugin is purpose-built for stores that want a simple, clean purchase-order
workflow without paying a monthly enterprise subscription, and that want optional
cloud analytics on the same data. It’s lightweight, ships only the modules listed
above, and integrates directly with OpenPOS for per-location stock.

### Does it work with OpenPOS, WooCommerce Memberships, TeraWallet and WooWallet?

Yes. OpenPOS is the deepest integration (outlet sync, in-terminal Members and Stock
Take panels). Memberships and TeraWallet/WooWallet get read-only REST endpoints 
so the WC-Manager dashboard can show member status and store-credit balances. The
plugin works fine on stores without any of these — those features simply stay dormant.

### Is my store data safe?

Yes. Procurement data lives in your own database in tables prefixed `wp_oadb_`. 
REST endpoints authenticate with your existing WooCommerce REST consumer key — no
public endpoints, no third-party services. The Stock Take sync only fires after 
you explicitly paste a connection token in settings.

### Will this plugin slow down my store?

No. Admin pages only load when an admin opens them. REST endpoints respond only 
to authenticated requests. The wallet-balances query is cached for one minute. There
is no front-end overhead at all.

### How do I uninstall?

Deactivate and delete via WordPress **Plugins**. The procurement tables (`wp_oadb_suppliers`,`
wp_oadb_warehouses`, `wp_oadb_pos`, `wp_oadb_po_items`) stay in place so you don’t
lose your supplier list and PO history; drop them manually if you want a fully clean
removal.

## Отзывы

Нет отзывов об этом плагине.

## Участники и разработчики

«Purchase Orders, Suppliers & Multi-Warehouse Inventory for WooCommerce — Free» —
проект с открытым исходным кодом. В развитие плагина внесли свой вклад следующие
участники:

Участники

 *   [ opsassistrsa ](https://profiles.wordpress.org/opsassistrsa/)

[Перевести «Purchase Orders, Suppliers & Multi-Warehouse Inventory for WooCommerce — Free» на ваш язык.](https://translate.wordpress.org/projects/wp-plugins/opsassist-data-bridge-for-woocommerce)

### Заинтересованы в разработке?

[Посмотрите код](https://plugins.trac.wordpress.org/browser/opsassist-data-bridge-for-woocommerce/),
проверьте [SVN репозиторий](https://plugins.svn.wordpress.org/opsassist-data-bridge-for-woocommerce/),
или подпишитесь на [журнал разработки](https://plugins.trac.wordpress.org/log/opsassist-data-bridge-for-woocommerce/)
по [RSS](https://plugins.trac.wordpress.org/log/opsassist-data-bridge-for-woocommerce/?limit=100&mode=stop_on_copy&format=rss).

## Журнал изменений

#### 1.5.60

 * **Saved carts: fix missing date** — some held-cart posts have a zeroed GMT date,
   which showed as no/invalid age in the dashboard. Fall back to converting the 
   local post date so a real age always shows.

#### 1.5.59

 * **Telegram: order alerts now show the amount and customer name** — the real-time
   order push carried only the fields the Stock Log needs, so alerts built from 
   it read «ZAR» with no total and «Guest» for every buyer. The push now includes
   the order total, currency and billing/customer name (falling back to the linked
   account when POS billing is blank).

#### 1.5.58

 * **Telegram: POS sales notify as «New order»** — a POS sale is created already-
   completed, so it fired the «completed» alert (or a duplicate). POS orders now
   always send the «New order» event; «completed» is reserved for online orders 
   you fulfil.

#### 1.5.57

 * **Telegram: salesperson** — order alerts now attribute the sale to the salesperson(`
   _op_sale_by_person_id`) rather than the till operator, and the POS line reads«
   Salesperson:» instead of «Cashier:».

#### 1.5.56

 * **Delete saved carts** — `DELETE /saved-carts/{id}` force-deletes a held cart(
   draft-order post), guarded so it only removes an open cart (has _op_cart_data,
   no _payment_ref). Lets the dashboard clear abandoned carts.

#### 1.5.55

 * **Saved carts — correct decoding** — `/saved-carts` now reads the real OpenPOS
   cart shape (PHP-serialized `_op_cart_data`): line items with tax-inclusive prices,
   the nested register + outlet, the salesperson (`sale_person`), the customer, 
   grand total and the linked order id. The large raw cart blob is no longer returned—
   just the summary the dashboard needs.

#### 1.5.54

 * **New: saved carts** — `GET /saved-carts` decodes OpenPOS held carts (the `_op_cart_data`
   post meta) into line items, totals, customer, cashier and outlet, so the dashboard
   can show which carts are open on the tills. Carts that have been checked out (
   a `_payment_ref` is present on the post) are excluded, since they’re no longer
   open.

#### 1.5.53

 * Groundwork for the saved-carts endpoint.

#### 1.5.52

 * **Server-side user search** — `/cashiers` now accepts `?search=` (and `?number
   =`) and searches users on the server. Previously the dashboard fetched up to 
   500 users and filtered in the browser, so on stores with many customers (every
   WooCommerce customer is a WP user) most users could never be found, and the fetch
   was slow.

#### 1.5.51

 * **Register status** — `/openpos-registers` now returns each register’s `post_status`
   and an `active` flag (publish = active, draft = inactive), so the dashboard can
   show which registers are active.

#### 1.5.50

 * **New: register cashier assignment** — `/openpos-registers` now includes each
   register’s assigned cashiers (the `_op_cashiers` postmeta), and `POST /openpos-
   registers/{id}/cashiers` assigns/unassigns cashiers, so the dashboard can manage
   who can use each POS register.

#### 1.5.49

 * **Fix: staff PIN save fatal on PHP 8 (root cause)** — the `/staff-pins/{id}` (
   and `/terawallet/balance/{id}`) routes passed `is_numeric` as a `validate_callback`,
   but WordPress calls that with three arguments and `is_numeric` accepts one — 
   an ArgumentCountError fatal on PHP 8, thrown by core before the handler ran. 
   The route regex already guarantees a numeric id, so the redundant validator was
   removed.

#### 1.5.48

 * **Fix: staff PIN save critical error (final)** — the write path now fires NO 
   WordPress hooks: the value is written with direct SQL, the duplicate-PIN check
   uses a direct DB join (no WP_User_Query), and the object cache is cleared without
   clean_user_cache(). This side-steps a POS plugin hook that fatalled non-catchably.

#### 1.5.47

 * **Fix: staff PIN save still 500’d on some stores** — the OpenPOS meta hook could
   fatal non-catchably. The PIN / POS-access value is now written directly to the
   database (bypassing the meta hooks entirely) and the whole endpoint is wrapped
   so any error returns a readable message instead of a WordPress critical-error
   page.

#### 1.5.46

 * **Fix: saving a staff PIN could 500** — a third-party hook (e.g. OpenPOS) firing
   on the user-meta update could fatal the request. The meta write is now wrapped
   so the PIN/POS-access change persists and the request succeeds even if such a
   hook errors.

#### 1.5.45

 * **OpenPOS staff PINs — POS-enabled filter + editing** — `/staff-pins` now lists
   users whose `_op_allow_pos` is 1 (the actual POS staff), with their PINs. Adds`
   POST /staff-pins/{id}` to set a custom PIN or revoke POS access (`_op_allow_pos`
   = 0). PINs must be unique across POS users. Requires manage_woocommerce.

#### 1.5.44

 * **New: OpenPOS staff PIN codes endpoint** — adds a read-only `/staff-pins` route
   returning WP users that have an OpenPOS `_op_pin` usermeta, with their roles,
   so the dashboard can list till login PINs. Requires manage_woocommerce.

#### 1.5.43

 * **Fix: purchase-order Sent / Received times were hours off in the dashboard**—
   the PO REST response sent site-local datetimes as bare strings, which the dashboard
   read as UTC (so a SAST store showed times 2 hours ahead). PO created/updated/
   sent/received timestamps are now returned as proper UTC ISO-8601, so they display
   at the correct local time everywhere. Existing POs correct themselves on the 
   next sync.

#### 1.5.42

 * **Fix: in-store Stock Take loaded only the first 500 products** — the till stock-
   take screen capped the catalogue at 500. It now pages through every published
   product (batched, with a safety ceiling) so large stores get all their products,
   matching the dashboard.

#### 1.5.41

 * **Removed the custom wallet transactions endpoint** — the dashboard now reads
   per-customer wallet balances and transaction history (and posts manual credits/
   debits) through the wallet plugin’s own `wc/v3/wallet` REST API, so the bridge
   no longer queries the wallet transactions table directly. The bulk `/terawallet/
   balances` read (used for the balances overview) remains, as the wallet API has
   no list-all endpoint.

#### 1.5.40

 * **Fix: wallet balances could 500 on large stores** — the balances query used 
   an `ORDER BY CAST()` that forced a filesort and could exceed PHP’s max execution
   time on big user bases (returning a «critical error» page). Sorting now happens
   dashboard-side; the query is index-friendly, capped, and wrapped to return a 
   readable error instead of a white-screen.

#### 1.5.39

 * **Fix: TeraWallet transaction log returned a 500** — the `/terawallet/transactions`
   query referenced the reserved column name `date` and nested a prepared fragment.
   Rebuilt to `SELECT *` with a single prepare per statement, defensive field reads,
   and a multisite `base_prefix` fallback.

#### 1.5.38

 * **TeraWallet transaction log** — new `GET /wp-json/woo-manager/v1/terawallet/
   transactions?page=&per_page=&user_id=` reads the `woo_wallet_transactions` table(
   credit/debit, amount, running balance, details, date) with the user’s name joined
   in. Powers the new Wallet page in the WC-Manager dashboard, including the per-
   customer transaction slideout. Wallet balances were already exposed via `/terawallet/
   balances`.

#### 1.5.37

 * **Stock Take search no longer dismisses the iOS keyboard** — the OpenPOS Stock
   Take panel was re-rendering the entire screen on every keystroke in the search
   field, which destroyed the focused input element and forced iOS / iPadOS to drop
   the on-screen keyboard. Now only the product list updates when filtering; the
   search input keeps focus, so cashiers can type a full search term in one go. 
   Same fix applied to category-collapse toggles.

#### 1.5.36

 * **Partial SKU search for the dashboard products spreadsheet** — new `GET /wp-
   json/woo-manager/v1/products-by-sku?prefix=...` runs a direct LIKE query against`
   wp_postmeta._sku` so typing the first few characters of a SKU returns matching
   products. WC REST’s `?sku=` filter is exact-match only; this endpoint fills the
   gap.

#### 1.5.35

 * **Telegram «Send test alert» now bypasses channel filters + reports per-channel
   exclusions** — the test used to bail with «No channels matched» if your channels
   were configured for `order.completed` instead of `order.new` (typical for POS
   sales). The test now sends to every active channel regardless of filter mismatch,
   and the result message lists which channels would have been SKIPPED by a real
   alert (with the filter name, e.g. `events`, `orderSource`, `posRegisterIds`, `
   orderStatuses`, `minOrderTotal`) so the admin can quickly find the misconfigured
   filter.
 * The test now auto-picks the event flavour from the order’s actual status (so 
   a POS sale tests as `order.completed`), making the per-channel diagnostic meaningful.

#### 1.5.34

 * **Telegram alerts + stock log push now defer to WP shutdown** — fixes two POS-
   sale bugs caused by hook timing: empty line items in Telegram alerts (refunds
   worked because they fire later in the order lifecycle), and orders arriving at
   the WC-Manager Stock Log with no warehouse attribution. The root cause was OpenPOS
   + HPOS firing their save hooks before `woocommerce_order_items` and the order’s
   meta have been persisted. Dispatch is now queued on the `shutdown` action so 
   every read sees the fully-saved order in the same request, with a per-request
   static dedup so multi-hook orders don’t queue twice. Same-request execution means
   alerts and pushes still arrive in < 1 second.

#### 1.5.33

 * **Telegram alerts always include line items on HPOS + OpenPOS POS sales** — the
   standard `$order->get_items()` call was returning empty for some POS orders (
   HPOS save timing, or OpenPOS using a custom items path), leaving the alert without
   an itemised list. The collector now falls back through: a fresh re-fetch of the
   order, a direct DB query against `woocommerce_order_items`, and finally OpenPOS
   items meta keys (`_op_cart_items` / `_pos_order_items` / `_op_sale_items`). When
   all four come back empty the alert now renders a clear diagnostic line instead
   of silently dropping the section.
 * The «items.lines» auto-append on custom templates fires even when the collector
   returns nothing — so the user sees the diagnostic stub rather than a blank space
   and can act on it.

#### 1.5.32

 * **Stock log push now ships every WooCommerce / OpenPOS meta key** — instead of
   a curated whitelist that varied by OpenPOS version, the payload now includes 
   every order meta whose key starts with `_op_` / `_pos_` / `_woo_` / `_wc_`. Fixes«
   Warehouse: global» appearing on POS sales where OpenPOS wrote the outlet under
   a key name we hadn’t whitelisted.

#### 1.5.31

 * **Stock log push now carries every outlet + cashier meta variant** — sales were
   arriving on the dashboard with warehouse «global» and user «system» because OpenPOS
   writes outlet attribution under different meta keys across versions. The push
   payload now includes `_op_sale_by_store_id`, `_pos_order_warehouse`, `_op_warehouses_id`
   in addition to `_pos_order_outlet`, plus the cashier id (`_pos_order_cashier_id`,`
   _op_cashier_id`) so the dashboard can render the cashier name on each row.

#### 1.5.30

 * **HPOS-safe backfill endpoint for WC-Manager Stock Log** — new `GET /wp-json/
   woo-manager/v1/stock-log-orders` reads historical orders via `wc_get_orders` (
   HPOS-aware) and returns them in a compact payload the dashboard can replay. The
   Backfill button on the WC-Manager Stock Log page now prefers this endpoint over
   the WC REST `/orders` endpoint, so HPOS stores no longer miss historical sales
   and refunds.

#### 1.5.29

 * **Stock Log auto-push for HPOS stores** — every order save, status flip and refund
   now POSTs a compact payload to the WC-Manager dashboard’s stock-log endpoint 
   directly from WordPress, using the same HPOS-native hooks the Telegram alerts
   use (`woocommerce_update_order`, `woocommerce_after_order_object_save`, `op_pos_order_*`,…).
   Removes any dependence on the WC REST API for stock-log accuracy. Dedup’d per(
   order, sale/refund) with a 5-min transient.
 * No new settings or UI — fires automatically whenever the plugin is connected 
   to a WC-Manager dashboard.

#### 1.5.28

 * **Line items now appear on every order alert** — even on channels with custom
   templates saved before 1.5.24. If a channel’s template doesn’t reference `{{items.
   lines}}` or `{{items.summary}}`, the dispatch now appends the itemised list automatically.
   No need to edit every channel template by hand.
 * **Recent activity panel in the WP admin** — under _WC-Manager  Telegram  Order
   alert delivery_. Shows the last 25 dispatch events (hook fire / dispatch decision/
   Telegram send result) so admins can see exactly why an alert didn’t fire without
   enabling WP_DEBUG_LOG.
 * **Dedup window reduced** from 5 min to 90 seconds so re-editing an order shortly
   after creation triggers a fresh alert.

#### 1.5.27

 * **«Send test alert» button now works on HPOS stores.** The test was silently 
   failing on some HPOS-enabled stores because `wc_get_orders()` threw / returned
   nothing under specific configurations. Added two fallback paths: a direct DB 
   read from `wc_orders` (or `wp_posts` for legacy stores) to find the most recent
   shop_order id, and a synthetic `WC_Order` stub as a last resort so brand-new 
   stores with zero orders can still verify the bot token + channel match + Telegram
   API end-to-end. The whole dispatch is now wrapped in try/catch so the test surfaces
   errors inline instead of producing a 500.

#### 1.5.26

 * **Telegram alerts now fire on stores with HPOS enabled.** WooCommerce’s High 
   Performance Order Storage (the new wc_orders custom table replacing wp_posts 
   for orders) skips the post-based hooks the plugin previously relied on (`save_post_shop_order`,`
   transition_post_status`), which meant new POS and online orders went silent on
   any store that had switched. Added `woocommerce_update_order` + `woocommerce_after_order_object_save`(
   the HPOS-equivalent hooks fired on every persisted order change) plus `woocommerce_store_api_checkout_order_processed`
   for the new block-based checkout. Existing dedup transient prevents duplicates
   on legacy stores that fire both paths. Two more OpenPOS hook variants added (`
   op_pos_order_after_create`, `op_pos_order_save`) for newer OpenPOS builds.

#### 1.5.25

 * **TeraWallet balances now read correctly.** The /terawallet/balances endpoint
   was querying user meta key `woo_wallet_current_balance`, but the active TeraWallet
   build stores balances under the underscore-prefixed `_current_woo_wallet_balance`.
   Both keys are now queried (with cache invalidation on either), so wallet balances
   surface on the dashboard’s Customers page instead of all showing zero.

#### 1.5.24

 * **Itemised line list on all order Telegram alerts** (was new-order only). The
   default templates for _order.completed_ and _order.refunded_ now include `{{items.
   lines}}` so POS sales — which fire both _order.new_ at processing and _order.
   completed_ when finalised — list every item on every alert, not just the first
   one.

#### 1.5.23

 * **First-run lockdown until connected.** When no WC-Manager plugin token is saved,
   the sidebar now hides every other WC-Manager submenu (Suppliers, Purchase Orders,
   Warehouses, Customer Notes, Telegram, Stock Take, Home) and any direct navigation
   to them redirects to the Connection tab with a warning banner. Removes the confusion
   of clicking around modules that can’t work until the token is pasted. Once a 
   token is saved the lockdown lifts immediately — no other behaviour changes.

#### 1.5.22

 * **Telegram alerts now fire for OpenPOS sales.** Previously, alerts were silent
   for tills because OpenPOS bypasses the standard `woocommerce_new_order` hook 
   and writes `shop_order` posts directly. Added catch-all `save_post_shop_order`
   + `transition_post_status` hooks (filtered tightly to `shop_order` at priority
   99, autosave/revision/auto-draft excluded), plus five known OpenPOS action variants(`
   op_after_create_order`, `openpos_after_create_order`, `op_after_order_create`,`
   op_order_created`, `op_save_order`). Whichever fires reaches dispatch; the existing
   per-(order, event) dedup transient prevents duplicates. Covers the typical POS
   flow of _pending  processing  completed_ in one go.

#### 1.5.21

 * **Telegram: per-channel POS register whitelist.** When a channel’s source is 
   _POS only_ or _Both_, you can now pick exactly which OpenPOS registers fire alerts
   for that channel — empty = all registers. Useful for wiring a «test till» channel
   separately from production tills, or routing till-1 alerts to one chat and till-
   2 to another. Pulls register names from your OpenPOS `_op_register` CPT so the
   picker shows friendly labels not IDs.
 * **Telegram: register, outlet, cashier in messages.** New template tokens `{{pos.
   register}}`, `{{pos.outlet}}`, `{{cashier.name}}`, plus a compact `{{pos.summary}}`
   that renders «Register: Till 2 · Cashier: Sarah · Outlet: Main Store» (empty 
   for non-POS orders). Default templates updated to include the summary.
 * **Telegram: itemised line list in messages.** New `{{items.lines}}` token renders
   each ordered line on its own bullet (e.g. «• 2× Coffee Beans · • 1× French Press»).
   Default _order.new_ template now shows the full list instead of just a 3-item
   summary.

#### 1.5.20

 * **Telegram: WC-Manager manual orders are now labelled correctly.** Orders created
   via the dashboard’s new «+ New order» button (tagged `created_via=wc-manager`/`
   _wcm_source=manual`) render in templates with `{{source.kind}}` = «WC-Manager
   manual», so the message title reads «New WC-Manager manual order #1234» instead
   of just «New Online order».
 * Removed the daily WP-Cron token refresh. Bot token is saved locally when you 
   link, and re-pulled only when you click «Refresh bot token» — clearer mental 
   model, less moving parts.

#### 1.5.19

 * Re-release of 1.5.18 with a fresh tag — an earlier SVN deploy committed a partial/
   stale 1.5.18 tag before the working copy locks could be cleared. This version
   is the same code under a clean tag so WordPress’ auto-update reliably picks it
   up.

#### 1.5.18

 * **Channels stored locally too** — alongside the bot token, the channel list is
   now pulled into `wp_options` on connect / Refresh / daily cron. The order-hook
   dispatch is now fully network-free for config: zero outbound HTTP calls for credentials
   or routing, only the final Telegram API send. This is the root cause of «manual
   test works but real orders don’t» — the per-order fetch was failing silently 
   on hosts with cURL/DNS hiccups.
 * **Debug logging on the dispatch path** — every order hook now writes a line to`
   wp-content/debug.log` (with `WP_DEBUG_LOG=true`): «dispatch fire», «dispatch 
   ok / fail to chat X», «dispatch skip — no bot token», «dispatch skip — 0 channels
   matched». Lets you tail one file and immediately see why an order didn’t alert.
 * **HPOS compatibility declared** — runs on stores with WC’s High-Performance Order
   Storage enabled without throwing the incompatibility warning.

#### 1.5.17

 * **Bot token is now cached locally** on plugin-token save. The dashboard’s `TELEGRAM_BOT_TOKEN`
   env value is pulled into `wp_options` the moment you connect, so the order-hook
   dispatch never touches the network for credentials — alerts keep firing even 
   if your host has a transient DNS/cURL hiccup. Auto-refreshes daily via WP-Cron;
   manual **Refresh bot token** button on the Connection page picks up rotations
   immediately.
 * **Connected state is now lock-edit** — once a valid token is saved you see a 
   status card (plugin token tail, bot username, last-synced time) plus **Refresh**
   and **Delink** buttons. To change the token, click Delink first. Prevents accidental
   token changes.
 * **Auto-bail on rejected tokens** — if the dashboard responds 401 during the initial
   fetch, the saved token is cleared rather than left in a «saved but doesn’t work»
   limbo.

#### 1.5.16

 * **Reliable Telegram alerts** — now hooks five WooCommerce actions at priority
   99 (`woocommerce_new_order`, `checkout_order_processed`, `thankyou`, `payment_complete`,`
   order_status_changed`) with per-(order, event) dedup. Previously only `new_order`
   fired, which some payment gateways (PayFast, async redirects, COD) don’t reach
   reliably — so paid orders silently never alerted. Multiple hooks now mean any
   path through checkout triggers exactly one Telegram message per status flavour.
 * **«Send test alert» button** on the Telegram page that runs the full direct-send
   pipeline (bot token fetch  channel match  Telegram API) using your most recent
   real order. Surfaces a per-chat success/failure summary inline so you know exactly
   which channel didn’t receive (and why).
 * **Better diagnostics on the channels list** — retries the dashboard fetch on 
   transient cURL errors (DNS exhaustion, «thread failed to start» on shared hosts),
   falls back to a 24h cached copy so the list doesn’t go blank on a blip, and shows
   specific host-side troubleshooting tips when cURL error 6 is detected.

#### 1.5.15

 * Fix: Connection page returned «Sorry, you are not allowed to access this page»—
   the submenu was registered before its parent menu existed. Adjusted hook priority
   so the parent always comes first.
 * Fix: Stock Take page wasn’t listing in-progress stocktakes — the dashboard returns`{
   stocktakes, outlets }` and the plugin was iterating the outer object instead 
   of the inner array. Now reads `.stocktakes`, drops the fake count columns, and
   renders the real fields (outlet, started by, started, last updated).

#### 1.5.14

 * **New: Connection page** (WC-Manager → Connection) — dedicated home for the plugin
   token with paste / save / validate / clear, mirroring the dashboard’s Plugin 
   Connection card. One token powers every WC-Manager feature (Telegram, customer
   notes, stocktake sync, supplier & PO sync) so this is now the single place to
   configure it.
 * **Token paste also embedded on the Telegram page** — if the bot can’t connect,
   the same token card shows inline so you don’t have to bounce pages.
 * **Stock Take page is now an actual stocktake interface** — lists in-progress 
   stocktakes pulled live from the dashboard, with shortcuts to start one at the
   till (OpenPOS) or in the dashboard for the full UI. Token settings removed from
   here (lives on the Connection page now).

#### 1.5.13

 * Telegram alerts simplified: always send **direct from WP**, no forwarder fallback,
   no bot token to paste. Plugin auto-fetches the token from WC-Manager (env var`
   TELEGRAM_BOT_TOKEN` on the dashboard) using your existing plugin token, cached
   for 5 min. Channels still configured in the dashboard and synced to WP admin.
   Sub-second alerts; admin never handles the secret.

#### 1.5.12

 * **Direct Telegram mode** — paste your Telegram bot token under _WC-Manager → 
   Telegram_ and the plugin sends alerts **straight to Telegram from WP** on every
   order, skipping the dashboard webhook entirely. Fewer failure points (no Vercel
   env to configure, no webhook URL, no proxy to whitelist) and a more reliable 
   sub-second alert path. Falls back to the forwarder if you leave the token blank.
   Channels (chat IDs, events, filters, templates) still managed in the dashboard
   and synced to WP admin — one source of truth.

#### 1.5.11

 * Telegram forwarder now defaults to ON for _both_ «New order created» AND «Order
   status changed». Without the status-change hook, completed-order (and paid-order)
   alerts never reach the dashboard, because WooCommerce fires `woocommerce_new_order`
   while the order is still in «pending» state — before payment clears. Existing
   installs keep their saved preference; only fresh setups get the new default.

#### 1.5.10

 * Readme refresh — Telegram alerts and Customer Notes now front-and-centre in the
   feature list, «Problems this plugin solves» and «Works great with» sections. 
   No functional changes.

#### 1.5.9

 * Telegram channel form: hides the _Order statuses_ picker unless _New order_ is
   checked. The _Order completed_ and _Order refunded_ events already imply their
   status, so asking for status would be confusing (and could silently never fire
   if you picked a mismatched pair).

#### 1.5.8

 * Updates the bot deep-link to `@wc_manager_bot` (the actual Telegram bot username).

#### 1.5.7

 * **Full Telegram channel manager in WP admin** — add, edit, test, delete chats
   from _WC-Manager → Telegram_ with the same controls the dashboard offers (chat
   ID, events, statuses, POS / online source filter when OpenPOS is detected, min
   order total, custom HTML template). Reads + writes the dashboard via the existing
   plugin token — what you change in either place reflects in both instantly.

#### 1.5.6

 * **New: Telegram Alerts** module under WC-Manager → Telegram. Forwards every new
   WooCommerce order (and optionally every status change) to the WC-Manager dashboard
   the moment it happens, which then routes it to your chosen Telegram groups, channels
   or DMs via the WC-Manager bot. Faster than the dashboard’s own polling — alerts
   hit your phone within a second of checkout. Per-channel filters (events, statuses,
   POS vs online, min total, custom HTML template) all live in the dashboard.

#### 1.5.5

 * **New: Customer Notes & Tags** under WC-Manager → Customer Notes. Free per-customer
   free-form notes plus tags (VIP, Wholesale, Prefers WhatsApp, At risk, etc.) keyed
   by email so guest checkouts are annotatable. Includes 9 quick-tag suggestions,
   4 000-char notes, and a search box. Two-way sync with the WC-Manager dashboard
   via new `GET / PUT /woo-manager/v1/customer-annotations` endpoints.
 * New `wp_oadb_customer_annotations` table created automatically on upgrade.

#### 1.5.4

 * **New: dark + purple admin theme** matching the WC-Manager dashboard. Loaded 
   only on this plugin’s WP admin pages — the rest of WP admin is untouched.
 * **Warehouses auto-mirror from OpenPOS.** Every published OpenPOS outlet is now
   created as a Warehouse on first page load with the OpenPOS link pre-set. No more
   empty Warehouses page if you already use OpenPOS.
 * **Live stock lookup on the Purchase Order builder.** As you type a SKU on a PO
   line, the plugin fetches the product’s name and current stock under the input
   and auto-fills the unit cost from the WooCommerce price if you haven’t set one.
   Variations supported.
 * **PO status badges** restyled as proper pill badges (draft / sent / partial /
   received / cancelled).

#### 1.5.3

 * New REST endpoint `POST /woo-manager/v1/purchase-orders/{id}/sync-receive` that
   bumps per-line `qty_received` without touching WooCommerce stock. Lets the WC-
   Manager dashboard mirror its own receive and return flows into the plugin’s PO
   status (draft  sent  partial  received) without double-counting stock.

#### 1.5.2

 * New REST endpoints under `woo-manager/v1/` for the procurement module — Suppliers(
   GET/POST/PUT/DELETE), Warehouses (GET), Purchase Orders (GET/POST/DELETE) plus
   PO send / cancel / receive actions.
 * Same authentication as the rest of the bridge — no additional connection key 
   needed; the WooCommerce REST consumer key handles it.
 * Lets the WC-Manager dashboard mirror suppliers and POs both ways: changes made
   in WP admin appear in the dashboard, and vice versa.

#### 1.5.1

 * Renamed the top-level admin menu from «OpsAssist» to «WC-Manager» to match the
   dashboard branding.
 * **New REST endpoints** for the procurement modules so the WC-Manager dashboard
   can read and write the same suppliers, warehouses and purchase orders:
    - `GET/POST /woo-manager/v1/suppliers`, `GET/PUT/DELETE /woo-manager/v1/suppliers/{
      id}`
    - `GET/POST /woo-manager/v1/warehouses`, `GET/PUT/DELETE /woo-manager/v1/warehouses/{
      id}`
    - `GET/POST /woo-manager/v1/purchase-orders`, `GET/PUT/DELETE /woo-manager/v1/
      purchase-orders/{id}`
    - `POST /woo-manager/v1/purchase-orders/{id}/send | /cancel | /receive`
 * All endpoints authenticate with the existing WooCommerce REST consumer key — 
   no new connection token needed.

#### 1.5.0

 * **New: built-in Procurement modules** in the WP admin under a new top-level **
   OpsAssist** menu.
 * **Suppliers** — directory with contact details, payment terms and lead time.
 * **Warehouses** — stock locations, with optional mapping to OpenPOS outlets so
   receives write to the same `_op_qty_warehouse_{id}` meta OpenPOS already uses.
 * **Purchase Orders** — create draft POs with line items by SKU (variations supported),
   mark as sent, then receive in one click to bump WooCommerce stock + per-warehouse
   counts.
 * **Stock Take settings page** moved from the WooCommerce submenu into the new 
   OpsAssist menu, keeping all OpsAssist tools in one place.
 * Database tables are created automatically on upgrade — no manual setup.

#### 1.4.3

 * Added a custom-header authentication method (X-WC-Manager-Key / X-WC-Manager-
   Secret). Some sites run a Basic-Auth or security plugin that intercepts the standard
   Authorization header and rejects non-WooCommerce REST routes as a failed login.
   The custom headers bypass that cleanly, survive redirects, and keep credentials
   out of the URL/access logs. The dashboard uses them automatically when available.

#### 1.4.2

 * Fixed authentication on servers where the Authorization header is consumed by
   PHP (most Apache mod_php and many FastCGI setups). The endpoints now read the
   WooCommerce consumer key/secret from PHP_AUTH_USER/PHP_AUTH_PW and REDIRECT_HTTP_AUTHORIZATION
   as well, matching how WooCommerce’s own REST API authenticates. This resolves
   the dashboard reporting the plugin as «not detected» even when it is active.

#### 1.4.1

 * Hardened the plugin loader: if an upload is incomplete and an internal file is
   missing, the plugin now shows an admin notice and stops loading instead of triggering
   a fatal error. This prevents a partial update from taking a site down.

#### 1.4.0

 * The woo-manager/v1 endpoints now authenticate with your existing WooCommerce 
   REST consumer key/secret — no WordPress Application Password needed. Store setup
   is just the API key plus this plugin.
 * Added `/ping` (authenticated handshake + companion-plugin detection), `/media`(
   image upload), and `/cashiers` (user name resolution) endpoints so the dashboard
   can do everything through this plugin with one credential.

#### 1.3.0

 * Restructured into a multi-folder plugin.
 * Added WooCommerce Memberships REST endpoints (`/memberships/plans`, `/memberships/
   user/{id}`).
 * Merged the standalone «WC-Manager: Members» and «WC-Manager: Stock Take» companion
   plugins into this plugin as optional OpenPOS terminal panels. They load only 
   when OpenPOS is present.
 * Added the Stock Take settings page (WooCommerce  WC-Manager Stock Take). Existing
   tokens from the standalone Stock Take plugin are read automatically.
 * Removed the self-hosted updater from the merged plugins — updates now come through
   WordPress.org.

#### 1.2.0

 * Renamed plugin to «OpsAssist Data Bridge for WooCommerce».
 * Function prefix renamed to `oadb_*`.
 * No changes to the REST endpoints or response shapes.

#### 1.1.0

 * Added a one-minute cache around the wallet-balances query.

#### 1.0.0

 * Initial release.

## Мета

 *  Версия **1.5.60**
 *  Обновление: **3 месяца назад**
 *  Активных установок: **Менее 10**
 *  Версия WordPress ** 5.6 или выше **
 *  Совместим вплоть до: **6.9.10**
 *  Версия PHP ** 7.0 или выше **
 *  Язык
 * [English (US)](https://wordpress.org/plugins/opsassist-data-bridge-for-woocommerce/)
 * Метки:
 * [inventory](https://ru.wordpress.org/plugins/tags/inventory/)[multi-warehouse](https://ru.wordpress.org/plugins/tags/multi-warehouse/)
   [purchase orders](https://ru.wordpress.org/plugins/tags/purchase-orders/)[suppliers](https://ru.wordpress.org/plugins/tags/suppliers/)
   [woocommerce](https://ru.wordpress.org/plugins/tags/woocommerce/)
 *  [Дополнительно](https://ru.wordpress.org/plugins/opsassist-data-bridge-for-woocommerce/advanced/)

## Оценки

Пока что нет ни одного отзыва.

[Ваш отзыв](https://wordpress.org/support/plugin/opsassist-data-bridge-for-woocommerce/reviews/#new-post)

[Посмотреть всеотзывы](https://wordpress.org/support/plugin/opsassist-data-bridge-for-woocommerce/reviews/)

## Участники

 *   [ opsassistrsa ](https://profiles.wordpress.org/opsassistrsa/)

## Поддержка

Есть что сказать? Нужна помощь?

 [Перейти в форум поддержки](https://wordpress.org/support/plugin/opsassist-data-bridge-for-woocommerce/)