Release Notes

Full versioned changelog, newest first

2026-05-26 Latest

Release Notes — 2026-05-26

Release Notes — 2026-05-26

Period (hotfixes): 2026-05-25 → 2026-05-26
Planned Releases: All changes in production-stage not yet on master


Planned Releases

mediajel-dashboard

#11107: Restore campaign cadence reprocess button

Restores the Cadence Reprocess feature to the Campaign Admin Tools modal, allowing admins to reprocess campaigns in configurable day-batches (1–30). Adds a dedicated "Reprocess by Cadence" card alongside the existing standard reprocess option.

#11114: Add Tailwind CSS and modern UI library foundation

Introduces Tailwind CSS, PostCSS, and supporting animation libraries as a foundation for building faster, more maintainable interfaces alongside the existing Ant Design library. No existing functionality is changed.

#11118: Standardize all dates to UTC

Centralizes all date and time display to UTC by updating the useTimezone hook, eliminating inconsistencies where different views showed different dates for the same campaign.

#11125: Fix adding historical task to a new project

Fixes a backend rejection when users attempt to link an existing task to a project via the Task Form, allowing tasks with a cleared assignee field to be saved successfully.

#11126: Search tickets by comments and descriptions

Adds the ability to search tasks by their comments and descriptions in addition to titles, with the user's name as a fallback search parameter.

#11140: Upgrade React from version 16 to 18

Upgrades React from 16.14.0 to 18.3.1 with legacy root compatibility, migrating the app entry point to createRoot and updating the test infrastructure accordingly.

#11142: Hide revenue and ROAS for non-ecomm campaigns

Hides Revenue and ROAS metric cards on the Campaign Summary and Home Rollup pages when a campaign has no transaction data (awareness-only or signups-only campaigns).

#11150: Fix Google OAuth modal state when already signed in

Corrects the Google OAuth modal so it reflects the correct signed-in state, preventing it from prompting users to authenticate again when they already have an active Google connection.

#11152: Add edit button to task details panel

Adds an edit button directly in the task details view, allowing users to edit a task without leaving the detail panel.

#11157: Revert uuid dependency upgrade

Reverts the uuid package from version 14.0.0 back to 3.4.0 due to compatibility issues introduced by the major version bump.

#11168: shadcn/ui design system integration

Establishes a modern dual-stack UI foundation by integrating the shadcn/ui design system alongside the existing Ant Design v4 codebase. All new features should be built using this modern stack; no existing functionality is changed.

#11169: Fix Following and Collaborating task filters being hidden

Fixes a bug where the Following and Collaborating filters were not visible in certain task views, restoring correct task filtering across the My Tasks and All Tasks pages.

#11179: Tags activity improvements with page URL breakdown

Enhances the Tags Activity section with a per-URL activity breakdown, providing more detailed insight into tag engagement across pages.

#11180: Filter clear buttons apply immediately without a second click

Improves the Status and Type filter clear buttons in the Campaigns view so clicking Clear immediately resets and applies the filter without requiring a separate Apply click.

#11191: Add Ad Provider IDs column to Campaigns and Pacing exports

Adds an "Ad Provider IDs" column to both the Campaigns table and the Overview Pacing tab exports, aggregating and deduplicating DSP advertiser IDs from all child campaigns per order.

#11208: Fix intermittent SSO and manual login failures

Fixes two separate login failure modes: SSO token URL parsing that truncated base64 padding characters, and empty token values in localStorage causing Buffer errors during manual login.

#11217: Source pacing modal data from backend pacing JSON

Refactors the Campaigns pacing modal and the Home Display Pacing tab to read from the backend-supplied pacing JSON array (today/yesterday/all-time entries) rather than recomputing values on the client.

#11220: Fix Percentage pricing validation and date comparison errors

Fixes two campaign requestor validation bugs: CPM validation is now skipped for Percentage pricing campaigns where CPM fields are hidden, and date comparison logic is corrected to prevent false blocking error states.

#11230: Restore UTC timezone standardization (missed dojo deploy)

Re-applies the UTC timezone fix from #11118 after it was not propagated to the dojo environment during a prior sync.

#11231: Restore hide revenue/ROAS feature (overwritten in dojo)

Re-applies the revenue/ROAS visibility feature from #11142 after it was overwritten during a dojo environment sync.

#11245: Add rate limit warning and auto-reconnect to campaign launch modal

Adds user-facing rate limit warning alerts and automatic websocket reconnection to the Campaign Launch Progress modal, preventing silent failures when Nexxen API rate limits are hit.

#11254: Manual link and unlink for DSP advertiser IDs

Adds the ability to manually link or unlink an existing DSP advertiser ID to an organization without going through the standard Nexxen verification flow, accepting freeform input as a pragmatic interim solution.

#11256: Fix filters resetting when updating a task in the flyout panel

Fixes applied filters being cleared when a user adds a comment or makes an update to a task in the flyout panel, preserving filter state across task interactions.

#11257: Inline editing for project lists

Enables inline editing for project list items, allowing users to rename or update list entries directly without opening a separate edit dialog.

#11264: Disable all-time date filter in campaign view

Removes the all-time date filter toggle from the campaign data view, which was causing data inconsistencies and confusion when comparing campaign performance across different date ranges.

#11273: Add channel partner org levels to task channel partner dropdown

Expands the channel partner dropdown in task management to include organizations at the CHANNEL_PARTNER_DIRECT, CORE, and ENTERPRISE org levels.

#11284: Fix content area layout and spacing in Tasks view

Corrects SCSS styling for the content area in the Tasks view to address layout and spacing issues.

#11285: Fix status tag display in Tasks view

Corrects SCSS styling for status tags in the Tasks view to address visual display issues with the tag component.

#11300: Fix campaign edit modal reappearing after being closed

Fixes a bug where the campaign edit confirmation modal would reappear after the user dismissed it, requiring a page refresh to proceed.

#11304: Fix user creation form field values not submitting correctly

Ensures all form field values (including phone number) are passed directly from the user creation form to the API call instead of relying on component state, and hides the timezone field pending a proper refactor.

#11331: Fix task-to-project modal not closing after confirmation

Fixes a bug where the modal for adding a task with an existing assignee to a project would not close after the user confirmed the assignee conversion, leaving the UI unresponsive.

#11343: Fix Task History tab showing 0 on first load

Re-applies a fix where the task History tab incorrectly showed 0 items on the first visit and only updated after being clicked, after the original fix was not propagated to staging.


mediajel-gql-service

#7264: Nexxen Clickhouse integration

Integrates Nexxen display campaign data processing through the Clickhouse-backed microservice pipeline, enabling Nexxen campaigns to run through the standard display campaign processing and reporting flow.

#7306: Fix transaction creatives drift

Fixes a data drift issue in transaction creatives where cumulative source data was not being rebuilt correctly during reprocessing, causing mismatched transaction counts between reports.

#7316: Add v1/v2 schema awareness to cadence reprocess job

Updates the cadence reprocess job to differentiate between Prisma v1 and v2 schemas, restoring the ability to trigger cadence reprocess from the Campaign Admin Tools modal.

#7335: Hide revenue and ROAS fields for non-ecomm campaigns

Adds the hasEcommerceAttribution flag to the GraphQL campaign response, enabling the frontend to conditionally hide Revenue and ROAS metrics for awareness-only campaigns.

#7340: Harden GraphQL authentication and rate limiting security

Fixes the isAuthenticated middleware to actually validate tokens, adds JWT algorithm constraints to prevent algorithm confusion attacks, and prevents error information leaks through GraphQL Shield.

#7343: Fix Nexxen number parsing

Corrects number parsing for Nexxen data fields to prevent incorrect metric values in reports caused by type coercion issues.

#7344: Fix Google OAuth modal state when already signed in

Updates GraphQL schema and resolvers to return the correct signed-in state for the Google OAuth integration, supporting the frontend modal fix.

#7359: Restore missing publisher images in transaction reports

Adds a mechanism to detect and recover campaigns with missing publisher images in transaction reports, with a targeted rebuild flag for selective restoration.

#7362: Tags activity improvements with page URL breakdown

Extends the GraphQL layer with resolvers and types to support the per-URL page activity breakdown for the Tags Activity feature.

#7367: Migrate CI deployment to GitOps workflow

Replaces the imperative kops/helm deployment process with a GitOps-based CI pipeline for more reliable, auditable, and automated deployments.

#7389: Fix missing schema in dojo environment

Adds the missing schema definitions required for the dojo environment to function correctly after a schema divergence between environments.

#7395: Switch Nexxen cost metric to advertiser_invoice

Updates all Nexxen chart endpoints to use advertiser_invoice instead of actual_spend as the cost metric, aligning reporting with the correct billing field across all chart types.

#7396: Pacing improvements: IO schedules, timezone fixes, and new metrics

Overhauls Nexxen pacing to use IO-level schedules instead of line item details, corrects schedule date timezone parsing to America/New_York, and adds new pacing metrics.

#7399: Add missing DSP tracking fields to Prisma v1 Media schema

Adds dspCreativeId and dspAdId fields to the Prisma v1 Media schema, fixing a TypeScript compilation error caused by these fields being present in Prisma v6 but absent from the legacy schema.

#7406: Add rate limit metadata fields to campaign launch schema

Adds isRateLimited, rateLimitDelay, and rateLimitRemainingDaily fields to the CampaignLaunchProgressMetadata GraphQL type, enabling the frontend to display user-friendly rate limit warnings during campaign launch.

#7430: GraphQL schema regeneration and cleanup

Regenerates the GraphQL schema to remove stale type definitions and ensure consistency across the codebase.

#7448: Restore accidentally dropped publisher exports in transactions query

Restores three symbols (prunePublishersForReport, mergePublishers, PersistedPublisher) that were accidentally dropped from the transactions query file during a merge conflict resolution.

#7459: Fix orphan rows and partial publisher transaction upsert

Fixes two issues in the transaction report consolidation flow: unique constraint violations caused by stale orphan rows from prior runs, and publisher undercounts caused by partial upserts not preserving all publisher records.

#7460: Fix Bull queue clearing in multi-pod deployments

Updates the queue clearing logic to remove only completed and failed jobs rather than obliterating the entire queue, preventing in-flight work from being lost in multi-pod deployments and adding a lock to prevent race conditions.


amplication-nestjs-microservices

#1913: Nexxen Clickhouse integration

Implements the Nexxen Clickhouse data pipeline in the microservices layer, enabling Nexxen campaign data to flow through the Clickhouse-backed reporting infrastructure.

#2030: Google Ads paid search adapter

Adds a Google Ads paid-search data source adapter to the data-factory service, ingesting keyword and asset daily campaign metrics into ClickHouse via a ReplacingMergeTree-backed schema with self-service Google OAuth authentication.

#2083: Include email in Google OAuth return

Updates the Google OAuth flow to include the user's email address in the returned data, enabling downstream services to identify and link Google accounts by email.

#2093: Tags activity improvements with page URL breakdown

Extends the microservices layer to support the per-URL page activity breakdown for the Tags Activity feature.

#2096: Auto-register built-in automation workflows on startup

Adds an AutomationSeedService that registers two built-in workflows (Cognito User Sync and Knowledge Base Refresh) on application startup, and fixes schedule creation validation errors and schedule list loading issues.

#2098: Upgrade kops to 1.33.2

Upgrades the kops Kubernetes Operations tool to version 1.33.2 for improved cluster management and compatibility.

#2106: Add environment variables for external service

Adds missing environment variable configuration required for the external service to function correctly in the deployment environment.

#2116: Rename actual_spend to advertiser_invoice in customer analytics

Renames the actual_spend metric to advertiser_invoice across the customer analytics feature to align with the renamed ClickHouse column, updating interfaces, the allowlist, the SQL projection, and Swagger documentation.

#2118: Update EFS and access point for new VPC network

Updates Elastic File System (EFS) and access point configuration to use the new VPC network, ensuring correct storage connectivity in the updated infrastructure.

#2121: Fix Percentage pricing package creation for multi-flight campaigns

Fixes createPackage failures for Percentage pricing campaigns with multiple flight schedules by using the campaignDurations array and applying the same date normalization logic used by createInsertionOrder.

#2128: Add rate limit status tracking to campaign launch progress

Adds rate limit detection to the campaign launch progress service, extracting constants and interfaces to a shared types file and enriching progress metadata with rate limit fields for frontend display.

#2150: Schema update for Nexxen Clickhouse integration

Updates the database schema to support new data structures required by the Nexxen Clickhouse integration.

#2157: Migrate dojo environment to GitOps deployment

Migrates the dojo environment deployment to a GitOps workflow, replacing manual deployment steps with automated pipeline-driven deployments.

#2236: Fix missing googleAdsAdapter argument in DataIngestionConsumer spec

Fixes a TypeScript compilation error in the DataIngestionConsumer test spec where the googleAdsAdapter constructor argument was missing, causing all subsequent constructor arguments to be misaligned and CI to fail.


Hotfixes (2026-05-25 → 2026-05-26)

mediajel-dashboard — #11402: Fix intermittent trouble logging in

Resolved an intermittent login failure caused by corrupted AWS Amplify device-key data left in browser storage from incomplete previous sessions (idle timeouts, tab closes, or failed logins). The authentication layer now detects partial device-key sets and triggers a clean re-registration instead of crashing, and a failed sign-out no longer leaves users stuck on a loading spinner.

mediajel-gql-service — #7525: Fix campaign order details

Updated the campaign order query and transformation logic to include related advertiser and shared organization data in the output. Each campaign order now surfaces its associated advertiser and organization details, and each campaign carries a campaignOrderId for clearer linkage to its parent order.


Generated by ReleaseNotesAgent

2026-05-23

Release Notes — 2026-05-23

Release Notes — 2026-05-23

Period: 2026-05-18 → 2026-05-23

29 PR(s) merged to master across 3 repo(s) — 19 hotfix(es), 10 planned release(s).


Hotfixes

Campaign Approval for PCL

Restored campaign approval functionality for PCL by uncommenting the approval handler call that had been disabled, unblocking the PCL approval flow.

Remove Statara Partitions job

Removed the Statara Partitions scheduled job from the Helm configuration to clean up deprecated infrastructure that was no longer needed.

Add new internal service env to production

Added a missing environment variable for a new internal service to the production Helm configuration so the service can start correctly in the production environment.

Add type field to all campaign order report queries for Demo Campaign

Added the missing type field to all campaign order report GraphQL queries, fixing Demo Campaign report data loading.

Fix Demo Campaign

Updated the campaign order query resolver to fix an issue preventing Demo Campaign data from loading correctly.

Remove Audience Type dropdown from Demograph reach panel

Removed the Audience Type dropdown from the Demograph reach panel because it was functionally cosmetic — none of the underlying GraphQL mutations accept or return an audienceType field — and caused contradictory UI state when toggled. The reach gauge now always reflects the device count, matching the persisted reachCount and the 10,000-device submission guard.

Removed Salesforce Rate-Limit

Removed Salesforce API rate-limiting logic to resolve throttling issues that were causing Salesforce requests to fail under load.

Salesforce Additional Fields in PCL

Added optional Salesforce fields (LeadSource, Serviced_Account__c, RecordTypeId, Deal_Signatory__c, Cpm__c) to the GQL schema for the PCL opportunity creation flow, forwarding them to Salesforce without breaking existing callers.

Fix reprocess button not process on cluster

Fixed the campaign reprocess button failing to trigger processing in the cluster environment.

For reprocess button remove the prisma1 query

Simplified the campaign tools reprocess workflow by removing all logic for the legacy getLogs job, focusing the processor on display campaigns, events, and consolidated S3 reports only.

Added Salesforce Fields and CPM

Rewired the Create Salesforce Opportunity flow on Campaign Requestor to properly resolve Channel-Partner account IDs, calculate CPM-based line item pricing, add a configurable Months input, and format the opportunity name from the campaign form. Also added a "Skip PandaDoc" toggle on the Campaign Order Queue approval modal and surfaced the Salesforce Opportunity link in the review summary.

Salesforce Additional Fields in PCL (re-apply + new fields)

Re-applied the previously reverted Salesforce additional fields change and extended it with additional PCL flow fields (Deal_Signatory__c, Contract_Type__c, Number_of_months__c, ServiceDate, Service_End_Datee__c, Cpm__c). All additions are optional so existing callers are unaffected.

Removed Console Log

Removed leftover console log statements from the codebase.

Fix page flickers after clicking task link

Added defensive coding to eliminate page flickers when navigating to task links or refreshing task detail pages.

Prevent 401 on first load of Widget Dev page

Fixed widget manager components on the Widget Development page firing API calls before a bearer token was available, producing silent 401 errors on every page load. Gated all queries on token presence, invalidate cached queries immediately after Connect, and surface auth failures as a Radix Toast notification.

Unblock Ingest button for fixed-template adapters

Unblocked the Ingest button for Jane, Shopify, and Dutchie datasets, which were always triggering a spurious "column mapping required" warning because their schemas are backend-dictated and cannot have column mappings configured. Also fixed a backend bug where a failed manual ingestion against a scheduled config would silently kill the scheduled-job chain for non-Nexxen adapters.

Pin Google Maps API to v3.64 to restore HeatmapLayer

Five dashboard pages were crashing with a white screen after Google silently removed HeatmapLayer from Maps JS API v3.65, which the shared loader was picking up via its weekly version channel. Pinned the loader to v3.64 to restore all five affected heatmap pages while a migration to deck.gl is planned.

Fix publish pipeline - address out-of-memory, resume from remaining chunk to be upload

Hardened the Statara/Nexxen publish pipeline to handle 6+ GB audience files without crashing: fixed storage leaks on failed attempts, added a Redis-backed resume-from-checkpoint mechanism that survives pod restarts, scoped temp-file sweeps per job to prevent cross-replica file deletion races, persisted Nexxen taxonomy IDs across retries to avoid duplicate taxonomies, added cooperative-cancel endpoints for operators, and hardened the SFTP pool with a stall watchdog and unhealthy-connection recycling.

Restructure task management route to avoid flickering

The entire Task Management section was flickering on page refresh because the /tasks route was recreated on every render, causing React Router to repeatedly remount the component tree. Stabilized the route reference with useCallback keyed on currentUser, and also standardized loading spinners and browser tab title updates across Task Details and Project Details.


Planned Releases

Add sync modes across data-factory v1 + v2 UIs with adapter-managed defaults

Added per-dataset Sync Mode (Full Refresh / Incremental) and Write Mode (Append, Overwrite, Append+Dedup, Overwrite+Dedup) configuration to both the Data Factory v1 and v2 UIs. Adapter-managed defaults handle primary keys, cursor columns, and dedup strategy automatically so users only make the two decisions that matter. Also added a column-mapping warning before ingestion fires on unmapped datasets, and ClickHouse data wipe on dataset deletion.

Campaign Requestor Enhancements and Line Item Management

Added bulk line item management with AI-powered column mapping, bulk targeting type and audience tabs, Campaign Deal IDs bulk-apply, Nexxen segment list API integration, and individual line item save functionality to the Campaign Requestor.

Nexxen Integration Fixes and Data Factory Cleanup

Reverted unsupported includeSegmentId Nexxen API changes (Nexxen only supports behavioralSegmentSetId and retargetingSegmentId), fixed insertion-order DTO types, removed data factory sync mode configuration added in error, cleaned up ClickHouse destination defaults, and added a repair-statara-partitions job template.

NexxenCredentialForwardFix

Stopped forwarding Nexxen credentials (clientId, clientSecret, nexxenApiUrl) from the data factory service to external-service, where they were being unnecessarily exposed.

Revert "[HOTFIX] Salesforce Additional Fields in PCL"

Reverted the initial Salesforce Additional Fields in PCL change after issues were discovered post-merge; a corrected version was re-applied in a subsequent PR.

Multiple Transactions Fix

Fixed the campaign transaction table showing duplicate entries by filtering out parent-campaign-level transactions, ensuring only the correct transaction records are displayed.

Guard xAxis access when Google data is empty

Fixed a white-screen crash on the Paid Search (Google) module for accounts with no data by adding null and undefined guards around xAxis and byDate property accesses, and covered the empty-data paths with enzyme tests.

Fix Paid Search Missing Dates

Fixed five compounding bugs that had frozen paid search reporting at 2026-05-07: stale unique-key conflicts preventing new date rows from saving, campaigns without an end date pulling 14 years of data and timing out, a missing null guard causing crashes on empty API responses, a chunk slice off-by-one dropping one record per thousand, and concat(false) polluting the consolidated date array. All fixes applied across both the Prisma v1 and Prisma 6 job paths.

Stop ingestion scheduler infinite loop

Fixed two interacting bugs in DataIngestionConsumer that caused scheduled ingestion jobs to re-arm every few milliseconds instead of waiting for the configured interval, hammering external DSP APIs with production credentials. The safety-net now checks all active job states, and zero-delay values are clamped to a full sync-frequency interval so a cron-style schedule never fires immediately.

Fix paid-search-prisma6 crashes: empty campaigns and Decimal aggregation

Fixed two production bugs in the paid-search-prisma6 job: campaigns that belonged to a different org's summary were no longer reconnected during update, causing a crash when dereferencing the result array; and Prisma 6's Decimal return type was being string-concatenated instead of numerically summed, producing malformed channel total values that failed Prisma's own decimal validation.


Generated by ReleaseNotesAgent