SARAH

Changelog

Recent updates and new features in Sarah.

Last updated: 2026-09-17

POS: pending tabs are yours only (2026-09-17)

Opening POS no longer fills with other people’s tickets or empty carts

  • An empty cart is not saved, so it does not come back on reload.
  • Tabs with products return for your user and the shift’s store. An administrator at the register does not see other cashiers’ pending tickets or another location’s.
  • After charging, focus does not jump to a web/pipeline order: a blank local cart opens (or an empty local tab already there is used). Guide: Multiple sales.

POS: add a product without reloading (2026-09-15)

Creating a product at the register no longer blanks the screen

  • From POS (+ Product), the SKU shows in the catalog as soon as you save. The whole page does not reload.
  • An open cart stays as it is. Guide: Products.

POS: charging closes that tab (2026-09-15)

With several sales open, charging one no longer leaves an extra empty tab

  • When you charge, only that sale’s tab closes. The others stay open.
  • If it was the only tab, an empty cart opens so you can keep selling. Guide: Multiple sales.

Sales: the date is the charge time (2026-09-14)

A parked ticket no longer keeps the time the cart was opened

  • In Sales the date is when you charge, same as Invoices.
  • If you leave a ticket open and charge later (another shift or day), the sale number stays and the date becomes the charge time.
  • Sales already charged are unchanged.

Promotions: limit to stores (2026-09-14)

A promo can apply only in some stores, or in all

  • When creating or editing a promotion you can pick stores (id_int). Leave empty to keep applying everywhere (same as before).
  • POS uses the store from the open shift. Online shop does not apply store-restricted promos.
  • The promotions list shows which stores each promo covers. Guide: Promotions.

Sales: box payment surcharge shows on the sale detail (2026-09-14)

Subtotal and total are no longer unexplained when you collected with a box surcharge or discount

  • On the sale detail page, a Surcharge/Discount (payment method) line appears between subtotal and total.
  • The amount is what was actually charged on that sale (it is not recalculated if you later change the box %).

Receiving: one deposit for the whole list (2026-09-14)

You no longer pick a deposit on every product

  • In goods receiving the deposit is chosen once at the top, for both manual entry and OCR.
  • Every product in that receiving goes to the same deposit. Previous stock is recalculated if you change the deposit.

Dashboard: new stores and large catalogs keep loading (2026-09-14)

An empty period or a slow inventory query no longer freezes the dashboard

  • Cards still show $0 / no data when the store has no sales in the range.
  • Inventory and accounts queries no longer block the rest of the page on large catalogs.
  • If a query times out, that block renders empty instead of an endless skeleton. Guide: Dashboard.

Demo: POS no longer dumps you on login (2026-09-14)

Trying Sarah in a private window keeps the register open; the Management menu is back

  • The “Create account / 7-day trial” CTA no longer prefetches /login or signs out the demo session.
  • Anonymous visitors get the session cookie again; real accounts still are not stuck on the demo company.
  • Chrome does not RSC-loop: session cookies are written only when the value changed.

Integration API: stock without timeouts (2026-09-13)

External stock lookups no longer die after 5 minutes

  • GET /api/integration/stock no longer hangs when an ERP or app polls many products in a burst.
  • Same auth and response shape. Guide: Integrations.

Login: store photo shows again (2026-09-13)

The right-hand sign-in panel is no longer a black frame

  • On /login (and welcome / confirm access) the store photo is served as a static JPEG.
  • In some browsers the image optimizer’s AVIF variant painted black; the overlay text still showed.

Online shop: large catalog with pending orders (2026-09-13)

The storefront loads again even when a web order is still pending

  • If the shop does not sell without stock and there is a pending online order, the public page no longer crashes while computing reserved stock.
  • This hit merchants with large catalogs (thousands of products). Checkout still validates stock.

Invoices: search by customer (2026-09-12)

Contact names show when you search or apply a movement to an invoice

  • On Invoices you can search by customer name, internal number, or receipt number.
  • When applying a cash movement to an invoice, search by customer; $0 tickets are omitted (nothing to settle).
  • The name appears if the sale or invoice has a contact. Guides: Billing and Cash registers.

Contacts: store credit (2026-09-11)

Load and spend customer prepaid balance without lowering the sale total

  • On the customer page (Pro plan) there is Store credit: manual load into a drawer, history, and available balance.
  • On Pay debt, optional credit overpayment (off by default).
  • In POS, credit is applied as a payment method (settlement), not a discount. Shift cash-up does not double-count.
  • Guide: Customers.

Contacts: mixed payment when paying debt (2026-09-11)

Collect a customer’s debt from more than one register

  • On Pay debt in the contact file, Mixed payment appears if the company has more than one register.
  • Enter an amount per register; the sum is applied to the oldest invoices first. Each register gets its own income movement.

Receive: mixed payment on purchase invoices (2026-09-10)

Pay a purchase invoice from more than one cash box when receiving

  • When recording the expense on goods receiving, Mixed payment appears if the company has more than one box.
  • Enter an amount per box; the sum is Paid (full or partial). Each box gets its own Purchases expense movement.

sarah.ar landing (2026-09-10)

sarah.ar landing (2026-09-10)

Clearer homepage: hero, real testimonials, and pricing before YouTube

  • New hero: Sell. Sarah puts the rest in order., with POS screenshots and 300+ stores.
  • Testimonials use two in-store videos on a dark block for contrast.
  • Page order: benefits → testimonials → pricing → Sarah Club → tutorials → FAQ.
  • YouTube library refreshed; Quick tour is the first video in Start here.
  • The hero paints immediately (no fade) so mobile loads faster; the YouTube button has stronger contrast.

Shop cart photos (2026-09-09)

Product thumbnails no longer vanish when the cart opens

  • On the Beauty theme, applying promotions rebuilt cart lines without the product photo. The cart now keeps the product image (or the first gallery photo). Guide: Checkout.

Faster POS and online shop (2026-09-09)

Less waiting after checkout and when opening the storefront

  • On POS, heavy modals (payment, quick invoice, returns, etc.) load on demand; after a sale with ticket, the receipt opens without remounting the whole screen. Visible stock (Inv) updates right away and is confirmed from the database—no hard reload.
  • The app layout fetches independent work in parallel.
  • The online shop reuses the company-by-slug lookup, streams the catalog for real, loads stock only for visible products (not the whole company warehouse), and the cart keeps stock across pages. Guide: Shop.

Product tributes (2026-09-09)

Municipal, IIBB and internal taxes belong on the product sheet, not VAT only

  • Product Pricing (Argentina) now has municipal, provincial (IIBB), internal, national and other rates in addition to VAT (they are not a VAT rate). The % is on the net, inside the shelf price.
  • Tribute % fields sit in a compact row next to VAT (not full-width). Below, the selling price splits into net, VAT and each tribute.
  • Pricing is 4 columns: cost, real profit (net − cost), margin % and price.
  • If the company has price lists, they also show on that tab: percentage lists are computed; value lists are editable (blank = selling price).
  • POS still charges the same amount; AFIP files VAT in AlicIva and these in Tributos. Blank = previous behavior. Guide: Products.

Fiscal month: faster VAT-book export (2026-09-09)

The TXT no longer truncates or waits on AFIP SOAP blobs

  • Sales → Fiscal month downloads a ZIP with the four official files (sales/purchases × CBTE/alícuotas).
  • The full month is included (PostgREST used to stop at 1000 rows) and invoice SOAP is not fetched. Guide: Billing.

Receive goods: paid amount no longer doubles (2026-09-09)

Paying the purchase total on receive no longer writes Paid as twice that amount

  • When receiving with a purchase invoice and a cash-box expense, Paid matches the amount you registered (full or partial), not double.
  • Credit purchases (no cash movement) stay pending with paid 0. Guide: Receiving.

Digital VAT book: official ARCA layouts (2026-09-09)

Fiscal-month TXT no longer reuses the sales file format for purchases

  • Sales: LIBRO_IVA_DIGITAL_VENTAS_CBTE (266) and VENTAS_ALICUOTAS (62). Purchases: COMPRAS_CBTE (325) and COMPRAS_ALICUOTAS (84), per the record design.
  • Point of sale comes from the voucher (not the company default POS). Older A/B invoices with CAE and no stored breakdown use the /1.21 split sent to AFIP.
  • Internal tax vs other tributes use separate fields; B/C purchases do not claim VAT credit in the file. Guide: Billing.

Cancellation: print the credit note (2026-09-09)

Canceling an invoice no longer leaves the credit note unprintable

  • Cancel asks for confirmation (it is no longer a GET link that prefetch could fire).
  • After canceling you can print the credit note (ticket or A4) as well as the original invoice; on canceled invoices the dialog opens on the credit note.
  • The list shows Invoice B / Credit note B instead of a raw CAE dump. Guide: Cancellation.

Per-product VAT, purchase credit, and fiscal month (2026-09-09)

Registered taxpayers: rates, purchase VAT credit, and monthly balance — checkout unchanged

  • Products can set a VAT rate (default 21%; also 10.5%, 27%, etc.). Untouched products behave as before.
  • On receive stock, optional Record VAT (% or amount) adds monthly purchase credit. Separate from “include VAT in cost”.
  • Fiscal month (Sales) and a dashboard card (Argentina RI only): VAT on sales, VAT on purchases, and balance due/credit. The month follows the Argentina calendar (not UTC). CSV plus digital VAT book TXT (sales and complete purchase rows).
  • Homogeneous A/B invoices at 21% still use total / 1.21. POS checkout is unchanged. Guide: Billing.

Product edit: size-stock idle fetch (2026-09-08)

Size-stock editor no longer hammers the server while you leave the form open

  • Opening More → stock by attribute loads deposits and size drawers once for that product. Leaving the tab idle does not keep requesting the same data.
  • Saving a size cell, enabling stock-by-size, or merging drawers back still refreshes the grid once. Guide: Products.

Merge size stock back to one pool (2026-09-08)

Return to a single warehouse quantity without manual support

  • On the product form, under stock by attribute, choose “No attribute stock”: Sarah asks for confirmation and sums drawers (S/M/L…) into one pool per warehouse.
  • The deposit picker only shows when enabling (splitting the pool); once dimensional, you edit the deposit × size grid. Guide: Products.

Product edit: stable size-stock editor (2026-09-08)

Size-stock editor no longer sticks in a render loop

  • On the product form (More), the size-stock editor stops reloading in a loop and shows the grid normally.
  • Removed the duplicated “Stock by attribute” label. Guide: Products.

POS: checkout with size-based stock (2026-09-08)

You could pick a size and still fail at payment

  • When checking out a product with size drawers (e.g. shirt size S), the size stays on the sale line through stock deduction.
  • Previously, recalculating promotions dropped that data and payment failed.
  • When picking a size in POS, each value shows available stock for the shift’s deposit.
  • In Receive products, adding a sized item loads every size at once (S/M/L) so you can enter quantities together.
  • In Adjust stock, each item/size uses a signed quantity (+ adds, removes); there is no longer a global add/remove mode for the whole list. Guide: Products.

API and Club / portal session security (2026-09-08)

Fail-closed gates on money writes, messaging, and payment webhooks

  • Debt pay, ticket email (SES), and WhatsApp (Twilio) now require a Sarah session and company membership. Body user_id is ignored.
  • Mercado Pago and Stripe webhooks reject unsigned or forged notifications. A missing signing secret fails closed.
  • Club and restaurant portal session cookies are HMAC-signed. A tampered cookie or guessed OTP does not get in. If you already had Club or the portal open, you may need to enter the code again. Guide: Authentication.

Clearer product attributes (2026-09-08)

Two visible steps: attribute name, then values

  • On the product sheet, adding Size (or another attribute) no longer disappears before you add values.
  • The UI spells out step 1 (name) and step 2 (values like S, M, L one by one). Guide: Products.

Stock by a single attribute (size) (2026-09-07)

Optional: one product, one color/SKU, stock drawers by size

  • On the product sheet you can enable stock by one attribute (usually Size / Talle): Sarah splits the warehouse pool into drawers per value.
  • Lists, POS, and dashboard still show the total (sum of drawers). POS and shop sales require picking that size; receive, adjust, and transfer also use drawers.
  • Products with a null key keep the previous behavior (kiosks and catalogs without sizes are unchanged). Guide: Products.

Safe/vault with no store (2026-09-04)

A cash box can exist without a store link

  • In Cash registers, Stores is optional. Leave it empty and the box will not appear in POS checkout — use that for a safe.
  • New boxes still default to the main store; existing links are unchanged. Guide: Cash Register Management.

Invoice A: VAT broken out on the receipt (2026-09-04)

Taxable net + rate, not “VAT included” on top of the total

  • Invoice A tickets and A4 now show NETO GRAVADO 21%, IVA 21%, and TOTAL. The VAT-included amount is no longer printed as a pre-tax subtotal.
  • Invoice B still shows VAT included plus the consumer tax-transparency legend (Law 27.743) on the thermal ticket.
  • Untaxed, exempt, and other-tax lines print only when they have an amount. Guide: Receipt types.

Three shelf layouts for labels (2026-09-03)

Market, Sale, and Ticket, plus classic

  • In Products → Labels → Style: Market (big price + list block), Sale (promo banner), and Ticket (color rail).
  • Classic is unchanged. Older bar/colored-price/shelf prefs map to the nearest new layout. Guide: Products.

Labels with a color bar or colored price (2026-09-03)

Easier to spot on the shelf, classic look unchanged

  • In Products → Labels you can pick classic, color bar, colored price, or shelf (bar + price), plus an accent color.
  • 2nd and 3rd prices use distinct colors. Default is still black on white. Guide: Products.

Labels: tertiary price on one compact line (2026-09-03)

Primary list plus 2nd and 3rd prices without crowding the label

  • In Products → Labels you can pick a tertiary price list in addition to the secondary one.
  • The large price stays the primary list; 2nd and 3rd sit together on one small row (short names) so the barcode keeps its space.
  • With no tertiary list selected, labels look as before. Guide: Products.

Superadmin Instagram inbox fills the viewport and is read-only (2026-09-03)

/superadmin/instagram is no longer a short card with leftover whitespace

  • The connection block is compact (active account, Connect, read-only). Callback, webhook, and META_IG_SEND_ENABLED sit in a collapsible details row.
  • The list and thread fill remaining height: narrow conversation list, message pane with a participant header, narrower bubbles, and audio that fits the bubble. On mobile it is list or thread.
  • A visible note says replies are off pending Meta App Review. There is no composer or send. Operator notes: Instagram (superadmin).

Superadmin Instagram inbox lists stored DMs without waiting on Graph (2026-09-03)

Opening /superadmin/instagram shows existing threads even if Instagram is slow

  • The conversations API returns stored DM threads from the database immediately. Graph refresh runs after the response (after()), so a slow Meta poll cannot stick the left pane on “Cargando…”.
  • If the first paint is empty (fresh Connect), the panel retries the list once after a few seconds — not a loop.
  • The list poll is slim (preview + participants). Full messages and attachment ids load when a thread is opened, so voice notes still play through the attachments proxy. Operator notes: Instagram (superadmin).

Sale detail: collection, invoice, and items together (2026-09-02)

One ticket screen, not three

  • Sales → detail shows collection by register (including split payments), the company’s invoice, and products. Customer and shipping only if there is data.
  • From the shift, Invoice # opens that sale. Guide: Payments and collection methods.

The same id_int in lists, shifts, stock, and tickets

  • Sales, movements, shipments, product detail, cancellations, and ARCA invoice redirects open Invoices/Sales with the company’s internal number, not the global ID.
  • POS sale tabs and Mercado Pago collection descriptions use that number. Shifts: Payments.

Superadmin Instagram inbox labels senders and plays voice DMs (2026-09-02)

Israel can see who sent each message, and audio DMs play

  • Each bubble on /superadmin/instagram shows a name: outbound uses the connected handle (for example @sarah.patmos), inbound uses the conversation participant (for example matiiasross).
  • Voice notes and other Graph attachments are polled with the conversations request and played through a superadmin proxy so the browser never sees the Instagram access token. Empty audio no longer renders as a blank blue box.
  • Send stays off. Operator notes: Instagram (superadmin).

Superadmin Instagram inbox no longer hangs on Graph timeouts (2026-09-02)

Inbox lists from the database even if Instagram Graph is slow

  • Graph profile (/me, /{id}) and conversation polls abort after 8 seconds. The inbox API always returns { conversations } from the database so /superadmin/instagram never stays on “Cargando…”. Operator notes: Instagram (superadmin).

Shift detail shows the company’s invoice number (2026-09-02)

Same numbering as Invoices

  • On the shift detail (main register and other registers) the Invoice # link uses the company’s internal number (id_int), not the global database ID.
  • Clicking it opens that sale’s detail. Guide: Payments and collection methods.

Superadmin Instagram inbox stores the professional Graph id from GET /me (2026-09-02)

@sarah.patmos DMs poll /{user_id}/conversations, not the Instagram Login IGSID

  • Connect and inbox refresh call official
    GET graph.instagram.com/{version}/me?fields=user_id,username,id
    first. id stays external_id (IGSID). user_id (1784…) is stored as metadata.professionalUserId.
  • If /me still 400s, Sarah falls back to GET /{IGSID} (the path used before the tester was accepted). Conversation poll uses the professional id when it is present — not /{IGSID}/conversations.
  • An existing Connect is enough: opening /superadmin/instagram refreshes the profile. Operator notes: Instagram (superadmin).

Sale detail shows how the sale was collected (2026-09-02)

Cash + QR (and other methods) on the sale summary

  • On Sales → detail, POS sales no longer show an empty payment method: each register and amount is listed (including mixed payments).
  • Online shop sales still show the checkout method when there are no movements.
  • Guide: Payments and collection methods.

Superadmin Instagram badge reads @username from Graph /{id} (2026-09-02)

Instagram Login profile no longer calls GET /me

  • /superadmin/instagram stores the connected handle from
    GET graph.instagram.com/{version}/{ig-user-id}?fields=user_id,username,id
    using the token-exchange user id (IGSID).
  • Instagram Login on graph.instagram.com does not support GET /me (production 400). The badge shows @username instead of the numeric IGSID when Graph returns a username.
  • IGSID stays external_id. Professional user_id (1784…) is stored in channel metadata. Conversation poll is still GET /{ig-user-id}/conversations.
  • Operator notes: Instagram (superadmin).

Superadmin Instagram inbox shows the connected @handle (2026-09-02)

@sarah.patmos DMs only — leftover personal threads stay hidden

  • The experimental inbox at /superadmin/instagram lists only conversations for the currently connected Instagram channel. Threads from an earlier connect (another handle) are not shown.
  • After Connect, and when status or conversations load, Sarah reads
    GET graph.instagram.com/{version}/me?fields=user_id,username,id
    and stores the username on the badge (for example @sarah.patmos).
  • Conversation poll uses
    GET graph.instagram.com/{version}/{ig-user-id}/conversations
    with the Instagram Login token. No Facebook Page is required.
  • Operator notes: Instagram (superadmin).

Instagram Connect forces professional reauth (2026-09-02)

Connect no longer silently binds a Facebook-linked personal Instagram

  • The Instagram Login authorize URL from /superadmin/instagram now includes force_reauth=true and enable_fb_login=false.
  • Operators logged into instagram.com as a professional account (e.g. @sarah.patmos) are asked for Instagram professional credentials instead of inheriting a Facebook session's personal IG.
  • Scopes, client_id, and token exchange are unchanged. Operator notes: Instagram (superadmin).

Instagram Connect uses Instagram Login on Patmos Channels (2026-09-01)

Connect logs in with Instagram credentials — no Facebook Page

  • Connect from /superadmin/instagram is Instagram Login (https://www.instagram.com/oauth/authorize) with client_id = Patmos Channels Instagram App ID (INSTAGRAM_APP_ID=1223099003236295).
  • That id is the Instagram product of the shared Patmos Channels connector (legacy dashboard name Landscape-IG), not Landscape-the-product. The Facebook app (META_APP_ID=1386194269924434) is not used as Instagram Login client_id.
  • Scopes are instagram_business_basic and instagram_business_manage_messages. No Facebook Login, Facebook Page, or pages_*.
  • Operator notes: Instagram (superadmin).

Instagram Connect uses the Sarah Facebook Login for Business config (2026-09-01)

Connect dialog requests the Sarah Instagram configuration on Patmos Channels — not Landscape

  • Connect from /superadmin/instagram now sends config_id=1063669696383947 (env META_FACEBOOK_LOGIN_CONFIG_ID) for Facebook Login for Business configuration Sarah Instagram.
  • Still Facebook Login on Patmos Channels (META_APP_ID=1386194269924434) at
    https://www.sarah.ar/api/integrations/meta/instagram/callback
    . Landscape Facebook Login configs and Landscape-IG are not used.
  • Operator notes: Instagram (superadmin).

Instagram Connect uses Patmos Channels only (2026-09-01)

Sarah Instagram OAuth is Facebook Login on the shared Tech Provider app — not Landscape-IG

  • Connect from /superadmin/instagram uses Patmos Channels (META_APP_ID=1386194269924434) and
    https://www.sarah.ar/api/integrations/meta/instagram/callback
    .
  • Landscape-IG (1223099003236295) is Landscape's Instagram Login child and is not used for Sarah.
  • After Connect, the experimental inbox can list DMs via Graph; the Patmos Channels webhook stays on Landscape.
  • Operator notes: Instagram (superadmin).

Instagram inbox for Patmos superadmin (experimental) (2026-09-01)

Connect Instagram and read inbound DMs — operators only, not the shop CRM

  • Patmos superadmins get an experimental panel at /superadmin/instagram: Connect Instagram and list inbound DMs.
  • Shop admins and cashiers do not see this. It is not on Company settings or merchant inbox.
  • Inbox APIs prove the cookie JWT with the anon-key SSR client before the superadmin table check; they do not treat the x-user header as the session.
  • Sending DMs stays off (META_IG_SEND_ENABLED default false). WhatsApp is unchanged (Twilio).
  • Operator notes: Instagram (superadmin).

ARCA delegation: skip re-linking when WSFE already works (2026-08-31)

Tax regime or POS change without repeating step 2

  • When tapping “Ya delegué”, Sarah checks WSFE before opening Admin Relaciones. If the Sarah certificate is already enabled, step 2 is marked done and the merchant continues with regime and POS (steps 3 and 4).
  • If ARCA returns a ticket error but WSFE responds OK (relationship already exists), it is treated as success too.

Manual stock edits appear in the product history (2026-08-31)

Changing quantity in the table now shows up under Movements

  • Editing stock on Products (warehouse column) or Warehouses and stock writes an Edit movement.
  • Creating a product with initial stock (or a new stock row) writes Initial stock.
  • Both appear on the product detail and in stock movements. Transfers, receiving, sales, and scan adjustments are not duplicated.

Receiving from image: sale price on new products (2026-08-31)

If the line has invoice cost and a margin, the sale price is no longer left at 0

  • In goods receiving from a photo or file, Update price sets the sale price from invoice cost × margin (including new products whose catalog price is 0).
  • Assigning a product by hand or barcode uses the cost already read from the invoice, not the previous catalog price.
  • If you type a sale price different from the catalog, that value is kept.

POS ticket: name and payment method when printing (2026-08-30)

The receipt that opens after checkout is no longer blank

  • Printing from the POS (auto-print or ?print=) waits for the store name, customer, and payment movements before showing or printing.
  • The sale is loaded with its invoice and payment methods together, same as reprinting from Sales.
  • No customer still prints as Final consumer. Pending sales stay a pre-invoice.

POS: payment amount no longer snaps back to the total (2026-08-28)

You can type a partial amount and record a deposit

  • In checkout, the Amount field no longer resets to the sale total when you leave the field or tap another register.
  • If you enter less than the total, Pending stays correct and Pay records that amount (the invoice remains pending for the rest).

Phone POS: cart and checkout stay usable (2026-08-27)

The cart no longer dismisses itself, and payment no longer opens the keyboard on load

  • On POS on a phone, tapping quantity or price no longer closes the cart (Android Chrome used to do that when the URL bar or keyboard moved).
  • Opening Pay does not focus the amount field, so the keyboard does not cover Pay. Description is a single line. On desktop, checkout is unchanged (amount still autofocuses; description stays taller).
  • Tap the active sale tab to reopen the cart; double-tap to rename it.

Team invitations: more reliable email access (2026-08-26)

Invited users join the business without getting stuck on /welcome

  • The email link goes through /auth/confirm first (same session as login), then links the store.
  • If the account already has a business or a pending invitation, /welcome blocks creating another trial by mistake.

Initial setup: smarter banner (2026-08-26)

Less vertical space if you already configured or don't need a step

  • The banner detects steps already done (products, logo, online store, sales, etc.) and stops asking for them.
  • You can skip a step or hide the banner; full detail stays on Growth.

ARCA delegation: real incorporate button + WSFE verification (2026-08-26)

Fixes step 2 when delegation is already accepted but the Sarah certificate still needs linking

  • ARCA labels the final button “Confirme aquí la generación de la nueva autorización”; automation detects it on serviceSearch, userSearch, and incorporation.
  • No longer reports success on intermediate wizard screens; verifies WSFE before marking authorized when company_id is available.

POS: find a product by the last digits of the barcode (2026-08-26)

Typing 3 to 5 digits of a barcode works again

  • In POS, searching with the last digits of a code (for example 7890) shows the product again.
  • Name search and full-code scanning are unchanged.

ARCA delegation: more robust step 2 (wsfe + Sarah cert) (2026-08-26)

Improves automation when confirming Electronic Invoicing and linking the Sarah certificate

  • ARCA exposes the wizard confirm control as “Submit”; automation now clicks it in addition to CONFIRMAR.
  • After choosing WSFE, it advances via “Buscar representante” before selecting the sarah certificate.
  • Fewer wizard retries to reduce production timeouts.

Fixes Sarah certificate linking failures in Admin Relaciones

  • Automation no longer opens the direct relationAdd URL (it triggered ARCA internal errors); it completes the wizard step by step and waits for the “Incorporar nueva Relación” screen before CONFIRM.
  • If delegation was already accepted and pending is empty, the flow continues straight to Sarah certificate linking.
  • Clearer messages when ARCA returns tx.error with a ticket number.

Saving a product is not blocked if the barcode was already shared (2026-08-24)

Photos and other fields can be saved even when several SKUs share the same code

  • If two catalog products already have the same barcode (for example a placeholder), editing the photo, price, or name is no longer blocked. The duplicate-barcode warning only appears when you change the code to one another product already uses.

Opening the register as the signed-in cashier (2026-08-24)

POS can open a shift even if the cashier is not on the team member list

  • Some cashiers sign in with only the business on their session (no team membership row). Opening a shift from POS uses that person as the owner.
  • Creating a shift from Sales → Shifts still requires the email of someone in the business.

Shift details require a real team user (2026-08-24)

Creating a shift from Sales → Shifts no longer saves a shift without a cashier

  • If an administrator creates a shift from the shifts list (not from POS), they must pick an email of someone in the business. Made-up text is not saved, and the detail page no longer shows “user not found”.
  • Opening and closing from POS is unchanged.

Hotmail, Outlook, and existing accounts no longer see the link as expired the moment it arrives

  • The login email for an account that already exists was verified as if it were a brand-new signup, so Sarah said the link had expired even though the mail had just arrived. It now uses the correct token type.
  • Opening the link shows Sign in: tap it to enter. That stops the mailbox scanner (common on Hotmail) from using up the link before you do. See Authentication.

Shop shipping rates work again (2026-08-21)

Correo Argentino and other carriers show up in the cart again, without exposing company credentials

  • After tenant isolation, the online shop cart could not see whether shipping was configured. It now asks Sarah’s server for the enabled carrier list only (no credentials).
  • Rate quotes and agency lookup are unchanged for shoppers. See Calculating shipping costs.

Deleting a sale and taking Mercado Pago at the register work again (2026-08-21)

After tenant isolation, everyday sales and checkout operations are restored

  • Deleting a sale (or a line) from Sales or the register no longer fails. Internal audit history still cannot be read or edited from a store login.
  • At the register, Mercado Pago (QR or Point) is recorded again for that sale. A business does not see another store’s payment events.
  • Sending the receipt on WhatsApp and saving the onboarding profile work again. Per-company access is unchanged: staff still only see their business.

A store login cannot list every uploaded file (2026-08-20)

Storage listing no longer shows other businesses’ files

  • A shop session cannot ask for Sarah’s full inventory of photos and files. Product, storefront, and register images still load from their public URL, as before.
  • See Introduction to Security.

A store login cannot list Sarah users or the database schema (2026-08-20)

Internal platform functions no longer answer a shop session

  • A store user cannot ask the API for the global account list or Sarah’s table names. That stays on Sarah’s servers, for the platform team.
  • Per-company access is unchanged: staff still only see their business.

Sarah’s plan can no longer be changed with a raw API PATCH (2026-08-20)

Picking Basic or Pro on Subscription does not write the plan until payment (or an admin) confirms it

  • A business cannot upgrade by PATCHing its subscription row. The plan is still chosen on screen; it is stored when Mercado Pago, Stripe, or Rebill confirms, or when a Sarah admin assigns it (postpaid / bank transfer).
  • Trial / active / expired status also cannot be rewritten from the browser.

Dashboard and Mercado Pago at the register, after tenant isolation (2026-08-20)

A store with a long sales history can open the dashboard again, and QR/Point can confirm payment

  • Dashboard metrics (average ticket, items sold) no longer time out for businesses with a large history.
  • At the register, Mercado Pago QR/Point approval reaches the cashier again. They only see events for their own sales.

POS: catalog search works again on large catalogs (2026-08-20)

Typing in the register search no longer times out when the catalog is big

  • After limiting each business to its own rows, name/brand search in POS could hit the statement timeout on large catalogs. It now uses the store’s index and returns results right away.
  • A barcode still goes to the exact product. Nobody sees another business’s catalog.

Each business only sees its own data (2026-08-20)

The public storefront key can no longer list other companies

  • Products, invoices, contacts, and company records are limited to the signed-in user's business. The online store still loads as before from Sarah's servers.
  • Checking that a shop URL is free no longer requires seeing other companies' rows.
  • See Introduction to Security.

Shifts: required operator for Junior Salesperson (2026-08-20)

When opening a shift, Junior Salesperson must name who is at the register

  • Blind opening now includes a required Operator field: the name of the person opening, so the shift can be identified in Shifts.
  • Cash count still has no expected amounts and no balance ticket.

Faster POS search, invoices, and movements (2026-08-20)

Catalog search and large lists respond sooner, with the same products as before

  • In POS, searching by name or brand still shows the same items (favorites first, then best sellers). A 6+ digit code still goes straight to that product.
  • Invoices and Movements load lighter. On movements, pending invoices are searched as you type instead of preloading a huge list.
  • On the dashboard, totals by receipt type (A/B/C/X) no longer stall for businesses with many invoices.
  • See POS and Invoicing.

Categories: tree and “also appears in” (2026-08-19)

The store can have subcategories, and a product can show in more than one menu, without changing POS or promotions

  • Under Inventory > Categories you can hang a category under another (Parent category, one level) and set an order.
  • On the product, Also appears in shows it in another store section. The primary category still drives checkout and offers.
  • If you skip parent and extras, the store menu looks the same as before.
  • See Products and Store products.

Online store: sticky marquee and design polish (2026-08-18)

The announcement bar can stay above the menu, and the catalog is easier to scan

  • In Design, the marquee has Pin above the header: it stays visible while scrolling, above the menu. Leave it off and it scrolls away as before.
  • If a Theme Studio design is unpublished, Publish theme is highlighted so it is not confused with Save (the draft does not change the live store).
  • On the Fashion theme, the category grid fills itself (including See all) instead of leaving a short last row.
  • On product cards, the price and Buy sit on the same row; installment or promo notes stay in the gray box.
  • See Themes and customization and Store setup.

Theme Studio: visual shop editor (beta) (2026-08-18)

Design the online store with chat, page structure, and preview — classic theme stays live until you publish

  • On Online Store, Pro plans see Design (beta) next to Settings. Save keeps a draft; Publish theme switches the live store to Theme Studio.
  • Start from a preset (Editorial, Lookbook, Market, or the current theme), reorder modules, and click a preview block to edit it (for example the marquee) and Save.
  • Chat cannot write analytics scripts or a custom domain: those stay under Settings → Advanced.
  • Without Pro, the General / Catalog / Design / Advanced tabs are unchanged.
  • See Themes and customization.

Smart Purchase: restock suggestions (2026-08-18)

Build the order from sales, receiving, and projected stock

  • Under Inventory → Smart Purchase (Pro; basic plan sees a preview) Sarah suggests what to restock. It recalculates every time you open the screen.
  • Products are grouped by supplier. You can assign a supplier per product (it is saved) and filter the list.
  • Order is rising (highest sales first), then stable, then falling.
  • Preview to export PDF, print, or send on WhatsApp, without opening another tab.
  • See Smart Purchase.

Shifts: blind cash count for Junior Salesperson (2026-08-18)

Junior Salesperson counts cash without seeing expected amounts or the ticket

  • When opening or closing a shift from POS, Junior Salesperson does not see the suggested or theoretical balance: they must count and enter the amount.
  • They do not see the balance ticket. Administrator, cashier, and salesperson see it on close, and can open it from Shifts (including other users' shifts in the same company).
  • This records how the shift came out (counted vs theoretical) without the cashier knowing the expected result in advance.
  • See Roles and permissions.

Contacts: Pay debt uses the real balance (2026-08-17)

Invoices with a remaining balance can be collected even if marked paid

  • Pay debt includes the same invoices as the debt card: those with a balance (total − paid), not only those marked pending.
  • If an invoice was left as paid with a balance (store credit closed incorrectly), it now appears in collection.
  • You can enter how much the customer is paying: it is applied to the oldest invoices, and if it does not match, the last one stays with a partial balance.
  • In New movement (POS), the invoice picker shows customer, date and balance, and selecting one fills the amount to apply.
  • See Customers.

Superadmin → Growth: full trial follow-up list (2026-08-14)

Trial tracking with scroll

  • Expiring and expired columns show every merchant, with scroll when the list is long (no longer capped at 5).

Trial: 7 more days if the week got away (2026-08-13)

If you used Sarah and the trial ended, Deby writes to you

  • Merchants who got far enough in setup (high activation score) get an email when the trial expires: Need another week?
  • Deby introduces herself, offers 7 more days free and personal help with setup. The button is I want 7 more days.
  • Sent once. If you already subscribed, opted out, or have no email, it does not send.

POS: cart sync no longer drops products (2026-08-12)

Pending sales can no longer end up with only the promo discount line

  • When syncing the cart, a stale line id (already replaced) is re-inserted instead of deleting the live product rows.
  • The client adopts new ids from sync and does not keep obsolete ids across concurrent syncs.
  • Each cart line keeps a stable identity (line_uid) across promotion rebuilds so the ticket is not fully re-inserted.
  • POS sends a monotonic cart revision (cart_rev): an older in-flight sync can no longer delete lines a newer sync already saved.
  • Charging a positive total is blocked if the detail has no products left (only discount lines).
  • Fixes cases where the total looked correct but the detail only showed the promotion line.

Contacts: supplier detail with purchase invoices (2026-08-11)

Suppliers again show what you owe them

  • A supplier detail page shows the correct title, total purchased, amount due, and purchase invoices (Total / Paid / Balance).
  • It is no longer treated as a customer with no sales; customer credit panel does not apply.
  • See Suppliers.

WhatsApp / social previews show the right image again

  • Unified OG system: when a real photo exists (banner, product, menu cover, landing/docs image), that is the og:image.
  • If the banner is a video or there is no valid image, the generated /og card is used (gradient + logo/name).

Products: single-line name and description (2026-08-11)

Denser product list; full text on hover

  • In the products table, name and description stay on one line with an ellipsis.
  • Hover to see the full text in a tooltip.

Products: tabbed edit page (2026-08-11)

Edit on a full page, without the side sheet

  • From the list (View / Edit) or the detail page, editing opens /products/{#}/edit with General, Pricing, Visibility, and More tabs.
  • Compact design-system layout (preview, cards, sticky actions).
  • See Products.

Sales: redesigned detail page (2026-08-11)

Same information, layout aligned with the app shell

  • Sale detail (/sales/{#}) now uses the compact panel layout: back to the list, summary/customer/shipping cards, and a dense line-items table.
  • Status uses the design-system semantic badge; the customer links to their contact page when available.

Contacts + POS: credit score and credit (2026-08-11)

Analyze the customer and check credit at checkout without eating cart space

  • Customer detail (Pro plan) shows a credit score (0–100), payment terms (default 30 days), suggested/editable limit, debt, purchase chart, aging, and invoices with Total / Paid / Balance.
  • Credit is enabled by saving a limit under Credit & terms; in POS, the Credit / Club button shows available credit, debt, and score (informational; does not block the sale).
  • On the Basic plan, a blurred teaser invites upgrade to Pro.
  • See Customers.

Products: detail page with stock history (2026-08-11)

Open a product on its own page, with ledger-style movements

  • From Products → Open, Sarah opens /products/{#} with Summary, Details, and Movements tabs.
  • Movements unify sales, receiving, adjustments, and transfers, showing previous stock → movement → new stock.
  • Each receiving also writes a stock movement (shipments) for future history.
  • See Products and Receiving.

POS: attributes separate cart lines again (2026-08-08)

Same combo increases qty; different combo = another line

  • Adding a product with different option/attribute combinations (e.g. a burger with different toppings) again creates separate cart lines.
  • The same combination still increases quantity on one line (and barcode scans without attributes still consolidate as before).
  • See Point of Sale.

Superadmin: sales volume in USD (2026-08-08)

Platform metric on the main panel

  • Sales volume card (30 days) in U$S with compact M/B formatting, Δ % vs the prior 30 days, and completed sale count.
  • Conversion uses the official dollar from the exchange cron; session info moved to the header.
  • Slightly tighter vertical spacing on the panel.

Superadmin → Growth: visual activation funnel (2026-08-08)

Redesigned dashboard for activation decisions

  • Funnel Entrada → Registro → Setup → Activo with unique-session metrics (not raw event counts).
  • Auto insights, segments (UTM, industry, country, channel), and /welcome form engagement steps.
  • Expiring and expired trials with quick contact (email / WhatsApp); onboarding lists only incomplete setups.

Products: barcode generator without a shared placeholder (2026-08-08)

Each generation starts with a random code

  • The generator no longer suggests the fixed code 123456789012, which many stores reused by accident.
  • When creating a product, that placeholder code no longer fills in a photo or data from another merchant.
  • See Products.

POS: clearer product names in the grid (2026-08-07)

Product titles can wrap up to 2 lines

  • In grid view, names are no longer cut off to a single ellipsis line.
  • Slightly smaller type and reserved space for 2 lines so inventory and price stay aligned across cards.
  • See Point of Sale.

POS: category icons when a product has no photo (2026-08-06)

The grid no longer shows an empty gray placeholder

  • Products without a photo show a 3D icon based on category (drinks, candy, cigarettes, photocopies, etc.).
  • Unrecognized categories fall back to a generic icon or product initials.
  • See Point of Sale.

POS: catalog favorites (2026-08-05)

Pin products to the top of the grid while keeping best-seller order

  • Tap the star on a POS product to mark it as a favorite (shared company-wide).
  • Favorites show first; everything else stays ordered by best sellers.
  • You can also set it from Products (POS favorite field).
  • See Point of Sale.

POS: safer scanning without barcode preload (2026-08-05)

Fewer false multi-item carts — no speculative catalog preload on open

  • Removed barcode-catalog preload when opening the POS (unnecessary; slowed large stores).
  • Presentation-scanner bursts: only different codes within ~150 ms are ignored; normal back-to-back scans are not blocked.
  • Live cart bridging uses mutation sequence (not fragile line-count heuristics) so rapid multi-item scans are not dropped.
  • Long numeric search: exact barcode match only (no huge partial-match grids).

POS: cart quantities no longer reset (2026-08-05)

Adding another product keeps the quantity you already set

  • If you raised quantity with +/− and then added another item, the quantity sometimes jumped back to 1. That no longer happens.
  • Also keeps the same-product scan fix: scanning again increases quantity on the same line instead of duplicating rows.

Billing: more reliable Mercado Pago reconciliation (2026-08-05)

Fewer false actives, duplicate subs, and early payments stuck pending

  • When the Mercado Pago preapproval is cancelled, Sarah no longer keeps the subscription active incorrectly—it moves to pending or inactive based on overdue days.
  • If a merchant creates a new MP subscription after a failed one, the cron repoints payment_id to the newest preapproval and cancels stale duplicates in MP.
  • MP API calls use throttling and retries on 429 errors (fewer cron failures).
  • Early payments (transfer or MP charge before the due date) reactivate the account even when status is pending, clearing the payment banner.
  • See Superadmin → Payment tracking.

Resto: configurable delivery-style menu (2026-08-04)

Combos, add-ons with photos and prices on the ordering portal

  • Dishes can carry a structured menu (menu_config): required/optional sections, per-option photos, price deltas, pick-N combos, and ingredient removals.
  • On /{slug}/pedir, every dish opens a dialog (qty and note; options too when menu_config exists). Accordion with Completed, extras with quantity, “people also ordered”, and edit-from-cart.
  • Optional upsells (drink, dessert) stay collapsed with an Optional badge; qty badges on cards are no longer clipped.
  • Appearance themes Delivery 1 and Delivery 2 (cards, “View cart” bar); legacy ifood still resolves to Delivery 1.
  • Under Resto → Menu / portal you can edit per-dish menus and set integrations (Mercado Pago BR PIX/card, iFood catalog import, SC NFC-e via partner).
  • See Resto.

Contacts: history sorted newest first (2026-08-04)

Sales, invoices, and interactions on the contact detail page

  • On the contact detail view, sales, invoices, and interactions are listed from newest to oldest.
  • Makes it easier to find pending invoices and recent activity without scrolling through unsorted dates.

POS: scale PLU layout per header 20/21 (2026-08-03)

Systel scale scans for weight and unit items

  • Per-company barcode layout: header20Layout and header21Layout with { plu, amount } slices in pos_scale_barcode_settings.
  • Legacy pluDigitCount applies only to header 20 (weight); header 21 (unit) uses the standard 4-digit layout unless explicitly overridden.
  • Fixes mismatched product names when PLU width differs by item type (e.g. salami PLU 2 vs chips PLU 109).

Scentia export: durable workflow and 350-sale minimum (2026-08-03)

The monthly ZIP no longer relies on one long request

  • Quality threshold raised from 60 to 350 sales, matching Scentia’s current requirement.
  • Export runs as a durable workflow (one step per company) with retries on Supabase timeouts.
  • From /scentia, the button shows progress (12/44) and downloads the ZIP when finished.
  • Files are stored temporarily in internal storage while the final package is assembled.

Online store: header analytics scripts (2026-08-03)

Google Analytics and Meta Pixel are now detected correctly on the public store

  • Scripts pasted under Online store → Analytics and tracking no longer wait until the page fully finishes loading.
  • They load when the store becomes interactive, so Google Tag Assistant and pageview tracking work reliably.
  • Applies only to the public storefront; the admin panel does not run these scripts.

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.

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.

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.

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.

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.

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.

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.

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.

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: product map for agents (plans, Club, key docs).
  • New /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.

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.

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.

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.

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.

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.

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 and Store 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.

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, Store products, and Store 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, Key metrics, and Cash register 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 and Roles and 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 and Introduction to Promotions.

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 and Cash Register Management.