Changelog

What's new in HARi

Every feature, improvement, and fix we ship — in plain language. No marketing spin, just what changed.

Updated 1 day ago 40 updates across 3 weeks

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.

    Campaign recipients box with the new "Filter directly" source: Contact entity selected, FILTER CONDITIONS section, EMAIL FIELDS TO SEND TO checkbox group, and a live count of 433 recipients (98 excluded by Layer-1 opt-out and dedup gates)

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.

    Data Privacy settings after the workspace export update: clicking Request export schedules the archive and confirms the email destination
  • 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.

    Billing settings after the self-serve closure update: a Danger zone reveals a typed-confirmation dialog explaining the 30-day grace period
  • 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.