Weekly Performance

Developer velocity and ticket metrics by week

2026-W21 Dev Performance — Week 2026-W21
44Total tickets
26Closed
18Moved to QA
10Engineers
🥇
Russell0813
3 closed 3 QA 6
🥈
icarlofer
3 closed 1 QA 4
🥉
ramzell
3 closed 1 QA 4
4
randallegend
0 closed 2 QA 2
5
verdelmediajel
2 closed 0 QA 2
6
danaszova
1 closed 0 QA 1
7
elmobunani21
0 closed 1 QA 1
8
johnjoseph28
0 closed 1 QA 1
9
ZeeLiger
0 closed 1 QA 1
10
martin0x
1 closed 0 QA 1

Dev Performance — Week 2026-W21

Period: 2026-05-16 → 2026-05-23

Generated by DevPerformanceAgent from MediaJel ENGINEERING BOARD (Project #25)

Summary

Engineer Closed Moved to QA Total
unassigned 13 8 21
Russell0813 3 3 6
icarlofer 3 1 4
ramzell 3 1 4
randallegend 0 2 2
verdelmediajel 2 0 2
danaszova 1 0 1
elmobunani21 0 1 1
johnjoseph28 0 1 1
ZeeLiger 0 1 1
martin0x 1 0 1

Highlights

  • Top contributor: unassigned with 21 tickets
  • Total tickets closed: 26
  • Total tickets moved to QA: 18
  • Engineers active this week: 10

Details

unassigned

  • #10645 — Campaign Update (Closed)
  • #11143 — Fix: Stop all Nexxen Ads when deleting AdGroupCreative with multiple medias (Closed)
  • #10642 — [Bug] Verifying Tag Domain triggers other input field errors (Closed)
  • #10447 — [Bug] User gets logged out when moving org with lesser permission (Closed)
  • #10646 — Accurate reporting and pacing calculations (Closed)
  • #11089 — Update Campaign Testing (Closed)
  • #7380 — Fix CPMList upsert error when IDs are null in updateParentOrg (Closed)
  • #11224 — [Bug] A specific tag is redirecting users to white screen (Closed)
  • #2132 — Fix: IO and Package name not updated when campaign name changes (Closed)
  • #11263 — [Bug] White screen occurs after changing user password (Closed)
  • #11265 — [Bug] User unable to logout when no avatar is set (Closed)
  • #11267 — [Bug] Dojo webapp server restarts when someone changes password (Closed)
  • #11268 — Homepage RollUp shows non-zero impressions/revenue for orgs with no live or in-attribution campaigns (Closed)
  • #7033 — Multi-Flight Schedule Support at Campaign Level (Nexxen IO Schedules) (QA)
  • #10627 — [Enhancement] Order Queue > Queued Stage | For Delivery Button (QA)
  • #10754 — Proposal - QAJel (QA)
  • #11175 — Remove Past Month Filter from Campaign Table (QA)
  • #11190 — [Bug] GraphQL AttributionMethodCommerce validation error on campaign transaction upsert (QA)
  • #11241 — Add "Prospecting" Org Type (QA)
  • #11240 — Add "Channel Partner Direct" Org Type (QA)
  • #11307 — Hotfix Tag table issues (QA)

Russell0813

  • #11376 — NexTek, SRS Distribution preview: app crashes after accessing Library (Closed)
  • #11225 — [Bug] Unable to select any location from dropdown (Closed)
  • #11327 — [Bug] No data in creatives when searching from the last pagination (Closed)
  • #11364 — Dashboard Dark Mode (QA)
  • #11341 — [Bug] Error 404 when creating location in Prodstage (QA)
  • #11379 — Deprecated heatmap (QA)

icarlofer

  • #11360 — Paid Search data stops at May 7 on dashboard (Closed)
  • #10864 — Refactor Display Campaign Pipeline to use the Data in Clickhouse (Closed)
  • #11361 — Paid Search dashboard: white screen when accessing empty Paid Search (TypeError reading 'xAxis') (Closed)
  • #11129 — [Enhancement] Clear button should reset the filters without needing to click Apply (QA)

ramzell

  • #11223 — [Bug] Team member and Owner dropdown filter does not display the Selected filters (Closed)
  • #11206 — [Bug] Task History tab shows 0 and only updates upon clicking (Closed)
  • #10006 — PCL | Campaign requester load data on demand (Closed)
  • #11325 — [Bug] Page flickers after clicking task link (QA)

randallegend

  • #11305 — [Bug] Missing start date in Campaign display report (QA)
  • #11129 — [Enhancement] Clear button should reset the filters without needing to click Apply (QA)

verdelmediajel

  • #2194 — 500 Internal Server Error on Verify Data Integrity Results Page — "The Landing - Denver" Dataset (Closed)
  • #2195 — [Widget Development] Connect Button Unresponsive Due to 401 Unauthorized on Initial API Request (Closed)

danaszova

  • #10864 — Refactor Display Campaign Pipeline to use the Data in Clickhouse (Closed)

elmobunani21

  • #7483 — dsp-campaigns-nexxen-prisma6 DAG failure — unhandled 400 from Nexxen Creatives API crashes worker po (QA)

johnjoseph28

  • #7483 — dsp-campaigns-nexxen-prisma6 DAG failure — unhandled 400 from Nexxen Creatives API crashes worker po (QA)

ZeeLiger

  • #10386 — filter out IP addresses of bots DERVICED_CONTEXTS deviceFamily: Spider* (QA)

martin0x

  • #2194 — 500 Internal Server Error on Verify Data Integrity Results Page — "The Landing - Denver" Dataset (Closed)
2026-W20 Dev Performance — 2026-W20
14Total tickets
12Closed
2Moved to QA
9Engineers
🥇
randallegend
2 closed 1 QA 3
🥈
ramzell
3 closed 0 QA 3
🥉
elmobunani21
1 closed 1 QA 2
4
martin0x
1 closed 0 QA 1
5
verdelmediajel
1 closed 0 QA 1
6
ZeeLiger
1 closed 0 QA 1
7
JC-DMZ22
1 closed 0 QA 1
8
Russell0813
1 closed 0 QA 1
9
_(unassigned)_
1 closed 0 QA 1

Dev Performance — 2026-W20

Period: 2026-05-11 → 2026-05-17

Summary

Engineer Closed Moved to QA Total
randallegend 2 1 3
ramzell 3 0 3
elmobunani21 1 1 2
martin0x 1 0 1
verdelmediajel 1 0 1
ZeeLiger 1 0 1
JC-DMZ22 1 0 1
Russell0813 1 0 1
(unassigned) 1 0 1

Highlights

  • randallegend and ramzell tied for the lead with 3 tickets each — randallegend drove fixes across the dashboard and GQL service, while ramzell shipped three enhancements.
  • elmobunani21 advanced both the K8s cluster migration (closed) and the CI/GitOps refactor (moved to QA).
  • #1640 Q4 GOALS: Data Factory Service was a collaborative close shared by four engineers: martin0x, verdelmediajel, ZeeLiger, and JC-DMZ22.
  • 8 issues closed and 3 issues moved to QA across 8 engineers this week.

Details

randallegend

ramzell

elmobunani21

martin0x

verdelmediajel

ZeeLiger

JC-DMZ22

Russell0813

(unassigned)

Achievements

Team wins, milestones, and highlights

Release Notes

Full versioned changelog, newest first

2026-07-15 Latest

Release Notes — 2026-07-15

Release Notes — 2026-07-15

Period: 2026-07-13 → 2026-07-15

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


Hotfixes

For prisma6 client connection error

Introduces connection resiliency for Prisma v6 database operations, automatically retrying failed connections to reduce service disruptions caused by transient database connectivity issues.

AWS SDK on multipart upload

Adds a shared retry mechanism to all S3 multipart upload operations, improving upload reliability when write operations encounter transient network or service failures.

Restore All Lost Pagination Page-Size Selector Functionality

Removes a global CSS rule that was inadvertently hiding the page-size selector on every table throughout the app, restoring users' ability to choose how many rows are displayed per page.

Add 30s timeout/maxWait to campaignReport $transaction

Adds a 30-second timeout to the Prisma interactive transaction in the editorial job, preventing it from hanging indefinitely and eliminating "transaction already closed" (P2028) errors that were causing job failures.

Guard undefined GA4 OAuth account instead of crashing

Adds a null guard in the SEO job so that organizations without a connected GA4 account are skipped gracefully instead of crashing with a destructuring TypeError, fixing nine recurring failed jobs.

Stop 404 retry storm that hit the 1h job timeout

Prevents the scrape-publisher job from endlessly retrying 404 responses that are expected to return no data, stopping the resulting retry storm that was causing the job to hit its one-hour Bull timeout across twenty failed runs.

Gate transaction Impressions/Transactions columns by advertiser level

On the campaign details Transactions tab (V2), the Impressions and Transactions columns on the Publishers and Creatives tables are now shown only when the campaign is at the advertiser level, ensuring these metrics appear only where they are meaningful.

Chunk large S3 report and stop masking the real error

Fixes the editorial-consolidate job crashing with a "string too large" error on oversized reports by splitting the S3 upload into chunks, and surfaces the real underlying error instead of swallowing failures silently as null.

Bump CircleCI Node image to 20.19.0 to fix node-expat native build

Upgrades the CircleCI executor's Node.js image from 20.11.0 to 20.19.0 so that native packages requiring Node ≥20.15 (such as node-gyp@13's undici dependency) compile correctly during CI builds.

Pin global node-gyp@11.5.0 in service Dockerfiles

Pins the global node-gyp installation to version 11.5.0 in service Dockerfiles to prevent the unpinned bun base image from pulling node-gyp@13, which was shadowing the local devDependency and breaking native dependency builds inside containers.


Planned Releases

None in this period.


Generated by ReleaseNotesAgent

2026-07-14

Release Notes — 2026-07-14

Release Notes — 2026-07-14

Period: 2026-07-13 → 2026-07-14

1 PR(s) merged to master across 1 repo(s) — 1 hotfix(es), 0 planned release(s).


Hotfixes

For prisma6 client connection error

Adds automatic retry logic to Prisma v6 database read operations so that transient connection drops (common with idle MySQL/RDS connections) no longer cause jobs to fail. Batch processing is also made more resilient: Bull queue stall thresholds are raised for CPU-bound jobs, and per-campaign error handling now ensures that a single database hiccup does not abort an entire campaign processing run.


Planned Releases

None in this period.


Generated by ReleaseNotesAgent

2026-07-12

Release Notes — 2026-07-12

Release Notes — 2026-07-12

Period: 2026-07-06 → 2026-07-12

2 PR(s) merged to master across 1 repo(s) — 2 hotfix(es), 0 planned release(s).


Hotfixes

Silent errors in advertiser funnel job + Fix for large advertisers

An advertiser funnel silently stopped updating because the job queue reported success even when individual jobs failed, masking a gateway timeout on large advertisers and a database transaction timeout during the final write step. The fix makes failures surface properly, batches and retries the impressions calls for large advertisers, and raises the transaction limits so large report writes can complete.

Include paused campaigns in get-events and consolidate processing

Paused campaigns were being skipped entirely by the event-fetching and report-consolidation jobs (and their newer counterparts), so their data was never picked up while paused. This hotfix adds the paused statuses to the existing filters so paused, in-flight campaigns are processed the same way live campaigns are.


Planned Releases

None in this period.


Generated by ReleaseNotesAgent

2026-06-01

Release Notes — 2026-06-01

Release Notes — 2026-06-01

Period: 2026-06-01 → 2026-06-01

No PRs merged to master in this period.


Hotfixes

None in this period.


Planned Releases

None in this period.


Generated by ReleaseNotesAgent

2026-05-26

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