Changelog
Recent updates and new features in Sarah.
Last updated: 2026-10-31
POS: closing a sale does not leave a matching open order (2026-10-31)
After payment, that cart is not saved again as a pending sale
- If the tab is already closed, Sarah does not resend that copy, so a second pending sale with the same items is not created.
POS: a charged cart no longer comes back after printing (2026-10-31)
After payment and the ticket, that sale does not show up on screen again
- The charged tab is removed in the browser, both the saved id and the temporary id.
- No copy is left in the local draft Sarah uses if the page has to reload.
- Closing the print ticket does not switch tabs or reopen that cart.
Receiving OCR: better catalog matching (2026-10-30)
After uploading an invoice or delivery note, Sarah links more lines on its own
- Right after the photo, it tries to match each line to a catalog product (not only when you tap Search products).
- Handles wholesaler abbreviations better (e.g.
ALF.,BCO,TRI) and short vs. long SKYCEO-style names. - Also distinguishes snack case packs (
3D QUESO 43GX75X1→ the 43G catalog SKU, not 85G). - If two similar products tie (same name, different size), the row stays for manual pick.
- Guide: Receiving merchandise.
Suppliers: pay account (purchase-invoice balance) (2026-10-29)
Pay a supplier from their contact file the same way you collect customer debt
- On the supplier detail page, Pay account appears when there is an amount due.
- The amount is applied to the oldest purchase invoices first (a partial payment leaves a balance on the last one).
- It records an expense in the chosen cash box; with several boxes you can use mixed payment.
- Complements optional payment when receiving merchandise: you can also settle later.
Returns: adjustments, stock movements and detail (2026-10-28)
Improvements to the linked return
- Internal receipts (X): the return no longer creates a credit note (which only exists for fiscal A/B/C). It adjusts the original invoice and the returned amount is exactly what is returned (quantity × price).
- Correct credit note (A/B/C): full or partial returns emit the NC with AFIP with its proportional amount (including IVA) and the returned items. If a note goes wrong, the system can reverse it (debit note) and re-issue it.
- Stock movement: each return records its movement (restock + reason), visible in Inventory → Movements and in the product detail.
- Sale detail: shows that sale's returns (credit note or internal adjustment) with product, quantity and amount.
- Contact detail: the invoice table can be expanded per invoice to see its payment movements.
- Movements (Inventory): now sorted newest first.
Sale-linked returns, with credit (fiado) support (2026-10-28)
Returns are now done against the original sale/invoice and respect whether it was credit or cash
- When returning, you pick the sale/invoice and the system detects the customer, whether a fiscal invoice with CAE exists, and how much is still pending.
- It no longer refunds cash for what was never collected: if the item was taken on credit it is deducted from the customer's balance; money is only returned for what was actually paid.
- It restores stock in the deposit.
- If the sale was invoiced (A/B/C with CAE), it issues the credit note (full or partial) to AFIP.
POS: payment modal fits on one screen (2026-10-26)
Cash checkout no longer forces mouse-scrolling to reach Pay
- Tighter layout: methods, till, amount, and description use less height.
- Payment methods and tills in a 4-column grid.
- Total and actions stay pinned at the bottom; scroll only for extras (MP / mixed).
- Aimed at cashier monitors and the installed webapp.
POS: product list no longer moves by itself (2026-10-26)
Stops the infinite pagination that grew the grid with no user scroll
- A “load more” sensor sat mid-viewport and kept requesting the next page.
- On large catalogs (e.g. installed webapp) the list scrolled/jumped alone and locked up the register.
- More pages load only when the cashier reaches the real end of the list.
POS: single search debounce like 0.2.317 (2026-10-26)
Restores the 300 ms debounce for names and codes (one query after typing/scanning settles)
- Same as 0.2.317: the gun finishes in <50 ms, then one search runs.
- Stops flooding the database with one query per digit (side effect of immediate fetch in 333–338).
- Keeps the race fix for the first search after opening POS (
201).
POS: first search after open (code 201) (2026-10-26)
The first code after opening POS filters; no need to clear and type again
- Stale responses are ignored if a newer search already started (race on open / typing).
- Candy case: right after load, typing
201returned nothing; clear + retype worked.
Auto-update when a new version is detected (2026-10-26)
Sarah detects a deploy and forces an app reload
- While the tab is open, it checks the server version (~every 45 s and when the tab becomes visible again).
- If the local build differs, it shows “Updating Sarah…”, clears cache/service worker, saves the POS cart when present, and reloads on its own.
- The avatar menu still has “Get the latest version” for a manual force.
POS: barcode search in the search box (2026-10-26)
An EAN in the search box filters the grid again (no more stuck favorites)
- 6+ digit codes hit the search API immediately (no stacked 300+300 ms debounce that left the old list on screen).
- If the API fails or finds nothing, the grid clears instead of keeping the seed catalog.
- Typed text still uses a single 300 ms debounce.
POS: search and barcode gun as in 0.2.317 (2026-10-26)
We restore search and the barcode gun to the stable 0.2.317 model
- With focus outside search, the gun adds to the cart; its Enter does not close the sale.
- In the search box (F), a code only filters the list: Enter does not add or charge. Price checks without invoicing work again.
- Today’s 329–331 patches that changed search-box Enter are reverted.
POS: gun Enter in search no longer closes the sale (2026-10-26)
Urgent fix: scanning with search focused no longer opens checkout or invoices on its own
- Enter from the gun in the search box can still add the product, but briefly cannot trigger “Finalize sale” or confirm payment.
- Stops the case where checking a price (F + scan) closed or invoiced the sale by itself.
POS: gun in the search box without search delay (2026-10-26)
Scanning with focus in search adds to the cart immediately, without waiting on catalog filter
- With 6+ digits in the search box, Sarah does not hit the network search: the gun’s Enter adds the product (same path as the cart gun).
- Large catalogs (thousands of SKUs) no longer feel slow when scanning into search.
- Name search and short last-digit BC filters are unchanged.
POS: gun Enter in the search box adds to the cart (2026-10-26)
If the gun types into search (F focused), Enter adds the product and does not freeze the register
- Enter on a barcode in the search box adds to the cart (same path as the cart gun) and blurs the input.
- While only digits are arriving, the POS does not search on every key — it waits briefly or for the scanner Enter. That avoids freezes on very large catalogs.
- Name search is unchanged. With focus outside search, the gun path is unchanged.
POS: search and barcode scan restored (2026-10-26)
The search box and the barcode gun are back to the flow from before last night
- Typing waits 300 ms, then the server query waits another 300 ms, as before.
- With focus outside the search box, the gun adds the product through the same barcode lookup.
- Focusing the search box no longer prefetches the catalog or paints a static cache.
- Optimistic cart, the virtual grid, the menu, and the dashboard stay as they are.
Dashboard: income by box and expenses by category restored (2026-10-26)
The “income by box” and “expenses by category” widgets show data again
- Fixed a database error that left those two cards empty after the daily-aggregates rollout.
- Totals match the previous movements-based calculation for the same date range.
Dashboard: fast metrics that stay current (2026-10-26)
High-volume stores no longer hang on the dashboard
- Sales, tickets, account movements, product ranking, origin, categories, invoices, and sales by user read daily aggregates (milliseconds) instead of scanning full history.
- Today (store timezone) is computed live so reported income matches what was just collected.
- Until a store’s aggregates are ready, the previous live query still runs (no empty screen).
Sidebar: instant menu paint (cosmetic cache) (2026-10-26)
The sidebar shows menu items immediately and revalidates plan/company in the background
- Only the menu shape is cached (plan, role, currency, restaurant) per user+company.
- Every route still checks permissions on the server; logout or company switch clears the cache.
POS: optimistic cart, virtual grid, static seed cache (2026-10-26)
Adding products feels instant; stock and price stay fresh from the server
- Serialized/idempotent sync queue: reconcile with the server and visual revert on failure when there are no newer edits.
- Catalog grid is virtualized with memoized tiles; search prefetch on focus.
- Catalog cache stores static fields only (name, code, image); on-hand qty and price always come from the server.
POS: no chrome animations that slow the till (2026-10-26)
POS sidebar and cart snap instantly
- Collapsing/expanding the side menu on
/posno longer animates for 200–500 ms. - The always-visible cart and cart sheet open/close without a slide.
POS: snappier search and catalog feel (2026-10-26)
Typing in the POS search box updates the grid immediately
- Catalog filter runs on the already-loaded products first; the server search follows once (no double wait).
- Clearing the search restores the open catalog without an extra round-trip.
- First product photos load with priority; boxes for the shift load in parallel.
POS / sales: faster checkout and lighter listings (2026-10-26)
Closing a sale and browsing sales/catalog hits the database less
- Sale close skips line/stock QuickAudit noise and inserts cart lines in one statement (money path unchanged; sale-close tests pass).
- Sales list uses estimated counts (including status filter); pagination still offers next when the page is full.
- POS catalog loads only the product columns the cashier UI needs (no
select *).
POS / caja: faster shift movements and catalog paging (2026-10-26)
Opening a shift summary and scrolling the POS catalog is lighter on the database
- Shift movement lookups use indexes on cashier+time and
metadata.shift_id(no change to close/payment logic). - POS catalog pages no longer run an exact
COUNT(*)of every enabled product; they detect “more pages” with a limit+1 fetch (same pattern as text search).
Product ranking: incremental background updates (2026-10-26)
Catalog “best sellers” order stays fresh without overnight database timeouts
- Sales rank is recomputed in small background batches from the last 30 days of completed sales.
- Cashiers keep seeing the same POS order fields; checkout is unchanged.
- Only companies with new sales are processed; failed batches are logged for operators.
Sarah subscription: more reliable payment tracking (2026-10-25)
Reminders, due dates, and checkout activation aligned to Argentina calendar
- Payment reminders and overdue-deactivation notices are sent when status moves to pending/inactive (previously the event was logged and the first-day message was skipped).
- Next payment date no longer skips a month when the last payment falls on day 29–31.
- Mercado Pago / Stripe checkout activation (
/thanksand webhook) uses today’s ART date and the planpayment_day; it does not reuse an onboardinglast_pay. - The billing cron alerts internally on overdue actives, missing due dates, or charges without a company-9 invoice (no manual customer messages).
- If a paying rail is missing
next_payment_date, it is seeded from the start date so +1/+5 rules apply.
Sarah subscription: overdue bank transfers become pending (2026-10-25)
When a transfer payment is past due, status moves to pending the next Argentina calendar day
- Fixed a false “payment detected” when the payer email/CUIT was counted twice via aliases, which left subscriptions active while overdue.
- A transfer already recorded is not reused to mark paid. After 5 days overdue, status still moves to inactive.
Sarah subscription: shared-CUIT Mercado Pago charges (2026-10-25)
Mercado Pago charges are no longer assigned by CUIT or company name alone
- When several stores share a CUIT, Sarah will not auto-invoice at random: it uses the payment’s preapproval/reference, a payer historically linked to exactly one subscription, or exact amount+period when only one candidate matches.
- If evidence is not unique, the charge goes to the needs_review queue in Superadmin → Billing → Fiscal (with candidates and reason) and no invoice is issued.
- An MP operation glued to a type-X invoice or one without CAE no longer counts as fiscal coverage.
A4 invoice: WhatsApp and PDF (2026-10-23)
Sharing an A4 invoice on WhatsApp now opens the right image, and the PDF downloads as real A4 pages
- Previously, the WhatsApp link for an A4 voucher opened a generic thermal ticket (name, total, and a large QR) instead of the A4 invoice you saw on screen.
- A4/Remito links now serve the captured voucher; 80/57 mm tickets still regenerate the ARCA fiscal QR.
- The A4 PDF uses 210×297 mm pages (ORIGINAL and DUPLICATE on separate sheets) instead of a wrong page size that looked off.
- If you already sent an old link, share the voucher again to get the new URL.
Contacts: undo a store credit load (2026-10-22)
If you loaded store credit by mistake, undo it from the customer history
- On the customer page (Plan Pro), each manual load or debt overpayment shows Undo while balance covers it.
- Undoing reduces the customer balance and posts an expense in the same drawer; the original income stays in the history.
- If part of the credit was already used on sales, the full load cannot be undone. Guide: Customers.
Shifts: extra income and expenses separate from sales (2026-10-22)
On the shift detail page you get a block with only manual movements (not sales) to review withdrawals, expenses, and cash top-ups
- New Extra income and expenses (non-sales) block on shift detail: concept, type (income/expense), amount, user, time, and cash drawer.
- Excludes sale cobros, refunds, and invoice-linked payments; shows subtotals for extra income, extra expenses, and net.
- Empty state when there are no extra movements. See Cash shifts.
Online store: the cart recovers a lost size at checkout (2026-10-22)
If a sized product sat in the cart and checkout said “insufficient stock — available 0”, reopen the store or clear the cart: Sarah restores the size when it can
- Carts saved in the browser from before the size fix still had a null size on the line, so checkout kept rejecting the order even when units existed.
- On cart refresh and at checkout, Sarah restores the size when it is unambiguous (only one size on the product, or the size still written on the line name).
- If the product has several sizes and the cart does not say which one, that line is removed so the shopper can pick again. A size that truly has no stock still fails.
Electronic invoicing: unlinking the CUIT now restarts the whole process (2026-10-21)
If you want to invoice with a different CUIT, the process is redone from scratch and Sarah no longer says “it was already accepted” when it was not
- Previously, after unlinking the electronic invoicing setup, Sarah kept showing the delegation acceptance of the previous CUIT. The merchant saw “already accepted”, the “I delegated it” button would not let them request the delegation, and they had to do the ARCA acceptance by hand.
- The delegation state is now per CUIT: it only counts for the CUIT being configured. If the new CUIT was never delegated, Sarah says so and enables the button to request the acceptance.
- New “Verify with ARCA” button: if you delegated by hand (or with help from support), Sarah asks ARCA whether the delegation really exists for that CUIT and, if it does, takes it as valid — no need to delegate anything again.
- Unlinking (button “Unlink CUIT and redo the setup”) resets the delegation state: delegate in ARCA, press “I delegated it”, enter the CUIT and choose the point of sale again.
- If a delegation gets accepted after you already unlinked, that request does not re-accept itself: you have to request it again.
- Invoices already issued do not change.
Online store: products with sizes can now be bought (2026-10-21)
If your product has sizes (or any stock variant), the cart now remembers the size you picked and checkout is no longer rejected with “insufficient stock”
- When you picked a size, the store lost it while building the cart: the purchase ended in the “insufficient stock — available 0, requested 1” error even when the product had units.
- The chosen size now travels with the cart line, stock is deducted from the correct size and the purchase completes.
- If that size genuinely has no units, the error still shows (and it is correct). Stock per size is deducted from the deposit and the size, not from the product total.
POS: a sale can no longer close with a zero charge (2026-10-21)
If the effective charge is $0 and there is no customer to record the debt against, the sale does not complete and the POS shows an error instead of losing the money
- Previously a sale could show as paid while the money never entered any box — no cash, no bank, not in the shift — and no one left to collect from. The server now rejects that close and the cashier sees the message to fix the amount.
- Customer credit (“fiado”) still works: select a customer and charge $0 (full amount on account) and the sale completes with a pending invoice as the customer's open debt.
- Partial payments and sales paid 100% with store credit work exactly as before.
- Also, the shift summary now includes income from bank boxes without an MP integration (e.g. manually created posnet/QR boxes). Those sales used to be hidden from the “Card / Mercado Pago” summary even though the money was in the box.
Superadmin: Sarah 9 month-end invoice close (2026-10-16)
Last month’s subscription payments are matched to company-9 invoices with no human or bot in the loop
- On the 1st (03:30 ART) a cron reconciles Mercado Pago credits and recorded transfers against Sarah Software Factura B. Missing invoices are issued through the existing billing flow (no duplicates by MP op / transfer_id).
- Existing sales are not CAE-retried. HOLD clients and advance payments for a later month are listed and skipped.
- Superadmin → Billing shows the summary (totals, IIBB by payer CUIT province) and a CSV for the accountant. Email fires only when exceptions remain (missing CUIT, duplicates, invoice without payment).
Products: expiry is editable in the table (2026-10-15)
The expiry date is no longer read-only text; change it with the date picker on Products
- In the product list (Advanced plan), the Expiry column is a date picker. The X clears it.
- It saves on the product itself (
expiry), not per lot. It is still on Edit → More. - A date display node had been covering the editor, so the column looked read-only (e.g. Quiero Dulces).
Billing: manual receipt confirmation advances dates and rejects reused receipts (2026-10-15)
A real new transfer via “Registrar pago por comprobante” keeps the subscription current; the same receipt cannot be booked twice
- Confirming a new manual receipt advances
last_payandnext_payment_datethe same way automatic payments do. - If OCR misreads the year (for example 2023 instead of 2026), Sarah uses the confirmation date so the next due date stays in the future.
- If that operation id was already confirmed for any company (or already invoiced in Sarah 9), the upload is rejected with a clear error — no second cobro.
POS: Mercado Pago QR works when the cash register has no external_id (2026-10-14)
QR orders no longer fail with “POS not found” on older Mercado Pago registers
- Some Mercado Pago cash registers (POS) were created without an
external_id. Sarah’s QR charge needs that id, so the order failed even though Point worked. - When the cashier opens the QR list or charges QR, Sarah sets
external_idautomatically if it is missing (same value as the register id) and retries the order. - Point / Smart Point and accounts that already have
external_idare unchanged. No reconnect required.
Dashboard: axis labels line up and the top value is fully visible (2026-10-14)
250k, 200k, and 0 start on the same line, and the top label is no longer cut off
- Axis labels form a left column, aligned with the card title.
- The highest value (for example 250k) fits completely, including the top of the text.
Dashboard: chart axis no longer clips the first digit (2026-10-14)
800k, 200k, and 150k read in full
- Those labels were slightly cut off on the left. They now fit completely, still flush with the card edge.
Dashboard: shorter chart axes (2026-10-14)
Axis amounts read as 200k and 1M, flush with the card edge
- Instead of 200,000 or 1,000,000, the axis shows 200k and 1M.
- The axis sits on the left, without a wide empty gutter.
- Small counts (tickets, units) stay as whole numbers. Hovering a point still shows the full amount.
Camera scanner: zxing-wasm + BarcodeDetector (2026-10-14)
Product (and POS / stock) camera scanning works better on Android Chrome
- Replaced
html5-qrcode(ZXing JS) with the same stack as the VGS door: native BarcodeDetector when available, otherwise zxing-wasm (zxing-cpp) in a worker. - Formats: EAN-13/8, UPC-A/E, Code128, Code39, ITF, and QR. Rear camera ~1280×720, continuous autofocus, and torch when the device supports it.
- Continuous center-ROI scan; per-frame “no code” noise is no longer shown (only real camera/permission errors). On success: beep or vibrate, close the modal, and fill the field.
Sarah subscription invoices: Factura B CF with payer document (2026-10-14)
Company 9 (Patmos) keeps Factura B → Consumidor Final for IVA, but always sends the payer’s CUIT/CUIL/DNI
- Automatic Sarah SaaS invoices stay Factura B with CondicionIVA Consumidor Final; DocTipo (80/86/96) and DocNro are the payer’s document (Mercado Pago / transfer), then company tax ID, then subscriber contact — never DocNro 0.
- The invoice stores name/razón social, document, and province/domicile from the ARCA padrón (or company address) so accountants can classify by province.
- If no document can be resolved, Sarah does not emit with DocNro 0: the sale is kept, the invoice is flagged
needs_review/receptor_doc_missing, and Superadmin Billing lists it for manual review.
Invoices: ARCA QR scannable size + complete receptor fields (2026-10-14)
Scanning the QR no longer fails from incomplete data or a too-small code
- The QR JSON (RG 4892) always includes numeric
tipoDocRecandnroDocRec. For consumidor final they are99and0(never omitted). - Factura A with a receptor CUIT keeps
tipoDocRec80 and the document number. - The QR date uses ARCA
CbteFchor theAmerica/Argentina/Buenos_Airescalendar day (not the UTC date fromcreated_at). - The verification URL uses
https://www.afip.gob.ar/fe/qr/?p=. - On 80 mm tickets the ARCA QR prints ~45 mm (~60% width); on 57/58 mm, at least ~35 mm. Quiet zone, error correction M, and crisp
pixelatedrendering; the merchant footer QR stays separate. - Shared links (
/api/invoice/{company}-invoice-{nro}.webp, e.g. WhatsApp) regenerate the ticket with that complete, large QR.
Invoices: ARCA QR again without a custom footer image (2026-10-14)
CAE tickets (including billing-agent invoices) show the verification QR even with no footer image
- In the Sales Ticket view (and POS / PDF / WhatsApp), the ARCA verification QR is built even when the invoice has no
metadata.pos(typical for Sarah / billing-agent invoices): it uses the company’s ARCA point of sale. - Removing the merchant logo or Ticket QR/Footer image does not turn off the fiscal QR; they are independent.
Company: remove logo and ticket QR (2026-10-14)
Visual settings get a Remove button; ARCA QR stays separate from the merchant footer
- In Settings → Company → Visual elements you can Remove the logo or Ticket QR/Footer image (with confirmation). The company reference is cleared and the storage file is deleted when safe.
- On electronic invoices with CAE, the ARCA QR is generated before print is enabled and prints labeled separately from the merchant footer QR (it never replaces or hides it).
ARCA invoices: mandatory QR code (RG 4892) (2026-10-13)
Verification QR on 57/80 mm tickets and A4 invoices
- Every fiscal voucher with a CAE (A/B/C and credit/debit notes) gets the ARCA QR automatically, even if the merchant configured nothing in the ticket footer. There is no switch to turn it off.
- If the merchant already has their own footer text or image/QR, that stays and the ARCA QR is added as well (next to the CAE and its expiration).
- Non-fiscal tickets (no CAE: X, remito, etc.): no ARCA QR. If data is missing to build it, the receipt still prints and POS checkout is never blocked.
- The QR opens
arca.gob.ar/fe/qr(RG 4892/2020), is generated on-device, and is included in email/WhatsApp captures.
Dates follow your browser timezone and locale (2026-10-13)
Lists, tickets, and shop pages no longer force Argentina time or a fixed language format
- Every displayed datetime uses the browser’s timezone and locale (
Intl, no forcedAmerica/Argentinaores-AR/en-US). Merchants in Brazil and other countries see local times. - Balance Turno tickets treat close times without a
Zas UTC (same as the database), so open and close both convert correctly. - Inventory Movimientos (
/shipments) and other SSR tables render dates on the client so the server timezone cannot skew the list. - Stored
timestamptzvalues are unchanged.
POS: Mercado Pago Point/QR auto-close after payment (2026-10-13)
Approved Point and QR payments close the sale again without waiting on Realtime
- While the cashier waits for Mercado Pago, Sarah polls payment status and closes the sale from that response (Point and QR). Closing no longer depends only on a live Realtime insert.
- Duplicate
mp_webhook_eventsrows from the 4s poll are stopped: an unprocessed approval is reused instead of inserted again. - The reconcile/webhook routes read Supabase with no store cache, so a cached empty lookup cannot re-insert the same approval every few seconds.
- Manual Close sale remains available if the network is slow.
Superadmin: Channels menu + Spanish WhatsApp (2026-10-12)
No toolbar overflow; official bot always Rioplatense Spanish; never answers business auto-replies
- In Superadmin, Instagram and WA shadow move under a Channels menu (WhatsApp / Instagram sections); Infra and the rest stay outside so the row does not overflow.
- Official WhatsApp (+1 628…) replies are Rioplatense Spanish (system prompt + output validation; never English).
- Before replying, inbound is classified as a business auto-reply (heuristics + LLM: welcome, away, hours, menu). If so, the bot does not answer and never comments on the message.
- WA inbox: contacts sorted by last message (newest first), WhatsApp-style time/date, unread indicator when needs human and unclaimed; badges Iniciada por Sarah and auto-respuesta.
Official WhatsApp: shadow asistente label + inbox tray (2026-10-12)
Classification venta | asistente | soporte | otro and a human inbox (behind a flag)
- The official WhatsApp (+1 628…) shadow now splits asistente (existing-merchant how-to → Sarah AI) from real soporte (bug, account, subscription payment → needs a human).
- Superadmin → WA shadow is an inbox: contacts on the left, chronological thread in the center, company/subscription panel on the right, proposed route, and asistente / needs human filters.
- With
WHATSAPP_SHADOW_INBOX=1, a human can claim a thread (pauses the bot for that number), reply via Twilio within the 24h window, and release the bot. Global auto-reply is unchanged when the flag is off. - Requests to pay / get a Sarah subscription link go to a human and point to Settings → Subscription (
/subscription); they never answer with online-shop / Mercado Pago checkout docs. - WhatsApp alerts to Deby and Israel (env-configurable; ops defaults) with a deep link to the thread; one alert until the conversation is claimed or released.
- Club opt-out only on explicit phrases (
BAJA, “darme de baja”, etc.); “I don’t want to fill in the fields” no longer opts out. - Internal runbook: skill
whatsapp-shadow-triage.
Superadmin: distributor referrals (2026-10-12)
Partner commission (UKRA and others) on the Sarah subscription — never on store sales
sarah.ar/?ref=codestores the code for ~90 days and attributes it to the company at signup. Superadmin can also assign or change a company’s referrer by hand.- Commission is the referrer’s % (default 10%; UKRA 15%) of actual Sarah subscription collections. Each company can have its own % and period: explicit start/end dates, or a number of months from the start (default 12). Empty start = first subscription payment. Only payments inside
[start, end]earn commission. - Monthly liquidation per referrer, mark as paid, and CSV export live under Superadmin → Referrals. POS and in-store sales are unchanged.
Landing: cleaner hero CTAs + trust bullet (2026-10-12)
Hero buttons without the odd glow on mobile, plus a clearer “no limits” message
- On the sarah.ar hero, Try it free and See demo are the same width when stacked on mobile, with clean spacing and without the rainbow glow peeking behind the black button.
- On desktop the CTAs stay in a row, also without the overflowing glow.
- New trust bullet with check: No limits on invoices, users, or products (alongside the free trial and e-invoicing lines).
Cash registers: withdrawals attributed to the shift + card/MP separate from cash (2026-10-09)
Withdrawals stay on the right shift even if entered after close; the Movements list no longer hides rows without an invoice
- When you register a withdrawal, Sarah stores the shift in
metadata.shift_id(defaults to that box’s open shift). You can pick another shift of the same box from the last 24 hours; if it is closed, you are warned that the withdrawal changes that close. Without a shift you cannot save. - Shift balance includes movements tagged to that shift and excludes ones tagged to others; older movements without the field keep the shift’s time-window behaviour.
- On the close summary, Credit/Debit (Posnet) and Mercado Pago are shown separately from cash with the note “Does not count toward cash” and the movement count. Expected cash is unchanged.
- In Finance → Movements, filtering by cash box no longer hides withdrawals or expenses without an invoice (invoice left join). Guides: Cash registers, Cash closing.
Company: fiscal VAT starts at 0 (2026-10-09)
A new company does not add 21% on top of the price on invoice A/B
- Fiscal VAT starts at 0: the loaded price already includes tax.
- Each product still has its own VAT rate.
- Companies already set to 21 stay as they are.
Online shop: category menu and filters in the Pro themes (2026-10-07)
Supermarket and Sneakers now have a category menu with subcategories
- Supermarket: a ≡ Categories button in the bar with a panel per category and its subcategories. Each category page has a path (Home / Category) and a Filters column with checkboxes to pick one or more subcategories; on phones they open from Filter (Clear / Apply).
- The Supermarket card shows the previous price struck through with the % OFF label next to it, the new price and a full-width Add button; installments sit below.
- Sneakers: Products opens a mega-menu with one column per category and its subcategories.
- On phones, both themes add a ≡ button with a side panel of expandable categories. The scrollable category row stays as it was.
- They use the categories and subcategories you already have, with no extra setup. Default, Fashion and Beauty, checkout and POS are unchanged. Guide: Themes and customization.
POS: checkout still closes if a product was deleted (2026-10-07)
Deleting a product that is already in an open cart no longer blocks payment
- Cash or Mercado Pago, ticket or invoice: that line is saved with the name and price it had, without a product link. Stock is deducted only for products that still exist.
- Other open registers drop it from the grid; the cart line stays and can be charged. An older tab (not reloaded) still closes — the server accepts the previous cart payload.
- The same snapshot applies to shop, resto portal, and integration sales. Guide: Point of sale.
Online shop: Sneakers and Supermarket themes for the Pro plan (2026-10-07)
Two new optional online shop themes, Pro plan only
- Sneakers: dark top bar with an always-visible search, bold uppercase headings, categories in a scrollable row, a large banner and tall edge-to-edge product photos.
- Supermarket: large search pinned to the top, a category row, a short banner and a dense grid (5 to 6 columns on desktop, 2 or 3 on phones). Each card has an Add button and, once in the cart, − and + buttons to change the quantity without leaving the grid.
- Supermarket shows the previous price struck through and a % OFF label when the shop price list lowers a product's price.
- Both show at least two columns on phones and the same number of products per page as the Default theme, with no extra catalog queries.
- They can only be selected on the Pro plan. If the company leaves Pro, the shop falls back to the Default theme on its own. Default, Fashion, Beauty, Theme Studio, checkout and POS are unchanged.
- Guide: Themes and customization.
Invoicing: Law 19.640 VAT exempt (Tierra del Fuego) (2026-10-06)
Island companies can file A/B with no national VAT, behind an explicit flag
- Company → Tax has Law 19.640 regime (Tierra del Fuego). Off (the default) changes nothing: the split stays as today.
- When on, Invoice A and B go to ARCA as an exempt operation (
ImpOpEx, VAT 0, no AlicIva). The customer VAT condition is unchanged (final consumer = 5, RI = 1, exempt = 4). Id 10 is never set on the issuer. - The ticket may print “VAT exempt – Law 19.640”. Invoice C is unchanged. Province text alone does not turn this on.
- Guide: Invoice types.
Point / QR: scale totals with more than 2 decimals (2026-10-06)
Mercado Pago Point and QR round the charge to cents so weighed produce no longer fails
- A kilo at $2000.04 (or a cart total with leftover float decimals) is charged as
8903.05on Point, QR, cash, and the ARCA invoice. The sale total is rounded to cents (half-up), not each scale line. - If Mercado Pago rejects the payload, the cashier sees a clear message and can charge via QR or another method; the sale stays usable. If the Point already has a queued order, Sarah asks to cancel or complete it on the terminal.
- Guide: Payments.
POS: one reload if a tab is still on a previous deploy (2026-10-05)
An open cart survives a Sarah deploy
- If POS calls a server action the new deploy no longer recognizes (404 / action-not-found), Sarah persists the cart and the local outbound sync queue, shows Updating Sarah…, and reloads the tab once.
- An already-approved Mercado Pago cobro is stored as a pending close and finished after reload. The webhook is marked processed only after that close succeeds, so the cashier is not charged twice.
- If that sale is already
completedon the server, the tab does not close it again (no second invoice, stock, or CAE), including Close sale manually. If the status cannot be read, Sarah does not close again. If the cart could not be saved, Sarah does not auto-reload: sticky banner and manual close only. - If reload is not enough, There is a new version of Sarah — Reload stays on screen and sync pauses until you reload.
- Opening or closing a shift from POS (and admin close) uses the same recovery: no silent fail if the server action went stale.
- After reload, sales that already have a server id come from the database (a closed ticket is not resurrected). Only local carts with no id are restored. Guide: Point of Sale.
Sarah SaaS invoices: last_pay no longer skips company 9 (2026-10-05)
A subscription cobro must go through the Sarah 9 ledger
- In Superadmin, advancing
last_payis blocked if the current or form processor is a paid rail (MP, Stripe, transfer, Rebill). Switching trial/none → MP and advancinglast_payin the same save is rejected (LÖPIN gap). Register the cobro in Billing → "Registrar pago por comprobante". - The invoice uses the real payment date (not “today”), the payer CUIT/DNI when present, and
Op. MPonly for Mercado Pago. Stripe / transfer / other get their own label. An unusable payer document still gets Factura B as consumidor final (99/0) and is flagged in Superadmin Billing. - Superadmin → Billing lists gaps for the current and previous ART month (payment without a company-9 CAE, or emitted as CF because the receptor document was invalid). Error rows stay visible for CFO regularization; there is no automatic retry. Guide: Subscriptions.
Online shop: checkout no longer trusts the cart price (2026-10-03)
Each line’s name and price come from the catalog, not from the browser
- When a web order is created (origin
sarah/web), Sarah takes the current name and price fromproducts(and from the shop price list or promotions, if those are on). The customer only chooses product, variant, and quantity. - Club rewards are recalculated on the server from the verified member’s pending redemption. An invented discount is rejected. Shipping is re-quoted with the store’s carrier integration; the browser’s
rate.costis ignored. Payment surcharge comes from the cash-box percent. - The cart returned to the browser does not include cost, margin, or supplier. It does include weight and dimensions for shipping quotes, and wholesale fields only when the shop has wholesale on. A product from another store is treated as unavailable, without exposing its name. The sale contact is always created from the checkout form (a foreign
customer_idis ignored). Discounts cannot exceed the subtotal, and line quantity is a whole number from 1 to 9999. More than 80 distinct products shows an error instead of silently dropping lines. - A stale cart (localStorage) is refreshed when the shop opens: if the price or name changed, it updates with a short notice; if the product is disabled or no longer in the shop, it is removed.
- Two lines for the same product and variant merge into one, adding quantities. An old snapshot is not charged next to the current price.
- Guide: Online shop.
Lists: pagination no longer stops at the first page (2026-10-03)
Movements and Invoices confirm the total when the Postgres estimate is low
- If the planned count is below 1000 rows, Sarah re-counts with an exact total for the same filter. If the estimate is 1000 or more, it keeps the planned count so large tables do not time out.
- Date filters still cut the day in the company timezone (ART when unset). Equality filters on box or type still force an exact count, as in the previous change.
- If the current page came full (for example 15 of 15), Next stays available even when the estimated total says there is only one page.
- Guide: Cash registers.
Shifts: the list no longer crashes on companies with many users (2026-10-02)
Cash register → Shifts does not call Auth once per user_company row
- If the company has more than 200 members, the user filter on the list uses emails already stored on shifts (one query). Small companies stay the same.
- Stops a large tenant from taking down
/shiftsand leaking file/network errors onto POS. - Guide: Shifts.
Cash register: opening and closing a shift finds the open shift again (2026-10-02)
The open-shift lookup again filters on a null date_close
- Opening or closing a shift looks up that cashier’s open shift (
date_closeempty) for the company, newest first. - A Movements date-filter change had dropped that “is null” predicate and could return an already-closed shift, so POS could not open or close.
- Guide: Shifts.
AFIP invoicing: receiver VAT condition, exempt customers, and standalone credit/debit notes (2026-10-01)
Electronic invoices send the customer’s real VAT condition to ARCA and can file exempt sales with no VAT
- Sarah sends
CondicionIVAReceptorIdfrom the contact’s tax condition (registered VAT, exempt, final consumer, monotax, and the other ARCA ids). Class B no longer forces final consumer when the id is valid for B (for example exempt = 4). Ids that ARCA does not allow on that letter (monotax / social monotax / promoted monotax / RI on B) fall back to final consumer (5) — the same emit shops already use — and POS shows a non-blocking hint that Invoice A is the correct voucher. - An IVA-exempt customer on Invoice B is billed by default as an exempt operation (
ImpOpEx, VAT 0, no AlicIva; other tributes come out of ImpOpEx). Invoice C keeps today’s amounts and only sends id 4. In Company → Tax you can turn off Bill exempt customers as exempt operations to keep the previous 21% taxable split on B; the real receptor id is still sent to ARCA. - If another contact shares the same CUIT, POS shows a warning. When the selected contact has no condition, that sibling condition is used (rows are not edited). Conflicting conditions are not guessed.
- Credit and debit notes are stored as their own invoice rows (
NC-A/NC-B/NC-C/ND-*), not only in the original invoice metadata. - Guide: Receipt types.
Finance: Movements date filter uses the company timezone (2026-10-01)
The cash-movements list cuts each day at local midnight, not UTC midnight
- In Finance → Movements, a day (or range) runs from 00:00 through 23:59:59.999 in the company timezone (
companies.utc_offset_minutes; otherwise Argentina UTC−3). A collection or debt payment at 21:11 ART stays on that day, not the next. - The cash box filter still applies to
movements.boxes_id(the movement’s box), together with type and date. When type or box is also set, pagination uses an exact count so a full month is not truncated to the first page. - The same date cut applies to Invoices and Cancellations (same date picker) and to the assistant’s date queries. Shift / cash closing is unchanged: it still uses the shift’s
date_openanddate_close. - Guide: Cash registers.
Printed invoice: VAT and CAE come from the voucher, not from sale lines (2026-10-01)
The PDF / ticket of an electronic invoice uses the fiscal amounts stored on the voucher
- The VAT footer (net, VAT, exempt operations, total) is taken from
invoices.tax_aggregatesor the ARCA request/response stored ininvoices.metadata. If those fields are missing, print still falls back to sale-line math as before. - On Invoice B, “IVA: Consumidor Final” and the Law 27.743 “VAT included” legend appear only when the customer is a final consumer. An exempt receiver prints their condition, the exempt amount, and not that legend.
- If a CAE exists (column or metadata), the footer shows CAE and expiry; it does not say the receipt is not a valid fiscal voucher.
- Guide: Receipt types.
Inventory: create initial stock no longer overwrites existing quantities (2026-09-30)
“Create initial stock” only adds missing rows; stock that already exists does not change
- On Warehouses and stock, the button is visible only to that company’s admin (
user_company.role_id = 1). Cashiers and salespeople do not see it, even if the JWT says otherwise. - A confirmation step states that existing quantities in that warehouse are not overwritten or changed.
- Quantity cannot exceed 99,999,999.9999. If the user is not allowed, the toast says so clearly.
- When it finishes, a toast shows how many rows were created and how many already had stock. Products with size/attribute stock are skipped.
- Each new row writes an incoming movement (
stock_create) with the user who ran it. Warehouses and stock.
POS: Mercado Pago Point toast only for QR or Point (2026-09-29)
Charging with transfer, cash, or card no longer shows “Mercado Pago Point is not available”
- The POS looks up Point/QR devices only when you choose Mercado Pago QR or Point.
- If those methods fail because the Mercado Pago connection expired, the message asks you to reconnect in Cash registers.
- Transfer, cash, card, and other local methods still record the sale as before, without a Point toast.
POS: scanner adds to cart after cobro (2026-09-29)
After a sale, the barcode scanner adds the next product instead of typing into search
- A successful cobro still clears search, category, and results.
- Focus is released (not moved back into the search box) so the cart scanner listener can receive the next barcode.
- Guide: Point of Sale.
Inventory: editing a completed sale no longer deducts stock twice (2026-09-29)
Saving a finished sale in Ventas does not subtract the same units again
- Completing a sale (pending → completed) still subtracts each line once, as before.
- Editing a completed sale (date, total, customer, or saving without changing lines) does not subtract those units again.
- Changing lines on a completed sale still does not auto-adjust stock (same as before this fix). Warehouses and stock.
POS: search resets after every cobro (2026-09-28)
Product search clears after any successful sale, not only when a factura is printed
- After cash, card, mixed, Mercado Pago, ticket-only, or factura A/B/C, the search box, category filter, and results go back to the empty catalog.
- A failed cobro leaves the query as the cashier typed it.
- Guide: Point of Sale.
Superadmin: even chart axis ticks (2026-09-27)
Dashboard Y-axes now use evenly spaced nice numbers
- Shared
ChartComponentticks are 0 → a nice ceiling in even 1–2–5 steps (for example 0/50/100/150/200/250 and 0/5/10/15/20/25), instead of uneven labels like 0/65/130/250. - Merchant dashboard cards keep the same 0-based domain and opt-in compact ticks; only the tick positions are even.
- Empty charts can later receive data without crashing (Y-scale is computed before the empty-state return, not in a hook after it).
- The current-month Total on Estado de suscripciones is pinned to the live open-book count (
countOpenSubscriptionTotal), so the last point matches the Total N subline. - Guide: Subscriptions.
Superadmin: subscription chart Total line (2026-09-27)
Estado de suscripciones now plots an open-book Total
- The chart adds Total first in the legend (stronger blue, thicker stroke): Activas (pagas) + Pendientes + Gratuitas + Trials activos + Trials vencidos. Inactivas and Canceladas stay off that sum.
- The headline is still paid Activas with its month-over-month %. The subline now starts with Total N.
- Monthly history reuses the inferred series; the current month stays pinned to live KPI counts.
- Guide: Subscriptions.
Superadmin: subscription card matches billing KPIs (2026-09-26)
Estado de suscripciones on /superadmin now uses the same buckets as Seguimiento de Pagos
- The headline is paid Activas only. Trials no longer inflate that number.
- The subline lists Trials activos, Trials vencidos, Gratuitas, Pendientes, Inactivas, Canceladas, and the total. Gratuitas is complimentary
processor=none(not trials). - The monthly chart has separate lines for paid Activas, Trials activos, Gratuitas, Canceladas, and Trials vencidos. Legend labels are no longer cut off.
- Sales volume (30 days, USD) Y-axis ticks now go 0 → compact amounts (25k / 50k / 75k) and are no longer clipped.
- Guide: Subscriptions.
Superadmin: sales volume window starts at ART midnight (2026-09-26)
- The 30-day USD card now starts each window at Argentina midnight, not 18:00 the day before.
Superadmin: sales volume in USD uses a real official dollar (2026-09-26)
The 30-day volume card no longer shows an inflated billion-dollar total
- The Dólar Hoy scraper now reads Argentine quotes (
$1.545,1.545,50,1545,00) as 1545 / 1545.5 / 1545. Values below 100 ARS per USD are not stored. - Readers ignore those historic bad rows and fall back to the latest plausible rate. POS, shop, invoices, and product prices do not read this table — only the superadmin card and exchange/API/AI listing.
- The card compares volume and ticket count separately. The series uses Argentina calendar days (today + 29 previous) and skips the demo company, non-converted companies, and Sarah ledger company 9.
Superadmin: active and expired trial KPIs (2026-09-26)
Payment tracking now shows live trials and expired trials as separate cards
- Trials activos and Trials vencidos follow the same access rules as the product (
status=trialstill in window vs. expired trial orinactivewithtrial_end_reason=expired/processor=trial). - Counts are mutually exclusive: active trials were never in Activas; expired trials are no longer in Inactivas.
- Guide: Subscriptions.
Superadmin: last-7-days billing events (2026-09-26)
The payment-tracking page no longer crashes when listing Mercado Pago charges
- The Match detail accepts either a list or a string (
matched_byfrom older rows vs newer writes). - New charges are stored as a list again, same as transfer matches.
- Guide: Subscriptions.
Invoices: manual create accepts Argentine amounts (2026-09-25)
In Sales → Invoices, creating an invoice by hand accepts totals like 93.394,39 and requires a type
- Amounts with a comma decimal (and optional thousands dots) are stored as numbers. Postgres used to reject them and the page showed a 500.
- A missing type (sale or purchase) now shows a Spanish validation message. New invoices default to Sale.
- The letter selector stays only in the Type column. Use Generate in ARCA.
- Guide: Generate invoices.
Invoices: changing a Ticket X letter now saves (2026-09-25)
In Sales → Invoices, switching a Ticket X to A/B/C from Type works again
- The letter change is saved. The selector had been showing Could not save the letter and leaving the receipt as X.
- The selector stays only in the Type column. Use Generate in ARCA to request the CAE (invoice A needs a customer with a CUIT).
- Guide: Generate invoices.
Invoices: change the letter only in Type (2026-09-25)
In Sales → Invoices, the letter selector now lives only in the Type column
- The ARCA column again shows Generate (to request the CAE) or the issued CAE. There is no second selector or helper text there.
- To turn a Ticket X into invoice A/B/C, change the letter in Type (same options as POS for your tax regime) and then use Generate.
- Guide: Generate invoices.
Invoices: change letter X to A/B and generate CAE (2026-09-24)
Online shop sales (ticket X) can be converted to invoice A or B from Sales → Invoices
- When ARCA is connected, a letter selector appears in Type and in the ARCA column.
- Letters are the same set as POS (
getAllowedPosInvoiceTypes): registered VAT sees X/A/B; monotributo or VAT-exempt sees X/C. Not a hardcoded A/B list for everyone. Receipts that already have a CAE cannot change letter. - After choosing A or B, Generate requests the CAE from AFIP the same way as POS sales.
- The online shop still creates ticket X; the path to invoice is change the letter, then generate.
- Guide: Generate invoices.
Demo: cash checkout without Point or other visitors' carts (2026-09-24)
The public demo can complete a cash sale even when Mercado Pago Point is not configured
- Point and QR are hidden on the sample company; an expired MP token no longer blocks checkout — use cash or another local method.
- Each demo visitor sees only their own pending tickets, not other tours' carts or inbound web orders.
- The demo is not put in read-only mode if the sample company's subscription row is expired.
- Guide: Point of sale.
Cancellations: authorization codes under Sales (2026-09-23)
Junior Salesperson cancellation codes are managed in Sales > Cancellations, not Integrations
- Administrators (any plan, including Básico) generate and print codes on the same screen as the cancellation log.
- They no longer appear under Company → Integrations (next to Pro shipping), so they do not look like a Pro-plan feature.
- Guide: Cancellations.
Subscription: confirmed Mercado Pago charges in billing history (2026-09-22)
A verified Mercado Pago charge can no longer stay active without a confirmed-payment event
- Reconcile and
/thankswritebilling_events.payment_confirmedwhen MP captures the cobro (including whenlast_payalready matches that day or the subscription is already active). - The Growth Pago KPI still counts those events, not an orphan
last_pay.
POS: pending sales with no store while a shift is open (2026-09-21)
Pending sales parked without opening a cash shift also show up in POS with a shift
- With a shift at one location, POS still hides tickets from another location.
- Local pending sales with no store (sold without an open shift) now restore, so another PC (e.g. the office) can charge or print them.
- Guide: Multiple sales.
Stock adjustment: search by name (2026-09-21)
Adjust stock can add a product by name, not only by barcode
- Search by name field in the modal (products and stock).
- Scanning or the camera still works the same: the same product increases quantity.
- Guide: Stock adjustment.
Demo: the session stays after leaving /demo (2026-09-21)
Trying the demo keeps the session on normal routes
/demo/poscreates the session and redirects to/pos(same for stock and the rest).- Session cookies apply to the whole site and last 12 hours, so they are not dropped on the next page.
Instagram: Deby quotes public prices immediately (2026-09-20)
If they ask what SARAH costs, Mode C replies with the public list — never a stall
- «What does it cost?», «precios», «qué vale», «cuánto sale», «planes» get Básico $38.000 ARS/month and Avanzado $76.000 ARS/month (same list as the landing / docs; in-app Avanzado is named Plan Pro) in the same message.
- Banned: «let me check the docs», «I’ll confirm with the team», «I don’t want to quote from memory», «give me a moment», or closing only with a 10-minute demo.
- After the price, a soft audio/WhatsApp or 7-day trial CTA. Deby identity, handoff, sticky memory, claim, and delay are unchanged.
Instagram: Deby sends the audio herself (never «a alguien») (2026-09-20)
If they leave a WhatsApp for an audio, Mode C replies in first person
- When they hand a number or ask for audio (e.g. «Quiero un audio si mejor 1150999958»), Deby says she will write / send it («Dale, te escribo por WhatsApp y te mando el audio.»).
- Banned handoff copy: «a alguien», «el equipo», «un compañero», «le paso tu número a…», «te contactan».
- Thread history is sticky: do not re-ask WhatsApp, store name / mail / phone, rubro («para un kiosco…»), city, staff, printer, fiscal, or any fact the lead already gave.
- Deby identity, área-menu, claim, delay, and allowlist are unchanged.
Instagram: Deby never admits being AI; faster follow-ups (2026-09-20)
«Sos AI?» is answered as Deby, co-founder; a 2nd message in an active chat does not wait 1–5 min
- Mode C is Deby (Debora Introini), co-founder of Sarah. Never admits being AI / a bot / an assistant. «Sos AI?», «quién sos?», «cómo te llamás?» → human identity + audio/WhatsApp CTA.
- First message (or no Mode C send in the last hour): 60–300 s delay.
- Active-thread follow-up: 15–60 s (
META_IG_SALES_AGENT_FOLLOWUP_DELAY_MS_MIN/_MAX). - Área-menu ban, claim, cron, and allowlist are unchanged.
Instagram: Deby waits 1–5 min and offers a WhatsApp audio (2026-09-20)
Mode C replies no longer land instantly or ask a module-menu FAQ
- Durable human delay: the claim stores
send_after(default 60–300 s, envMETA_IG_SALES_AGENT_DELAY_MS_MIN/_MAX) and the minute cron sends. Nosleepin the webhook. - Soft CTA after answering: «¿Querés que te grabe un audio? Dejame tu WhatsApp y te mando un mensaje.» (collects a number for human Deby — Mode C cannot send WhatsApp audio).
- Still banned: «which specific area… sales, inventory, billing?». Claim and allowlist unchanged.
- The Deby playbook now lives in the sales skill the model loads (
lib/sarah-agents/skills/sarah-sales/SKILL.md) on SALES intent.
Instagram: Deby no longer asks the module-menu FAQ (2026-09-20)
«Quiero info» gets a commercial pitch, not an área questionnaire
- Mode C on @sarah.patmos replies as Deby: short, cloud / no-install, 7-day trial asking name + email + phone, soft CTA.
- Banned: «which specific area of the software… sales, inventory, billing?». Plans only from docs (
$38.000/$76.000if docs say so). - Claim, flags, and sender allowlist are unchanged.
Instagram: Channels hub can fan out DMs to Sarah (2026-09-20)
Sarah accepts Patmos Channels webhook events without replacing the inbox poll
POST /api/webhooks/channelsverifiesX-Channels-SignaturewithCHANNELS_CONSUMER_SECRET(same HMAC scheme and env name Landscape uses).- Accepted Instagram DMs persist on the existing inbox path, then Mode C runs once via the shared
ig_midclaim. The minute cron and/api/webhooks/metastay. - Prod URL for the hub:
https://www.sarah.ar/api/webhooks/channels. WhatsApp bodies can be accepted later without touching Twilio.
Instagram: Mode C sends at most one reply per inbound DM (2026-09-20)
The sales agent no longer posts the same answer twice for one Instagram message
- Mode C claims
ig_sales_agent_logs.ig_midbefore calling Graph send. Cron, inbox Graph sync, and the Meta webhook share that claim. - A second runner for the same Meta mid does not send. The minute cron stays as the interim poll.
- Flags and allowlists are unchanged. WhatsApp and Landscape are unchanged.
Instagram: Mode C also runs on a cron poll (2026-09-20)
The sales agent can reply to new DMs without opening /superadmin/instagram
- A once-a-minute cron (
/api/cron/instagram-inbox-sync,CRON_SECRET) runs the same Graph list poll as the inbox list and runs Mode C on newly persisted inbound. - The Meta webhook stays optional (Patmos Channels still posts to landscap.app).
after()on/api/webhooks/metais not removed. Allowlists unchanged: channel@sarah.patmos, sender@israelwegierski. - Flags unchanged:
META_IG_SALES_AGENT_ENABLEDandMETA_IG_SEND_ENABLEDdefault off. WhatsApp and Landscape are unchanged.
Instagram: Mode C also runs when the inbox opens (2026-09-20)
The sales agent can reply to new DMs even if Meta never delivers the webhook
- Besides
/api/webhooks/meta, Mode C runs after the Graph poll when listing threads or opening a DM on /superadmin/instagram. - Only newly persisted inbound messages. Flags and allowlists are unchanged: default off, channel
@sarah.patmos, sender@israelwegierski. - The webhook still schedules the agent with
after(). WhatsApp and Landscape are unchanged.
Instagram: Mode C sales agent (2026-09-19)
DMs to @sarah.patmos can be answered by the sales agent, off by default
- Flag
META_IG_SALES_AGENT_ENABLED(default off). Off = the inbox stays human-only. - When on, the receiving channel is
@sarah.patmosand the agent replies only to sender@israelwegierski(live test). It never invents prices. Handoff if they ask for a human, hard-object, confidence is low, or they are closing. - Every turn is listed at
/superadmin/ig-sales-shadow. Real send still needsMETA_IG_SEND_ENABLED. WhatsApp and Landscape are unchanged.
Pricing: invoice VAT in cost (2026-09-19)
On the product form you can see real profit when cost came from an invoice with VAT
- In Products → Edit → Pricing, there is a Cost includes VAT (invoice) checkbox (on by default in Argentina).
- When the product has VAT, Sarah shows net cost and real profit = net sale − net cost. The cost you type is not rewritten on save.
- Exempt / 0% VAT: the figures do not change. Margin % and price still use the cost as entered.
Superadmin Instagram: in-app replies (2026-09-19)
Patmos operators can reply to Instagram DMs when send is enabled
- On /superadmin/instagram,
META_IG_SEND_ENABLED=truehides the permanent read-only banner and shows a composer on the selected thread. - Send uses Instagram Login (
POST graph.instagram.com/{IG_ID}/messages) and stores the outbound message in the inbox. The flag still defaults off. - Superadmin only. WhatsApp / Landscape are unchanged.
POS: admins see everyone’s pending sales (2026-09-19)
On the point of sale, an administrator sees other users’ pending sales
- When opening POS, an administrator restores pending sales with products from every user at the shift’s store, not only their own.
- Those tabs do not take focus on their own: the active cart stays the admin’s. Cashier, salesperson, and junior salesperson still see only their own (cashiers also see web orders).
- Tickets from another location and empty carts still stay hidden.
Customers: birthday (2026-09-19)
You can store a customer’s birthday and see who celebrates in the dashboard period
- The customer profile has an optional birthday field (also when creating or editing the contact).
- On the dashboard, the selected date range lists customers whose birthday (month and day) falls in that period. Birth year is ignored.
- If the date is empty, the customer does not appear. The rest of the dashboard is unchanged.
POS: cash web orders show the chosen payment (2026-09-18)
Pending web tickets now show Efectivo (and other methods) next to the POS total
- Checkout was not saving the customer's payment choice on the order (the box lookup used a column that does not exist), so cashiers saw nothing on cash web tickets.
- New web orders store the preference again. On the POS cart it appears next to the total, before charging. It is still only a preference — cobro does not change.
- Existing tickets created without that data stay empty. Guide: Online orders.
POS: web sales for admin and cashier only (2026-09-18)
Salespeople and junior salespeople no longer see pending web orders
- In POS and Sales, pending web / shop / pipeline tickets are visible to administrator and cashier (so they can charge them).
- Salesperson and junior salesperson still see only their own sales. An online order does not appear in their tabs even when it has no store assigned.
- Roles: Roles and permissions.
Web sales: customer payment method on POS and sale detail (2026-09-18)
On a pending web order you can see how the customer wanted to pay
- The method chosen at checkout (cash, transfer, Mercado Pago, etc.) is stored on the order and shown on the sale detail and in POS when you open that pending sale.
- It is a preference: collection at the register is unchanged; it does not charge by itself.
- Online shop orders still appear as POS tabs even when they have no store assigned. Guide: Online orders.
80 mm ticket: last 4 barcode digits (2026-09-17)
On the 80 mm thermal ticket each product shows the last 4 digits of its barcode
- If the product has a barcode, the 80 mm ticket prints it next to the name (for example
1234). - Use it to identify the item and find it in POS by typing those digits. 57 mm and A4 are unchanged. Lines without a barcode look as before.
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’ local pending tickets or another location’s; web/pipeline orders still appear (so they can be charged) but do not take focus on their own.
- After charging or closing a tab, focus goes to the next local pending sale. A web/pipeline order does not take focus unless you select it. A blank cart opens only when no local sale remains. 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
/loginor 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/stockno 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) andVENTAS_ALICUOTAS(62). Purchases:COMPRAS_CBTE(325) andCOMPRAS_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.21split 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 Binstead 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_idis 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%, andTOTAL. 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_ENABLEDsit 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.
Sale and invoice links use the company’s number (2026-09-02)
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/instagramshows a name: outbound uses the connected handle (for example@sarah.patmos), inbound uses the conversation participant (for examplematiiasross). - 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/instagramnever 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 first.
GET graph.instagram.com/{version}/me?fields=user_id,username,ididstaysexternal_id(IGSID).user_id(1784…) is stored asmetadata.professionalUserId. - If
/mestill 400s, Sarah falls back toGET /{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/instagramrefreshes 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/instagramstores the connected handle fromusing the token-exchange user id (IGSID).GET graph.instagram.com/{version}/{ig-user-id}?fields=user_id,username,id- Instagram Login on
graph.instagram.comdoes not supportGET /me(production 400). The badge shows@usernameinstead of the numeric IGSID when Graph returns a username. - IGSID stays
external_id. Professionaluser_id(1784…) is stored in channel metadata. Conversation poll is stillGET /{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/instagramlists 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 and stores the username on the badge (for example
GET graph.instagram.com/{version}/me?fields=user_id,username,id@sarah.patmos). - Conversation poll uses with the Instagram Login token. No Facebook Page is required.
GET graph.instagram.com/{version}/{ig-user-id}/conversations - 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/instagramnow includesforce_reauth=trueandenable_fb_login=false. - Operators logged into
instagram.comas 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/instagramis Instagram Login (https://www.instagram.com/oauth/authorize) withclient_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 Loginclient_id. - Scopes are
instagram_business_basicandinstagram_business_manage_messages. No Facebook Login, Facebook Page, orpages_*. - 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/instagramnow sendsconfig_id=1063669696383947(envMETA_FACEBOOK_LOGIN_CONFIG_ID) for Facebook Login for Business configuration Sarah Instagram. - Still Facebook Login on Patmos Channels (
META_APP_ID=1386194269924434) at. Landscape Facebook Login configs and Landscape-IG are not used.https://www.sarah.ar/api/integrations/meta/instagram/callback - 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/instagramuses 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-userheader as the session. - Sending DMs stays off (
META_IG_SEND_ENABLEDdefault 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/confirmfirst (same session as login), then links the store. - If the account already has a business or a pending invitation,
/welcomeblocks 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_idis 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
sarahcertificate. - Fewer wizard retries to reduce production timeouts.
ARCA delegation: Sarah linking without deep link (2026-08-25)
Fixes Sarah certificate linking failures in Admin Relaciones
- Automation no longer opens the direct
relationAddURL (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.errorwith 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.
Email sign-in links work again (2026-08-21)
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.
Link share previews (shop, menu, docs, landings) (2026-08-11)
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
/ogcard 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/{#}/editwith 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
exchangecron; 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
/welcomeform 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
pendingorinactivebased on overdue days. - If a merchant creates a new MP subscription after a failed one, the cron repoints
payment_idto 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 whenmenu_configexists). 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
ifoodstill 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:
header20Layoutandheader21Layoutwith{ plu, amount }slices inpos_scale_barcode_settings. - Legacy
pluDigitCountapplies 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_idandlegacy_provideras scalars inattributes; 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
redirectToand 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_idandlegacy_providerinattributes; 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,composedPathtouch detection, and a grace period when Select/Popover closes. - v0.2.122+: dropdown renders inside the Sheet/Dialog (not
body) and blocks dismiss inonOpenChangewhile 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 and aborted checkout (e.g. Quiero Dulces).
pg_advisory_xact_lock(bigint, bigint) does not exist - Postgres function updated with explicit
integercasts.
Online shop: checkout on subdomains and custom domains (2026-07-28)
Fixes finish-purchase errors on merchant storefronts
- Stores on
*.sarah.arsubdomains 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
/oggenerator withbrand,docs,landing,shop, andmenutemplates (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
localequery 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.txtallows crawling/og. - Production fix: Geist fonts bundled in
assets/fonts/so/ogreturns 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-almacenescampaign reads published copy from the CMS (landing_pagesby 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-storesand/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.posstill 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 (
tzin the URL). - Charts no longer show an off-by-one day when formatting
YYYY-MM-DDkeys. - 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
/welcomeand 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_relationshipinsert 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.processedviaGET /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_orderfix (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 toorderandpayment. - POS QR payments (e.g. FLAMA) close automatically when MP confirms the charge—no need for “Close manually”.
- Matching is fixed when MP sends minimal notification payloads (order ID only).
Mobile login and passkey (2026-07-16)
Cleaner sign-in on phones
- On mobile, the header photo was removed: the form is centered with the SARAH logo on top.
- Sign in with fingerprint or Face ID is always shown, including when you arrive with a return link (
?next=).
Welcome, sales channel, and tours (2026-07-16)
Shorter signup and setup that matches how you sell
- Welcome collects the essentials in one form (country, industry, channel, business, and payment/trial).
- The sales channel (in-store, online, or both) drives the checklist, catalog onboarding, and tours (POS or online shop).
- Login and welcome share the same storefront photo via
next/image(AVIF/WebP). - Superadmin → Growth includes a welcome conversion funnel.
- RLS fix: authenticated roles can read activation step definitions.
Cash registers: unlink store locations (2026-07-15)
Multi-store select can remove linked locations again
- In Sales → Cash registers, when editing a register you can uncheck or remove a linked store with the X (previously you could only add).
- If you clear the list, the system keeps the main store linked.
Resto portal: maps, admin, and QR (2026-07-15)
Maps link, clearer Menu / QR admin, and printable QRs
- On the public menu / ordering site, the store address opens Google Maps (store coordinates or address search).
- Resto → Menu / QR: tabs (QR, Appearance, Channels, Delivery, Dishes), color pickers with live preview, and Open / Copy on links.
- Print dialog includes Menu and Order QRs as well as table QRs.
- See Resto.
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/menuand/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 forcedautoFocuson/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_idunique + 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.
/restaurantroute (and/restoalias) 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-systemwith tokens, typography, and real dashboard components. - Layout primitives:
PageShell,PageHeader,MetricCard, andStatusBadge. - 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
.mdto the URL or sendAccept: text/markdown. - JSON-LD on the landing page: Organization, SoftwareApplication, and FAQPage.
robots.txtwith explicit AI bots,Content-Signal, and anLLM: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_enrolldisabled).
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…vs11…). - 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,
/asistentpage, and/api/chatrequire 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 viagetUser()and membership check (userHasCompanyAccess); no longer relies on thex-userheader alone.dbtool: stronger isolation —promotion_targetsandsales_detailsscoped by company; FK ownership on creates;company_idcannot be changed on update; cross-tenantcompanieslist blocked.- App CRUD:
updateTableDatarequires row permission and filters bycompany_id. - Sarah AI: accounts receivable queries without date ranges;
get_accounts_datafix; 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 inproducts_db. - Guided tour (driver.js) on dashboard, products, and POS.
- Post-signup activation flow and progress tracking in
onboarding_progress.
Global documentation search (2026-06-15)
Quick wiki access from the dashboard
- Search help shortcut in the header with instant docs search (es/en/pt-BR).
- Plain-text indexing and improved ranking on
/api/docs/search.
New public landing (2026-06-15)
Homepage focused on kiosks, grocery stores, and bookshops
- Redesigned sections: pain points, benefits, comparison, demo, YouTube tutorials, testimonials, and pricing.
- SEO metadata and i18n per locale (es/en/pt-BR); dynamic OG/Twitter images.
- Optimized WebP assets and deferred loading for below-the-fold sections.
- Trustpilot link and YouTube channel centralized in constants.
POS: cart layout mode for Junior Seller (2026-06-14)
More flexibility in point-of-sale layout
- Users with the Junior Seller role can now switch between always-visible cart and panel layout, same as other POS roles.
POS: invoice type selector (2026-06-12)
Cleaner checkout cart UI at the point of sale
- The ARCA and fiscal invoice notice no longer sits below the selector: it now appears in a tooltip when hovering the info icon next to the Invoice Type label.
Online store: product URLs and legacy links (2026-06-12)
Fix for shared links and infinite reload when opening products
- Canonical product URLs use
?product={id}on the store home again (reverts the/p/{id}experiment). - Legacy
/p/{id}links automatically redirect to?product={id}so previously shared URLs keep working. - Fixed an infinite RSC reload loop when opening products via
/p/{id}URLs.
Product URLs, SEO, and analytics scripts (2026-06-11)
Online store: measurement and better indexing
- Metadata and canonical: product, search, and filter pages correctly define what to index and the canonical URL (
?product=for products). - Analytics scripts: in Settings > Online Store > Analytics and tracking you can paste Google Analytics, Meta Pixel, or other scripts. They load on the public store only (not the admin panel), deferred to avoid impacting page speed.
- Internationalization: configuration strings in Spanish, English, and Portuguese.
For more details, see Store setup 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.txtper 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
/cancellationspage accessible only to administrators, with detailed records of all cancellations including date, type, product, user, authorizer, and comment. - Database: New
cancellationstable with columns for type (product/sale), comment, and full cancelled product data. Newcancellation_authorizer_barcodestable 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.