Skip to main content
Automation test sends use the automation's date range

Test sends now match what the automation will deliver

The Send test button on an automation produced an email whose report link opened the source dashboard on its date range, not the automation’s. Testing a “Last 12 Months” automation showed “Last 7 Days” — the recipient was reviewing a different report from the one the schedule would send.A test now builds the same dated copy of the report a scheduled run does, resolved against the automation’s own date range. Everything else about a test is unchanged: it still records a single run in the automation’s history, never advances the schedule, and can be repeated as often as you like.
Klaviyo rate-limit handling

Klaviyo widgets survive rate limits

Klaviyo enforces a strict request rate and returns a 429 with a retry delay when you exceed it — a report with several Klaviyo widgets could trip it and leave widgets in an error state.Oviond now reads the delay Klaviyo asks for, pauses every Klaviyo request for that period, and retries. Widgets that previously failed on a busy report load complete instead. No reconfiguration needed.
SerpWatch keyword selection

Choose which SerpWatch keywords a widget reports on

SerpWatch widgets fetched every keyword on a project before filtering, which was slow on large projects and could hit the platform’s rate limit.A widget now reports on up to 50 keywords, chosen in one of two ways:
  • Pick them explicitly — the Keywords field in advanced settings, which now shows a n/50 counter and stops accepting selections at the limit.
  • Let Oviond choose — leave Keywords empty and the top 50 are selected by the new Sort By (Current Position, Name, Movement, Status, Best Position) and Order settings, narrowed by the new Device, Type (Owner, Competitor, Paid) and Search Engine filters.
Existing SerpWatch widgets keep their configuration and now default to the 50 best-ranking keywords.
Ahrefs Rank Tracker requires a Project ID

Project ID is now required for Ahrefs Rank Tracker

The Ahrefs Rank Tracker dataview needs an Ahrefs project to query keywords against. Without one the widget returned nothing with no explanation.Project ID is now a required field in the widget’s advanced settings for that dataview, validated before the query runs. Other Ahrefs dataviews are unaffected.
Notification field renamed to name

title on a notification is now name

A notification’s headline field is renamed from title to name, so a notification carries the same field as every other record you can list and archive.This affects the notification endpoints and the corresponding MCP tools. Update any integration that reads notification.title to read notification.name. Nothing else about the shape changed, and the in-app inbox is unaffected.
Delete renamed to Archive where records are recoverable

”Delete” now says “Archive” where nothing is destroyed

Sixteen operations were labelled delete while the record actually moved to the Archive and could be restored. The names and descriptions now say what happens, and point to the Archive rather than implying the record is gone.Renamed to archive_*: clients, projects, assets, automations, templates, themes, goals, calculated metrics, custom data, exports, media files, and notifications — singular and bulk. The matching REST summaries and descriptions were corrected in the same pass.Operations that genuinely destroy, with no undo, keep the delete_* name: widgets, pages, folders, media folders, datasource connections, notification channels, API keys, email senders and templates, custom domains, and removing a user.Only the names and descriptions changed. Every endpoint behaves exactly as it did.
Date-range presets applied over the API

Setting a project date range to a preset now takes effect

Updating a project with a preset alone — { "text": "Last 7 Days" } — stored the preset without any resolved start and end dates. The project looked correct, but its widgets kept rendering their previous dates because the refresh had no window to run against.The preset is now resolved against the client’s timezone before it is stored, merged over the range already on the project so a partial update keeps what it didn’t mention (such as the comparison period). Widgets refresh against the resolved range, matching what the date picker in the app has always done.
Asset data source filter fixed

Filtering saved sections by data source returns results again

The Data source filter in the Assets panel returned nothing. Assets record the data sources they use by display name (“Google Ads”), while the filter sent the alias id (gadw), so the two never matched.The filter now translates the id before matching. Saved sections filter correctly, singly or in combination.
GA4 custom dimensions and metrics

Google Analytics 4 custom definitions appear in the builder

Custom dimensions and custom metrics defined on a GA4 property are now loaded from that property when you open the report builder, and appear alongside the standard GA4 fields.They’re read live per property, so a definition added in GA4 is available in Oviond without waiting for a release. Existing GA4 widgets are unchanged.
MCP data tools share the report builder's logic

MCP data widgets are configured the same way the builder configures them

The MCP tools that create and update DATA widgets now run the report builder’s own query logic rather than their own copy of it. In practice that means an agent gets the same answers, and the same errors, a person gets in the editor:
  • One discovery call. describe_datasource returns a datasource’s data views, the advanced settings each view requires, and its metric and dimension catalogs with the flags that decide what can be combined — a dimension that must be the only one, a dimension only offered once a particular metric is picked, deprecated fields, and per-account custom fields.
  • Selections are validated against the catalog. A metric or dimension that doesn’t belong to the chosen data view is rejected with the valid list, instead of being saved and silently returning nothing.
  • The cascade matches the editor. Changing the datasource clears the data view, metrics, dimensions, filters and advanced settings, then applies that datasource’s defaults; changing the data view clears metrics and dimensions.
  • Widgets are named the same way. An unnamed widget gets the generated name the builder would give it (“Clicks & Impressions by Date”), and a name you set is never overwritten.
  • Display-only changes don’t re-fetch. Editing a chart type, sort order, row limit or metric label writes through without re-running the query, mirroring the builder’s two panels.
Datasource connections can also now be created from a tool for platforms that authenticate with an API key. Platforms that sign in on the vendor’s website (Google, Meta, LinkedIn, TikTok) still need a browser and are connected in the app, then linked from a tool.
New data source: ChatGPT Ads

ChatGPT Ads

Report on ChatGPT Ads campaign performance. Connect it with an API key from your OpenAI Ads account — the key scopes to the advertiser, so there’s no account to pick after connecting.Three dataviews, each with Impressions, Clicks, Spend, CTR (%), Avg CPC and Avg CPM:
  • Campaigns — broken down by campaign name, status, daily budget and lifetime budget. Adds Conversions, which the platform reports at campaign level only.
  • Ad Groups — by ad group name and status.
  • Ads — by ad name, status, URL and parent ad group.
All three support a date breakdown, and widgets can be narrowed to specific campaigns, ad groups or ads in advanced settings.
AdRoll — Conversion Events and CPA

AdRoll gains a Conversion Events dataview

A new Conversion Events dataview reports on the audiences and conversion rules configured in AdRoll, broken down by conversion event: Estimated Audience Size, Unique Website Visitors, Rule, Type and Duration.The existing Account dataview also picks up CPA. Existing AdRoll widgets are unaffected.
Per-client number format

Number format per client

Each client can now choose how numbers read in its reports. A Number format setting under Settings → General sets the thousands and decimal separators — for example 1,234.56 (US) versus 1.234,56 (German) — independently of the client’s currency.The value is a BCP 47 locale, so it works for any region without a fixed list of “US vs Europe” options. New clients default to en-US, and every existing client keeps rendering exactly as before until you change it.Over the API this is the number_format field on a client, accepting a locale string such as en-US or de-DE. Null or absent defaults to en-US.
Variables in text widgets

Insert dynamic variables into text

Textbox widgets can now include variables that resolve to live client and report details when the report is viewed, shared, or exported to PDF. Insert them from the text toolbar; each renders as a chip in the editor and as real text everywhere the report is shown.Available variables:
  • Client Name, Client First Name, Client Website, Client Manager
  • Project Type, Project Name, Date Range
  • Account Name, Report URL
Write one intro paragraph — Here’s the {{Project Name}} update for {{Client Name}} covering {{Date Range}} — and it fills itself in for every client and every period.
New Ahrefs dataviews

Ahrefs — Organic Traffic and Rank Tracker

Two new Ahrefs dataviews are available in the report builder:
  • Organic Traffic — organic keywords, traffic, and traffic value over time
  • Rank Tracker — tracked keyword positions and movement
Existing Ahrefs widgets are unaffected.
New data sources: Moz and Vbout

Two new data sources

  • Moz — domain SEO authority: Domain Authority, Links to Root Domain, Linking Root Domains, Links to Subdomain, Links to Page, and Outbound Links.
  • Vbout — email marketing: Email Campaigns and Campaigns dataviews.
Connect either from the Data Sources tab in a client’s project, the same way as any other platform.
Faster PDF and screenshot rendering

More reliable PDF exports

PDF generation and report screenshots now run on a dedicated rendering service with its own browser pool and memory watchdog, separated from the API. Large reports render more consistently and are less likely to time out under load. No change to how you generate a PDF — pdf_generate and automation attachments work exactly as before.
Connection profile manager

Manage a connection in one place

The data-source connection panel gained a profile manager slide-over. From Settings → Data sources, opening a connection now shows its status, the clients linked to it, and an inline credentials editor — so you can re-authorize or repoint a connection without leaving the page.
Logo restored to emails

Your logo is back on emails

The agency (or client) logo again appears in the header of report and authentication emails, following the same branding source as the rest of the workspace. Emails sent without a configured logo fall back cleanly to the workspace name.
Go High Level — five new dataviews

Go High Level expands beyond Opportunities and Contacts

The Go High Level data source gains five new dataviews, so you can report on far more of a sub-account than deals and contacts:
  • Appointments and Appointments Performance — appointment title, status, start/end time, address, contact, and created/updated dates, plus performance counts for Total Booked, Showed, No-Show, and Cancelled.
  • Forms Performance — form Submissions over time, broken down by form.
  • Email Campaigns and Email Campaigns Performance — per-campaign Opens, Clicks, Delivered, Open Rate, and Click-Through Rate, plus workspace-wide totals for the same.
  • Pipeline SummaryContacts and Total Value by pipeline and stage.
  • Social Planner — scheduled and published posts with Platform, Status, Type, and publish/display dates.
The existing Contacts dataview also picks up Tags and Last Updated as new fields. Existing Go High Level widgets are unaffected.
Instagram — new metrics

New Instagram metrics

The Instagram data source adds several metrics that Meta has surfaced for Reels and cross-posted content:
  • Account performanceReposts.
  • MediaReels Skip Rate, Reposts, Crossposted Views, Facebook Views, and Link Clicks.
These appear alongside the existing Instagram metrics in the report builder; existing widgets are unchanged.
WhatConverts — Lead Source dimension

Break WhatConverts leads down by source

WhatConverts gains a Lead Source dimension, so you can group and chart leads by where they originated — for example splitting a lead-count table or bar chart across Google Ads, organic, direct, and referral traffic. It sits under the Leads dimension group and works with any existing WhatConverts lead metric.
Date selector on mobile in shared reports

Date selector on mobile

Shared reports now show the date-range selector on mobile as an icon button that expands to the full picker — it was previously hidden below the small-screen breakpoint. The picker popover is capped to the viewport and scrolls, so presets and the calendar stay reachable on a phone.
Archive UI fixes

Archive placeholder fixes

Fixed placeholder and empty-state glitches in the Archive view so restoring and deleting archived items reads correctly.
Widget data source types

Widget data source types

The datasource_type field on a widget accepts:DATASOURCE · CALCULATION · CUSTOM_DATA · CUSTOM_IMPORT · GOALS
Deprecated metrics flagged

Deprecated metrics are flagged, not renamed

When a vendor retires a metric, it is now marked with a deprecated flag in the metric catalog rather than having (Deprecated) appended to its name. In the report builder these metrics render in red with an explanatory tooltip, and they remain selectable so existing widgets continue to resolve.The change removes a long-standing annoyance: the old suffix was copied into a widget’s saved metric label at the moment it was picked, so every deprecation round left stale labels behind in saved reports. The flag lives only in the catalog, so it can never go out of date.Applied across Ahrefs, Facebook Pages, Google Analytics 4, Google Ads, Google Business Profile, Google Local Services Ads, Instagram, Instagram Ads, Keywords, Salesforce, Shopify, Twitter Ads, WooCommerce, and YouTube. No metrics were added or removed.
Facebook post reach fixed

Facebook post reach returns data again

Post-level reach was still requesting a field Meta has retired, which returned 0 for every post. It now uses Meta’s current unique-viewers field. Affected widgets recover on their next refresh — no reconfiguration needed.
Preview column sorting & search

Sorting and search fixed for preview columns

Table columns that render a rich preview — ad creatives, social posts — carry a structured value rather than plain text. Sorting and searching those columns compared the underlying object instead of its text, so every row looked identical: sorting did nothing and search matched everything or nothing.These columns now sort and search on the text shown in the cell. Period comparison on the same columns matches rows by the entity’s identifier, so each row is compared against its own previous-period value instead of all rows collapsing onto the first.
Comparison display modes

Choose how comparison data appears

When a comparison period is active, you can now choose what each row or data point shows. A Comparison Display setting under Display offers:
  • Previous Value — the raw figure from the previous period (the default)
  • Percentage Change — the change against the previous period
  • Both — the previous value and the percentage change side by side
Available on tables, line, area, and bar charts. Pie, funnel, map, and scorecard widgets don’t render side-by-side comparisons, so the setting is hidden for them.Over the API, this is the comparison_display field on a widget, accepting previous, change, or both. Widgets without it continue to show the previous value.
Period comparison alignment

Period comparison matches the correct category

Comparison figures now line up with the category they belong to for dimensions such as channel, country, page, and campaign — including on widgets that are sorted or limited to a set number of rows. Date-based comparisons are unaffected.
Per-metric display settings

Metric Settings — rename, format, and set comparison direction

A new Metric Settings panel under Display gives each metric in a widget its own overrides, in a collapsible row per metric:
  • Name — a custom label that replaces the metric’s default name
  • Format — how the value renders (numeric, decimal, percentage, currency, time)
  • Comparison Indicator — whether a rise is good or bad for that metric
The comparison indicator matters for cost-style metrics. On Higher is better (the default) a rise shows green and a fall red. On Lower is better — cost, CPC, bounce rate — the colours swap, so a falling cost reads as a win. Only the colour changes; the arrow and the sign always follow the actual movement.Applies to scorecards and the KPI figures on chart widgets.
Dashboard widget limit enforced on duplicate

Dashboard widget limit applies to duplication

Dashboards are capped at 50 widgets. The cap was enforced when saving widgets but not when duplicating them, so a direct API or MCP call could push a dashboard past the limit. Duplicating beyond the cap now returns:
Reports paginate across pages and remain exempt. In the editor, a slot counter on the dashboard canvas now shows how much room is left, shifting from neutral to amber as the limit approaches and to red once it is reached.
Table search toggle
Table widgets accept a new show_search boolean on create and update, exposed in the builder under Display. It defaults to enabled, so existing widgets are unchanged.
Heading colour in themes

Headings can be coloured independently

Themes gain an optional heading_text token, edited as Headings in the theme editor’s colour section. It controls the colour of title widgets. When unset, headings continue to follow the general text colour, so existing themes render exactly as before.
More MCP tools

New MCP tools

The MCP server now exposes the rest of the workspace to AI agents. New tool groups:
  • Goalsgoals_list, goals_create, goals_update, goals_delete, goals_duplicate
  • Calculated metricscalculated_metrics_list, _create, _update, _delete, _duplicate
  • Custom datacustom_data_list, _get, _create, _update, _delete, _duplicate
  • PDFpdf_generate, pdf_status; Exportsexports_list, exports_delete
  • Emailemail_send, senders / templates / sending-domains CRUD, and email_provider_get/_set
  • API keysapi_keys_list, api_keys_create, api_keys_revoke
  • Notificationsnotifications_list, notifications_unread_count, notifications_mark_read, and more
  • Archivearchive_list, archive_counts, archive_restore
  • Activityactivity_list
  • Billingbilling_get, billing_invoices (read-only; plan changes stay in-app)
Stricter input validation

Enumerated fields are now validated

Request fields with a fixed set of options now reject anything outside that set (a clear 400 instead of silently storing a bad value), and every enumerated field shares one definition across the REST API and the MCP tools so they can’t drift. Highlights:
  • Sort & filter paramssort_by / order on list endpoints, source (all / standard / mine) on templates and assets, and the datasources filter (each id must be a real data source).
  • Automationsfrequency, time_format, and the report date_text preset.
  • Projectstype, orientation, paper_size, branding_source, and auto_refresh_interval_hours (hourly or daily).
  • Goals & calculated metricsoperator, goal_type, and the display format (Numeric / Decimal / Percentage / Currency).
  • Media — upload content_type is restricted to image types.
  • Onboarding & company — client-count band and country (from the country list).
  • Timezones — every timezone field is validated as a real IANA zone.
No changes are needed for existing integrations that already send valid values.
Saved Metrics hidden

Saved Metrics excluded from the public reference

The internal Saved Metrics endpoints are no longer published in the OpenAPI spec (/openapi.json) or the API reference. The endpoints continue to work for existing callers; they’re simply not part of the documented public surface.