Changelog

What's new in HARi

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

Updated today 49 updates across 4 weeks

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.

    The merge dialog on its Conflicts step: a Field / kept value / removed value table with the kept record's values pre-selected, plus "Keep all from kept record" and "Keep all from removed record" toggles

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.