Changelog
What's new in HARi
Every feature, improvement, and fix we ship — in plain language. No marketing spin, just what changed.
Week of May 25, 2026
- Fix
Merging contacts now keeps every linked record — even the unmapped ones
When you merged two contacts, related records (activities, tasks, custom child entities) were supposed to move from the deactivated copy to the survivor. In a handful of older workspaces some of those links were missed: a record could be merged and yet its survivor page still showed fewer children than expected. The merge engine now reads the database itself for every real link between records, not just the ones declared in the Schema editor, so every child row is repointed at merge time and the survivor record shows the complete history.
- Fix
Settings → Email now correctly shows a connected Microsoft 365 mailbox
When the workspace was set to send through Microsoft 365 and a teammate had connected their Outlook mailbox in Connected Channels, the Settings → Email page would still say "Email not configured" with an amber warning — even though the inbox was already pulling mail through that same connection. The check now looks at the whole workspace (any teammate with a connected Microsoft 365 mailbox counts) instead of asking only whether the person currently looking at the page has connected their own mailbox, so the status banner finally matches reality. The "Send test email" button also no longer claims the provider is unconfigured in that case.
- Feature
Choose a record thumbnail image
Records can now open with a picture, not just text. In the Schema Editor, next to where you set the Display name, there is a new Record thumbnail selector — point it at any image or file field on the entity (a contact photo, a company logo, a product shot) and that image shows at the top of every record of that type. The field stays fully editable in the form, so uploading or swapping the image from the record updates the thumbnail too. Records that have no image for that field simply show no thumbnail — nothing looks broken.
- Fix
Kanban cards now show names, not IDs
On the Kanban board, fields that link to another record (like Client, Owner, or a status drop-down) used to leak a raw internal ID on the card — you would see "Client: 6aac76d6…" instead of the actual name. Those fields now resolve to the human display name, exactly like they already did in the list view, so a card reads "Client: Acme Ltd" at a glance.
- Fix
Clearer errors when a record can't be saved
When a record could not be created because of a database rule — a required value was missing, or a value had to be unique and already existed — HARi used to surface a generic "Failed to create record" with no hint about what went wrong. You now get a plain-language message that names the problem and highlights the field at fault, for example "Email is required" or "That value already exists", so you can fix it and save without guessing.
- Feature
Your table columns now follow your login across devices
Set up a table the way you like it — which columns show, the order you drag them into, each column's width, and how many rows appear per page — and HARi now remembers that layout against your login instead of just the browser you happened to be using. Arrange the Contacts table on your laptop and the same columns, order, widths, and page size are waiting when you sign in on another computer. Each entity (Contacts, Companies, Deals, and so on) keeps its own layout, so tuning one never disturbs another. Want a clean slate? The table's column menu now has a "Reset to default columns" item that restores the standard layout for that entity in one click.
- Feature
Schedule a campaign to send at a future time
The campaign send dialog now asks "Send now" or "Schedule for later". Pick "Schedule for later", choose a date and time, and HARi holds the campaign and sends it automatically when that moment arrives — handy for hitting a recipient's local morning, lining a newsletter up with a launch, or queuing the send before you step away. The picker only accepts a time in the future, so you can't accidentally schedule into a moment that's already passed. A scheduled campaign stays editable while it waits, and you can still cancel it before it leaves.
- Feature
Mark fields as Recommended — a nudge, not a hard block
Required fields (red ★) stop a record from saving until they're filled — the right call for data you genuinely can't do business without. But forcing every nice-to-have field is heavy-handed and slows people down. Fields can now be marked Recommended (blue ★) instead: leaving one empty doesn't block the save — HARi shows a friendly "save anyway?" prompt so you can fill it in or proceed. Use it for job titles, phone numbers, lead sources — anything that improves your data without being a deal-breaker. Configure it with the new "Recommended (advisory)" checkbox when you add or edit a field in the Schema Editor.
- Feature
Merge duplicate records from any list
Cleaning up duplicates no longer means hunting them down one record page at a time. Select two or more rows in any entity list, open the Actions menu, and click "Merge N records" to launch a guided three-step dialog: choose which record to keep (with a Swap button if HARi picked the wrong one), resolve any conflicting field values — keep-all toggles set every field at once, or pick winners individually — then confirm against a plain-language summary of exactly which related records will move. Related activities, deals, emails, tasks, and list memberships move to the kept record, the other is deactivated rather than deleted, and no automations fire. The Data Health and record-page banner paths now open this same dialog.
Week of May 4, 2026
- Feature
Build campaign recipient lists directly on the campaign
A new "Filter directly" source type lets you build the recipient query inline when creating a campaign — no need to first create and save a view. Pick any entity that has an email field (Contact, Company, Event Registration today; whatever your custom solutions add later), set filter conditions including one-hop relation traversal (e.g. "Company > Industry equals tech"), and pick which email field(s) to send to when an entity has more than one. Multiple sources stack and deduplicate by email automatically — if the same address appears under a contact and a company, it ships exactly once. The first source listed wins for tracking attribution. The recipient box also got a width revamp so the filter UI breathes instead of cramming into a narrow column.
Week of April 27, 2026
- Feature
Abort a campaign that's already sending
Until today, once a campaign moved into the sending status there was no way to stop it from the app — Delete only worked on drafts, Cancel only worked on scheduled. A real customer hit the gap when they noticed a duplicate "Sending..." campaign and had no kill switch. Now every campaign in sending shows a red "Abort campaign" button, both in the row actions and in the report header. Confirming opens a modal with a clear count: how many recipients have not yet received the email (these are cancelled), versus how many already received it (these are preserved as historical record). The campaign moves to the new "Cancelled" status and the cron stops processing it on the next tick.
- Feature
Test-fire any webhook directly from the settings page
Configuring a webhook used to mean saving it in HARi, then triggering a real workflow event to confirm the endpoint actually received the call — slow whenever you tweaked the URL or the payload. Each saved webhook now has a "Test fire" button that sends a sample payload immediately. A result panel appears below the row showing HTTP status, response time, the response body (truncated at 500 characters with a "Show more" link for long payloads), and any connection error in red. The panel persists until you dismiss it — no toast you have to catch before it fades.
- Feature
Leads merged into Contacts with a Lifecycle Stage field
Tracking the same person twice — once as a Lead, then again as a Contact when they sign — was awkward and easy to break. Now there's one record per person on the Contact entity, with a Lifecycle Stage field that moves them through Lead → Qualified → Customer (or Lost). The "Active Leads" view that used to live under /lead now points at Contacts filtered to Lead + Qualified, so the workflow stays familiar. Existing workspaces keep their old Lead records visible until your admin runs the one-shot migration (which copies them into Contact with lifecycle_stage="lead" and soft-archives the old rows). New workspaces ship without the Lead entity at all.
- Feature
Download dashboard charts as PNG
Every chart on your dashboard now has a "Download as PNG" button next to the CSV one. Click it and the chart drops to your downloads as a retina-quality image with the right background colour for whatever theme you're in — drop straight into a slide deck or report without screenshotting and cropping. The CSV button is still there when you need the raw numbers.
- Polish
Reactivated teammates: see what was transferred away last time
When you open a teammate's profile in Settings → Users, HARi now shows a "Records previously transferred away" card if any records were reassigned to other teammates during a prior deactivation — listing the entity, count, new owner, and date. Useful when a returning teammate asks where their old contacts went; you can see at a glance who picked them up and reach out for a manual handover. Pure information — no surprise auto-reassignments.
- Polish
Forms now show errors next to the right field instead of one big message
When a record save fails validation, HARi now highlights exactly which fields have a problem and what to fix — the email is malformed, the amount is below the minimum, the date is in the wrong format. Previously some forms only showed a single "Validation failed: 3 error(s)" toast that left you hunting for the offending field. The same standardized error shape now flows everywhere: contacts, companies, opportunities, tasks, invoices, custom entities — anywhere you create or edit a record.
- Polish
User reactivation no longer surprises record owners
Reactivating a deactivated teammate is one click and now does the conservative thing on purpose: it re-enables login and nothing else. Records previously reassigned to other teammates stay with their current owner — no silent yank-back when someone returns. The Reactivate button on the user detail page spells it out in a tooltip so admins aren't guessing what the click will do, and admins can still reassign records back manually on a case-by-case basis if the returning teammate genuinely needs them.
- Polish
Workspace renames no longer break embed widgets
Until now, renaming your workspace would also rotate the URL slug — which silently broke every embed widget, OAuth callback, and external link you'd already shared with customers. The URL is now locked at signup; the editable label lives separately in Settings → Branding → Workspace identity. Type a new label, hit Save, and the workspace switcher and login page update — your URL stays the same so nothing downstream breaks.
- Polish
Deactivation modal: notify the new owner with one summary message
Tick the new "Notify the new owner" box when you reassign someone's records during deactivation, and the chosen teammate gets a single summary in their notification bell — "Vincent reassigned 47 records from Amy to you." — instead of one ping per moved record. Off by default to keep the notification feed quiet on routine cleanups; flip it on when you want a heads-up to land.
- Feature
Deactivating a teammate: pick who inherits their records
When you deactivate someone in Settings → Users, HARi now opens a dialog showing exactly what they own — contacts, opportunities, tasks, and any team where they're the only active member — and asks where it should go. Pick a teammate to receive everything, or skip with a short note explaining why (for example: "Returning in 3 months — keep records as-is"). The transfer happens in one click and is recorded in the audit log so you can always see what moved. No more silent record orphaning when someone leaves.
- Polish
Embed widget pings you when its routing breaks
When an active embed widget routes new submissions to a user who's been deactivated or deleted (or to a team that no longer exists), the widget creator now gets a notification the moment the platform detects it — instead of having to spot the issue buried in Settings → Data Health. The detection runs on the existing nightly hygiene scan, and the notification only fires the first time each broken widget is found, so re-runs don't spam.
- Polish
Wait timers can stick to business hours
The "Only count business hours" toggle is back on automation Wait nodes — and now actually does what it says. Pick "Wait 5 days" with the toggle on, and the timer skips Saturday and Sunday so a Friday start resolves on the following Friday, not the next Wednesday. Pick "Wait 2 hours" with the toggle on at 5 PM, and the wait carries over to 10 AM the next business day instead of finishing at 7 PM after-hours. Times use the contact owner's timezone, falling back to UTC.
- Feature
New automation actions: subscription lists + AI enrichment
Three actions are now configurable in the automation builder: "Add to list" and "Remove from list" subscribe or unsubscribe a contact from one of your marketing lists, and "AI enrichment" queues a contact for background AI enrichment on the fields you pick (with an optional "apply suggestions automatically" toggle when you trust the result quality). The Add/Remove list actions write through the same opt-in / opt-out audit trail your campaign sends respect, so the consent gate stays honoured. Pair them with the new "Sent a campaign" trigger for end-to-end campaign-driven workflows — for example: someone receives the welcome newsletter → enrich their job title and company → add to the engaged-prospects list.
- Feature
Automation trigger: "Sent a campaign"
New trigger in the automation builder: "Sent a campaign" fires the moment a contact receives a campaign send. Pick a specific campaign or any campaign. Use it to chain follow-up workflows after a newsletter, drip the next message in a sequence, or notify the owner once a recipient has been reached. Replaces the old "Matches a saved filter" trigger for the "contact enters a campaign" pattern, with no polling delay — the automation enrols the contact at the same moment the send is marked successful.
- Polish
Automation triggers — "Matches a saved filter" retired
The "Matches a saved filter" trigger option has been removed from the automation builder. View membership turned out to be a poor signal for automating workflows — it's a derived filter result rather than a real data event, so the engine could never reliably catch indirect cases (records that became visible because something else changed). Use real data triggers instead: "Field changes", "New contact added", "Form received", or "Engagement score reached". Existing automations using the old trigger now show a "Deprecated trigger" pill on the automation list so you can spot and rewrite them.
- Feature
Compose Email suggests related contacts
Composing an email from a record without an email field of its own (like a Company or Account) used to open with an empty "To" — you had to remember which contact was associated and type their address. The dialog now suggests up to 10 related contacts as one-click chips below the recipient field. The suggestion list is built from your schema (any record type that "belongs to" the parent and carries an email field) and respects your read permissions, so you only see contacts you're already allowed to see.
- Fix
Webhook activity log now tells you when it fails to load
When the webhook log on Settings → Webhooks couldn't reach the server (5xx error or network blip), the page silently dropped to "No log entries match the current filters." — making a real failure look like an empty result. There's now a clear red banner explaining the load failed, the underlying error, and a Retry button. Empty results still show the empty-state.
- Fix
Activity feed marks soft-deleted records as "[deleted]"
When a record was archived (soft-deleted), the activity feed kept showing its live name as if nothing had changed — "John Smith updated" instead of indicating the record was gone. Soft-deleted records are now prefixed with "[deleted]" in the activity-feed entries so it's clear at a glance which timeline events relate to records still in your workspace versus ones that have been archived.
- Polish
Billing audit log now reads in plain English
The Wallet ledger and audit tables on Settings → Billing used to show raw enum strings in mono-font — "top_up", "credit_pack_external_billing", "subscription_read_only_triggered" — that nobody but a developer could decode. Every event and action is now shown in plain language ("Top-up", "Credit pack purchase", "Workspace switched to read-only", "AI chat", "Email send", etc.). Hovering over any label still shows the raw value as a tooltip for support and debugging.
- Polish
Settings breadcrumbs now show the leaf page on Currency, Data Privacy, and Data Health
The breadcrumb at the top of the Settings → Currency, Settings → Data Privacy, and Settings → Data Health pages used to stop at "Settings" — not telling you which sub-page you were on. Now the full chain shows ("Settings · Currency"), matching every other settings sub-page.
- Polish
Background Tasks page: plain-language header and live "Updated N seconds ago" indicator
The Settings → Background Tasks page (formerly "Job Queue") got a friendlier header — "Webhooks, bulk imports, AI jobs, and other long-running work — auto-refreshed every 30 seconds." — and a live "Updated 12s ago" / "Just updated" indicator next to the Refresh button. The page already auto-polled every 30 seconds, but you had no way to tell whether the numbers on screen were 1 second old or 29 seconds old. Now you do.
- Polish
Dashboard shows skeletons on first load instead of "No charts yet"
Opening the Dashboard used to flash "No charts yet" and "No records yet" for two to four seconds while data was loading — making the workspace look broken or empty on every navigation. The skeletons now render from the first paint and only resolve to real content (or the genuine empty-state messages) once the data has arrived.
- Feature
Download any chart as CSV from /reports and dashboards
Every chart on the Reports page (and on dashboards) now has a small download icon next to its fullscreen icon. One click saves the chart's underlying numbers as a CSV file with two columns — Label and Value — that opens straight into Excel, Numbers, or Google Sheets. Works for every chart type (pie, doughnut, bar, column, line, funnel) and uses today's date in the filename so you can keep snapshots.
- Fix
Contact pickers, card view, and timeline now show full names
Anywhere HARi rendered a record from an entity that uses a compound display name (like Contacts, where the display is "first name + last name"), the label was rendering empty or showing the raw ID. The relation picker dropdown, card view tiles, timeline list, business-process indicator, and right-click context menu all now resolve compound display fields correctly and fall back to a friendly "(unnamed)" label rather than leaking an internal UUID.
- Polish
Templates page opens to your most-recent template
The Settings → Templates page used to drop you into an empty "New Template" form even when you already had saved templates. Now it auto-opens the template you edited most recently, so returning users land on the row they were probably about to edit. The sidebar list also got proper list semantics for screen readers and a clearer selected-row indicator.
- Feature
Four starter templates on the Templates page
Open Settings → Templates in a fresh workspace and the editor now offers four ready-to-edit starting points: Newsletter, Welcome email, Receipt, and Announcement. Pick one to pre-fill the form with sample copy and merge fields, or click "Start blank" to keep the old behaviour. The cards disappear automatically once you have at least one saved template.
- Feature
Reassign historical embed-form submissions when you change routing
Edit any embed widget, change its owner or team, and tick the new "Also apply this routing to records already submitted via this form" checkbox before saving. The save will reassign every historical submission from that widget to match the new routing — no more leaving old leads stranded with the previous owner. Future submissions are always routed by the current settings, with or without the checkbox.
- Fix
Webhook Activity Log shows real entries instead of "no entries"
The Webhook Activity Log on the Integrations page was silently rendering "No log entries match the current filters" even when deliveries had happened. The underlying API call was failing because two columns the code expected were never created in the database. Both columns are now in place and the log shows your real webhook delivery history again.
- Feature
Trigger automations from public form submissions
You can now build an automation with a "Form submitted" trigger and have it fire every time a visitor submits one of your embed widget forms. Pick a specific form, or "any form" on a chosen entity. Useful for instant assignment, welcome emails, or notifying a team channel the moment a lead arrives.
Week of April 13, 2026
- Feature
Export your entire workspace as a ZIP
Download a full copy of your HARi workspace — all contacts, companies, deals, tasks, and related files — from Settings. Useful for GDPR/PDPO subject-access requests, backups, and moving between plans.
- Feature
Close your workspace yourself
You can now request workspace closure directly from Settings. No email ticket needed. Your data is exported, then deleted on schedule — you stay in control.
- Feature
Automatic cleanup of deleted records
When you permanently delete a record, attached files stored in HARi are now cleaned up at the same time. No more orphaned attachments taking up space.
- Polish
Dark-mode polish across the app
Record pages, settings screens, and the relation editor now look and feel native in dark mode. Colours, borders, and badges were all tuned for comfortable reading.
- Polish
Smoother loading on record pages and dashboards
Opening a contact or the main dashboard now shows a light skeleton of the page while data arrives, instead of a blank screen. Feels noticeably faster.
- Polish
Friendlier tables and forms
Row hover is more obvious, the first field in forms is auto-focused so you can start typing immediately, and list views feel cleaner on mobile (down to 375px).
- Feature
Phone fields get a country-code picker
Adding a phone number now offers a country-code dropdown so formatting is consistent and international numbers are stored correctly.
- Feature
AI Assistant page with real examples
A new Features → AI Assistant page shows exactly what the assistant can do for you: answer questions about your data, draft emails, manage records, and build workflows.
- Polish
Sidebar active-page indicator
A small accent border now highlights the page you're on in the sidebar, so you always know where you are. Notification tooltips were also tightened up.
- Polish
Friendlier tables and billing errors
Table rows alternate colours for easier scanning, form fields auto-focus where it makes sense, and billing error messages are now in plain language.
Want to try the latest updates?
Start free — no credit card
Every change on this page is live for every HARi workspace. No feature-gating, no upgrade nag.