---
title: "Changelog"
description: "Recent updates and new features in Sarah."
keywords: ["changelog", "updates", "release", "new features"]
lastUpdated: "2026-07-31"
---

# Changelog

## POS and products: legacy import attributes (2026-07-31)

**Fix for migrated accounts with metadata in `products.attributes`**

- Some imports stored `supplier_id` and `legacy_provider` as scalars in `attributes`; Sarah expects variant options (`Size`, `Color`, etc.) as string arrays.
- That caused blank screens when adding to cart (POS) or editing a product (e.g. cost).
- Data cleanup for affected accounts; the product editor now ignores non-variant metadata.

## User invitations: correct redirect (2026-07-31)

**Invited users no longer land on /welcome to create a duplicate company**

- Fixes invited users being sent to merchant signup after accepting an invitation (magic link or Supabase invite email) instead of joining the inviting business.
- The flow now redirects to `/auth/confirm-invitation`, links membership, and sends admins to the dashboard or cashiers to the POS based on role.
- Invite emails set an explicit `redirectTo` and email-keyed login continuation so the flow works across browsers.

## POS: crash when adding imported products (2026-07-31)

**Fix for cart add on products with legacy metadata in attributes**

- Migrated products stored `supplier_id` and `legacy_provider` in `attributes`; POS treated them as variants (size, color) and the page crashed with «This page couldn't load».
- The variant picker only opens when there are real options (`string[]`); everything else adds straight to the cart.
- Same fix applied to the online shop for products with the same attribute format.

## POS: manual discount on A4 receipt (2026-07-29)

**Cart discount now shows when printing in A4 format**

- Fixes manual POS discounts missing from A4 receipt line items and totals (80 mm / 57 mm tickets already worked).
- Adds a "Manual discount" line in the A4 discounts section, including the percentage when applicable.

## Landing: plan translations by currency (2026-07-29)

**Fix for untranslated i18n keys in the pricing section**

- Plan features for BRL currency (Brazil) no longer show raw translation keys when the site is in Spanish or other locales.
- Pricing title, announcement, and VAT note on the landing page now adapt to the detected currency (ARS, BRL, USD).

## Android modals: fix Select inside Sheet/Dialog (2026-07-29)

**Prevents cart or dialogs from closing when using dropdowns in Chrome on Android**

- Fixes known Radix bug: with an open Select, taps hit the overlay and dismiss the modal.
- Adds `pointer-events-auto`, `composedPath` touch detection, and a grace period when Select/Popover closes.
- **v0.2.122+:** dropdown renders inside the Sheet/Dialog (not `body`) and blocks dismiss in `onOpenChange` while a Select is open — fix for Android 16 / Chrome on devices like Motorola Edge.

## Receive OCR and mobile modals (2026-07-28)

**Better parsing of cropped invoices and dialogs that stay open when picking options**

- **Receive products (OCR):** accepts line items even when the photo has no visible prices (e.g. wholesaler invoices with cropped columns); warns when costs must be entered manually.
- **POS and mobile modals:** changing invoice type or tax condition no longer closes the cart or dialog when tapping a Select or combobox.

## ARCA delegation: fix Sarah certificate linking (2026-07-28)

**Fixes step 2 stopping at userSearch without clicking CONFIRM**

- Automation no longer marks linking as done when userSearch shows “subdelegation”; it opens the incorporate-relation screen and clicks CONFIRM (merchant + wsfe + sarah cert).
- Avoids false “Ready to link” when only delegation was accepted but the certificate link was not confirmed.

## ARCA delegation: WSFE verification and error 600 (2026-07-28)

**Avoids showing “Ready to link” when AFIP has not enabled WSFE billing yet**

- After accepting delegation and linking the Sarah certificate, Sarah calls AFIP (`FEParamGetPtosVenta`) before marking step 2 as authorized.
- If AFIP returns error 600 (CUIT not in relation list), the wizard guides the merchant to re-delegate from their own tax key.
- Clearer messages when fetching points of sale and when automation fails.

## Online shop: fix stock trigger on checkout (2026-07-28)

**Fixes finish-purchase failure after pending-stock reservation**

- The pending web-order trigger failed with `pg_advisory_xact_lock(bigint, bigint) does not exist` and aborted checkout (e.g. Quiero Dulces).
- Postgres function updated with explicit `integer` casts.

## Online shop: checkout on subdomains and custom domains (2026-07-28)

**Fixes finish-purchase errors on merchant storefronts**

- Stores on `*.sarah.ar` subdomains and custom domains can complete checkout without *"An unexpected response was received from the server"* or 403 screens.
- Applies to buyers opening the shop from Instagram or other in-app browsers.

## Receiving OCR: Krafei and SKYCEO invoices (2026-07-28)

**Better distributor invoice parsing and clearer failure messages**

- **Products → Receive → From file (OCR)** now handles **UNI/DESCRIPCIÓN** (Krafei) and **BULT/UxB/UNID** (SKYCEO) layouts: packs, units per pack, and prices.
- Filters bonus lines (BONIF, symbolic prices) and shows a clear error when no products are detected instead of success with an empty table.
- On success, the toast shows how many products were detected.
- Recovers line items when the model response is truncated on long invoices (30+ lines).

## ARCA delegation: clearer errors (2026-07-27)

**When delegation is missing in the portal, the message explains what to do**

- If Patmos finds no pending items for the CUIT, Sarah explains the merchant must finish delegating on arca.gob.ar (step 1) before tapping **Ya delegué**.
- The ARCA wizard shows actionable guidance instead of a generic technical error.

## Kiosk landing: products block and trial navbar (2026-07-27)

**`/para/kioscos-almacenes` — copy from CMS**

- New **“No empezás de cero”** block below the hero: catalog (+15,000 products), import your list/Excel, and a master database of +500,000 barcodes.
- Campaign navbar CTA **Start 7-day free trial** (no separate “Log in”).
- **Superadmin → Growth → Landings:** **Products** tab for the block; optional hero eyebrow; **testimonial video** slot in Case study (`YouTube ID`).
- Demo video: play button only, no overlay copy.

## Online shop: reserved stock on pending orders (2026-07-27)

**Prevents selling more units than available**

- At checkout, the shop subtracts units already committed in **pending web orders** (not just physical deposit stock).
- Product grid and cart show real availability; items fully reserved by pending orders appear unavailable.
- **Database:** trigger blocks sale line inserts when free stock is insufficient, including concurrent checkouts.

## Unified OG/SEO framework (2026-07-27)

**1200×630 share images across the product**

- **`/og`** generator with `brand`, `docs`, `landing`, `shop`, and `menu` templates (Geist + Sarah colors on owned surfaces).
- **Shop and resto:** OG uses merchant theme (primary color, default/dark/warm preset or shop default/fashion/beauty); merchant cover/header when available.
- **i18n:** OG copy in es, en, and pt-BR; locale from cookie, merchant country, or `locale` query param.
- **Resto:** OG metadata on `/menu`, `/pedir`, thanks, my orders, and table QR; distinct badge per flow.
- **Shop / club / thanks / sales:** generated template with merchant branding; `robots.txt` allows crawling `/og`.
- **Production fix:** Geist fonts bundled in `assets/fonts/` so `/og` returns 200 on Vercel (WhatsApp/Facebook link previews).
- **Landings `/para/…`:** OG metadata uses the URL’s canonical locale (es), not scraper geo — fixes Portuguese title/image when sharing Spanish links.

## Campaign landings: CMS, SEO, and PageSpeed (2026-07-26)

**Kiosks and corner stores — production ready**

- **`/para/kioscos-almacenes`** (es / pt-BR): copy is **100% from published CMS**; no hardcoded marketing text in code.
- Only landings with a **published** Superadmin version are reachable, indexable (sitemap), and allowed in `robots.txt`; others return **404**.
- **SEO/GEO:** niche JSON-LD (WebPage, SoftwareApplication, FAQPage), keywords, hreflang, and OG/Twitter metadata from CMS.
- **PageSpeed:** optimized images (`next/image`), LCP preload, YouTube facade (loads on click), static navbar on campaigns, lazy pricing/FAQ, CTAs without costly animations.
- **`robots.txt`:** `LLM:` directive moved to a comment for Lighthouse compatibility.

## CMS for kiosks campaign landing (8 blocks) (2026-07-26)

**Multilingual editing from Superadmin**

- The **`/para/kioscos-almacenes`** campaign reads published copy from the CMS (`landing_pages` by vertical + locale).
- In **Superadmin → Growth → Landings**, vertical **Kiosks and stores**: **8-block** editor (hero, pain points, flow, video, onboarding, case study, closing, SEO).
- Preview and production use the same template; edit **es**, **pt-BR**, and **en** separately and publish per locale.
- If nothing is published, the URL is unavailable (404).

## Kiosks-stores landing and mobile demo POS (2026-07-26)

**First kiosks/stores campaign landing — ES and pt-BR (Brazil)**

- **`/for/kiosks-stores`** and **`/para/kioscos-almacenes`** (8 blocks: hero, pain points, flow, video, onboarding, case study, pricing, CTA) with locale-aware copy (**es** and **pt-BR** from locale/geo).
- **Embedded demo video** (YouTube, ~60 s) featuring real customer **Novo Santa Maria · Tigre**.
- **Case study** with counter photo and Before / Problem / With SARAH layout.
- SEO and WhatsApp message per locale; pricing uses site i18n.
- **Mobile demo POS:** the cart no longer opens automatically on entry; the product grid stays visible until the user opens it.
- **Mobile cart:** aligned header labels (price list, invoice type, origin, customer).
- **Mobile payment modal:** payment methods and cash boxes in a compact **3-column** grid.
- **Kiosco demo:** demo POS shows only the boxes relevant for campaign screenshots and video.

## Duplicate barcode warning (2026-07-26)

**Manual product create/edit when a barcode already exists**

- When you **create** or **edit** a product by hand, if the barcode already exists in your company, Sarah **warns** you and you can choose: view the existing product, create/save anyway, or cancel.
- Applies in **Inventory** (edit and duplicate) and **quick add** from inventory or POS.
- **Bulk import** is unchanged: duplicate barcodes in spreadsheets remain the merchant’s responsibility.

## Smart Excel/CSV importer (2026-07-26)

**Bulk import without a fixed template, with AI mapping and preview**

- New import wizard for **products**, **contacts**, and **prices**: upload any `.csv`/`.xlsx`, Sarah suggests column mapping (heuristics + AI), and you can adjust before importing.
- **Preview** with per-row validation, batch progress, and **error CSV download** when rows fail.
- **Explicit confirm step** before import, 5-step stepper with contextual hints, mapping progress with live preview, and a progress screen with real-time counters.
- **Load** is now catalog-focused: removed “Create invoice” (belongs in **Receive**) and fixed empty space below the AI hint on the File step.
- Replaces legacy upload modals on Products and Contacts; the **Load from File** tab in Update prices uses the same flow.
- Updated docs: [Bulk import](/docs/inventory/bulk-import).

## Brazil subscriptions with Pix and BRL pricing (2026-07-26)

**Localized checkout for Brazilian merchants**

- Visitors from **Brazil** see **R$ 149 / R$ 299** pricing on the landing page and signup flow.
- Stripe Checkout uses **BRL** prices and supports **Pix Automático** (QR in the banking app) alongside cards.
- The signup flow shows Portuguese payment copy for the Pix checkout path.

## Fiscal ticket: point of sale and CAE expiry (2026-07-25)

**More reliable ticket reprints**

- Tickets no longer show literal placeholders (`{pos}`, `{date}`) when data was missing.
- When issuing through **ARCA**, the **point of sale** is stored in invoice metadata; reprints use that value even if ARCA config changes later.
- **CAE expiration** is formatted correctly from `cae_expiration`.
- Backward compatible: older invoices without `metadata.pos` still use the configured ARCA settings.

## Admin shift close (2026-07-24)

**Admins can close open shifts belonging to other users**

- On **Shifts → View details** for an open shift, administrators see a **Close shift** button.
- Amounts are suggested from the theoretical balance and can be adjusted before confirming.
- Closing generates the balance ticket and records who closed it in the shift description (`Cerrado por admin: …`).
- Useful when a cashier forgot to close their register at end of day.

## Step-by-step ARCA setup wizard (2026-07-24)

**Clearer electronic invoicing onboarding**

- Under **Settings → ARCA**, a 4-step wizard guides the full flow: delegate in ARCA, tap **Ya delegué**, complete CUIT/regime, and choose a point of sale.
- Step 1 asks merchants to create the **electronic point of sale** in the same ARCA session, so they do not need to return to the portal later.
- Instructions use **literal ARCA portal labels** (menus, buttons, and system options) in flowing prose for first-time users.
- Steps unlock in order; delegation status updates live until **Ready to link**.
- The CUIT from the delegation request is pre-filled when linking the merchant profile.

## Payment tracking and trial expiration (2026-07-24)

**More reliable billing and self-expiring trials**

- When the **7-day trial** ends, the subscription becomes **inactive** automatically; the merchant stays in read-only mode until they subscribe.
- **Superadmin → Payment tracking**: company ID, WhatsApp, recent sales (30 days), attention reason, and quick actions (Sync, WhatsApp, Admin).
- Billing reconciliation runs synchronously and syncs Mercado Pago charges that previously left stale due dates in Sarah.
- **Real billing-cycle overdue**: missed months and overdue days even when a receipt advanced dates without reactivating the subscription.
- **Active trials** are excluded from “Needs attention”; only expired trials (conversion) and real overdue cases remain.

## Automatic ARCA delegation acceptance (2026-07-24)

**Patmos can accept WSFE delegations from Sarah**

- Under **Settings → ARCA**, merchants can notify Sarah after delegating electronic invoicing to Patmos.
- Sarah queues a workflow that logs into ARCA, accepts the designation, and links the Sarah certificate.
- Patmos superadmin can run a smoke test for login + Relationship Manager.

## Dashboard: dates in the consulting client timezone (2026-07-24)

**Dashboard date range no longer shifts a day because of UTC**

- The date filter uses the browser timezone of whoever is viewing (`tz` in the URL).
- Charts no longer show an off-by-one day when formatting `YYYY-MM-DD` keys.
- Tickets-by-day buckets use the company UTC offset, aligned with account movements.

## Trial follow-up on WhatsApp (2026-07-24)

**Automatic reminders during the 7-day trial**

- SARAH can WhatsApp you on trial days 1, 3, and 5, and when ~48 hours remain.
- The message adapts to what’s left to set up; if you already wrote within 24 hours, it can be personalized.
- Reply **BAJA** to stop these messages.

## Goods receiving with OCR (2026-07-23)

**Clearer packs, costs, and prices when receiving from an invoice**

- In **Products → Receive → From file (OCR)**, columns separate **packages/bultos** (invoice packs) from **units/pack** and show **new units** entering inventory.
- Stock order: **previous stock → new units → final stock**.
- **System cost** vs **invoice cost** comparison, with change indicator and **Use higher cost** (helpful when buying on sale).
- When a product is matched, **margin** is prefilled from the catalog and **new sale price** is calculated.
- OCR better distinguishes pack quantity and price per pack (e.g. LATAX6 invoices).
- When creating a **purchase invoice**, you can **optionally record the expense in a cash box**: full or **partial payment**, with remaining balance on the invoice.

## Dashboard: expenses without withdrawals (2026-07-23)

**Cash withdrawals no longer count as operating expenses**

- The **Expenses by category** card and **daily expense movements** chart exclude cash withdrawals.
- Withdrawals remain in box movements; they no longer inflate dashboard expense metrics.

## Promotions: product selector (2026-07-23)

**Product name when editing combos**

- When editing bundle-style promotions, combo items show the **product name** instead of a numeric ID.
- Also applies to other async product selectors when loading a previously saved value.

## Team invitations (2026-07-23)

**Linking and redirect when accepting an invitation**

- Confirming an invitation links company, role, and membership even if the user already existed in Auth.
- After acceptance, admins go to the **dashboard** and other roles to **POS**.
- Users with a pending invitation no longer land on `/welcome` and avoid creating a duplicate company.

## Quicknew: company creation (2026-07-23)

**Fix when linking box and store in quick setup**

- Removed the duplicate `box_store_relationship` insert that failed with *duplicate key* when database triggers had already linked the default box to the main store.
- The flow now uses idempotent linking and relies on existing triggers for deposits and additional boxes.

## Mercado Pago Point (POSNET) without webhooks (2026-07-22)

**Automatic close on Point terminal even when MP does not notify**

- POS polling now covers **Point / POSNET** (`order.processed` via `GET /v1/orders`), not only static QR.
- Same 4-second fallback while the payment modal waits for confirmation.

## MP QR payments without webhooks (2026-07-17)

**Automatic close even when Mercado Pago does not notify**

- For static in-store QR, MP often sends no webhook; the POS modal polls MP every 4 seconds and closes the sale once the charge is approved.
- Complements the `merchant_order` fix (2026-07-16): in-store payment confirmation no longer depends on webhook delivery.

## Mercado Pago QR payments at POS (2026-07-16)

**Automatic confirmation when paying with in-store QR**

- The Mercado Pago webhook now handles **merchant orders** (`merchant_order`) in addition to `order` and `payment`.
- POS QR payments (e.g. FLAMA) close automatically when MP confirms the charge—no need for “Close manually”.
- Matching is fixed when MP sends minimal notification payloads (order ID only).

## Mobile login and passkey (2026-07-16)

**Cleaner sign-in on phones**

- On mobile, the header photo was removed: the form is centered with the SARAH logo on top.
- **Sign in with fingerprint or Face ID** is always shown, including when you arrive with a return link (`?next=`).

## Welcome, sales channel, and tours (2026-07-16)

**Shorter signup and setup that matches how you sell**

- Welcome collects the essentials in one form (country, industry, channel, business, and payment/trial).
- The **sales channel** (in-store, online, or both) drives the checklist, catalog onboarding, and tours (POS or online shop).
- Login and welcome share the same storefront photo via `next/image` (AVIF/WebP).
- Superadmin → Growth includes a welcome conversion funnel.
- RLS fix: authenticated roles can read activation step definitions.

## Cash registers: unlink store locations (2026-07-15)

**Multi-store select can remove linked locations again**

- In **Sales → Cash registers**, when editing a register you can uncheck or remove a linked store with the X (previously you could only add).
- If you clear the list, the system keeps the main store linked.

## Resto portal: maps, admin, and QR (2026-07-15)

**Maps link, clearer Menu / QR admin, and printable QRs**

- On the public menu / ordering site, the store address opens **Google Maps** (store coordinates or address search).
- **Resto → Menu / QR**: tabs (QR, Appearance, Channels, Delivery, Dishes), color pickers with live preview, and Open / Copy on links.
- Print dialog includes Menu and Order QRs as well as table QRs.
- See [Resto](/docs/pos/restaurant).

## Resto ordering portal (2026-07-15)

**Digital menu, table QR, and online pickup / delivery orders**

- Public menu at `/{slug}/menu`, ordering at `/{slug}/pedir`, and table QR browse at `/m/{token}` (also via subdomain `/menu` and `/pedir`).
- Merchants configure it under **Resto → Menu / QR** (`/restaurant/portal`): branding, pickup/delivery, store pin, and distance fee (`minimum + km × rate`).
- Guests verify phone with OTP (WhatsApp/SMS), build an order, and pay with **Mercado Pago** when a bank box is connected; otherwise **pay on pickup** or **cash on delivery**.
- Orders land on the takeaway board with source **Portal**, including fee / distance for delivery.
- See [Resto](/docs/pos/restaurant).

## Quick dish in Resto (2026-07-15)

**Add a menu item from the order screen without opening Inventory**

- On **Orders** (`/restaurant/orders`), admin and cashier can use **Quick dish**: name, price, category (new or existing), optional photo, and dish options (attributes).
- The item is saved to the catalog and shows up on the menu right away. See [Resto](/docs/pos/restaurant).

## Trial, activation, and growth (2026-07-15)

**Try SARAH free for 7 days and follow setup step by step**

- Sign up with a **7-day card-free trial** from the landing and welcome flow.
- In-app activation checklist (product, payment method, logo, shift, and first sale) plus a **Growth** page (`/crecimiento`).
- Web demo CTAs into trial; clearer subscription/trial banners.
- **Growth** panel in Superadmin (trial and activation metrics) and an internal landing editor.
- Vertical landings (`/para/…`) are **not public yet**; they turn on via a code flag when content is ready.

## Icons on dashboard and POS (2026-07-14)

**Restored icons that showed “Icon not found”**

- Dashboard (metric info) and POS (list/grid view and cart layout toggles) show the correct icons again.

## Quick access with fingerprint / Face ID (2026-07-14)

**Faster sign-in without waiting for email**

- On login you can sign in with **fingerprint, Face ID, or your device PIN** (passkey) once enabled on that phone or computer.
- Enable it from the user menu → **Quick access (fingerprint / Face ID)** (`/account`).
- Email magic links stay as a backup. Same user, role, and permissions.
- See [Authentication](/docs/security/authentication).

## Table search (2026-07-15)

**Typing in Products is no longer blocked / overwritten while searching**

- Cause: each search soft-navigates the URL; the RSC refresh **stole focus** from the input (you kept typing “zza” but keys never reached the field).
- Fix: the input owns the text; after debounce we **restore focus + caret**; navigation uses `scroll: false`.
- No more rewriting the input from `?search=` or forced `autoFocus` on `/products`.

## Table search (2026-07-14)

**Search no longer overwrites what you are typing**

- On products (and other lists with the same search bar), the input keeps your text even when the URL updates mid-typing.
- Normal typing stays debounced; fast bursts (barcode scanners) search almost immediately.
- Enter and blur still apply the search right away.
- **Superseded on 2026-07-15** by the fix above.

## Resto — floor and takeaway polish (2026-07-14)

**Visual and board tweaks for the Resto beta**

- Round-table chairs match rectangular chair width on the floor plan.
- Reservation detail: title and body share the same left column under the back control.
- Takeaway: **Completed today** stays pinned at the bottom (horizontal strip); “today” uses pickup time; empty-board hint when nothing is open.
- Completed cards show **delivery clock time** plus frozen total duration (timer no longer keeps counting).
- Orders hub: **New order** sits on the same bar as Comandas / Take away (both tabs).

## Resto experimental beta (2026-07-14)

**Restaurant floor in beta — experimental module (Pro plan + opt-in)**

- First **beta** of the Resto module (`/restaurant`): floor plan, tickets, kitchen, reservations, takeaway, and checkout.
- **Pro plan only**, and must be enabled under **Settings → Company**. Sidebar: **Resto (beta)**. In-app experimental notice.
- Atomic, idempotent charging (`sale_id` unique + RPC), close blocked with unpaid balance, open/join guards for taken tables.
- Unified table presentation (primary state + chips: draft, kitchen, ready, partial, unpaid, upcoming reservation).
- Precuenta and table receipt (non-fiscal); precuenta shows payment-method discounts/surcharges.
- Scoped realtime refreshes (no duplicate mount fetch); POS checkout modals load on demand.
- Minimal permissions `resto.access|kitchen|charge|layout` (same Users roles; no extra restaurant roles).
- Docs: [Resto](/docs/pos/restaurant).

## Demo fix — middleware (2026-07-12)

**Restored original `/demo/*` behavior**

- If a logged-in merchant visits the demo, **their Auth profile is no longer modified** (prevents accidental assignment to the sample company).
- Anonymous demo sessions work as before.
- `/restaurant` route (and `/resto` alias) added to middleware protected routes.

## CRM Opportunities — Pro plan (2026-07-11)

**Sales pipeline linked to real POS quotes**

- New **Opportunities** module (`/pipeline`) on Pro: kanban board, stages, KPIs, and per-deal interactions.
- From an opportunity you can **create a quote** in POS; when paid, the deal moves to **Won** with the actual amount.
- Contacts menu renamed for clarity: **Prospects** (leads) and **Opportunities** (pipeline). **Users** moved under Settings.
- Docs: [Opportunities](/docs/contacts/pipeline).

## Design system — compact, consistent UI (2026-07-11)

**Denser, more uniform interface across the admin panel**

- New living styleguide at `/design-system` with tokens, typography, and real dashboard components.
- Layout primitives: `PageShell`, `PageHeader`, `MetricCard`, and `StatusBadge`.
- Geist-style compact density: tighter card padding, shorter controls, narrower sidebar.
- Unified tokens: success/warning states, chart colors aligned with the dashboard, 6px radius.
- Geist Sans typography across the app.
- Admin screens migrated to the shared page layout.

## Floating assistant — dark mode (2026-07-11)

**Sarah AI floating icon is now visible in dark mode**

- Floating bubble uses dark-theme background, border, and shadow.
- Sparkles icon uses a contrasting blue color instead of white-on-white.

## SEO/GEO — llms.txt and structured data (2026-07-10)

**Better discovery in search engines and AI systems**

- New [`/llms.txt`](https://www.sarah.ar/llms.txt): product map for agents (plans, Club, key docs).
- New [`/docs/llms.txt`](https://www.sarah.ar/docs/llms.txt): full documentation index.
- Docs available as Markdown: append `.md` to the URL or send `Accept: text/markdown`.
- JSON-LD on the landing page: Organization, SoftwareApplication, and FAQPage.
- `robots.txt` with explicit AI bots, `Content-Signal`, and an `LLM:` pointer.

## Landing — Sarah Club on Pro plan (2026-07-10)

**Sarah Club featured on the homepage**

- New landing section presenting Sarah Club: points, rewards, wallet, and redemption in POS/online store.
- **Pro plan** lists Sarah Club among its benefits (landing, subscription, and FAQ).
- Docs: [Sarah Club](/docs/club/overview).

## Sarah Club — customer invitations (2026-07-08)

**Customer reactivation on behalf of the merchant**

- When activating Sarah Club, merchants can **invite loaded customers** (with phone or email) to join the benefits program.
- SARAH sends the message **on behalf of the store** (email and/or WhatsApp); customers activate benefits via their own link.
- Public activation page (`/{slug}/club/activate`) and unsubscribe page (`/{slug}/club/unsubscribe`).
- **BAJA** reply on WhatsApp registers contact opt-out via the main webhook, with an automatic confirmation message.
- New **Invitations** tab in club admin with metrics: sent, activated, opted out, and invitable customers.
- With invitations enabled, points are not earned until the customer **activates** membership (`auto_enroll` disabled).

## Sarah Club — operational improvements (2026-07-07)

**Fewer duplicates, more merchant control**

- Shop checkout and wallet resolve the canonical contact by normalized phone/email (avoids duplicate members from variants like `011…` vs `11…`).
- Merge duplicate contacts from the customer profile and from club members flagged as duplicates.
- Block or delete club members from admin; blocked members cannot redeem or earn points.
- New **Redemptions** tab with benefit redemption history.
- **Free product** reward: product picker in benefit setup.
- Fix for applying club discount in the online shop cart.

## Sarah Club — loyalty program (2026-07-06)

**Points, rewards, and wallet integrated with POS and online shop (Pro plan)**

- New **Sales → Sarah Club** module with quick setup (Simple and Standard presets).
- Automatic points on completed POS sales and web orders.
- Reward redemption in POS and shop checkout.
- Public customer wallet at `/{slug}/club` (phone + OTP login).
- Printable QR card for in-store promotion.
- Docs: [Sarah Club](/docs/club/overview).

## Order detail: product photos (2026-07-05)

**Clearer view of what the customer bought**

- Sale detail in the admin panel shows a photo for each line item.
- Also on the public order detail page and the standard checkout confirmation page.

## Shop checkout: payment method visible to merchants (2026-07-05)

**Merchants know how the customer wants to pay**

- When checkout completes in the online store, the selected payment method (cash, bank transfer, Mercado Pago, etc.) is saved on the sale.
- Shown in the sale detail in the admin panel and in the pending web sale email notification.

## Shop checkout: accessible validation (2026-07-05)

**Customers see what's missing before completing checkout**

- The checkout button no longer stays disabled silently: attempting to buy shows clear errors for each required field.
- Visible labels, inline field messages, and an accessible summary (`aria-invalid`, focus on first error).
- Validates contact, shipping, branch pickup, and payment method before processing the order.

## Mobile: no zoom when focusing inputs (2026-07-03)

**Better POS and form usage on phones**

- Text fields, selects, and textareas keep a readable size (16px) on small screens to prevent iOS Safari from auto-zooming when you tap them.
- Applies to POS, app forms, and online shop checkout.

## A4 labels: single-column print (2026-07-02)

**Print output matches the preview**

- Fixed A4 printing when using a single column (or after grid layout changes): it no longer falls back to showing only the product name.
- The print window now clones the full preview page (price, barcode, and layout) instead of a truncated fragment.

## Interactive demo: demo mode banner (2026-07-01)

**Clear notice while exploring the public demo**

- Top banner on `/demo/*` routes (sample company) explaining that data is fictional.
- Subscription/payment banner is hidden in demo mode to avoid confusion.

## Signup and billing: /thanks checkout verification (2026-07-01)

**Fewer false positives after returning from checkout**

- The thank-you page verifies payment with Mercado Pago or Stripe before showing success.
- On verification failure, shows an error with retry payment or contact support options.
- From **Activate account**, retry opens onboarding in payment mode (`retry_payment=1`).

## AI assistant: business analytics (2026-06-30)

**Faster, more accurate answers about sales and profitability**

- The assistant can answer questions like *who bought the most?*, *most profitable products*, *star products for a period*, and *how many units to sell to earn X*.
- Pre-aggregated queries by period (today, this month, last month, etc.) without opening the Dashboard.
- Available in chat and WhatsApp (Pro plan).

## Online store: SEO and structured data for Google (2026-06-29)

**Better Search Console signals for every merchant store**

- Complete product schema.org: image, description, brand, GTIN, shipping, and returns on every offer.
- New **SEO and Google** section under **Settings → Online Store → Advanced** to customize return days, return shipping cost, shipping cap, and delivery/preparation times.
- Updated guide: [Store setup](/docs/shop/setup).

## Online store: layout and field grouping (2026-06-27)

**Settings → Online Store — screen polish**

- Single-row header: title, status, public URL, and save (no card wrapper).
- **General**: social links and store description; **Catalog & sales**: pickup and minimum order.
- Wider live preview; compact marquee row; aligned social link inputs.

## Online store: tabbed settings (2026-06-27)

**Settings → Online Store reorganized**

- Top bar with store status (active/closed), public URL, and save.
- Four tabs: **General**, **Catalog & sales**, **Design**, and **Advanced** (analytics and Pro extras).
- Less scrolling: everyday options up front; measurement scripts moved to Advanced.

## Online store: enable or disable (2026-06-27)

**Control from Settings → Online Store**

- New **Online store active** toggle to close the public storefront without deleting products or settings.
- When disabled, customers see a closed notice, cannot checkout, and the page is not indexed by search engines.
- Guide: [Store setup](/docs/shop/setup).

## Labels: wholesale price (2026-06-25)

**Pro Plan — «Wholesale» chip on label printing**

- In **Products → Labels**, optional **wholesale price** and **condition** (pack x N units or from N units) on each label.
- Pro Plan only, for products with wholesale configured; preference persists like other label options.

## POS: closed-bundle wholesale recalculation (2026-06-25)

**Fix when changing quantity at checkout**

- On **Pro Plan**, **closed bundle** wholesale stopped recalculating correctly after adding or removing units (stale average was treated as a manual price override).
- Cashier manual price edits still use an explicit flag; minimum-quantity wholesale is unchanged.

## POS: manual checkout price (2026-06-25)

**Fix after wholesale pricing rollout**

- On **Pro Plan**, editing a line item's unit price in the POS cart no longer resets to the list/base price on every recalculation (promotions, quantity changes, etc.).
- Automatic wholesale pricing still applies when configured; only prices manually overridden by cashier or admin are preserved.

## Wholesale pricing — Pro Plan (2026-06-25)

**Wholesale on products, POS, and online shop**

- On **Pro Plan**, each product can have wholesale pricing: **bundle/pack** or **minimum quantity** mode.
- **POS** applies wholesale automatically (along with promotions, picking the best benefit for the customer).
- **Products**: wholesale columns and inline editing; also in the quick-add modal and edit sheet.
- **Online shop**: toggle to enable wholesale in the store; catalog shows *"Buy X+ and pay $Y each"* and the cart nudges how many more units unlock wholesale.
- Basic plan: no wholesale columns or fields in the UI (DB values stay hidden and non-editable).

## Movements: Salesperson and Junior Salesperson restriction (2026-06-22)

**Cannot reassign a movement's cash register**

- **Salesperson** and **Junior Salesperson** roles can no longer change which cash register a movement was recorded on from **Sales > Movements** (the column is read-only).
- Additional server-side validation blocks API updates.

## POS promotions (2026-06-22)

**Combo and quantity promos no longer double-count units**

- When the same product qualifies for multiple stackable promotions (e.g. a fernet + cola combo and a 6-pack soda discount), the POS no longer applies the same units twice.
- On priority ties, multi-product bundles are evaluated before single-SKU quantity discounts.

## Product photos (2026-06-21)

**More reliable uploads from mobile**

- When editing a product, the uploaded photo is no longer lost if you save right after selecting it: the form waits for the upload to finish and persists the correct URL.
- Better iPhone photo (HEIC) conversion: JPEG fallback when WebP fails, with clearer error messages when the format cannot be processed.

## Online shop — Fashion theme (2026-06-20)

**Header hero image visible again**

- Stores using the **Fashion** theme now show the hero header image correctly again (a gray overlay was hiding it and made the store name nearly invisible on white).

## Dashboard with store filter (2026-06-19)

**Invoices by type chart**

- When filtering the dashboard by **store/branch**, the invoices-by-type chart loads correctly again (it previously failed silently and showed empty data).

## Promotions and A4 labels (2026-06-18)

**Promotions list fixes**

- **Editable priority**: changing priority from the table now saves correctly as an integer (previously failed on save).
- **Active toggle**: enabling or disabling a promotion from the list works again.

**A4 labels**

- Product **brand** text in label preview and print uses a darker color for better readability.

## ARCA fiscal validation and correct cancellations (2026-06-18)

**Safer invoicing for AFIP compliance**

- **Emit validation**: Invoice A only for Registered VAT (RI) customers with CUIT; Invoice B blocked when the customer is RI (must use A). **Invoice C** can only be issued by **monotax** or **VAT-exempt** businesses; monotax and exempt customers **cannot receive Invoice A** (B or C only). Applies in POS, invoice generation, and advanced invoicing.
- **Cancel validation**: before issuing a credit note, Sarah queries AFIP and requires the buyer to match the registered customer (same party).
- **Automatic reversal**: invoices produce credit notes; wrongly issued credit notes produce debit notes, copying the original buyer and amounts.
- **Patmos corrections** panel (superadmin, `/arca`) and operational script for NC/ND correction chains on test receipts.

## French, Turkish, and Simplified Chinese (2026-06-15)

**More languages across the app and online shop**

- New languages in the selector: **French**, **Turkish**, and **Simplified Chinese** (in addition to Spanish, English, and Portuguese).
- Full UI translation (POS, dashboard, online shop, onboarding, and more).
- Auto-detection by country and browser; Sarah AI assistant replies in the selected language.
- Docs for those locales fall back to English content until dedicated translations are available.

## Sarah AI for administrators only (2026-06-15)

**Business owners and managers**

- Floating assistant, `/asistent` page, and `/api/chat` require **Administrator** role (plus Pro plan).
- Cashiers, salespeople, and junior salespeople no longer see the ✨ button or can query business data via chat.
- Updated docs: [Roles and permissions](/docs/security/permissions).

## Multi-tenant security and accounts receivable in Sarah AI (2026-06-15) — v0.2.1

**The assistant and writes stay within the user's company**

- **`/api/chat`**: verified session via `getUser()` and membership check (`userHasCompanyAccess`); no longer relies on the `x-user` header alone.
- **`db` tool**: stronger isolation — `promotion_targets` and `sales_details` scoped by company; FK ownership on creates; `company_id` cannot be changed on update; cross-tenant `companies` list blocked.
- **App CRUD**: `updateTableData` requires row permission and filters by `company_id`.
- **Sarah AI**: accounts receivable queries without date ranges; `get_accounts_data` fix; follow-ups for debts and pending invoices.

## Sarah AI — floating assistant and Pro chat (2026-06-15)

**Business queries backed by live data**

- **Floating assistant** (✨) and **Sarah AI** page (`/asistent`); **Pro plan** required.
- **Gemini 2.5 Flash** agent via AI Gateway (5 steps max, limited follow-ups).
- Clean UX: one final reply per turn, promotions with product names, Mermaid charts.

## Guided onboarding and industry catalog (2026-06-15)

**Faster setup for new merchants**

- Sample product import from **Catalog** (`/onboarding/catalog`) tagged in `products_db`.
- Guided tour (driver.js) on dashboard, products, and POS.
- Post-signup activation flow and progress tracking in `onboarding_progress`.

## Global documentation search (2026-06-15)

**Quick wiki access from the dashboard**

- **Search help** shortcut in the header with instant docs search (es/en/pt-BR).
- Plain-text indexing and improved ranking on `/api/docs/search`.

## New public landing (2026-06-15)

**Homepage focused on kiosks, grocery stores, and bookshops**

- Redesigned sections: pain points, benefits, comparison, demo, YouTube tutorials, testimonials, and pricing.
- SEO metadata and i18n per locale (es/en/pt-BR); dynamic OG/Twitter images.
- Optimized WebP assets and deferred loading for below-the-fold sections.
- Trustpilot link and YouTube channel centralized in constants.

## POS: cart layout mode for Junior Seller (2026-06-14)

**More flexibility in point-of-sale layout**

- Users with the **Junior Seller** role can now switch between always-visible cart and panel layout, same as other POS roles.

## POS: invoice type selector (2026-06-12)

**Cleaner checkout cart UI at the point of sale**

- The ARCA and fiscal invoice notice no longer sits below the selector: it now appears in a tooltip when hovering the info icon next to the **Invoice Type** label.

## Online store: product URLs and legacy links (2026-06-12)

**Fix for shared links and infinite reload when opening products**

- Canonical product URLs use `?product={id}` on the store home again (reverts the `/p/{id}` experiment).
- Legacy `/p/{id}` links automatically redirect to `?product={id}` so previously shared URLs keep working.
- Fixed an infinite RSC reload loop when opening products via `/p/{id}` URLs.

## Product URLs, SEO, and analytics scripts (2026-06-11)

**Online store: measurement and better indexing**

- **Metadata and canonical**: product, search, and filter pages correctly define what to index and the canonical URL (`?product=` for products).
- **Analytics scripts**: in **Settings > Online Store > Analytics and tracking** you can paste Google Analytics, Meta Pixel, or other scripts. They load on the public store only (not the admin panel), deferred to avoid impacting page speed.
- **Internationalization**: configuration strings in Spanish, English, and Portuguese.

For more details, see [Store setup](/docs/shop/setup) and [Store products](/docs/shop/products).

## Integration API and webhooks (2026-06-11)

**Bidirectional integration with external systems (ERP, marketplaces, etc.)**

- **Company settings**: new **Integration API and webhook** section to set the outbound webhook URL and the deposit used for sales and stock queries.
- **Stock notifications**: Sarah sends events (e.g. stock updates) to the configured webhook when products are created or updated.
- **Inbound API**: external systems can query stock (GET) and send events (POST) with Bearer authentication and optional signature (`x-signature`).
- **Configurable deposit**: choose a specific deposit or the sum of all deposits for integrations.
- **Internationalization**: interface available in Spanish, English, and Portuguese.

For more details, see [Integrations](/docs/api/integrations).

## Inventory, A4 labels, and online store (2026-06-11)

**Catalog, label printing, and store experience improvements**

- **Store product order**: alphabetical, best sellers, and manual modes from **Settings > Online Store**; **Store featured** and **Store sort order** fields per product.
- **A4 and thermal labels**: improved printing with configurable VAT on labels, promotional prices, saved preferences (columns, rows, layout), and quick load by promotion or recent price update.
- **Product fields**: profit margin, dimensions (weight, height, length, width), and store fields from the product form.
- **Share products**: WhatsApp button in the store grid and product panel.
- **Per-store SEO**: sitemap and `robots.txt` per store domain; structured data for products.
- **Performance**: loading improvements (LCP) and optimized images in the store.

For more details, see [Products](/docs/inventory/products), [Store products](/docs/shop/products), and [Store setup](/docs/shop/setup).

## ARCA, dashboard, and cash shifts (2026-06-11)

**Fiscal billing, control panel, and shift closing**

- **ARCA in POS**: automatic tax regime detection when entering CUIT; dynamic receipt type selector based on ARCA connection status.
- **Dashboard**: period-over-period comparison, new toolbar, and refactored metrics (sales, accounts, profitability).
- **Cash shifts**: shift closing ticket with reprint and WhatsApp sharing.

For more details, see [AFIP/ARCA configuration](/docs/billing/afip-arca), [Key metrics](/docs/dashboard/metrics), and [Cash register shifts](/docs/boxes/shifts).

## Cancellation system and Junior Salesperson role (2025-02-11)

**Product and sale cancellation system with barcode authorization**

- **New Junior Salesperson role (Role ID: 4)**: Inherits Salesperson permissions but with additional POS restrictions: cannot edit prices or quantities, requires authorization code to remove products or cancel sales, cannot see returns or the Inventory > Products menu.
- **Product cancellation**: Junior Salesperson users must scan an authorization code to remove products from the cart. Each cancellation is recorded with full detail.
- **Quick cancellation (shortcut Q)**: Two-step mode for quick cancellations: scan authorization code then scan the product barcode.
- **Sale cancellation**: When closing a sale, the Junior Salesperson must provide an authorization code and a mandatory comment explaining the reason.
- **Authorization code management**: From company settings, you can generate, print, view, and delete authorization barcodes with descriptive labels.
- **Cancellation logs view**: New `/cancellations` page accessible only to administrators, with detailed records of all cancellations including date, type, product, user, authorizer, and comment.
- **Database**: New `cancellations` table with columns for type (product/sale), comment, and full cancelled product data. New `cancellation_authorizer_barcodes` table for code management.
- **Internationalization**: All new interfaces are available in Spanish, English, and Portuguese.

For more details, see [Cancellations in POS](/docs/pos/cancellations) and [Roles and Permissions](/docs/security/permissions).

## Channel filtering and promotion handling in shop (2025-01-29)

**Add channel filtering and promotion handling in shop components**

- **Promotions model**: Introduced a new channel field in promotions to differentiate between POS and online store applications.
- **PromotionsPage**: Updated to display the channel information for each promotion.
- **getCartWithPromotions**: Implemented logic to filter promotions based on the selected channel.
- **PromotionModal**: Enhanced to allow users to select the applicable channel for promotions.
- **ClientShopCart**: Updated to calculate and display cart totals with applied promotions based on the selected channel.
- **Localization**: Expanded locale files with new keys for channel labels and descriptions in English, Spanish, and Portuguese.

For details on configuring promotions and channels, see [Creating and Configuring Promotions](/docs/promotions/creating) and [Introduction to Promotions](/docs/promotions/overview).

## Payment surcharge handling (2025-01-29)

**Implement payment surcharge handling across various components**

- **PaymentModal and QuickInvoiceModal**: Added support for payment surcharges. Surcharges are calculated based on the selected payment methods and their associated boxes (cash registers).
- **Invoice component**: Updated to display payment surcharges clearly in the total calculation.
- **Boxes page**: Enhanced to include payment surcharge percentage in the table and field labels for better user understanding.
- **Data layer**: Refactored Supabase queries to fetch payment surcharge data from the database, ensuring accurate calculations.
- **Localization**: Expanded locale files with new keys for payment surcharge labels in English, Spanish, and Portuguese for full internationalization support.

For details on using payment surcharges, see [Payments and Collection Methods](/docs/pos/payments) and [Cash Register Management](/docs/boxes/overview).
