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