SARAH

Changelog

Recent updates and new features in Sarah.

Last updated: 2026-07-31

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.