KATURA
Your browser is not supported. Please update your iPad to the latest iOS version, or visit us on a newer device.
How to update your iPad Skip to main content JOIN THE WORLD OF KATURA Be the first to discover new collections, exclusive events, and the stories behind our legendary creations.
KaturaβCrafting timeless treasures since 1999.
The technology behind Katura is built in-house. K99 is our jewelry business platform β available to other jewelers.
Β© 2026 KATURA. All rights reserved.
πΊπΈ English EN πΊπΈ United States $
Software Updates Β· KATURA | KATURA
Live from GitHub Β· Refreshed continuously
Software Updates Every change we ship to katura1999.com β features, fixes, security patches, the lot. Pulled straight from our private GitHub repository so you can see exactly what was built and when.
By the numbers Lines of code
828,292
Web platform β TypeScript, React, Prisma, CSS
iOS
78,204
Swift + SwiftUI lines
Android
3,117
Kotlin + Jetpack Compose lines
All platforms
909,613
Web + iOS + Android combined (44.5Γ the King James Bible)
Characters written
35.04M
35,041,420 total characters
Updates pushed
1,893
exact commit count on main
Current version
v1.18.93
build 1893 Β· 1c76417
Database models
392
across 47 schema files β most SaaS platforms have 20β50
API endpoints
955
individually routed β Stripe's public API has ~400
Translated strings
82,512
every string, in 24 languages
System permutations
10^287
2^955 endpoint combinations β more than atoms in the observable universe (10^80)
Project age
6mo 15d
since Dec 14, 2025
Pre-AI dev hours
30.3K hrs
909,613 lines Γ· 30 LOC/hr β equivalent to 14.6 years (senior engineer, no AI)
With-AI dev hours
7.6K hrs
4Γ AI productivity multiplier (2024β2026 studies) β equivalent to 948 days
Equivalent firm cost
$7,859,510
live ticker Β· Katura rate: $60 USD/hr
Hours estimated from source line count at 30 LOC/hr (industry benchmark for production-quality TypeScript/React without AI assistance), with a 4Γ multiplier for AI-assisted development per published 2024β2026 enterprise studies. Equivalent Firm Cost uses a $250/hr loaded billable rate reflecting a premium engineering firm building enterprise-grade SaaS β and ticks up live, because the project is still being actively built.
Commit history
1,893 updates pushed Showing page 18 of 40 Β· 851β900 of 2,000 fetched
Wednesday, March 25, 2026 6 updates pushed
4:22 AM Β· ZRosserMcIntosh
Sprint 3a: Shipping zones/rates + Tax settings with Brazil presets ShippingZone, ShippingRate, TaxSetting Prisma models (tenant-scoped) SQL migration for all 3 tables with proper indexes/FKs SaasTenant relations added /api/platform/shipping/zones β GET (list w/ rates) + POST (create) /api/platform/shipping/zones/[id] β GET/PATCH/DELETE /api/platform/shipping/rates β POST (create in zone) /api/platform/shipping/rates/[id] β PATCH/DELETE /api/platform/tax/settings β GET (list) + POST (create rule) /api/platform/tax/settings/[id] β PATCH/DELETE /admin/shipping β Zone management with expandable rate cards /admin/taxes β Tax rules grouped by country, Brazil preset import ICMS rates for all 27 states (2025 legislation, per-state laws cited) PIS/COFINS non-cumulative (1.65% + 7.6% = 9.25%) IPI rates for jewelry NCM codes (gold 5%, silver 5%, watches 10%) ISS municipal tax (2-5% range, LC 116/2003) Simples Nacional Annex I brackets DIFAL calculator for interstate B2C e-commerce (EC 87/2015) One-click import of 32 Brazil tax rules from Receita Federal data 3:35 AM Β· ZRosserMcIntosh
Sprint 2: Important Commerce β draft orders, team management, analytics, customer segments, abandoned carts POST/GET /api/platform/draft-orders β create & list manual/phone orders POST /api/platform/draft-orders/[id]/convert β convert draft to paid order GET /api/platform/team β tenant-scoped team members (owner + SaasTenantMember) POST /api/platform/team β invite by email with graceful table fallback GET /api/platform/analytics β real data aggregation with period comparison GET /api/platform/customers β segment filtering (new/returning/high-value/at-risk) GET /api/platform/abandoned-carts β time-based cart abandonment detection /platform/admin/draft-orders β draft order list with totals /platform/admin/draft-orders/new β full draft order form with product search /platform/admin/abandoned-carts β abandoned cart recovery dashboard Analytics: rewrote with real order data, period-over-period changes, top products Orders: added Draft Order button Sidebar: added Draft Orders + Abandoned Carts nav items 3:25 AM Β· ZRosserMcIntosh
Sprint 1: Core Commerce β product/collection/promotion CRUD + order actions Products: GET (list w/ filters, pagination, search) + POST (plan limits, SKU gen, storefront auto-create, inventory) Products/[id]: GET + PATCH (comprehensive field handling) + DELETE (soft-delete via ARCHIVED) Products/upload: POST multipart to Supabase tenant bucket Collections: GET (w/ product count) + POST (auto-storefront, auto sort order) Collections/[id]: GET + PATCH + DELETE Orders/[id]: GET (full detail) + PATCH (notes/tags) Orders/[id]/fulfill: POST (shipment + status update) Orders/[id]/refund: POST (full/partial refund) Orders/[id]/cancel: POST (restock + refund options) Promotions: GET + POST (6 discount types, code uniqueness, tenant-scoped) Promotions/[id]: GET (w/ usages) + PATCH + DELETE (soft/hard) New Product form (full jewelry fields, images, SEO, inventory, plan limits) Edit Product form (fetches + saves via PATCH, archive button) New Collection form (name, slug, description, visibility, SEO) New Promotion form (6 discount types, schedule, banner, usage limits) OrderActions: Fulfill/Refund/Cancel dialogs with confirmation Product detail: added Edit button Order detail: added OrderActions component Promotions list: real data table with tenantPrisma Update 2:49 AM Β· ZRosserMcIntosh
strip /platform prefix from all internal routes for k99 subdomain All href="/platform/foo" β href="/foo" in platform marketing pages All href="/platform/admin/foo" β href="/admin/foo" in admin pages All redirect("/platform/...") β redirect("/...") in server-side code Onboarding step hrefs stripped of /platform prefix Sidebar & header component links made root-relative Docs content (en/es/pt) links updated Language switcher regex updated for root-relative paths Investor page links changed to absolute k99 URLs Tenant storefront "Edit Site" link uses absolute k99 URL Admin layout redirects non-Katura users to k99 subdomain k99 subdomain: /platform/* β 301 redirect to strip prefix k99 subdomain: /api/* passthrough (no /platform rewrite) k99 subdomain: auth guard for /admin (redirect to /login) Shared admin component comments updated Security 2:14 AM Β· ZRosserMcIntosh
Close critical cross-tenant auth bypass + add k99 subdomain routing Added tenantId !== TENANT_ZERO_ID guard in /admin/layout.tsx SaaS tenant owners can no longer access Katura's store admin Redirects non-Katura users to /platform/admin automatically Post-login session check: verify user belongs to a SaaS tenant If user is tenant_katura (Katura employee), immediately sign out and show error directing them to /employee-login Prevents Katura employees from establishing sessions via platform login Added k99 subdomain rewrite: k99.katura1999.com/* β /platform/* Added middleware-level auth redirect for /admin and /platform/admin when no session cookie is present (defense-in-depth) Added 'k99' to RESERVED_SUBDOMAINS to prevent tenant slug collision Footer 'Explore K99 Platform' now links to https://k99.katura1999.com Footer 'Start Free Trial' links to https://k99.katura1999.com/signup Footer bottom bar 'Platform' β 'K99 Platform' with external URL Platform layout: 'Back to Katura Store' now absolute URL to katura1999.com Platform footer: Company/Legal links now absolute URLs to katura1999.com (prevents k99 middleware from incorrectly rewriting them) 1:52 AM Β· ZRosserMcIntosh
Rename Katura Platform β K99 Platform across all user-facing references Platform marketing pages: all page titles, meta descriptions, i18n (en/es/pt) Platform landing page: removed Antar CAD image, replaced with CSS pipeline visualization Platform i18n: updated headline, badge, descriptions in all 3 languages Marketing i18n: updated platform references Admin components: sidebar, header, context-switcher updated Investor pitch: all 4 references updated Docs page: fallback strings updated Message files: all 24 locales updated (explore, docs hub, seo, changelog) Translation scripts: updated for future runs README: architecture diagram updated with k99.katura1999.com SaaS constants, data-import, openclaw demo data updated Kept 'Katura' for jewelry store brand references (correct) Tuesday, March 24, 2026 1 update pushed
1:14 AM Β· ZRosserMcIntosh
rename Sell Gold & Silver to Buy & Sell Precious Metals, restore Pre-Owned Luxury Timepieces link Updated sellGoldSilver label across all 24 locales Added preOwnedWatches link (/timepiece-sourcing) back to clientCare footer section Updated preOwnedWatches label to include 'Luxury' across all locales Monday, March 23, 2026 9 updates pushed
Feature analytics 9:30 AM Β· ZRosserMcIntosh
complete GA4 + Meta Pixel audit & fixes Wire view_item_list on category, collection, and all-creations pages Wire select_item on product card clicks with list context Wire view_cart on cart page load Wire add_shipping_info on checkout step transition Fix add_to_cart data (product name, price, quantity) Wire remove_from_cart in cart context Add ViewItemListTracker client component Wire trackSearch to search dialog Add structured data (JSON-LD) for About, Contact, Engagement pages Fix OG type on creations/[id] to 'article' Wire trackAddToWishlist to WishlistButton Wire trackSearch (Meta) to SearchDialog alongside GA4 Wire trackLead to ContactForm on successful submission Wire trackLead to both newsletter forms (site-wide + Jewel Vox) Wire trackCompleteRegistration to register form Replace raw window.fbq AddToCart with trackMetaAddToCart utility (now includes content_name, value, currency) Differentiate sign-in pages: customer β 'My Account β Sign In', employee β 'Employee Portal β Sign In', register β 'Create Your Account' New employee-login layout.tsx with noindex/nofollow Fix double-branding in title template Add GOOGLE_ANALYTICS_MEGA_AUDIT.md Add META_PIXEL_MEGA_AUDIT.md (score: 6.1β8.8/10) Update
Sunday, March 22, 2026 1 update pushed
Update analytics 11:27 PM Β· ZRosserMcIntosh
replace all mock data with real DB queries on products page BounceRateChart: now queries ProductView with duration/scroll thresholds grouped by product jewelryType (was hardcoded mock data) DayOfWeekChart: now queries ProductView + Order by ISODOW for real views/sales/revenue per weekday (was hardcoded mock data) ImageEngagementChart: now queries ProductView imagesViewed buckets with buy-click correlation (was hardcoded mock data) /api/admin/analytics/bounce-rate β real bounce rate by category /api/admin/analytics/day-of-week β real views+sales by day of week /api/admin/analytics/image-engagement β real image engagement data product-funnel: removed fake fallbacks, date-filtered ProductView funnel-trends: new daily/hourly trend API product-view-trends: per-product trends with 24h/7d/30d/90d checkout-start: new CHECKOUT_START event tracking ViewsTimeSeriesChart: replaced fabricated data with real API ProductViewTrendsChart: new component with time range selector Friday, March 20, 2026 11 updates pushed
Tests 11:14 PM Β· ZRosserMcIntosh
add 38 checkout validation tests β guards against all 4 production bugs Happy path: US, international, multi-item, gift, promo, all currencies Rejections: empty cart, invalid email, bad quantities, bad country codes Client/server parity: exact payload shapes the checkout page sends Tenant injection: orderItems include tenantId for nested creates Update 10:56 PM Β· ZRosserMcIntosh
checkout 500 β nested OrderItem creates missing tenantId /api/create-payment-intent (web checkout) /api/checkout (Stripe Checkout Session) /api/checkout/payment-intent (mobile PaymentSheet) 10:40 PM Β· ZRosserMcIntosh
expose error message in create-payment-intent for diagnosis Thursday, March 19, 2026 15 updates pushed
Update 11:59 AM Β· ZRosserMcIntosh
Add CSP nonce to Meta Pixel inline script The pixel script was being blocked by the Content-Security-Policy because it lacked the per-request nonce. When a CSP includes a nonce directive, browsers ignore 'unsafe-inline' per the CSP spec. Added nonce={nonce} to the script tag by reading the x-nonce header set by middleware. Update 11:48 AM Β· ZRosserMcIntosh
Use raw script tag for Meta Pixel instead of Next.js Script component The Next.js Script component with strategy=afterInteractive was rendering the pixel code inside a React Server Component JSON payload rather than as a real <script> tag in the HTML <head>. This caused the fbevents.js SDK to never load, leaving window.fbq undefined. Switched to dangerouslySetInnerHTML which outputs a real inline <script> in the initial HTML, allowing the pixel to load synchronously before hydration. Wednesday, March 18, 2026 2 updates pushed
Feature 11:43 PM Β· ZRosserMcIntosh
Meta Pixel complete guide + upgrade SEO with all-caps KATURA in page titles Add comprehensive Meta Pixel implementation guide (500+ lines) Current state audit of pixel infrastructure Step-by-step Meta Business Suite setup All 10 standard events with wiring locations and code snippets 7 custom events to implement Custom conversions configuration Full Conversions API (CAPI) server-side implementation with SHA-256 hashing Product catalog and dynamic ads setup Audience building (11 custom + 5 lookalike audiences) Domain verification and AEM configuration Testing, debugging, and campaign optimization Complete 6-phase implementation checklist Upgrade SEO: Replace all 'Katura' with 'KATURA' in page titles (100+ files) Update siteConfig.name to 'KATURA' (powers global title template) Update all 268 SEO template titles across 24 languages Update PWA manifest name and short_name Update 101+ individual page titles throughout app Preserve 'Katura' in body copy, descriptions, and non-title contexts Feature 8:26 PM Β· ZRosserMcIntosh
project detail enhancements β sales person, editable dates/team, CAD files tab, order linking Tuesday, March 17, 2026 5 updates pushed
Feature 7:31 PM Β· ZRosserMcIntosh
cert PDF upload in Stones tab β parse, auto-fill, store & view New API route: /api/admin/jewelry-projects/:id/stones/upload Accepts PDF FormData, extracts text via pdfjs-dist Parses GIA/IGI/Wise certs β structured JSON Uploads PDF to Supabase Storage (order-attachments/cert-pdfs/) Creates JewelryProjectAsset (CERT_PDF) for PDF viewing Creates JewelryProjectStone with all parsed fields + rawCertJson Recalculates total stone cost, logs activity Enhanced StonesTab in project detail page: Drag-and-drop cert PDF upload zone at top of tab Expandable stone cards with click-to-reveal detail panels Color-coded GradeBadge component for grades (color/clarity/cut/finish) Structured display: measurements, proportions, CAD dimensions Amber-highlighted CAD dimensions card for quick reference Additional info section: girdle, culet, inscription, growth process View PDF button linking to Supabase-stored cert Manual add stone form preserved as fallback Full accessibility: keyboard nav, aria labels, no nested controls Feature 5:26 PM Β· ZRosserMcIntosh
add jewelry projects system β production tracking from concept to completion 8:45 AM Β· ZRosserMcIntosh
ProductView tracking + split marketing into separate URLs Removed broken 'if (prisma.productView)' guard that referenced undefined 'prisma' instead of tenant 'db', silently skipping all writes Added required 'tenantId: TENANT_ZERO_ID' to ProductView create call Fixed Prisma OR queries with undefined values causing match-all Errors now logged via console.error instead of being silently swallowed /admin/stella/marketing β Overview (funnel, trends, engagement, tips) /admin/stella/marketing/traffic β Channel trends, sources, geo, hourly, UTM /admin/stella/marketing/orders β Cart, wishlist, revenue, order tables /admin/stella/marketing/products β Product performance table Shared layout with header, KPI cards, sub-navigation Shared components extracted to _components/shared.tsx Data fetched once in layout, passed via React Context Feature 7:40 AM Β· ZRosserMcIntosh
tabbed marketing dashboard, Recharts charts, channel trend lines, Meta CAPI, loading progress bar Reorganized into 4 tabs: Overview, Traffic, Orders & Revenue, Products Added animated loading progress bar with stage labels (KPIs β Traffic β Orders β Products) Replaced unlabeled bar charts with Recharts BarChart (proper XAxis labels, YAxis, Tooltip) Added Channel Trend Lines (LineChart) showing daily traffic per channel source Color-coded channels: Direct, Google, Instagram, Facebook, LinkedIn, etc. Created src/lib/tracking/meta-capi.ts with SHA-256 hashed PII, _fbp/_fbc cookie parsing Wired AddToCart events into POST /api/cart Wired InitiateCheckout + Purchase into POST /api/create-payment-intent Wired Purchase into Stripe webhook on payment_intent.succeeded Added META_CAPI_ACCESS_TOKEN to env files Added channelTrends query (daily channel breakdown from HeroEvent table) New response field: channelTrends { dates, channels[{ name, data[] }] } Feature analytics 6:58 AM Β· ZRosserMcIntosh
per-channel funnel attribution β traffic source β cart β checkout β purchase Added visitorId + referrerChannel columns to Cart and Order tables Migration: prisma/add-visitor-tracking.sql (already applied to production) New lib: src/lib/referrer-channel.ts β classifies document.referrer into channels (Google, Facebook, Instagram, LinkedIn, Email/Brevo, Direct, etc.) New component: ReferrerCapture β captures first-touch referrer on page load into sessionStorage, mounted in root layout cart-context.tsx: addItem now sends visitorId + referrerChannel to /api/cart checkout/page.tsx: sends visitorId + referrerChannel to /api/create-payment-intent /api/cart: stores visitorId + referrerChannel on Cart creation, backfills existing carts that don't have attribution yet /api/create-payment-intent: stores visitorId + referrerChannel on Order /api/checkout: stores visitorId + referrerChannel on Order Section 8: CHANNEL FUNNELS β queries Cart and Order by referrerChannel, with visitorIdβHeroEvent join fallback for pre-migration carts Returns per-channel: impressions, carts, checkouts, purchases, revenue, conversionRate, cartRate New 'Channel Funnels' card with horizontal funnel bars per channel (impression β add to bag β checkout β purchase) with colored stages Shows revenue and conversion rate badges per channel Warning banner when funnel data hasn't accumulated yet i18n: EN + PT keys for all funnel labels Feature marketing 6:29 AM Β· ZRosserMcIntosh
traffic channel attribution from HeroEvent data API: classify HeroEvent referrers into channels (Google, Facebook, Instagram, LinkedIn, Email/Brevo, Direct, Other Search, etc.) API: period-over-period comparison for each channel + total impressions API: device breakdown from HeroEvent (always available, unlike ProductView) Frontend: new Traffic Channels card with progress bars, change badges, emoji icons per channel, and device breakdown β always visible Frontend: separated Geo into its own card (still gated behind ProductView) i18n: updated EN/PT labels for Traffic Channels section Update 6:19 AM Β· ZRosserMcIntosh
marketing dashboard data integrity + GA-level granularity Website purchases now correctly filtered by source='KATURA_WEBSITE' (was 6, now 2) Website revenue now shows only katura.com orders (was K+, now ) Offline sales (IN_PERSON, PRIVATE_COMMISSION, RESTYLING) shown separately Revenue by source breakdown shows exact attribution per channel Cart Activity tab: per-product breakdown (times added, unique carts, first/last date) Recent Cart Events timeline: individual add-to-cart events with timestamps Wishlist Activity tab: each save with product detail and date Orders & Revenue tab: website orders table, all-sales table, revenue by source Order status badges (PAID, CANCELLED, DELIVERED, etc.) Source labels (Katura Website, In-Person, Private Commission, Restyling) ProductView table has 0 rows β view-dependent sections hidden with banner 'Product view tracking has no data yet' warning explains what will appear Cart, wishlist, and order data shown since it IS being collected Funnel rates show N/A when views unavailable 5:42 AM Β· ZRosserMcIntosh
Stella Marketing hub: i18n (EN/PT), visual upgrades, real analytics New /admin/stella route structure (layout, marketing, media) Conversions API: 10 real-data sections (funnel, traffic, UTM, devices, geo, engagement, hourly, products, wishlist, daily trends) Full i18n: ~100 translation keys for EN + PT via admin-i18n-provider Visual polish: gradient KPI cards, colored funnel bars, medal emojis, hover effects, intensity-based hourly chart Nav renamed to Stella Marketing with expanded keywords Old /admin/media redirects to /admin/stella/media Update 4:30 AM Β· ZRosserMcIntosh
cancel bot orders, block disposable emails, fix inventory display 8 bot orders from johnsmith###@storebotmail.joonix.net holding reservations cleanup-orders cron was NOT scheduled in vercel.json (never ran) Admin page only showed quantity, not quantity-reserved (misleading) Cancelled all 8 bot PENDING orders and released their inventory Released stale reservation on Golden South Seas Pearls (no matching order) src/lib/security/email-validation.ts: blocks 50+ disposable/bot email domains and suspicious patterns (johnsmith###@, testuser###@, etc.) Checkout + create-payment-intent routes now validate emails before creating orders/reserving inventory cleanup-orders now runs hourly (was never scheduled) Bot emails: cancelled after 30 min (was 24h) Normal emails: cancelled after 4h (was 24h) Orders cancelled (not deleted) for audit trail Added to vercel.json cron schedule Products list now shows 'Avail: X (Y held)' in amber when reserved > 0 Product edit form shows reserved inventory warning banner New /api/admin/inventory/audit endpoint (GET=diagnose, POST=fix) Update analytics 12:21 AM Β· ZRosserMcIntosh
use CartItem for add-to-cart tracking, filter Shopify imports Funnel was showing 0 add-to-carts and 0 purchases because: 1. Add to Cart used UserEvent table which only records for SIGNED-IN users. Guest checkout (the common path) was never tracked. β Now uses CartItem.createdAt as primary source (works for all users) β Falls back to UserEvent if it has more data 2. Checkout count included Shopify-imported historical orders (9 total) inflating the number beyond actual Katura site checkouts. β Now filters isShopifyImport=false for checkout counts 3. The 'safe capping' logic was zeroing out checkout/purchase when addToCart was 0 (Math.min(9, 0) = 0). β Removed artificial capping β shows real numbers with warnings 4. Purchase count was 0 despite 2 real orders β likely the orders have PENDING status (Stripe webhook may not have fired). β Added specific warning when orders exist but none are settled Also updated funnel-trends API with same CartItem + Shopify filter fixes. Update 10:18 PM Β· ZRosserMcIntosh
checkout rejects variantId:null β Zod z.string().optional() doesn't accept null Cart items have variantId: string | null. When serialized to JSON, null is sent literally. But z.string().optional() only accepts string | undefined, not null. Changed to z.string().nullable().optional() on all checkout APIs. This was the ACTUAL 'Invalid request data' error β the shippingMethod and giftBalanceAmount fixes from the previous commit were also needed but this null variantId was the primary trigger since most products have no variant. Update 10:03 PM Β· ZRosserMcIntosh
checkout 'Invalid request data' β Zod schema rejects international shipping + string giftBalanceAmount Root cause: Two Zod validation failures in /api/create-payment-intent: 1. shippingMethod: Client sends 'international' for non-US orders but schema only accepted z.enum(['standard', 'express']). Added 'international'. 2. giftBalanceAmount: Client sent as string (customGiftAmount is useState('')) but schema expected z.number(). Added z.union to accept both types with stringβnumber coercion. Also fixed client to send parseFloat(). 3. promoCode: Client sends promoCode but field was missing from schema. Zod strips unknown keys by default so this wasn't the cause, but added it for correctness. Also fixed /api/checkout/route.ts shippingMethod enum for consistency. Update ga4 8:21 AM Β· ZRosserMcIntosh
replace next/script with nonce'd raw script tags Root cause: next/script strategy='afterInteractive' does NOT propagate the CSP nonce to dynamically injected script elements. With strict CSP (nonce-based script-src), the inline gtag config script was silently blocked by the browser. Fix: Switch to raw <script nonce={nonce}> tags with dangerouslySetInnerHTML, matching the proven pattern already used for Meta Pixel. This ensures: 1. External gtag.js loads with nonce (CSP compliant) 2. Inline gtag config executes with nonce (CSP compliant) 3. Both render server-side in the initial HTML (no hydration race condition) Also removes unused next/script import. Update csp 7:08 AM Β· ZRosserMcIntosh
add missing GA4 data collection domains to connect-src https://*.doubleclick.net (stats.g.doubleclick.net/g/collect) https://*.googlesyndication.com (pagead2.googlesyndication.com/ccm/collect) https://*.googleadservices.com (conversion tracking) https://adservice.google.com (ad service endpoint) https://cct.google (new Google tag agent) https://cct.google (cct.google/taggy/agent.js) Update analytics 6:49 AM Β· ZRosserMcIntosh
wire GA4 e-commerce events alongside Meta Pixel across full funnel PROBLEM: GA4 was loading correctly but zero e-commerce events were firing. The tracking functions existed in google-analytics.ts but were never imported or called anywhere. Only Meta Pixel events were wired up. Additionally, PageViewTracker (SPA navigation tracking) was defined but never mounted β GA4 only saw initial page loads, not client-side navigations. Feature i18n 6:33 AM Β· ZRosserMcIntosh
Phase 2 translations β 4,428 keys across 22 languages scripts/count-untranslated.js scripts/section-audit.js scripts/untranslated-keys.json Feature 12:32 AM Β· ZRosserMcIntosh
complete Phase 1 translation overhaul β 4,308 keys across 23 languages Phase 1: 1,657 keys (checkout, footer for 14 red-tier languages) Phase 1B: 532 keys (checkout+footer for da/sv/no/ru) Phase 1C: 1,119 keys (checkout+footer+home for nl/he/hi/hu/pl/tr/th/id/vi/uk) Phase 1D: 1,000 keys (remaining customer-facing: contact, cart, product, wishlist, blog, about, shipping, wholesale, careers) Update 12:04 AM Β· ZRosserMcIntosh
add missing GA4 domains to CSP connect-src and script-src https://analytics.google.com https://*.google-analytics.com (region endpoints like region1.google-analytics.com) https://*.analytics.google.com https://*.googletagmanager.com Update 11:45 AM Β· ZRosserMcIntosh
Meta Pixel console logs now report whether fbq() was actually called or silently dropped 3:16 AM Β· ZRosserMcIntosh
Add comprehensive troubleshooting guide for pixel not firing issue 3:02 AM Β· ZRosserMcIntosh
Add urgent action guide for Vercel Meta Pixel setup 3:02 AM Β· ZRosserMcIntosh
Add Vercel deployment guides for Meta Pixel environment variable 2:26 AM Β· ZRosserMcIntosh
Add diagnostic guides for Meta Pixel firing issue Update 2:24 AM Β· ZRosserMcIntosh
Set real Meta Pixel ID in .env.production - 1263804075100220 2:15 AM Β· ZRosserMcIntosh
π― Add Stella's Complete Verification Package Summary Overview of all 4 testing documents What each document is for and when to use it The 5 critical events to test Quick verification checklist How Stella should use these guides Complete package contents Critical points before launching ads Expected Meta Events Manager display Troubleshooting guidance Next steps for Stella Success metrics to monitor Reading guide for different time constraints 2:14 AM Β· ZRosserMcIntosh
π Add Master Testing Index & Navigation Guide Complete navigation guide for all testing documents Document overview and comparison Quick navigation by scenario (in a hurry, detailed, broken, etc.) The 5 critical events to test Success criteria checklist Testing flow diagram Campaign launch readiness matrix Pro tips and do's/don'ts Support & troubleshooting guide 2:13 AM Β· ZRosserMcIntosh
β
Complete Test Verification Guides for Stella's Campaign Launch Complete 5-part testing framework Pre-flight checklist Step-by-step instructions for each event Real world simulation Troubleshooting guide Final verification summary Issue reporting template One-page quick reference card 5 core tests to run Where to verify results Pass/fail criteria Campaign launch decision matrix Visual mockups of what to expect Console output examples Meta Events Manager display examples Correct vs incorrect outputs Perfect test run example Screenshot checklist 1:27 AM Β· ZRosserMcIntosh
π Add Completion Summary Document What just happened What's working now Impact on your ads & ROI Code changes made (with examples) Testing checklist Next action items Reading guide for all documentation 1:26 AM Β· ZRosserMcIntosh
π Add Meta Pixel Quick Reference Guide Event status overview (5/10 critical events working) How to verify events firing (3 methods) Event funnel visualization Business impact before/after Quick test checklist Technical parameters reference Next priority actions 1:25 AM Β· ZRosserMcIntosh
π Add Meta Pixel Testing & Explanation Guides TEST_PIXEL_EVENTS.md: Step-by-step guide to verify events are firing How to use Meta Pixel Helper What to expect for each event How to access Meta Events Manager Troubleshooting tips PIXEL_CHANGES_EXPLAINED.md: Before/after code explanation Shows exactly what changed in each file Explains what each event does Shows the complete event funnel Lists next priority events to wire 1:24 AM Β· ZRosserMcIntosh
π― Wire Meta Pixel Purchase & InitiateCheckout Events Add Purchase event tracking to checkout success page Fires when order loads with all order details Tracks: content_ids, num_items, value, currency Enables ROAS calculation and sales optimization Add InitiateCheckout event tracking to checkout page Fires when user enters checkout with cart items Tracks: cart items, quantity, subtotal, currency Enables funnel analysis and checkout optimization What's currently firing (PageView, ViewContent, AddToCart) What's missing (Purchase, Lead, InitiateCheckout) How to verify in Meta Events Manager Action items by priority
Added salesPersonId field to JewelryProject model + User back-reference
Updated GET route to include salesPerson, PATCH to accept salesPersonId
Rewrote OverviewTab: staff selectors for all team roles, inline date editors, budget inputs, order search/link/unlink
Added CAD Files tab with drag-drop upload, version tracking, file type icons, delete support
Created /api/admin/jewelry-projects/[id]/cad-files route (POST upload, DELETE)
Created /api/admin/jewelry-projects/[id]/order-links route (POST link, DELETE unlink)
Order search integration with existing /api/admin/orders endpoint
Prisma schema: 13 models + 8 enums for JewelryProject lifecycle
SQL migration applied: all tables, counters, enums, indexes, FKs
User + SaasTenant relations for all jewelry project models
Tenant scoping: 13 models registered in TENANT_SCOPED_MODELS
Admin nav: Gem icon + Projects link + New Project quick action
i18n: English + Portuguese translations for projects nav
API routes (7): list/create, detail/update/archive, notes, stones, casting quotes, labor items, vendors β all with activity logging
Admin pages (3): list (stats/filters/mobile+desktop), new (5-section form), detail (7-tab: overview/notes/stones/casting/labor/vendors/activity)
Auto-generated project numbers: PRJ-YYYY-XXXX via atomic counter
Profitability tracking: stone/material/labor costs vs target/actual price
Stone cost + labor cost auto-recalculation on item add
DecimalβNumber serialization for all monetary fields
Full accessibility: aria-labels on all form inputs/selects Update 3:14 AM Β· ZRosserMcIntosh
cert parser Vercel 500 β preload pdfjs worker + polyfill DOMMatrix/Path2D Root cause: pdfjs-dist in Node.js mode does `await import('./pdf.worker.mjs')` which fails on Vercel because the bundler doesn't include the worker file. Fix: statically import the worker module and set it on `globalThis.pdfjsWorker` so pdfjs-dist finds WorkerMessageHandler via its #mainThreadWorkerMessageHandler check and never attempts the dynamic import. Also polyfill DOMMatrix and Path2D which are browser-only globals that pdfjs-dist references internally. Update 2:12 AM Β· ZRosserMcIntosh
cert parser 500 on Vercel β polyfill DOMMatrix/Path2D + add Wise cert support Polyfill DOMMatrix and Path2D globals for Vercel serverless (Node.js env lacks these browser APIs that pdfjs-dist references internally) Add Wise certificate parser: detectLab(), parseWise(), parseProportionsWise() Wise-specific fields: growth process, country of origin, inscription Update main dispatcher to route Wise certs through new parser Update 1:50 AM Β· ZRosserMcIntosh
cert parser 500 on Vercel β switch from pdf-parse to pdfjs-dist Replace pdf-parse (requires worker file at filesystem path) with pdfjs-dist/legacy/build/pdf.mjs (runs in main thread, no worker needed) Eliminates the GlobalWorkerOptions.workerSrc error on Vercel Remove pdf-parse dependency, add pdfjs-dist as direct dependency Add pdfjs-dist to serverExternalPackages in next.config.ts Tested with both IGI and GIA certificate PDFs