# April 2026

## Monthly summary / tl;dr

* The **Assistant app** had a massive month — full **return and refund flow**, **pre-payments**, **PIN protection** on credit and sale, and a serious **purchase order** glow-up with filter chips, notes, receivement history, and an actually useful "more options" menu.
* **Order handling** got smarter across Client and Admin — require serial numbers on completion, pick a message template, print a missing items note, email the customer when done, and create **Profrakt** shipping labels straight from the dialog.
* New **Klaviyo** integration (Beta) — a tenant extension that syncs customers and consents into Klaviyo for marketing automation.
* New **Company Registry** lookups — look up companies by organisation or VAT number through a configured provider (Power Direct first out of the gate).
* New **Customer Merge** endpoint — finally a clean way to fold duplicate customers into one and bring their orders along.
* **Order Import** has been straightened out: no more silent magic. What you send is what you get — required add-ons, freight, and explicit prices are now your job, not ours. We'll fail loudly and early instead of half-building an order.
* Smarter **customer and order search** — better ranking, multi-word matching, dial-code-aware phone lookups, and a proper order date range filter.
* The **Payment Methods admin UI** got a refresh, plus a new visibility mode (`HIDDEN_WHEN_NOT_REQUIRED`) for methods that should only show up when needed for a refund.
* Loads of **Omnium** sync improvements — B2B contacts, e-invoice details, fewer accidental overwrites, retry on queued orders, and far fewer duplicate customers.
* As always, a long tail of fixes — phone input no longer eats your digits, gift card CVCs no longer crash payments, package product rounding adds up properly, and cross-store transactions are now properly blocked.

## 2026-04-30

### Added

* New **Company Registry** tenant extension that points to the integration used for company lookups. Activate it and set the provider extension UID to the integration you want to use.
* New endpoint to look up a company by organisation or VAT number through the configured company registry provider. If you leave out the country code, the tenant's country is used. If the provider rejects the request (for example an invalid identifier), you get a `400` with the provider's own explanation.
* Tenant payment methods now support an optional **receipt text** (`receiptText`) — the line that's printed on the receipt when that method is used.

### Fixed

* **Order import** no longer requires you to include the freight line yourself — leave it out and the system will add it for you using the freight product set on the delivery method.
* **Order search** respects the chosen sort order again. Sorting by settled date, order date or any other field now actually applies, and orders that don't have a value for the sort field (for example orders that aren't settled yet) are listed at the end instead of jumping to the top.
* The delivery service lookup no longer performs an unnecessary product search when the response has no value-added or freight services, which was causing incorrect results.
* Several **Omnium** order integration fixes around delivery creation, state mapping, and preserving Omnium's own values when Flow has nothing to overwrite them with.

## 2026-04-28

### Added

* **Pre-payment support** in the **Assistant app** — take pre-payments on orders, use existing pre-payments during final payment, and view pre-paid amounts. Perfect for special orders and deposits.
* **Order status check before payment** in the **Assistant app** — surfaces blocking errors and ignorable warnings before you start the payment flow, so you don't get stuck halfway.
* Full **return and refund flow** in the **Assistant app**:
  * Start a return on the **Sales Hub** — look up a settled order by number, or create an empty return from scratch.
  * **Return mode** on open orders, marked with a "Return" badge in the order header.
  * **Return / Sell prompt** when adding a product to an order in return mode, so you don't accidentally credit something you meant to sell.
  * Pay button shows **"Refund"** with destructive styling when the order total is negative.
  * **Serial number re-entry** when crediting a serial-numbered item — scan or enter the actual serial(s) being returned.
* **PIN confirmation** before crediting an order, when `requirePinCodeForCredit` is enabled (**Assistant app**).
* **PIN confirmation** before creating a new sale or opening an existing order, when `requirePinCodeForSale` is enabled (**Assistant app**).
* **Serialised products** can now be added without a serial number — the serial can be entered later, before payment (**Assistant app**).
* **Order handling** improvements (**Client** and **Admin**):
  * New "Require serial number on completion" switch.
  * New optional "Template on completion" dropdown for sending a message when the handling is completed.
  * Re-print pickup note on completed order handlings (**Client**).
  * Print missing items note (**Client**).
  * Notify customer by email when completing an order handling (**Client**).
  * Order and item notes are shown in the order handling open dialog (**Client**).
* New **Customer Merge** endpoint: `POST /tenants/{tenantUid}/customers/{customerUid}/merge` — pass `mergeFromCustomerUid` in the body to merge the duplicate into the customer in the path. Sales orders and related data are reassigned to the surviving customer, and the duplicate is deleted. Requires `CUSTOMER` permission.
* **Sold not delivered** dialog added to the touch sale "more" dialog (**Client**).
* **Stocktaking** in the **Assistant app** got a proper exit experience:
  * Progress bar on the loading screen.
  * Exit dialog when leaving with three clear options: submit, save progress, or discard and leave.
* New **Klaviyo subscription** webhook for syncing subscription changes back into Flow.
* **Printers API**: new `availablePrintActions` field on printer resources lists what each printer is actually capable of printing — `RECEIPT`, `EXCHANGENOTE`, `GIFTCARD_BARCODE`, `PICKUP_LABEL`, `PRODUCT`, `CUSTOMER_MEMBERSHIP_CARD`. Derived from the printer's hardware type, so clients can stop sending jobs to printers that can't handle them.
* **Printer edit modal** now shows read-only "Can print" chips listing those capabilities, with an info-icon tooltip explaining where the list comes from (**Admin**).
* **Order import** now fails early with a clear message if a product has a **required add-on** that isn't included in the request, or if the **delivery method requires a freight product** that isn't included. No more half-built orders.
* **Import templates** API response now includes the field definitions, so frontends can stay in sync without hardcoding.

### Improved

* **Order search** now ranks results by relevance when you search by customer name, address, company, phone number, email, or order number. Closest matches appear first, multi-word searches like *"kari anne hansen"* find the right customer even when the names span first and last name, and searching by order number still lands the exact order at the top.
* **Order import** has been tightened up significantly — no more silent magic:
  * No automatic add-on products, no campaign discounts, no automatic environmental fees (ARTS). What you send is what gets created.
  * Required add-ons must be included **explicitly** and linked to the main product line.
  * Freight products must be included when the delivery method requires one.
  * `itemPrice` and `quantityOrdered` are now required on each order line.
  * Settlements are now restricted to payment methods of type **external**, **payment gateway**, **invoice**, or **rounding**. Anything else is rejected with a clear error.
  * If you send a status on a settlement, we keep **exactly that status** instead of replacing it. If you leave it out, we default to `authorized` for payment gateway settlements and `captured` for the rest.
* **Receipts** with authorized settlements from external or invoice payment methods are now **captured automatically** when the receipt is ready for capture — same behaviour payment gateway settlements already had.
* **Power**: the home delivery integration has been updated to the vendor's new API version, so delivery options and time slots keep working.
* **Raw ESCPOS** is now the default for ESCPOS printing. Can be turned off via feature flag if needed.
* **Import templates** in **Admin**: required-field rules now come from the backend instead of a hardcoded frontend table, so the editor stays in sync when Core changes. Fresh templates open empty with a "Suggest fields" helper (favours `sku` over `productUid` when both are allowed), and the header shows "Valid for: Create / Update" capability badges.
* **Serial number** is no longer required to be re-entered in order deliver and order handling if it's already on the order line (**Client**).
* **Payment methods** in the **Assistant app** are now fetched fresh per order instead of using a cached list from login — toggle a payment method setting on the backend and it takes effect immediately.
* **Stocktaking** progress in the **Assistant app** is no longer auto-saved on every quantity change — it's saved explicitly via the exit dialog, which keeps device storage from filling up.

### Fixed

* **Accounting report**: rounding settlement posts now correctly accumulate both debit and credit amounts when a rounding key receives a mix of positive and negative settlements, instead of overwriting one side with zero.
* **Power**: cancelling a home delivery that hasn't been delivered yet now surfaces a clear error if the cancellation actually failed on the supplier side, instead of cheerfully reporting success.
* **Gift card** settlements: entering a CVC on a gift card whose brand doesn't require one is now ignored, instead of failing the payment with a CVC decryption error.
* **Phone number input** in the **Client** silently dropped digits when the typed number started with the selected country's calling code (e.g. typing `4705555` with Norway selected). It now keeps your digits.
* `quantity not delivered` on a sale order item could show incorrect values if returns were linked to that line (**Client** and **Assistant**).
* **Return dialog** in the **Client** could crash if the store was missing return access to its default return warehouse.
* **Order handling** count on the **Assistant** dashboard didn't match the order handling list filters.
* Saved **stocktakings** no longer build up unnecessary storage on the device over time (**Assistant**).
* Restoring a saved **stocktaking** now correctly picks up items added or removed since the last save (**Assistant**).
* **Quick sale** product list in the product search dialog can now actually be scrolled all the way to the bottom (**Assistant**).

### Removed

* **Peripheral edit modal** in **Admin**: the deprecated `defaultLabelTemplate` and `loadedLabelSize` fields are gone. Label template and size now live on the **Printer** itself, exposed via the generic printer settings array.

## 2026-04-23

### Added

* New **Klaviyo** tenant extension (**Core** and **Admin**):
  * Configure with API key and consent parameters.
  * Klaviyo service for connecting and syncing customer profiles.
  * Customer **consents** sync to Klaviyo subscriptions automatically.
  * New `ExternalId` field on consents for mapping to external systems — exposed in the **Admin** create/edit modal and the consent list, and searchable.
* New payment method visibility **`HIDDEN_WHEN_NOT_REQUIRED`** — hidden by default but promoted to `LISTED` when the method is required for a refund (via `requireRefundToSameMethod`). Great for cards-on-file scenarios where you don't want the customer to see the method unless it's needed.
* **Order search** (store and tenant) now supports filtering by **order date** using `orderDateFrom` and `orderDateTo` — the actual business order date, not just last-modified or settled-at.
* **Accounting configs**: new `cashfloatDiff` (`CASHFLOAT_DIFF`) account number key for booking cash register till count discrepancies.
* **Payment extension wizard** in **Admin** (superadmin) — a guided setup flow that adds the extension, configures its parameters, and creates the corresponding payment method, all in one go.
* **Delete tenant extension** — superadmin-only delete button on the extension edit modal in **Admin**.
* **Stock History** report in **Admin** — view stock movements by store, warehouse, and transaction type, with XLSX export.

### Improved

* **User modal** in **Admin**: the deprecated Access Level dropdown and Store Access tab are now hidden for new users. In edit mode, a "Show old access" switch reveals both (in an amber-tinted panel) for users still on the legacy access system. Cleaner for new setups, gentler for old ones.
* **Payment method edit modal** in **Admin** got a proper redesign:
  * Split-pane layout with left navigation (General / Requirements / Settings / Mappings) replacing the old accordion.
  * Parameters and mappings now edit inline above the table instead of opening nested sub-dialogs.
  * Tighter sizing so the dialog no longer stretches awkwardly on tall screens.
  * Info tooltip on the **Amount Input** field explaining None / Autofill Remaining / Force Remaining.
* **Settlement print** in **Admin** now shows "Not verified by others" instead of "-" when closed without second approval, and hides the signature/date lines for the verifier.
* **Product image reorder** in **Admin** uses the batch endpoint (`POST /media/batch`) instead of firing individual `PUT` calls — faster and easier on the API.
* **Count cash modal** in **Admin** now requires a **note** when the counted amount differs from the expected amount (FLOW-2499).

### Fixed

* **Customer search** now finds customers by the start of a mobile number even when the digits you type happen to begin with your country's dial code — searching `477028` or `47477028` now matches a customer stored as `+47477028…`.
* **EHF**: `statusAt` on invoice status responses now reflects the stored transaction log time instead of `time.Now()`.
* **Reserved quantity** on a referenced order line is now only reduced when the current order line has no delivered and no reserved items.
* **Cross-store transactions** are now properly blocked — settlements and receipts can't be created when the till or order belongs to a different store (FLOW-2551).
* **Customers**: the VAT number duplicate check now normalizes whitespace, hyphens, and country/MVA prefixes before comparing, so `"977 04 7838"` and `"977047838"` are recognized as the same number — preventing duplicate companies from sneaking in via creative formatting.
* A pile of **Omnium** sync fixes:
  * Order status updates now retry automatically when Omnium reports the order is still queued, with Sentry reporting if retries are exhausted.
  * Shipment status is no longer overwritten by Flow when syncing orders — Omnium keeps its own state.
  * Fixed a customer sync condition that was creating duplicate private customers instead of updating existing ones.
  * Newly created customer contacts are now synced to Omnium, and the linked company customer is also updated so the new contact appears in its contact list. Previously only contact *updates* were synced.
  * Flow no longer sets or overwrites the returned quantity on order lines when syncing — Omnium's own return tracking is preserved.
  * **Power**: use the quantity from the return when checking if the order can be refunded towards SAP.
  * `ReturnQuantity` is now sent when transferring an order line to Omnium on an invoice.
* **Admin** fixes:
  * **Consents**: clearing the description or external id now actually persists (previously empty values were silently dropped). Whitespace-only inputs are also trimmed.
  * **Device auto-logout**: fixed the custom seconds input not working, and unified two separate implementations into one shared component.
  * Image upload limit reduced to **3MB** to prevent Vercel payload errors (base64 encoding adds \~33% overhead over the 4.5MB limit).
  * **Product groups** table no longer reloads when opening or closing modals without changes.
  * **Product groups** edit modal no longer has layout shift — the form populates instantly from table data.

### Deprecated

* **Order search**: `fromDateTime` and `toDateTime` are deprecated. They previously drove either last-modified or settled-time depending on other filters, which was confusing. Use the explicit fields instead — `createdAtFrom` / `createdAtTo`, `settledAtFrom` / `settledAtTo`, `lastModifiedAtFrom` / `lastModifiedAtTo`, and the new `orderDateFrom` / `orderDateTo`.

## 2026-04-13

### Added

* **Standalone customer contacts** — contacts can now exist independently and be linked to multiple customers with roles. Includes new endpoints for create/read/update/delete, search, and customer linking. A contact at a B2B customer can now be the same person across companies.
* New tenant setting **`customerContactsRequiresEmail`** — when enabled, email is required for contacts and duplicates within the tenant are rejected (**Core** and **Admin**).
* **B2B customer contacts** are now synced to Omnium as private customers with a `"B2B"` tag, linking the contact person to their private customer record. Contact updates are also synced independently.
* **Purchase orders** in the **Assistant app** got a well-deserved upgrade:
  * **Status filter chips** above the list for quick status switching.
  * **"More options"** menu with actions for discount, freight cost, send to email, addresses, mark as received, reservations allowed after, and message history.
  * **Confirmed receivements** filter (All / Confirmed / Not confirmed) in the list filter dialog.
  * **Green checkmark** icon next to the status badge for orders with confirmed receivements.
  * **Notes** on purchase orders and purchase order items.
  * **Receivement history** dialog on purchase order items.
  * Expandable **supplier info** section on open purchase orders showing supplier and delivery addresses, order metadata, and totals.
  * **Closed view** for purchase orders with actions and metadata.
* **Drag-to-reorder** items in open sales orders and purchase orders (**Assistant**).
* **Click-to-copy** on phone numbers, emails, and identifiers in the customer details dialog (**Client**).
* New **order handling** dialog on an order (**Client**), with support for:
  * Creating **Profrakt** shipping labels directly from the dialog.
  * Requiring a **serial number** on order handlings.
  * Selecting a **message template** for order handlings.
* **Monthly Sold Not Delivered (SIU) report** page in **Admin**, listing the auto-generated report files.
* **Excel download** button on the Purchase and Receivement Report page in **Admin**.
* **Delivery method**: dynamic options toggle — when enabled, hides the freight product and timeslots since they're provided dynamically by the delivery provider (**Admin**).
* **Organizations** page in **Admin** now has proper **pagination controls** (page navigation and page size selector).
* **Purchase order search** response is now also available as **Excel** (optional via the `Accept` header).
* New endpoint for **available payment methods for an order**, using `POST` instead of the old `GET`. The `GET` version is now deprecated.
* New **webhook** for when an order item reservation is changed.
* **Transaction templates** API now accepts `integrationToken` alongside `authToken` and `accessToken` for create, list, get, update, delete, and notifications-preview.
* **Poster print** request now supports a product properties field.

### Improved

* **Order settlement** responses now include **store** (`storeUid`, `storeName`) and **till** (`tillUid`, `tillName`, `tillNumber`) — so you can see where each payment was actually registered.
* **Notifications**: `templateData` is now merged into template variables before rendering for both email and SMS (optional overrides; leading `.` stripped from keys). Server-filled values from `orderUid`, `customerUid`, etc. still apply when a variable stays empty after merging.
* When **RabbitMQ** or the print/message path fails (timeouts, connection issues, publish failures, etc.), affected APIs now respond with **`503 Service Unavailable`** and clearer, localized messaging — instead of treating these as ordinary client errors. Affects order print, till, printer, product, and customer flows that rely on the message queue.
* **Invoice payment** for **Danish tenants** now requires a customer contact when the customer has e-invoicing enabled — and is blocked outright at settlement if the contact is missing.
* **Company departments** no longer require phone number, address, or email — validation is skipped for departments (sub-customers) of a company.
* **Product group name** is now optional on update.
* **Featured payment method** in touch sale (**Client**) — the method's requirements are now checked before opening the payment dialog, instead of failing inside it.
* Default **order state filter** (parked, confirmed) on the order handling list has been removed (**Assistant**) — show me everything.
* **Orders filter** in **Admin** now has a settled date range filter, and the left column has been reordered (Order Type before Settle State) with grid rows aligned across columns.
* **Device create modal** in **Admin** defaults Touch Mode to "On (Optional)" and Auto Logout to "Use tenant settings" on step 2. The Auto Logout input also hides the seconds field when "Use tenant settings" or "Disabled" is selected.
* **Omnium** sync now includes **e-invoice enabled** status and **e-invoice address** for business customers.
* **Omnium**: Flow no longer updates the order status on Omnium orders — only shipments are updated, which is how it should have been all along.
* **Omnium**: timeslot, delivery provider indicator, and delivery date are now updated on deliveries when changed in Omnium.
* **Omnium**: stable shipment IDs are now prefixed with the order UID.

### Fixed

* **Invoice settlement** for **Danish tenants** is now blocked when the customer has e-invoicing enabled but no contact person is set on the order.
* **EHF credit notes** could fail validation when the customer had no contact information.
* **Printing of exchange notes** is fixed.
* **Poster PDF** margins were overriding the template's zero-margin layout, causing only the first page to render.
* **Customer search** matching on name, phone, and email has been improved (also added missing trigram indexes for `firstname` and `lastname`).
* **Template rendering** for email and SMS: empty subject when no DB template exists no longer causes a nil dereference on `templateRecord.Subject`.
* **Exchange note receipts**: `ExternalNote` is now supplied on order lines, so exchange-note templates no longer fail when showing product external info.
* **Omnium order delivery** now correctly records only the **new quantity** instead of the cumulative total — preventing double-counted deliveries.
* **Omnium contact persons** on business customers now correctly link to the contact's own private customer record instead of the parent company.
* **Tracking number** on deliveries can now be updated after the fact, and timeslots can be removed by setting `fromTime` and `toTime` to empty strings.
* **Order items**: serial number and warehouse UID can now be updated on non-editable orders until the line is fully delivered (FLOW-2365).
* **Payment orders** now support the ESCPOS/bong receipt template (same as `ORDER`).
* **Package products**: fixed a rounding issue where component prices could differ from the package total.
* **Package products**: components are now included on the receipt.
* **Cashback and rounding** settlements are now linked to the correct receipt.
* **Client** fixes:
  * When adding a company customer during payment method requirement validation, you weren't asked to add a contact when one wasn't required.
  * If there were any deliveries, adding or changing a customer during payment method requirement validation didn't ask the user to update the address on the deliveries.
  * Couldn't select a "to" date before today on reports, even if the "from" date was set earlier.
  * Message history for orders and purchase orders only showed messages sent from the order's store.
  * Selecting Invoice payment on an order with deliveries asked you to update the delivery address even when there were no customer changes.
  * Order deliver out dialog used the order's `storeUid` to check warehouse access, not the device's `storeUid`.
* **Assistant** fix: delete button in the order close dialog now shows a confirmation dialog before deleting.
* **Admin** fixes:
  * **Organizations** page footer count mismatch — showed "1-10 of N" while displaying 25 items. Footer now uses the correct page size.
  * **Organizations** page: stale form data when creating a new organization right after editing an existing one — selection state now resets on modal close.
  * Deleting **product properties** with very large text could fail due to oversized delete-confirmation dialog content.
  * **Import template** validation is now operation-aware — update-only templates no longer require create-only fields (e.g. `brandUid`, `productGroupUid`).
  * **Import templates** now block saving and importing when required field mappings are missing, with translated validation tooltips and warnings.
  * Field validation aligned with backend requirements, with OR-group support.

### Deprecated

* `GET /tenants/{tenantUid}/orders/{orderUid}/payment-methods` (the old "available payment methods for an order" endpoint) — use the new `POST` endpoint instead.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.flowretail.com/docs/april-2026.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
