Commit Graph
332 Commits
Author SHA1 Message Date
Christian Vidal WolfandClaude Opus 4.6 5dfcdd71c0 fix(parser): prevent regex collision where /sale/i matched ACOS column instead of attributed sales
The generic regex /sale/i in ads column detection was matching "Advertising Cost
of Sales" (the ACOS % column) before reaching "7 day total sales" (the actual
attributed sales amount). This caused attributedSales30d to receive the ACOS
percentage instead of the real sales value, making experiment ACOS = 0 or 100%.

- Replace /sale/i with specific regexes: /\d+\s*day.*sale/i, /total\s+sale/i, etc.
- Replace /cost/i with regexes that exclude "cost of sales" columns
- Replace /unit/i with specific regexes for unit columns
- Add diagnostic logging for ads Excel column headers and first-row values
- Revert ACOS 100% fallback (root cause now fixed)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 16:54:56 +01:00
Christian Vidal WolfandClaude Opus 4.6 8b774ae7ba fix(experiments): prevent NaN propagation and ACOS zero-value bug in experiment analysis
- Change ?? to || for salesAds/units/revenue in weekly aggregation to guard against NaN
- Add || 0 fallback to ads-only records in mergeSalesAndAdsData
- Fix parseCurrency to check isNaN on all EU-format return paths
- Handle ACOS edge case: cost > 0 with adRevenue = 0 now returns 100% instead of 0%
- Add diagnostic console logging to computeDiD for data flow tracing

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 16:34:55 +01:00
Christian Vidal Wolf de1af7e0db fix(experiment): patch ASIN matching bug where trailing whitespaces from excel files dropped matching records from analysis leading to zeroed metrics 2026-02-25 16:16:47 +01:00
Christian Vidal Wolf 79641b793a fix(parser): implement regex matching for headers to catch prefixed metric titles like '7 day total sales' 2026-02-25 14:56:15 +01:00
Christian Vidal Wolf 13dd4b62c2 fix(parser): add alphanumeric sanitizer to excel header mapping to support characters like % and parenthesis 2026-02-25 14:22:58 +01:00
Christian Vidal WolfandClaude Opus 4.6 487b8e105e feat: bulk ASIN selection via space-separated paste in filters
Allow pasting multiple ASINs separated by spaces in any MultiSelectDropdown
search field and pressing Enter to auto-select all matching options.
Also switch ads CSV/Excel parsing to header-based column mapping for
robustness across different file formats.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 14:01:11 +01:00
Christian Vidal Wolf 69eafe8335 fix(experiments): explicitly use ad revenue (salesAds) for true ACOS and ROAS calculations instead of total sales revenue 2026-02-25 13:52:57 +01:00
Christian Vidal Wolf 30466a94ff fix(experiments): mathematically correctly aggregate ratios like ACOS and ROAS before averaging 2026-02-25 13:44:59 +01:00
Christian Vidal Wolf b39831c417 fix(experiments): change weekly boundaries to start on Sunday instead of ISO Monday 2026-02-25 13:35:10 +01:00
Christian Vidal Wolf 0fb312d537 fix(experiments): resolve bug that included adjacent week when experiment ended on midnight boundary 2026-02-25 13:32:39 +01:00
Christian Vidal Wolf 719390a5d5 refactor(experiments): change metric average calculation to strict weekly dividing rather than day fractions 2026-02-25 13:15:44 +01:00
Christian Vidal Wolf 6e94a32a47 fix(experiments): include full 24h of end_date in DiD overlap bounds 2026-02-25 13:10:00 +01:00
Christian Vidal Wolf be829c938e fix(experiments): allow decimals in formatMetricValue to show exact weekly averages 2026-02-25 13:03:45 +01:00
Christian Vidal Wolf 8ed073ff6e fix(experiments): use exact fractional proportions for overlapping weeks in DiD calculation 2026-02-25 12:59:03 +01:00
Christian Vidal Wolf 1edfd97ed1 feat(ui): exclude #N/D and Unassigned from product line filter options 2026-02-25 12:47:07 +01:00
Christian Vidal Wolf dc4db269ee feat(ui): exclude N/D from product line filter options 2026-02-25 12:44:51 +01:00
Christian Vidal Wolf aa745b4d5e feat(data): map product line from column R 2026-02-25 12:38:58 +01:00
Christian Vidal Wolf ce2241a5ec feat(data): update sell-out parser mapping and validation for new structure 2026-02-25 11:46:02 +01:00
Christian Vidal Wolf 27d4268aff feat(experiments): add edit experiment functionality 2026-02-25 09:26:58 +01:00
Christian Vidal Wolf 4de9fb5b89 fix(experiments): include overlapping weeks in date range logic and use exact ISO weeks 2026-02-25 08:39:13 +01:00
Christian Vidal WolfandClaude Opus 4.6 eba6628325 fix: apply dark theme to all form inputs in Experiments create view
Replace undefined input-field CSS class with explicit Tailwind dark theme
classes (bg-slate-800, border-slate-700, text-slate-200) to prevent white
background on form fields.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 08:25:46 +01:00
Christian Vidal Wolf 4935112a55 feat: enable custom baseline periods for Experiments to solve seasonality 2026-02-23 18:34:04 +01:00
Christian Vidal Wolf 69f4456942 feat: force ASIN and SKU columns in Grid exports 2026-02-23 18:18:02 +01:00
Christian Vidal WolfandClaude Opus 4.6 24df5935cc feat: rebuild Experiments tab with Difference-in-Differences analysis and Bayesian verdicts
Replace the basic CRUD experiment tracker with a scientifically rigorous A/B testing system:

- Add DiD analysis engine (services/experimentAnalysis.ts) that computes treatment vs control
  group comparisons across 7 metrics (units, sessions, CVR, CTR, ROAS, revenue, ACOS)
- Implement Bayesian verdict system (Winner/Loser/Inconclusive) using posterior probability
  with normal CDF approximation (Abramowitz & Stegun erf, no external deps)
- Build counterfactual time series for trend charts (actual vs estimated without change)
- Rewrite ExperimentsView as single component with 3 inline sub-views (list, detail, create)
  replacing the previous modal-based ExperimentDetail and ExperimentForm
- Add control group support, change annotations (before→after diffs), and SEO experiment type
- New types: ExperimentChangeAnnotation, DiDMetricResult, DifferenceInDifferencesResult,
  ExperimentVerdict
- Simplify App.tsx by removing experiment modal state (5 useState hooks eliminated)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 15:42:40 +01:00
Christian Vidal Wolf 7ee33671cc feat: add explicit period date ranges and absolute metric differences to experiment summary 2026-02-21 23:05:10 +01:00
Christian Vidal Wolf 09cfc1e6a8 feat: inject unfiltered ad data into experiments & deploy comprehensive KPI summary view 2026-02-21 22:56:37 +01:00
Christian Vidal Wolf 99d524db12 fix: adapt experiment calculation engine to consume both CombinedKPIs and SalesRecord data structures 2026-02-21 22:51:38 +01:00
Christian Vidal Wolf 411448e4d2 fix: resolve NaN algorithm corruption causing empty experiment calculations on save 2026-02-21 22:31:28 +01:00
Christian Vidal Wolf 58cc863748 chore: enable verbose error logging on experiment calculations to reveal silent production errors 2026-02-21 21:56:35 +01:00
Christian Vidal Wolf 9259129f95 fix: add safe generic fallback to date parsers to prevent parse errors 2026-02-21 19:44:18 +01:00
Christian Vidal Wolf aa9a7845b7 fix: resolve UTC date matching and implement per-product ASIN breakdown table for Line experiments 2026-02-21 19:37:07 +01:00
Christian Vidal Wolf 8bd78c2e7f chore: trigger vercel deployment for LINE experiments fix 2026-02-21 19:29:55 +01:00
Christian Vidal Wolf 249dc0c749 fix: resolve LINE level experiments to individual ASINs using salesData so calculation works for product lines 2026-02-21 19:26:45 +01:00
Christian Vidal Wolf c2d516dbfc docs: add new metric columns to supabase migration instructions 2026-02-21 18:08:41 +01:00
Christian Vidal Wolf e44f9b30b3 fix: account for null numeric values from supabase in metric cards to uncrash detail view 2026-02-21 18:05:04 +01:00
Christian Vidal Wolf a6135862c2 fix: resolve primary_metric toUpperCase crash on legacy experiment detail 2026-02-21 17:59:46 +01:00
Christian Vidal Wolf 1a56015f63 fix: resolve asins.map crash in experiment detail for legacy records 2026-02-21 17:56:38 +01:00
Christian Vidal Wolf 4dc4353885 fix: prevent crash on legacy experiments missing ASIN arrays 2026-02-21 17:52:04 +01:00
Christian Vidal Wolf 6319648996 fix: allow calculating results for non-completed experiments 2026-02-21 17:47:03 +01:00
Christian Vidal Wolf d78a88afe1 feat: complete experiments tab analytics optimization with modular kpis and sparklines 2026-02-21 15:31:02 +01:00
Christian Vidal Wolf 67e93f6653 feat: implement experiment tracking in Weekly Sales Grid 2026-02-21 15:14:22 +01:00
Christian Vidal Wolf b2598f4c49 fix: sanitize experiment form data to prevent save failure on empty dates 2026-02-21 11:25:39 +01:00
Christian Vidal Wolf b1346183c9 ui: fix modal z-index conflict in Experiments tab 2026-02-21 11:19:43 +01:00
Christian Vidal WolfandQwen-Coder 8d05173b40 Fix Supabase LockManager timeout error
- Disable auth persistence in Supabase client
- Set autoRefreshToken: false, persistSession: false
- Prevents 'Acquiring an exclusive Navigator LockManager lock' timeout
- Applied to both services/supabase.ts and api/experiments.ts

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-02-21 09:29:22 +01:00
Christian Vidal WolfandQwen-Coder d535004a29 Optimize app loading and fix product lines in experiments
Performance improvements:
- Fetch traffic, stock, vendor stock, buybox, and experiments data in parallel using Promise.all
- Reduces initial loading time significantly
- Non-blocking background fetches after sales data loads

Bug fixes:
- Pass availableLines from App.tsx to ExperimentForm as prop
- Remove localStorage dependency for product lines
- Product lines now correctly populated from rawData

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-02-21 09:25:15 +01:00
Christian Vidal WolfandQwen-Coder 5efc2d519e Fix duplicate handleAddAsin function
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-02-21 09:15:16 +01:00
Christian Vidal WolfandQwen-Coder 46d87127c8 Add product line targeting for experiments
- Add option to target entire product line instead of specific ASINs
- Support pasting multiple ASINs separated by spaces OR commas
- Add ASIN format validation (9-10 alphanumeric characters)
- Load available product lines from cached sales data
- Add handleCreateExperimentForLine function in App.tsx
- Update ExperimentForm with target type selector (ASIN vs Line)

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-02-21 00:40:30 +01:00
Christian Vidal WolfandQwen-Coder 9736a3d591 Improve experiment form UI - make it more compact
- Reduced modal max-width and padding
- Changed from buttons to select dropdowns for Type/Marketplace
- Smaller text sizes and spacing throughout
- Shorter placeholder texts
- More compact ASIN tags with max-height scroll
- Reduced textarea rows
- Smaller button labels

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-02-21 00:31:26 +01:00
Christian Vidal WolfandQwen-Coder aebebecf1b Fix Vercel function limit - remove unused API endpoints
- Removed fetch-forecast.ts (not used)
- Removed fetch-vendor-stock.ts (not used)
- Removed migrate-experiments.ts (manual SQL migration is sufficient)
- Kept 10 essential API functions (limit is 12 on Hobby plan)

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-02-21 00:25:04 +01:00
Christian Vidal WolfandQwen-Coder edbde19f3a Fix Supabase credentials error - use API routes
- Create /api/experiments endpoint for server-side Supabase access
- Update experiments service to use fetch instead of direct Supabase client
- Fixes 'Supabase credentials not configured' error in browser

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-02-21 00:21:57 +01:00