Skip to main content

What’s New in v2.278.9

This is a feature-rich release with major additions, user experience improvements, and platform stability enhancements. We’ve shipped birthday-triggered reward distribution, direct widget deep linking, and fixed critical UI behaviors across mobile and desktop platforms.

πŸŽ‚ Birthday Rewards: Celebrate Member Milestones

What’s New:
  • Birthday configuration dashboard β€” Admins define birthday reward amounts (points/coins), eligibility rules (tenure, tier), and distribution timing (day-of or advance notice)
  • Automatic birthday detection β€” System tracks member birthdays from signup profiles and securely issues rewards without manual intervention
  • Scheduled distribution β€” Birthdays are queued as rewards events, respecting timezone settings, with full audit trails and completion tracking
  • Recipient controls β€” Members can opt in/out of birthday rewards; admins see distribution status and can retry failed deliveries
  • Shopify integration β€” Birthday config is synced to Shopify admin, allowing merchants to manage birthday rewards from their store without leaving their workflow
Who Benefits:
  • Community managers β€” Celebrate members with automatic birthday gifts; deepens engagement and retention
  • Platform admins β€” Birthday rewards are fully configurable per community, with timezone support and compliance logging
  • Enterprise customers β€” Birthday reward distribution integrates with existing referral reward system; no breaking changes

πŸ”— Widget Deep Linking: Direct to Where Users Want to Go

What’s New:
  • Direct page routing β€” Links like /embed?page=ways-to-earn or /embed?page=account jump users directly to that section instead of the dashboard home
  • Consistent initialization β€” Deep links work whether the widget is loading for the first time or already cached; full async state handling
  • Campaign & email integration β€” Link directly to your rewards catalog from marketing emails, loyalty program CTAs, or in-store signage
  • Performance boost β€” Loyalty hub now pre-fetches critical sections in parallel, reducing perceived load time by ~30-40%
  • Cross-domain support β€” Deep links work when embedding the widget on multiple subdomains or partner sites
Who Benefits:
  • Merchants β€” Drive traffic directly to specific loyalty sections (redeem rewards, view ways to earn) from marketing campaigns
  • End users β€” Seamless experience clicking links and landing exactly where emails promised
  • Performance-conscious deployments β€” 30-40% faster initial hub load through optimized data fetching

πŸ“± Mobile & Desktop Experience Refinements

What’s Better:
  • Mobile sign-in drawer stays put β€” When users open the keyboard to sign in on mobile, the sign-in drawer no longer expands, covering the input field
  • Search & input focus locked β€” Admin search fields and text inputs no longer lose focus when users type; no more re-opening dropdowns mid-keystroke
  • Challenge creation modal fixed β€” The β€œchoose creation method” modal now appears reliably when starting a new challenge (was intermittently skipped)
  • Admin upload UI polished β€” Challenge image upload section no longer has visual overflow or gap issues; icons and buttons align properly
  • Game responsiveness β€” Catch game falling items now scale correctly on all screen sizes (was breaking on mobile)
Who Benefits:
  • Mobile users β€” Smoother sign-in and challenge participation flows
  • Community managers β€” Admin dashboard feels more responsive; no focus-loss frustration when searching or filtering
  • Game players β€” Mobile games render correctly without layout shifts

Detailed Changes

Birthday Rewards Management:
  • Birthday rewards card β€” New community settings tab to configure birthday reward amounts, eligibility rules, and distribution timing
  • Birthday-triggered distribution β€” Automated queue-based processing; system securely issues rewards on member birthdays
  • Timezone-aware scheduling β€” Birthday rewards respect organization timezone settings; no manual timezone management needed
  • Distribution audit trail β€” View sent, pending, and failed birthday reward deliveries per member
  • Retry mechanism β€” One-click retry for failed birthday distributions; track completion status in real-time
  • Shopify sync β€” Birthday config automatically syncs to Shopify admin for merchant visibility and control
UI & Admin Panel Fixes:
  • Search & filter stability β€” Text inputs no longer lose focus during typing; admin search works smoothly without re-opening dropdowns
  • Challenge creation flow β€” β€œChoose creation method” modal now appears reliably; no more skipped steps
  • Upload UI polish β€” Challenge image upload section renders correctly; icon overflow and gap issues resolved
  • Game config accuracy β€” Game text search matches saved values, not defaults; game previews show actual error messages
  • Admin load optimization β€” Parallel data fetching on dashboard; 50-100ms faster page loads
Birthday & Reward Features:
  • Birthday gifts await β€” Members receive surprise birthday rewards automatically; opt-in/opt-out controls available in account settings
  • Direct widget navigation β€” Loyalty widget now supports deep links to specific pages (rewards, ways to earn, account) from emails or menus
Mobile & Game Experience:
  • Mobile sign-in works smoothly β€” Sign-in drawer stays in place when opening the keyboard; easier to enter credentials on mobile
  • Responsive game play β€” Catch game and other interactive games now render correctly on all screen sizes; no layout shifts or clipped content
  • Smooth admin workflows β€” Faster page loads and responsive interactions across dashboard, challenges, and user management

Technical Details

Birthday Reward Distribution System

Architecture: Multi-layer distributed system with async queue processing, timezone handling, and idempotent delivery guarantees. Components:
  • Birthday Config Service (packages/services/birthday-reward) β€” Manages configuration, validation, and state transitions
  • Birthday Write-back Handler β€” Idempotent helper ensuring single-pass delivery even with retries
  • Distribution Queue β€” Async queue (QueueNameEnum.BirthdayRewardTrigger) for scheduled birthday processing
  • Admin tRPC Endpoints β€” update-birthday-config, assign-birthday-distribution, get-birthday-config, sync-birthday-cron
  • Shopify Integration β€” api.birthday-config route syncs config to Shopify admin; api.quick-actions-save updated to handle birthday rewards
Key Features:
  • Timezone support β€” Birthday rewards issued at midnight in the organization’s configured timezone
  • Eligibility rules β€” Configurable tenure thresholds and member tier filters
  • Audit trail β€” Full logging of distribution attempts, retries, and completions
  • Compliance β€” GDPR-compliant birthday data handling; members can delete or opt out
Tests:
  • 427+ unit tests covering distribution logic, config validation, edge cases (leap years, timezone transitions)
  • 438+ integration tests for tRPC endpoints and API workflows

Widget Deep Linking & Loyalty Hub Performance

Changes:
  • Deep link parameter parsing β€” Embed script now accepts page query param; routes to specific sections
  • Loyalty hub pre-fetching β€” Parallel data loading for account, ways-to-earn, and rewards sections; ~30-40% faster perceived load time
  • Async state handling β€” Deep links work whether widget is initializing or already cached; graceful fallback to home on invalid pages
  • Cross-domain support β€” Deep links work with multiple widget instances on different subdomains
  • Embed script enhancement β€” Updated nudj-loyalty-account.js and nudj-ways-to-earn.js to support deep link resolution

Mobile & UI Stability Fixes

Mobile Sign-in Drawer (NUDJ-5522):
  • Removed keyboard event listener that was expanding drawer height
  • Fixed height now respects viewport constraints
  • Sign-in flow no longer interrupted by keyboard repositioning
Search & Input Focus (NUDJ-5490):
  • Root cause: Form state reset on every keystroke triggering re-render
  • Fix: Memoized input component with stable callbacks
  • Impact: Dropdowns stay open, focus preserved during multi-character searches
Challenge Creation Modal (NUDJ-5495):
  • Modal trigger state now derived from existing game config data
  • Prevents modal from being skipped in creation flow
  • Proper state synchronization between form steps
Admin Upload UI (NUDJ-5494):
  • Fixed CSS overflow on challenge image upload section
  • Added missing gaps between icon and label
  • Proper alignment of button and preview components
Game Responsiveness (NUDJ-5360):
  • Catch game falling items now scale relative to viewport width/height
  • Removed hardcoded pixel values; added responsive calculations
  • Mobile, tablet, and desktop all render correctly

Database & Infrastructure Improvements

GDPR Compliance (NUDJ-5222):
  • gdpr_requests migration now idempotent; safe to re-run without side effects
  • Sparse unique index fixed; respects shard key requirements
  • Full compliance audit in docs/analysis/birthday-reward-feature-analysis.md
Notification Logs Index (NUDJ-5503):
  • notification_logs unique index now includes shard key prefix (location, organisationId)
  • Proper MongoDB sharding compliance; no more sparse index issues
Platform Config Cache (NUDJ-5512):
  • Cache invalidation now triggered on pipeline domain updates
  • Prevents stale config from being served after DNS changes
Parquet Export (NUDJ-5476):
  • organisations collection now included in daily parquet drop export
  • Better data warehouse alignment for reporting and analytics

Logging & Observability Overhaul

Logging Architecture (NUDJ-5468):
  • Replaced Pino logger with Logtail across all Node.js services
  • Standardized logger argument order: log.info("message", { context }) everywhere
  • Auto-trace correlation: all logs tagged with trace_id / span_id from active OTel span
  • Shopify app structured logging now wired to BetterStack (NUDJ-5482)
Observability Benefits:
  • Unified log sink across API, admin, user, MCP, and Shopify apps
  • Request-scoped trace context automatically attached to all logs
  • Better debugging: follow request β†’ see all logs from that request across layers
  • Zero configuration: works automatically once OTel span is active

Platform Stability & Build Improvements

User App Build Optimization (NUDJ-0000):
  • Migrated to next build --turbo for faster production builds
  • Removed obsolete check-build-config rule; functionality now in Turbopack
  • ~30% faster CI build times
Code Quality Improvements (NUDJ-5460):
  • Resolved all Biome lint warnings in admin and MCP packages
  • Better type safety; no more suppressions or workarounds
API Resilience (NUDJ-5462):
  • Guard added for undefined action.hints in participation validation
  • Prevents crashes when action validation encounters malformed hints
Game Config State (NUDJ-0000):
  • Repeatability toggle state now derived from existing game config data
  • Prevents silent data loss when editing game repeatability settings

Playwright & Testing

  • Bumped @playwright/test to ^1.59.1 with latest browser engines
  • Better mobile device emulation; improved E2E test reliability

Breaking Changes

None in this release.

Migration Guide

No migration required. Update and restart your services.
# Standard deployment
vercel deploy

# Or if using Docker
docker pull nudj:v2.278.9
docker run nudj:v2.278.9
For Birthday Rewards: If you’re upgrading a production environment, the migration script (20260323141256-backfill_birthday_config.ts) runs automatically. It initializes empty birthday config for existing communities (no rewards issued until you configure them in the admin panel).

Contributors

This release was built by:

Release Stats

MetricValue
Total Commits26
Lines Added+38,596
Lines Removed-12,615
Files Changed1,093
Apps Modified5 (User App, API, Admin, Games, MCP Server)
Packages Modified5 (Database, API Client, Design System, Models, Services)

Questions? Reach out to support@nudj.co or check the Nudj Docs.