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.
Are You a Jewelry Business? E-commerce, CRM, marketing, payroll, analytics, and AI β everything you need to run a modern jewelry business, all in one platform.
Β© 2026 KATURA. All rights reserved.
πΊπΈ English EN πΊπΈ USD $
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
751,820
across the entire repo (equivalent to 37.0 King James Bibles)
Characters written
29.13M
29,126,188 total characters
Updates pushed
1,573
exact commit count on main
Current version
v1.15.73
build 1573 Β· 6d58963
Database models
366
across 47 schema files β most SaaS platforms have 20β50
API endpoints
854
individually routed β Stripe's public API has ~400
Translated strings
79,872
every string, in 24 languages
System permutations
10^257
2^854 endpoint combinations β more than atoms in the observable universe (10^80)
Project age
4mo 29d
since Dec 14, 2025
Pre-AI dev hours
25.1K hrs
751,820 lines Γ· 30 LOC/hr β equivalent to 12.0 years (senior engineer, no AI)
With-AI dev hours
6.3K hrs
4Γ AI productivity multiplier (2024β2026 studies) β equivalent to 783 days
Equivalent firm cost
$6,479,092
live ticker Β· $60/hr ongoing
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,573 updates pushed Showing page 11 of 33 Β· 501β550 of 1,643 fetched
Friday, March 20, 2026 3 updates pushed
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 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 Monday, March 16, 2026 3 updates pushed
Feature 9:00 PM Β· ZRosserMcIntosh
switch metal prices from metals-api to Google Finance scraping Scrape COMEX/NYMEX continuous futures (GCW00, SIW00, PLW00, PAW00) No API key required β free, zero cost Uses cheerio to extract data-last-price attribute from Google Finance 4 extraction methods with graceful fallback chain Rhodium stays as OTC manual reference (not exchange-traded) 5-min cache to avoid excessive requests Updated fallback prices to current March 2026 market levels Source badge: LIVE / PARTIAL / FALLBACK Added source attribution in casting page UI Feature 8:47 PM Β· ZRosserMcIntosh
Vercel-compatible cert parser (pdf-parse v2) + casting calculator Port diamond cert parser from Python/PyMuPDF to TypeScript (src/lib/cert-parser.ts) Rewrite cert-parse API to use pdf-parse v2 class API with worker config No Python dependency β works on Vercel serverless Add /developer/casting page: wax-to-metal weight & cost calculator Add /api/developer/metal-prices endpoint (metals-api.com + fallback) 7 wax types, 15 metals (all gold karats, Pt, Pd, Ag, Rh) Live spot prices with 10-min cache, graceful fallback
Sunday, March 15, 2026 2 updates pushed
Update 7:55 AM Β· ZRosserMcIntosh
sales rep assignment + product search in order dialogs 1. CreateOrderDialog: Add shouldFilter={false} to both Command components (customer search + product search). The cmdk library's built-in filter was re-filtering API results client-side, hiding valid matches. 2. EditOrderDialog: Add Sales Rep and Order Source fields. Previously these were only available on the orders list page, not when editing an individual order from its detail page. 3. Order detail API: Include salesRepId in the GET response so the edit dialog can pre-populate the current sales rep. 4. Users API: Allow EMPLOYEE role to list team members (read-only) so sales rep dropdowns work for all admin roles, not just OWNER/MANAGER. Update 4:50 AM Β· ZRosserMcIntosh
product search returns no results when creating/editing orders Wrap API response in { products: [...] } to match client expectations Include product variants in search results (needed by order item selector) Update hero-tab and variants page to handle the new response shape (with backwards-compatible fallback for safety)
Saturday, March 14, 2026 1 update pushed
Refactor 3:22 AM Β· ZRosserMcIntosh
rename 'watch' to 'timepiece' across storefront, API, admin, and translations Rename /watch-sourcing β /timepiece-sourcing (page route + API route) Rename /api/admin/watch-requests β /api/admin/timepiece-requests Rename watch-brands.ts β timepiece-brands.ts (exports: TIMEPIECE_BRANDS, TimepieceBrand, etc.) Rename components/watches β components/timepieces (TimepieceRequestForm, TimepieceBrandCarousel) Update all user-facing text: titles, descriptions, SEO metadata, JSON-LD, email templates, FAQ Update en.json translations (watchSourcing β 'Timepiece Sourcing', preOwnedWatches β 'Pre-Owned Timepieces') Update developer page entry text and href Update rate-limit keys Remove high-jewelry and watch-sourcing from footer (previous commit) Friday, March 13, 2026 1 update pushed
Update 6:10 AM Β· ZRosserMcIntosh
order success endpoint returning 500 on invalid order ID The /api/orders/success/[orderId] route was crashing with a 500 when given an invalid ID format (e.g. 'nonexistent'). Prisma throws on findUnique with malformed IDs. Wrapped the query in a try/catch to return 404 instead of 500 for invalid IDs. Thursday, March 12, 2026 3 updates pushed
Update 8:09 PM Β· ZRosserMcIntosh
analytics fetch error, reduce cron frequency, add all admin routes to health monitor appointment-reminders: hourly β every 2h health-check: every 15min β every 2h synthetic-tests: hourly β every 2h hero-aggregation: hourly β every 2h shipstation-sync: every 15min β every 2h abandoned-carts: every 30min β every 2h job-queue: every 5min β every 2h Daily/weekly/monthly jobs unchanged Analytics, Orders, Customers, Products, Collections Marketing, Wholesale, Team, Careers Treasury, Payroll, Cap Table, Business Planning Settings, Developer, Tasks, Operations SaaS/Platform admin pages All expect 200 or auth redirect (302/303/307) as healthy Update 7:50 PM Β· ZRosserMcIntosh
order creation Prisma tenant error + add source/salesRep to new order form Fix 'Argument tenant is missing' error by adding tenantId to nested creates (OrderItem, Payment, AuditLog all need explicit tenantId in nested creates since tenantPrisma middleware only intercepts top-level model operations) Add source selector to new order form (Website, In Person, Private Commission, Restyling, Other) Add sales rep dropdown to new order form (fetches team members from /api/admin/users) Tuesday, March 10, 2026 10 updates pushed
Update 11:01 PM Β· ZRosserMcIntosh
resolve 4 false-positive synthetic test failures Wholesale Templates: add 401/403 to expected statuses (auth-gated route) Nivoda Diamonds/Stats, Stuller Products: getPlatformAdminContext() uses redirect() which throws in API catch blocks β 500. Accept as valid auth rejection since unauthenticated probes can't reach these tenant-scoped routes. The routes themselves are healthy. Protected route tests: accept 405 (method not allowed) and handle platform route 500s from redirect-based auth as passing Feature 9:18 PM Β· ZRosserMcIntosh
comprehensive synthetic tests for ALL critical routes + SaaS platform Cart DELETE/PATCH handlers Gift card purchase, redeem, balance Product detail + variants (fetches real product ID) Order list, order success page Wishlist POST Auth register/forgot-password POST Shipping calculate POST Search query, exchange rates, loyalty Merchant feed JSON Signup API POST validation Onboarding API Billing: main, checkout, portal, invoices Tenant management Feature flags, themes Website builder + pages Domains API Stripe Connect: onboard, payments Monday, March 9, 2026 2 updates pushed
Feature admin 11:00 PM Β· ZRosserMcIntosh
editable inventory quantity on product edit page Replace read-only stock display with number input + Update button Calls existing POST /api/admin/inventory (set-level action) Shows one-of-a-kind hint when isOneOfOne is true Add Package icon to Inventory card header Trunk Show Specials Brevo email HTML (march-2026) Remove Ancient Roman Glass bracelet from email 4:36 AM Β· ZRosserMcIntosh
watch sourcing: 6x3 mosaic hero with 16 watch images, full-color carousel Replace single-image hero with 6Γ3 mosaic grid matching homepage collage layout Center 2 columns reserved for 'FIND YOUR TIMEPIECE' hero text 16 surrounding tiles with curated luxury watch images (Rolex, Patek, AP, etc.) Tiles use 88% sizing with hover-expand effect matching homepage pattern Brand carousel logos now display in full color (removed grayscale filter) All 16 watch images added to /public/images/watches/ Sunday, March 8, 2026 3 updates pushed
Security 11:40 PM Β· ZRosserMcIntosh
remove home address, SEO optimization, UI refinements URGENT: Remove 14113 Laurel Haven address from all files (security) Replace SHIPPING_ADDRESS with SHIPPING_INFO (address provided upon acceptance) Update FAQ, email template, client page shipping section Remove address from SEO structured data and documentation Remove 'Sell Gold & Silver' from footer Shop column (keep in Client Care only) Remove redundant brand grid section from watch sourcing page Redesign watch sourcing hero to match Katura site aesthetic (full-bleed image) Add Jaeger-LeCoultre and Chopard to watch brand carousel (logos + models) Add rich JSON-LD structured data (Service + FAQPage) to both pages Add Twitter cards, keywords, richer OpenGraph metadata Add generateStaticParams for static generation Clean up unused imports (Link, WATCH_BRANDS, Locale, SHIPPING_ADDRESS) Update 10:35 PM Β· ZRosserMcIntosh
remove deprecated onFID from web-vitals (replaced by onINP in v4+) FID (First Input Delay) was removed from the web-vitals library in v4. INP (Interaction to Next Paint) is already registered as its replacement. Fixes build failure: 'Export onFID doesn't exist in target module' 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 369a2ef
Feature 8:07 PM Β· ZRosserMcIntosh
diamond certificate parser + /developer/dimensions page Python script (scripts/cert-parser/parse_certificate.py) extracts stone details from GIA and IGI diamond grading report PDFs using PyMuPDF Extracts: shape, carat, color, clarity, cut, measurements, proportions (depth%, table%, crown/pavilion angles), finish grades, girdle, culet, inscription, growth process, diamond type, comments Calculates CAD-ready setting dimensions (setting diameter, table width, crown height) for Antar API route at /api/developer/cert-parse accepts PDF upload, runs parser New /developer/dimensions page with drag-and-drop upload, beautiful results display with grade badges, CAD dimensions section, JSON export Added Dimensions to developer experiments list 6e47002
Auto-calculate commission on order creation when salesRepId is provided
Fix productId to allow null for custom items in POST handler Update 12:26 AM Β· ZRosserMcIntosh
assign salesperson, add private commission + restyling source, mobile optimize orders page Fix assign salesperson: replaced prisma.$queryRaw with tenant-scoped db.user.findUnique for commission rate lookup Add RESTYLING order source (pink badge, Gem icon) for jewelry restyling jobs Add Private Commission toggle on mobile cards and desktop dropdown Add updateOrderSource function for inline source toggling Fully mobile-optimized order cards with source badge, sales rep assignment, 3-col data grid Add In Person, Private Commission, Restyling to source filter dropdowns (desktop + mobile) Expand API source filter to support in_person, private_commission, restyling Add Restyling to order detail page source badge, edit dropdown, and display Add sourceRestyling to i18n provider (EN + PT) Update docs-content source documentation table
Support tickets
Storage usage
Enterprise: SSO, white-label
Billing + Connect webhooks (reject unsigned)
Tenant API v1: products, orders, customers
API keys, webhooks management, imports
Nivoda: diamonds, stats
Stuller: products
Abandoned carts, Brevo sync, ShipStation sync
Daily tasks, order cleanup, domain verification, job queue Update 6:24 PM Β· ZRosserMcIntosh
health monitoring overhaul β critical alerting, cart POST test, email routing WHY THE CART OUTAGE WAS MISSED: 1. No POST /api/cart test β only GET was tested (returns empty cart 200) 2. Alert emails went to team@katura1999.com (no inbox) 3. Alert dedup too aggressive (30min window silenced repeat failures) 4. Bespoke Inquiry & Engagement Design tests sent JSON to formData routes β false 500s Update 6:02 PM Β· ZRosserMcIntosh
cart API β move db to module scope so helper functions can access it The getOrCreateCart() and mergeGuestCart() functions were defined at module scope but referenced 'db' which was only declared inside each route handler (GET, POST, DELETE). At runtime, db was undefined when these helpers ran, causing 'Failed to add item to cart' errors. Fix: declare tenantPrisma client at module level so all handlers and helpers share the same db instance. Type db as any to avoid Prisma $extends type mismatches (tenantPrisma auto-injects tenantId at runtime). 5:47 PM Β· ZRosserMcIntosh
Allow FEED_URL env var override in merchant feed validator 5:43 PM Β· ZRosserMcIntosh
Fix Google Merchant feed for Merchant Center submission Filter out base64-encoded images (2 products had data: URIs instead of real URLs) URL-encode slugs with spaces (Peruvian Opal product had broken link) Exclude priceOnRequest and non-NORMAL purchaseMode products (Google requires real prices) Skip products with no valid image (Google requires image_link) Skip products with zero/negative price Auto-generate fallback description for products with none Add validation script: scripts/validate-merchant-feed.ts 5:56 AM Β· ZRosserMcIntosh
Add one-time script: set inventory=1 for Ships Immediately products Already executed against production DB (37 products: 25 created, 12 already correct). Kept for audit trail. 5:30 AM Β· ZRosserMcIntosh
Enforce stock requirement for Ships Immediately products New shared helper: src/lib/inventory/stock-check.ts Single source of truth: isShipsImmediately(), canPurchase(), purchaseBlockReason() Cart API: Block adding ships-immediately products with 0 stock Checkout (3 routes): Block checkout for ships-immediately with no inventory Product detail page: Show 'Out of Stock' + disable Add to Bag button Google Merchant feed: Mark ships-immediately/no-stock as out_of_stock Atelier/made-to-order products remain always purchasable regardless of stock 4:11 AM Β· ZRosserMcIntosh
Restore full description textarea on admin product edit & new pages Update admin 12:04 AM Β· ZRosserMcIntosh
inventory update now writes to correct table (InventoryItem) New PUT /api/admin/products/[id]/inventory route that directly upserts the InventoryItem row via Prisma (findFirst + update/create) Handles both existing rows and products with no inventory item yet Form now calls the correct product-specific endpoint Feature 10:32 PM Β· ZRosserMcIntosh
add precious metals gold & silver redemption page, form, CRM tab & APIs Add /precious-metals page with SEO-optimized metadata + JSON-LD schema Metal redemption form: gold (all karatages) & silver bullion only Digitized gold redemption PDF: terms/agreement, ID upload, item photos Business logic: price re-verification thresholds (gold $100/oz, silver $15/oz) 30-min response window, 10% Katura commission, ACH 3-4 week payout API routes: public submit, image upload (ID + items), admin CRUD MetalRedemption Prisma model + SQL migration (8 status stages) CRM 'Metals' tab with status management, pricing display Footer links: Sell Gold & Silver (shop + client care) Rate limit entries for metal-redemption and metal-upload Silver restriction: bullion only (no jewelry, hollowware, flatware) Customer + internal Brevo email notifications with full details How-it-works, price protection explainer, shipping info, FAQ sections