Changelog
We build in the open. Every update we ship to Klaros, dated, so you can watch the product move, not just take our word that it's maintained.
Last updated: 30 September 2026 · See what's next →
Follow-ups: the inbox remembers what you promised. When you write a customer “I’ll send it tomorrow”, the inbox asks once whether to remember it, and saves nothing unless you tap. A Follow up button (or the f key) adds one by hand, for you or anyone on the team. A Follow-ups chip beside Priority lists what is due today, overdue first, with Done, Tomorrow and Drop, and each chat shows what is owed to that person. When Klaros cannot send a follow-up itself, for example because the 24-hour window has closed and there is no template, it hands it to a person with the reason instead of dropping it. In English and Spanish, and on a phone. How we tested it before release.
The customer’s name always shows in the chat header. On a phone, and on a laptop with the contact panel open, the header’s buttons could push the name out of view. The name and number now always get room, and the buttons move to a second line when they must.
Events in Tamil and Hindi. Choose an attendee language for each event: English, Spanish, Tamil or Hindi. The event page and its share preview, the pass, the after-event page with its certificate, and the WhatsApp welcome, confirmation and waiting-list replies all follow it. The Tamil and Hindi wording is machine-drafted and has not yet been checked by a native speaker. The registration form and the reminder templates stay in English for now.
The door keeps working when the WiFi does not. A volunteer's scanner now keeps the event's list on the phone (first name and initial, last four digits, nothing more). With no signal it still checks passes, catches anyone shown twice, and lets a volunteer find someone by the last four digits of their number. Every check-in is sent with the moment it happened as soon as the signal is back, and anything that turns out not to be valid is flagged.
See what filled the room. Give each registration QR or link a place (poster, stall, a college group) and Results shows how many registered and how many came from each, next to the event page, friends' links and people who messaged directly. Across your events: who came, the show-up rate wherever the door was scanned, how many had been before, and your regulars. Also in the API and for AI agents.
Run an event as a team. Add co-organisers, speakers, sponsors and volunteers to an event. Speakers and sponsors can appear on the event page, and each gets an invite link that counts who they brought. Give tasks an owner and a time: the owner gets a WhatsApp reminder an hour before and replies DONE to tick it off. Co-organisers are told on WhatsApp when the event is nearly full, when people are waiting, or when applications are still unanswered close to the day. Applicants nobody answered hear back when the event starts. Everything anyone did is listed under Team.
Your own registration questions, apply-to-attend, ticket types and promo codes. Ask registrants up to five questions of your own, answered in the chat with a tap or in their own words, with the answers on each attendee and in the export. Make an event apply-only: everyone applies, you approve or decline, and every applicant hears back. Sell ticket types (Early bird, Regular, with limits) and share promo codes as links; a code that covers the whole price gives a free place and sends the pass at once.
A paid place now gets its pass. Attendees who paid were told their pass would arrive once the payment went through, and it never did. It now goes the moment the payment settles. Also fixed: attendee pages of 100 or more lost their delivery badges, and the attendee export stopped at 500 rows.
After the event: thanks, ratings, certificates, and what no-shows missed. An hour after an event ends, everyone who came gets a thank-you with a one-tap rating; rating unlocks their certificate of participation (if you offer them), ready to print or save as a PDF, alongside any slides or recording you share. People who registered and did not come hear how many did, and what was shared, so they come next time. Ratings and comments appear in the new Feedback panel.
Attendees can just say it. Typing "I'll be there" confirms and sends the pass, exactly like the button. Typing "sorry, can't make it" asks once to be sure before releasing the place, so "I can't wait to come!" never costs anybody their seat. "My name is spelt wrong" brings their registration form back; the new answers replace the old ones and the place is kept, with no second payment request on paid events.
See every message before it goes, and choose the reminders. The new Messages panel shows everything an event sends, drawn as the chat bubbles attendees will see, built from the same code that sends them. Choose which reminders go (the day before, about two hours before, both or none), add a one-line note to them, and see how many billable messages that adds up to at your own recent Meta rate. Duplicate an event to start next month's from this one.
A public page for every event. Share one link anywhere: it shows what the event is, who is hosting, when and where, who is going, how many places are left, and a button that registers people on WhatsApp. Link previews on WhatsApp and LinkedIn show the event itself, and search engines see it as an event. Every number on it is a real count, and nobody's name appears unless they chose it on their own pass.
Attendees bring their friends. Every pass has a personal invite link. When a friend registers through it, it counts, and the people who have brought the most (and chose to be seen) appear on the event page. Organisers see every inviter from the new Event page panel, along with what is missing that would make the page shared more.
Event reminders that send themselves. Everyone registered for an event gets a reminder the day before and another about two hours before, each carrying their pass. Nobody who has already arrived or said they cannot come is reminded, a reminder whose moment has passed is skipped rather than sent late, and a moved event moves its reminders with it. The event line shows how many have gone and how many are still to go.
A waiting list for full events. Once an event reaches its capacity, new registrations join a waiting list instead of being turned away, whether they come through the dashboard, the API or the WhatsApp registration form. When somebody says they cannot come, or you raise the capacity, the place goes to whoever has waited longest and their pass is sent automatically. For paid events, you choose who gets a place with one click.
Add to calendar, from the pass. An attendee's pass now offers the event to their own calendar, as a file that opens in Apple Calendar and most Android calendars, or as a Google Calendar link, with the venue and a link back to the pass.
The gate scanner works on iPhones. Volunteers on an iPhone were told to type phone numbers because Safari has no built-in QR reader. The scanner now reads passes itself on any phone with a camera.
A declined place is really released. Somebody who says they cannot come no longer counts against the event's capacity, which is what the reply they receive has always told them.
QR codes you can change after printing. Every card, product and poster code is listed in one place with how often it has been scanned and when. Point a poster's code at a new page, rename it, or retire it and choose where people who scan it should land. The printed code never changes.
Your QR codes, in your colours. Pick a colour and a centre logo once and every code you show or download carries them. A colour too pale for a phone camera is refused before you save, and codes with a logo are built with extra error correction so the logo does not cost a scan.
Print-ready in one click. Any code opens as a poster, a sheet of twelve stickers with cut guides, and a one-page printing guide, ready to print or save as a PDF. Downloads come as a print-resolution PNG or a vector SVG for print shops, named after your card or product.
A retired code no longer sends your customer to us. When a code has nowhere to go, the person who scanned it sees a short, neutral "this code is no longer active" page instead of the Klaros homepage. Retiring a card now asks where its printed code should lead.
QR codes from chat and the API. /api/v1/qr-codes lists, creates and updates codes, and the MCP server gains list_qr_codes, create_qr_code and update_qr_code, so an assistant can answer "which poster is getting scanned" and act on it.
Stones, line by line. A piece set with diamonds of two qualities and three rubies now carries three stone lines, the way its bill prints them: the kind of stone, pieces, carats, quality, and a rate per carat or a fixed amount. Each line is priced on its own and the assistant's quote lists them. A stone with carats and no rate is refused rather than priced at zero. Export columns such as Dia Wt, Dia Pcs and Dia Amt import as lines, and an export imports back unchanged.
Listings a customer can tell apart. The tags of one design used to reach the WhatsApp storefront under one name at different prices. Each now carries its purity and weight in its title, and its description lists the metal, the net weight, each stone and the HUID. A laboratory-grown stone is named in full.
"916 is 22K", said once. When a stock list names a purity the rate board does not have, the board now offers to price it from one that it does. Before, those pieces waited unpriced until the same rate was typed into a second row every morning.
A minimum making charge, and the hallmarking charge. “12% or ₹500, whichever is higher” can now be set per piece, and the BIS hallmarking charge can be added as its own line when the shop passes it on.
Search in chat finds designs. Each word of a customer's question is matched, including a piece's purity, weight and stones, so “22K gold chain” finds the 22K chains. The pieces of one design come back as one result with each piece's weight and price, and a weight range can be asked for.
The rate reaches the storefront when it is saved. Saving the morning rate now sends the new prices to the WhatsApp catalogue straight away, with the 15-minute sync kept as the backstop. A customer who asks for the savaran rate is given the price of a sovereign as well as a gram.
A gross weight no longer prices the stones as gold. When a file gives only a gross weight for a stone-set piece and the stones' carats, the net weight is now worked out as the bill does it and the import says so. When the carats are missing, the piece is marked as weighed with its stones.
No HUID, not on sale. A jewellery catalogue is now one row per tag, grouped into its design, and a gold piece of 2 g or more is held back from the storefront and from chat until its BIS HUID is recorded. Kundan, polki and jadau pieces can be marked exempt.
Today's gold rate, answered in chat. “What is today's gold rate?” is answered from the shop's own rate board, with the rate yesterday and the day before, without an AI model. When no rate has been set today, nothing is sent, so nobody is told yesterday's rate as today's.
A cart at yesterday's price is charged today's, with the reason. A WhatsApp cart filled before the morning rate moved is re-priced at today's rate, and the payment request shows the customer the rate today, yesterday and the day before. The pricing extension is now called Jewellery. More for jewellers
Import the spreadsheet you already have. Products now come in from a
file rather than one form at a time: .xlsx, .xls or .csv, opened as it is with no
converting first. Columns are matched by name and you confirm the match before anything
is written, so an export from any ERP works without waiting for somebody to build an
integration for it. A dry run over the whole file tells you what will happen to every
row first — how many will import, which will be refused and why, and which will arrive
without a price. There is a blank template to download if you would rather start from
one, and an undo if the result is not what you expected. Cost columns are
deliberately never read as a price: a wholesale figure pushed to a storefront would
look exactly like a successful import.
Prices that follow the metal rate, on both surfaces. A piece can now be priced from what it is made of instead of a number somebody types: rate per gram for each purity you sell, times its net weight, plus the making charge, plus the stone, plus GST. Set the morning rate once and everything reprices, including overnight. The part that matters is what happens when a rate goes stale: past 36 hours the piece is held back from your storefront and a customer asking about it on WhatsApp is told “at today's gold rate” rather than quoted yesterday's figure. Both answers come from one rule, so the two cannot drift apart. Available as the Live Metal Rate Pricing extension; building and importing your catalogue stays part of the core product.
Descriptions in the language the customer asked for. Product copy is written once and stored per language, then served in the language that particular person asked to be spoken to in — not the language your shop picked. Copy is only ever generated for languages a real customer has actually requested, so you never pay for a translation nobody reads. Anything you wrote yourself always wins over anything generated.
Weights are read as weights. A net weight of 14.200 grams
was being read as 14,200 grams, because a full stop with three digits after it is a
thousands separator in a great deal of the world's money formatting. Jewellery is
weighed to the milligram and written exactly that way, so weights and prices are now
parsed under separate rules. If you imported before today, check the weights on any
rate-linked piece.
An imported file with an image column now imports. Any spreadsheet carrying a photo or image URL column failed every row while reporting the import as successful. Those files now import, the image address is kept, and the picture is fetched in the background. An import that partly fails also now says how many rows it could not save and why, instead of quietly reporting nothing created.
Product carousels — cards built from your catalogue. If you have a Meta product catalogue connected, a carousel can now pull its cards straight from it: the photo, name and price come from each catalogue item at the moment the message is sent, so there is nothing to upload and nothing to keep in sync by hand. You approve the template once and then choose up to ten products each time you send, in the Broadcast composer or on a milestone rule. Tapping a card opens the product and its cart inside WhatsApp, so interest comes back as an order rather than as a message you have to interpret. Without a connected catalogue the option is not offered at all, because the cards would have nothing to show.
Four carousel rules we had wrong. Card captions are optional in Meta’s spec, not required — we were rejecting perfectly legal image-only carousels. A carousel also cannot mix photos with video, must be a Marketing template, and has real character ceilings on its text; all four are now checked when you build one instead of coming back days later as a rejection. Carousel cards can also carry two buttons now, including a call button.
Carousel templates — up to ten swipeable cards in one message. Each card carries its own image or video, its own caption, and the same button across all of them, which is what Meta requires. You can build one in the Templates tab, fill each card's variables per campaign in the Broadcast composer, or attach one to a milestone rule. There is a ready-made starter in the template library if you would rather begin from working copy than a blank form. The one thing it does not do yet is let you edit a carousel that Meta has already approved — you delete and recreate it, and the builder says so rather than quietly dropping half your cards.
Calling: ask permission, and keep the log. You can send a customer a one-tap request for permission to call them, and their answer lands in the thread like any other reply. Every call on your number — who it was with, how long it lasted, how it ended, and which of your numbers it was on — is recorded and shows up on the contact. Klaros does not place or answer the call itself yet; that needs a live voice connection we have not built, and we would rather say so than imply a button exists.
Your call history is now in your data export, and in your erasures. Call records name the people you spoke to, so they belong in both. A full export now includes them, and erasing a contact clears their calls whether they dialled you or you dialled them. If you exported your data between late August and today, that export was missing this section — ask us and we will re-run it.
A malformed carousel now fails when you save it, not once per recipient. Campaigns, milestone rules and the public API all check the shape up front, so a broken card configuration is a message on the screen in front of you rather than a string of identical Meta errors arriving one per contact an hour later. Media attached to a message is also now checked as belonging to your workspace before it is stored.
Your cost screen was going to start lying to you on 1 October. Meta begins charging for service messages that day, and the Costs panel described them as free in six places, including the advice it gives about avoidable spend. All of it is now gated on the date rather than written into the copy, so it says replies are free while they are free and stops on the morning they are not, without waiting for us to notice. The same panel had a recommendation that told you a template sent inside an open window was wasted money because a free-form reply would have cost nothing; after October the saving is only the gap between the two rates, and it now says that instead.
We were missing half the October billing change, and so is most of the coverage. Utility templates sent inside an open 24-hour window are free today, and Meta starts charging for those on 1 October as well. That matters because it removes the obvious escape route: the standard advice is to move chatty replies into templates and Flows, and those get billed on the same day. From 1 October there is no free way to answer somebody inside an open conversation, whichever form the answer takes. Our roadmap page, pricing page and cost calculator now all say so.
You can work out your October bill now, instead of waiting. Meta prices a service message at the same rate as a utility or authentication message to the same country, with no volume discounts, and those rates are already published. The roadmap page says this rather than telling you to wait for an announcement.
We stated a deadline we could not prove. Our roadmap page said in nine places, including the structured data that AI assistants quote, that Meta requires a payment method on file by 30 September or it stops delivering your messages. We went looking for that in Meta's own documentation on 29 August and could not find it, in the pricing docs, in the page that does document the October change, or in the partner announcement a major vendor published about it. It may be true and relayed privately to providers. It is not something we can call primary-sourced, so it now reads as a provider-reported claim with the date we checked. Attaching a payment method before October is still worth doing, and costs nothing. What is documented, and what we had missed entirely, is that the Meta Terms for WhatsApp Business change on 23 September.
Our citation pointed at a page that does not mention the thing we were citing. The October section credited Meta's main pricing guide as its primary source. That page still describes in-window messages as free and says nothing about the change, which is exactly why we took two weeks to catch the utility half. The source list now links the page that does document it, and says plainly which of the two is right for rates and which is right for what is about to become billable.
Ask to book, get times. “Book a meeting for me” is the highest-intent sentence anybody sends a business, and until now it got a promise that somebody would follow up. It now comes back with up to three tappable times in the customer’s own timezone, avoiding anything already booked. Their thumb does the booking; nothing lands on a calendar until a person picks. Full write-up.
The assistant can show things, not only describe them. Somebody asking what you sell used to get a paragraph about products. They now get the actual card, with the photo and the price read from your catalogue at the moment it sends, so it can never quote a figure that has since changed. One thing per reply, never a menu: what moves a conversation is a single next step, not a list.
It stays out of conversations your team has taken over. If a colleague has claimed a thread, or answered in it in the last two hours, the assistant says nothing at all. It also treats three messages in twenty seconds as one thought and answers once, rather than replying to the first sentence somebody typed.
Decide what it may do, and for whom. A new AI commands panel lists everything the assistant can act on, each with an off switch and a choice of Anyone, Team only, or Customers only. Team means a colleague whose WhatsApp number is on their profile, verified by Meta rather than asserted by the sender. Staff-only commands are invisible to everybody else, so a stranger cannot reach one by guessing the right sentence.
See what it can explain but not do, before a customer finds out. AI Sources now cross-references what your assistant can answer against what it can actually send, and flags anything it could offer but cannot talk about. That screen predicted this exact gap on our own deployment 56 minutes before a real prospect hit it.
It could deny doing something it does. When the assistant could not answer, an optional follow-up question opened by saying the capability did not exist. That is a claim about the product it is in no position to make: being unable to answer means the knowledge is missing, not the feature. It now says it does not have a confident answer, which is true whatever the cause. The wrong version never reached a customer, because that feature only runs in review mode until an operator turns it on.
The assistant was reading the wrong end of the conversation. The thread passed to the AI reply was ordered oldest-first with a limit, so on any conversation longer than the window it received the oldest messages and never the newest, including the one it was answering. Timestamps were stripped too, so a discussion from three weeks ago read as the previous turn. It now receives the most recent messages in order, with elapsed-time markers, and is told that anything after a day-long gap is a new conversation. Full write-up.
"cancel my order" could unsubscribe a customer. The opt-out keyword list contains cancel and remove, so a three-word order cancellation matched it: consent flipped, a suppression row was written, and the order was left standing. When a contact has a live order, Klaros now asks which they meant with two buttons instead of guessing. Stop and unsubscribe are unchanged and still absolute.
Voice notes and stickers got no reply at all. The auto-reply path required message text, so a voice note, sticker or uncaptioned photo produced silence. A session-opening message with no text is now greeted like any other opener.
Replies went out under the wrong name. Automatic replies and the suggest-reply drafter both used the free-text name typed at signup rather than the display name approved by Meta. Now sourced from the reviewed name, refreshed daily.
Nobody waits unnoticed. Klaros now watches for conversations where the customer spoke last and nobody replied, works out how long is too long from your own median reply time, and alerts you. An explicit "talk to a person" gets a fifteen-minute grace instead. If someone writes again while still unanswered, they get an honest acknowledgement rather than more silence.
Greetings answer a conversation, not a lifetime. The greeting could previously fire at most once per contact ever, so somebody returning after three weeks fell through to the model. It is now scoped to a session, requires the message to actually be a greeting (so a real question is never answered with "how can I help?"), and recognises lazy and non-English openers. Where the lookup does not recognise one, the model classifies it and your own greeting text is what sends.
AI auto-reply. Answers customers on its own, but only from the business facts you give it in Settings. It won't invent your pricing or policies, and it hands off to a human quietly on anything outside scope. Runs on a schedule you set, independent of your away hours; a keyword or greeting rule you've already written always outranks it. Off by default at the deployment level; opt in per workspace from the Extensions catalog.
Two-way translation. Auto-detects any language on inbound and translates your reply into the customer's language on the way out. Shown as a secondary line under each message; the original is never replaced. Plain-text sends only; templates and media are never auto-translated. One toggle in Settings.
n8n / Zapier / Make integration path. Every operation in the OpenAPI spec now has a stable id for import into n8n or a Zapier/Make custom action. Documented trigger direction (our outbound webhooks → their generic webhook-catcher) and action direction (their generic HTTP module → our REST API) in the API docs. Works today, no published app required.
Sequences can branch, under the hood. The data model and resolution engine behind drip sequences now support branching logic, not just a single ordered list of steps. A new read-only graph view (Sequences tab → "View as graph") lets you visualize an existing sequence's steps. Authoring branches visually is still ahead; this is the foundation, not the canvas yet.
Silent webhook auto-disable. A webhook subscription that failed 15 times in a row used to go inactive with no signal anywhere. It now raises a health alert naming the endpoint and the failure count, so you find out from a notification, not from a partner asking why their integration went quiet.
Real-time WebSocket inbox. New messages, delivery receipts, and typing indicators now arrive instantly via WebSocket, powered by a per-workspace Cloudflare Durable Object. Replaces the previous 5-second polling. Automatic reconnect with exponential backoff, graceful fallback to 30-second polling if WebSocket is unavailable.
Contact detail panel. A right-side pane alongside the conversation thread showing contact identity (avatar, name, phone), consent/known/business badges, editable lead stage, internal notes with timestamps, company and industry details, and linked numbers for multi-number contacts. Toggle open from any thread, responsive overlay on narrow screens.
Auto-assignment routing. Three strategies for incoming conversations: round-robin, least-busy, and sticky re-assignment. Skill-based filtering: tag agents with skills and route matching conversations. Per-agent capacity caps prevent overload. Enable and configure from Settings.
Settings merge hardened. Saving one group of workspace settings (e.g. routing) no longer risks overwriting another (e.g. automation). One-level-deep merge preserves sibling keys.
Commerce: orders and payment requests. A received cart is now a tracked order, not a dead-end chat bubble. Multi-item payment-request composer in the Inbox, pre-filled from a real cart; works with any payment provider's link, no Meta Commerce Manager required. Orders track received → payment requested → paid → fulfilled, with one automatic reminder if a request goes unpaid. New Commerce dashboard tab. Product library gained optional numeric price and stock.
Real-time inbox connection. The WebSocket connection now authenticates correctly on every browser, instead of silently falling back to polling.
Contact import & sync. Pull contacts from Google, Outlook, or iCloud: zero-friction Google Apps Script method (no App Password friction), CardDAV for Outlook/iCloud, or upload CSV/vCard/JSON files. Auto-format detection, smart phone normalization (200+ countries), nightly auto-sync for credential-based sources.
Source provenance tracking. Every contact now shows where it came from: inline badges on the contacts explorer with "Google," "CSV," "iCloud" etc. Detail pane shows full import history per contact.
Progressive WhatsApp verification. Imported contacts are verified for WhatsApp reachability via delivery receipts: wa_verified status progresses from unknown → verified/failed. Filter your audience by verification status before campaigns.
Connect tab restructured. My Sources / Add New / Activity sub-tabs (matching Templates/Flows pattern). Per-provider guided setup with step-by-step instructions. Sync history with per-source stats.
Push API for external integrations. POST /api/contact-sources/push: feed
contacts from any external script or integration. Same normalize → dedupe → upsert pipeline as built-in
connectors.
File import robustness. CSV: auto-detects delimiter (comma/semicolon/tab), strips BOM, merges first+last name columns, broad header regex patterns. vCard: handles folded lines, prefers CELL/MOBILE type. JSON: searches nested arrays, handles CRM export formats (HubSpot, Salesforce patterns).
Behavior Sequences + Milestones API. The feature we've wanted to ship since day one:
WhatsApp that reacts to what your customers do, not what day it is. One API call from your own
backend (POST /api/v1/milestones when someone places an order, completes KYC, books a demo),
and the rule you defined sends the next-step template from your own number. Consent-gated on every send,
one message per contact per rule, zero markup on every trigger.
Read the docs →
Engage → Behavior Sequences tab. Define rules ("milestone → template, after N minutes"), watch the live activity feed (sent, skipped, why) without leaving the dashboard.
Trial onboarding now practices what we preach. Our own trial nudges run on the same milestone engine. You get guidance for the step you're actually on, and never a "connect your number" message after you've already connected it.
Trial signup edge cases. Same WhatsApp number under a different email is now caught with a clear path back to your existing workspace; credential delivery is tracked end-to-end so an undeliverable number is visible, not silent.
Compliance gate on every send path. Inbox template sends (the path agents are steered to when the 24h window closes) now enforce consent and suppression checks, closing the last ungated outbound route.
Inbound message deduplication. Cloudflare Queues retry on transient errors; retries no longer create duplicate thread bubbles, double unread counts, or duplicate auto-replies.
Graph API upgraded to v25.0 (from v20.0, which was at Meta's deprecation window). All API version references unified to a single constant.
Rate-limit-aware campaign retry. Meta rate limits now back off for 6 hours instead of failing permanently in 3 minutes. Auth errors raise a critical health alert instead of burning retries.
Dead-letter queue visibility. Failed queue messages are tracked in a
dlq_events table and surfaced in the health dashboard. No more silent message loss.
Content-hash cache busting. All dashboard asset references are now auto-versioned by content hash on every deploy. The "forgot to bump the version string" class of bug is structurally prevented.
Rich message composer. Send interactive buttons, list menus, CTA URLs, quote-replies, and reactions directly from the inbox, not just plain text and templates.
Read receipts + typing indicator. Real-time "seen" and "typing..." signals in conversations. Read receipts can be opted out per-deployment in Settings for privacy.
WhatsApp Flows. Create, publish, and manage Meta's native in-chat forms from the dashboard. 10 pre-built flows included: appointment booking, lead qualification, feedback survey, and more.
WhatsApp Business Tools. Edit your business profile and photo, create QR codes, configure welcome messages, ice-breakers, and persistent menu commands, all from Settings.
Template edit & resubmit. Edit approved templates for re-review. The live approved version keeps sending until the edit clears. Media library reuse for headers skips the re-upload step.
Broadcast preview. See a live WhatsApp-bubble preview of your template before sending. Replaces the old text-only confirmation dialog.
Consent-button decoupling. Opt-in/opt-out detection now uses stable payload IDs, not button display text. Relabeling a consent button can never again silently break what it does.
Full inbound parser. All WhatsApp message types are now parsed and rendered in threads: button taps, interactive replies, Flow responses, reactions, location, contacts, orders, system messages, and CTWA ad referrals.
Campaign audience builder shipped. Composable audience sources: segments, contact lists, groups, or all opted-in. Mix and match per campaign with automatic deduplication.
@lid phone number cap. 13-digit @lid suffixes no longer create duplicate contacts. Picker performance improved with lazy search.
Proactive health alerts. The dashboard now warns you the moment your WhatsApp number's quality rating drops or gets throttled, so you can act before it hurts deliverability, instead of finding out from a failed send.
Setup readiness in Settings. A live checklist of exactly what's left before your number can send: connection, business account, token, display name, and billing, so onboarding never stalls on a silent gap.
“Ready to self-deploy?” check on sign-up. A 30-second self-assessment on the trial page so you know upfront what you'll need to own your deployment, or whether managed onboarding is the better fit.
See what you save. The Costs tab now shows the messaging markup you avoid by paying Meta directly (with an annualised projection) right next to your real billed cost.
Value at the point of spend. The broadcast confirmation now shows the reseller markup you're avoiding on that exact send.
True-cost calculator. The calculator on the comparison page is sharper (multi-year savings and currency presets) and a display bug that stopped it running is fixed.
Interactive pricing journey and a smoother, hardened free-trial experience end to end.
Team management. Add teammates, assign them specific WhatsApp numbers (Sales, Support…), and manage admin/agent roles, all self-service.
Per-user data visibility and per-agent API keys. Each teammate's desktop connects as themselves, with their own credential.
Features and pricing pages redesigned, with every marketing claim aligned to exactly what's shipped. No overselling.
Composable campaign audiences with scheduling and a live delivery funnel. Build a send from segments and see it land in real time.
20+ site refinements across the trial flow, SEO, and everyday UX.
49 features live, shipping every week.
Klaros is actively built in production. Curious where it's headed next?
View the roadmap →