Commit Graph
100 Commits
Author SHA1 Message Date
Unchained 9ab07ab01d feat: implement centralized taxonomy for programmatic SEO
- Create taxonomy system with oils.json (5 oils) and concerns.json (9 concerns)
- Migrate 10 content files to new data/content/oil-for-concern/ structure
- Add scripts: generate-urls.js, validate-taxonomy.js, migrate-content.js
- Update dataLoader.ts to use centralized taxonomy
- Generate 40 URLs (10 pairs × 4 languages)
- Create sitemap-programmatic.xml for SEO
- Update by-oil and by-concern directory pages
2026-04-09 08:04:35 +02:00
Unchained 9d07a60d3f feat: implement programmatic SEO for solutions pages
- Add 10 oil-for-concern solution pages with localized slugs
- Support 4 languages: sr, en, de, fr with proper canonical URLs
- Add solutions hub, by-concern, and by-oil directory pages
- Filter bundle products from solutions pages
- Add hideLangSwitcher prop to Header component
- Update translations for all languages
- Fix canonical URLs to include locale prefix
2026-04-08 13:29:42 +02:00
Unchained 2097280f20 fix: force no-cache build
Build and Deploy / build (push) Successful in 1s
2026-04-05 13:05:28 +02:00
Unchained bea6aba014 fix: simplify workflow with proper build args
Build and Deploy / build (push) Successful in 0s
2026-04-05 13:02:05 +02:00
Unchained 8454ffc5b3 test: trigger build with args
Build and Deploy / build (push) Has been cancelled
2026-04-05 12:59:49 +02:00
Unchained 38defdfb9b chore: remove test workflow
Build and Deploy / build (push) Has been cancelled
2026-04-05 12:59:13 +02:00
Unchained bd1fa0d96a test: add no-cache build workflow
Build and Deploy / build (push) Successful in 59s
2026-04-05 12:53:44 +02:00
Unchained 826d1ebb46 trigger: rebuild with correct env vars
Build and Deploy / build (push) Successful in 59s
Previous build had localhost:8000 hardcoded.
This rebuild uses the fixed Dockerfile with build args.
2026-04-05 12:30:07 +02:00
Unchained 09b0614695 fix: remove kubectl annotate from build workflow
Build and Deploy / build (push) Successful in 59s
- Remove kubectl command that was causing build failures
- Flux will auto-detect new image within 5 minutes via polling
- Simpler, more reliable build process
2026-04-05 12:03:27 +02:00
Unchained 7c7611b723 fix: simplify build workflow YAML syntax
Build and Deploy / build (push) Successful in 10m0s
- Use 'command' and 'args' instead of multiline command
- Use quoted heredoc delimiter to prevent variable expansion
- Simplify clone and build scripts
2026-04-05 11:50:23 +02:00
Unchained 6563f0c966 fix: use full cluster DNS for gitea service
Build and Deploy / build (push) Has been cancelled
- Change gitea URL from http://gitea:3000 to http://gitea.gitea.svc.cluster.local:3000
- Add set -x for debugging
- Add explicit clone exit code checking
2026-04-05 11:43:57 +02:00
Unchained cdbcd8424b fix: improve git clone error handling in build workflow
Build and Deploy / build (push) Has been cancelled
2026-04-05 11:39:39 +02:00
Unchained 05b2c26634 fix: correct syntax errors in build workflow
Build and Deploy / build (push) Has been cancelled
- Fix unclosed quote on line 13
- Remove malformed git checkout command on line 39
2026-04-05 11:35:01 +02:00
Unchained bdc35ff2b4 fix: remove quotes from date command in build workflow
Build and Deploy / build (push) Failing after 0s
2026-04-05 11:31:59 +02:00
Unchained d53665d6da build: pass env vars as build args to fix localhost:8000 error
Build and Deploy / build (push) Failing after 0s
- Add ARG and ENV directives to Dockerfile for NEXT_PUBLIC_* vars
- Pass build args in buildctl command with --opt build-arg
- Fixes ERR_BLOCKED_BY_CLIENT on localhost:8000/graphql
2026-04-05 11:24:01 +02:00
Unchained 328bbbaaa2 ci: add Gitea Actions workflow with BuildKit
Build and Deploy / build (push) Failing after 23m52s
2026-04-05 08:13:55 +02:00
Unchained 6a05abc6de ci: simplify Gitea Actions workflow to use BuildKit 2026-04-05 08:12:24 +02:00
Unchained 29894cd555 chore: trigger Gitea Actions build
Build and Push to GHCR / build (push) Failing after 4m0s
2026-04-05 06:32:05 +02:00
Unchained c80970bcda feat(ci): add Gitea Actions workflow for building and pushing to GHCR
Build and Push to GHCR / build (push) Has been cancelled
Add .gitea/workflows/build.yaml that:
- Builds Docker image on push to master
- Pushes to ghcr.io/unchainedio/manoon-headless
- Tags with commit SHA and 'latest'
- Updates k8s/kustomization.yaml with new image tag
- Commits and pushes the tag update back to repo

Requires Gitea Actions runner to be configured.
2026-04-05 06:24:36 +02:00
Unchained 1dec08f857 Revert to working deployment while GHCR image builds
Build and Deploy / build (push) Failing after 12m23s
Will re-apply pre-built image once GitHub Actions successfully
pushes image to ghcr.io/unchainedio/manoon-headless
2026-04-05 06:15:54 +02:00
Unchained cc33d317ba fix(k8s): use latest tag for manoon-headless image
Build and Deploy / build (push) Has been cancelled
Temporary fix until GitHub Actions builds and pushes the image.
Workflow will update to specific SHA on next push.
2026-04-05 06:12:44 +02:00
Unchained 3c495f48b7 refactor(k8s): use pre-built GHCR image instead of building in pod
Build and Deploy / build (push) Has been cancelled
- Remove init containers (clone, install, build)
- Use ghcr.io/unchainedio/manoon-headless:latest image
- Faster pod startup, less resource usage
- Image built by GitHub Actions on push to master
2026-04-05 06:09:55 +02:00
Unchained 590b6ca6ea fix(k8s): handle existing workspace on pod restart
Apply same fix from master branch:
- Check if workspace exists before cloning
- Fetch and reset if .git directory exists
- Clean and clone fresh if not

Prevents CrashLoopBackOff on pod restarts.
2026-04-05 05:33:17 +02:00
Unchained f6609f07d7 feat: implement programmatic SEO solutions hub
- Add /solutions hub page with 10 category cards
- Add /solutions/by-concern directory page
- Add /solutions/by-oil directory page
- Add Solutions section to Footer with navigation links
- Add Breadcrumb component for solution pages
- Add translations for all solution pages (sr, en, de, fr)
- Fix ExitIntentDetector JSON parsing error
- Update sitemap with solution pages
- Create 3 sample solution pages with data files
2026-04-05 05:21:57 +02:00
Unchained a636d29f0b fix(k8s): handle existing workspace on pod restart
Build and Deploy / build (push) Has been cancelled
The clone init container was failing with 'destination path already exists'
when the pod restarted. EmptyDir volumes persist across container restarts
but init containers run again.

Now checks if workspace exists:
- If .git directory exists: fetch and reset to latest master
- If not: clean and clone fresh

This fixes the CrashLoopBackOff caused by failed clone attempts.
2026-04-05 05:17:30 +02:00
Unchained 6caefb420a docs: add OpenCode project memory for git workflow
Build and Deploy / build (push) Has been cancelled
2026-04-03 21:06:15 +02:00
Unchained cbbcaace22 docs: add git workflow guidelines
Build and Deploy / build (push) Has been cancelled
2026-04-03 21:03:04 +02:00
Unchained eb711fbf1a feat(popup): add email capture popup with Mautic integration
Build and Deploy / build (push) Has been cancelled
- Email capture popup with scroll (10%) and exit intent triggers
- First name field and full tracking (UTM, device, time on page)
- Mautic API integration for contact creation
- GeoIP detection for country/region
- 4 locale support (sr, en, de, fr)
- Mautic tracking script in layout
2026-04-03 20:44:15 +02:00
Unchained 4e5481af1a fix(layout): restore ExitIntentDetector and Mautic tracking
Build and Deploy / build (push) Has been cancelled
2026-04-03 20:27:25 +02:00
Unchained 618298b1b1 fix(layout): restore original structure, keep only Rybbit direct URL fix
Build and Deploy / build (push) Has been cancelled
Revert unintended changes from previous commit:
- Restore AnalyticsProvider (was accidentally removed)
- Remove ExitIntentDetector (feature branch code)
- Remove Mautic tracking script (feature branch code)

Keep only the intended Rybbit fix:
- Direct connection to Rybbit instead of server-side proxy
2026-04-03 20:14:07 +02:00
Unchained d999d739d5 fix(analytics): connect directly to Rybbit to preserve real visitor IP
Build and Deploy / build (push) Has been cancelled
Changed Rybbit script loading from server-side rewrite to client-side direct
connection. This prevents Next.js from proxying the request, which was causing
all visitor IPs to show as the Hetzner server IP (138.201.11.251).

Before:
- Browser → Next.js → Rybbit (server-side proxy, loses client IP)

After:
- Browser → Rybbit (direct connection, real IP preserved)

Changes:
- layout.tsx: Use direct Rybbit URL for script src
- next.config.ts: Remove /api/script.js rewrite
2026-04-03 20:10:59 +02:00
Unchained 0f00aa8a47 Add Mautic environment variables to deployment
Build and Deploy / build (push) Has been cancelled
2026-04-03 16:31:40 +02:00
Unchained 93b239bc5a Merge branch 'dev'
Build and Deploy / build (push) Has been cancelled
2026-04-03 16:12:02 +02:00
Unchained 1ed6cac647 fix(k8s): use NodePort with externalTrafficPolicy Local to preserve client IP
Build and Deploy / build (push) Has been cancelled
Change storefront service from ClusterIP to NodePort with externalTrafficPolicy: Local.
This preserves the real client source IP instead of NATing to the node IP.

Fixes analytics tracking showing Hetzner IP (138.201.11.251) instead of real visitor IPs.
Same fix previously applied to Rybbit backend service.

Note: On single-node clusters, this works seamlessly. Traefik routes directly
to the node where the pod is running, preserving the original source IP.
2026-04-03 06:55:42 +02:00
Unchained e476bc9fc4 fix(k8s): add HTTP to HTTPS redirect for manoonoils.com
Build and Deploy / build (push) Has been cancelled
- Create redirect-https middleware for permanent redirect (301)
- Split IngressRoute: HTTP route redirects to HTTPS, HTTPS route serves app
- Fixes Google Search Console 404 error on HTTP version
- No application code changes, only routing configuration
2026-04-02 22:50:43 +02:00
Unchained f4f23aa7f3 fix(k8s): add HTTP to HTTPS redirect for manoonoils.com
- Create redirect-https middleware for permanent redirect (301)
- Split IngressRoute: HTTP route redirects to HTTPS, HTTPS route serves app
- Fixes Google Search Console 404 error on HTTP version
- No application code changes, only routing configuration
2026-04-02 22:49:26 +02:00
Unchained 9124eeedc1 fix: add ts-ignore for request.ip runtime property
Build and Deploy / build (push) Has been cancelled
2026-04-01 10:47:09 +02:00
Unchained 6843d2db36 fix(404): add redirects for broken URLs and custom not-found page
Build and Deploy / build (push) Has been cancelled
- Add permanent redirects for /products/manoon to /products
- Strip malformed /contact suffix from product URLs
- Create custom branded 404 page with product navigation
- Add NotFound translations for en and sr locales
2026-04-01 10:24:09 +02:00
Unchained 0b9ddeedc8 fix(analytics): properly forward client IPs to Rybbit and OpenPanel
- Create new API route /api/rybbit/track to proxy Rybbit tracking requests
- Extract real client IP from Cloudflare headers (cf-connecting-ip)
- Forward X-Forwarded-For and X-Real-IP headers to analytics backends
- Update OpenPanel proxy to also forward client IP
- Update next.config.ts rewrite to use internal API route

This fixes geo-location issues where all traffic appeared to come from
Cloudflare edge locations instead of actual visitor countries.
2026-04-01 10:24:09 +02:00
Unchained a3873bb50d fix(analytics): properly forward client IPs to Rybbit and OpenPanel
- Create new API route /api/rybbit/track to proxy Rybbit tracking requests
- Extract real client IP from Cloudflare headers (cf-connecting-ip)
- Forward X-Forwarded-For and X-Real-IP headers to analytics backends
- Update OpenPanel proxy to also forward client IP
- Update next.config.ts rewrite to use internal API route

This fixes geo-location issues where all traffic appeared to come from
Cloudflare edge locations instead of actual visitor countries.
2026-04-01 07:42:34 +02:00
Unchained 3c9c091c46 fix: revert HeroVideo aspect-ratio, fix ProblemSection scroll animation with useEffect
Build and Deploy / build (push) Has been cancelled
2026-04-01 06:43:43 +02:00
Unchained 27af03ba3a feat(performance): optimize Core Web Vitals with CSS animations and lazy analytics
- Replace framer-motion with CSS animations in TrustBadges, AsSeenIn, ProblemSection
- Create AnalyticsProvider client component for OpenPanel lazy-loading
- Fix HeroVideo CLS with explicit aspect-ratio (4/3)
- Remove deprecated swcMinify from next.config (enabled by default)
- Add optimizePackageImports for better tree-shaking
2026-04-01 06:14:49 +02:00
Unchained ad20ffe588 Merge branch 'dev'
Build and Deploy / build (push) Has been cancelled
2026-04-01 05:17:48 +02:00
Unchained 13301dca12 fix: use middleware.ts instead of proxy.ts for build compatibility 2026-04-01 05:17:36 +02:00
Unchained e57169a807 fix: revert proxy back to middleware for Next.js build compatibility 2026-04-01 05:15:42 +02:00
Unchained 3697a5d8ea fix: rename middleware to proxy for Next.js 16 compatibility
Build and Deploy / build (push) Has been cancelled
2026-04-01 04:19:07 +02:00
Unchained edd5c1582b feat(performance): add ISR and Cloudflare cache headers
- Add revalidate=3600 to homepage and products page (1hr ISR)
- Add middleware to set cache headers for HTML pages
- Bypass cache for checkout and cart pages
2026-03-31 20:08:56 +02:00
Unchained dff78b28a5 fix(analytics): restore OpenPanel proxy routes
Build and Deploy / build (push) Has been cancelled
2026-03-31 13:47:14 +02:00
Unchained b4905ce4ee chore: remove OpenPanel proxy routes (keeping core vitals changes)
Build and Deploy / build (push) Has been cancelled
2026-03-31 13:44:53 +02:00
Unchained e87c655a5b Merge branch 'feature/web-vitals-optimization' into dev
Build and Deploy / build (push) Has been cancelled
2026-03-31 13:22:45 +02:00
Unchained 1c5ec1a271 fix: remove framer-motion from HeroVideo for instant content visibility 2026-03-31 13:22:45 +02:00
Unchained 8eb9f24b33 feat(performance): Core Web Vitals optimizations
- Font optimization: Replace @font-face with next/font/google (DM Sans, Inter) for faster font loading and no render-blocking
- Image optimization: Add Unsplash to remotePatterns, configure AVIF/WebP formats, add device/image sizes
- Convert native <img> tags to next/image with proper sizing and priority for LCP images
- Add optimizePackageImports for lucide-react and framer-motion to reduce bundle size
- Fix CLS: Urgency message uses fixed min-height instead of animated height
- Fix CLS: ProductCard quick-add button uses opacity instead of translate for hover
- Convert HeroVideo scroll indicator to CSS animation
- Script loading: Rybbit uses lazyOnload strategy for better INP
2026-03-31 12:03:34 +02:00
Unchained 66829aeffd refactor(analytics): abstract analytics into provider pattern
Build and Deploy / build (push) Has been cancelled
- Add type-safe AnalyticsEvent union types
- Create AnalyticsProvider interface for pluggable analytics backends
- Implement OpenPanelProvider and RybbitProvider adapters
- Create AnalyticsTracker that fans out events to all providers
- Simplifies adding new analytics platforms in the future
2026-03-31 07:45:21 +02:00
Unchained bce2d19ca3 fix(analytics): fix OpenPanel apiUrl to not include /track
Build and Deploy / build (push) Has been cancelled
2026-03-31 07:23:03 +02:00
Unchained cee3b71454 fix(analytics): use route handler for OpenPanel script to fix query param issue
Build and Deploy / build (push) Has been cancelled
2026-03-31 07:19:14 +02:00
Unchained ff629691a5 fix(analytics): fix OpenPanel script rewrite URL
Build and Deploy / build (push) Has been cancelled
2026-03-31 07:11:59 +02:00
Unchained 1cdda7db3c fix(analytics): use rewrites instead of route handler for OpenPanel proxy
Build and Deploy / build (push) Has been cancelled
2026-03-31 06:37:17 +02:00
Unchained 1dd7e1dfe7 fix(analytics): use local proxy for OpenPanel to avoid ad blockers
Build and Deploy / build (push) Has been cancelled
2026-03-31 06:31:48 +02:00
Unchained 054889a44e feat(analytics): add RYBBIT_API_KEY for server-side tracking
Build and Deploy / build (push) Has been cancelled
2026-03-31 06:05:47 +02:00
Unchained d4039c6e3b feat(analytics): complete Rybbit tracking integration
Build and Deploy / build (push) Has been cancelled
- Add Rybbit server-side tracking to analytics-server.ts for order completion and revenue
- Add trackNewsletterSignup to analytics.ts and wire up NewsletterSection
- Add cart tracking to CartDrawer (cart view, remove from cart)
- All ecommerce events now track to both OpenPanel and Rybbit
2026-03-31 05:53:53 +02:00
Unchained bbe618f22d fix(analytics): add session-replay record endpoint
Build and Deploy / build (push) Has been cancelled
2026-03-31 05:34:21 +02:00
Unchained cfb98a457f fix(analytics): add replay.js rewrite for Rybbit session replay
Build and Deploy / build (push) Has been cancelled
2026-03-31 05:30:55 +02:00
Unchained 97479d542b fix(analytics): add tracking-config rewrite for Rybbit
Build and Deploy / build (push) Has been cancelled
2026-03-31 05:27:27 +02:00
Unchained 56c05cc8fc feat(analytics): add Rybbit proxy rewrites and env vars
Build and Deploy / build (push) Has been cancelled
- Add Next.js rewrites to proxy /api/script.js and /api/track through self-hosted Rybbit
- This bypasses ad blockers that would block rybbit.nodecrew.me directly
- Add NEXT_PUBLIC_RYBBIT_HOST and NEXT_PUBLIC_RYBBIT_SITE_ID env vars to K8s deployment
2026-03-31 05:17:57 +02:00
Unchained 511c3078c5 fix: update all fallback URLs from dev.manoonoils.com to manoonoils.com
Build and Deploy / build (push) Has been cancelled
2026-03-31 00:53:37 +02:00
Unchained 44091fc72a fix: inline Rybbit config to avoid client directive in server component
Build and Deploy / build (push) Has been cancelled
2026-03-31 00:50:33 +02:00
Unchained b3efebd3e4 feat: integrate Rybbit analytics alongside OpenPanel
Build and Deploy / build (push) Has been cancelled
- Add RybbitService for tracking e-commerce events
- Update useAnalytics hook to track with both OpenPanel and Rybbit
- Add Rybbit script to layout for page view tracking
- Track all applicable store events: product views, cart, checkout, orders, search, etc.
2026-03-31 00:38:38 +02:00
Unchained 044aefae94 fix: remove dev.manoonoils.com from ingress and update OpenPanel API URL
Build and Deploy / build (push) Has been cancelled
- Remove dev.manoonoils.com from storefront ingress to prevent cross-domain tracking issues
- Use environment variable for OpenPanel API URL in route handler
- Fixes session state conflicts from multiple domains
2026-03-30 20:40:17 +02:00
Unchained 36915a3f75 feat: add OAuth 2.0 support for GSC monitoring
Build and Deploy / build (push) Has been cancelled
- Updated monitor.py to support both OAuth and Service Account
- Created setup-oauth-local.py for easy local authorization
- Created cronjob-oauth.yaml for OAuth-based deployment
- Updated README with both authentication options
- OAuth is now the recommended method (no key file needed)
2026-03-30 17:56:49 +02:00
Unchained 771e9dc20b docs: add GSC monitoring quickstart guide
Build and Deploy / build (push) Has been cancelled
2026-03-30 17:18:51 +02:00
Unchained df915ca128 feat: add Google Search Console automated monitoring
- Python monitoring script for daily GSC reports
- Kubernetes CronJob for automated execution
- Tracks search analytics, crawl errors, and sitemap status
- Includes full setup documentation
2026-03-30 17:17:42 +02:00
Unchained 83efc4f1e2 feat: migrate storefront to manoonoils.com domain
Build and Deploy / build (push) Has been cancelled
- Update ingress to serve all domains (dev.manoonoils.com, manoonoils.com, www.manoonoils.com)
- Update NEXT_PUBLIC_SITE_URL to https://manoonoils.com in deployment env vars
- Prepare for 24h testing period before removing dev domain
2026-03-30 16:52:04 +02:00
Unchained f1c30b7141 fix: replace {{productName}} template in product page keywords
Build and Deploy / build (push) Has been cancelled
- Add template replacement logic for product keywords
- Replace {{productName}} with actual product.name
- Keywords now show correct product name instead of template variable
2026-03-30 13:07:40 +02:00
Unchained d9473e3f9e fix: add missing SEO to About and Contact pages
- Add keywords, canonical, OpenGraph to About page
- Refactor Contact page to server component with generateMetadata
- Create ContactPageClient for form functionality
- All pages now have complete SEO coverage
2026-03-30 12:21:26 +02:00
Unchained be4e47aeb8 docs: add SEO verification with real rendered output proof
- Document actual rendered HTML structure
- Show extracted JSON-LD schemas
- Include complete verification test results
- Prove all 7/7 SEO checks pass with real data
2026-03-30 11:59:18 +02:00
Unchained ba4da3287d fix: JSON-LD schema rendering in SSR
- Remove next/script dependency causing SSR issues
- Use regular script tag for server-side rendering
- Add real SEO verification test that checks rendered output
- All 7/7 SEO checks now passing
2026-03-30 11:55:21 +02:00
Unchained 3accf4c244 docs: add SEO implementation documentation and tests
- Add comprehensive SEO implementation guide
- Add automated SEO testing script
- Document all schema types and integrations
- Include verification methods and expected impact
2026-03-30 11:44:50 +02:00
Unchained fd0490c3e1 feat: integrate SEO system into pages
- Add OrganizationSchema to root layout
- Add ProductSchema with metadata to product pages
- Add enhanced metadata to homepage with keywords
- Add enhanced metadata to products listing page
- Add noindex to checkout page via layout
- Implement canonical URLs, OpenGraph, and Twitter cards
2026-03-30 11:42:58 +02:00
Unchained 234b1f1739 feat: comprehensive SEO system with keywords and schema markup
- Add 4-locale keyword configurations (SR, EN, DE, FR)
- Create schema generators (Product, Organization, Breadcrumb)
- Add React components for JSON-LD rendering
- Implement caching for keyword performance
- Abstract all SEO logic for maintainability
2026-03-30 11:22:44 +02:00
Unchained 767afac606 Merge branch 'dev'
Build and Deploy / build (push) Has been cancelled
2026-03-30 06:35:45 +02:00
Unchained 341fb68216 Merge branch 'feature/cash-on-delivery' into dev 2026-03-30 06:31:58 +02:00
Unchained 25e60457cc fix: shipping cost calculation and performance optimization
- Fix shipping cost not included in checkout total
- Add useShippingMethodSelector hook for proper abstraction
- Remove blocking initCheckout from Header for better performance
- Checkout now initializes lazily when cart opens or item added
2026-03-30 06:31:52 +02:00
Unchained adb28c2a91 feat: Implement dual client/server analytics tracking
Complete analytics overhaul with redundant tracking:

CLIENT-SIDE (useAnalytics hook):
- Tracks user behavior in real-time
- Product views, add to cart, checkout steps
- Revenue tracking via op.revenue()
- Captures user session data

SERVER-SIDE (API route + server functions):
- POST /api/analytics/track-order endpoint
- trackOrderCompletedServer() function
- Reliable tracking that can't be blocked
- Works even if browser closes

DUAL TRACKING for order completion:
1. Client tracks immediately (session data)
2. API call to server endpoint (reliable)
3. Both sources recorded with 'source' property

Files:
- src/lib/analytics.ts - Client-side with dual tracking
- src/lib/analytics-server.ts - Server-side tracking
- src/app/api/analytics/track-order/route.ts - API endpoint

Benefits:
-  100% revenue capture (server-side backup)
-  Real-time client tracking
-  Ad blocker resistant
-  Browser-close resistant
-  Full funnel visibility
2026-03-30 05:41:05 +02:00
Unchained 6ae7b045a7 fix: Track order completion BEFORE clearing checkout
The checkout was being cleared before tracking, causing getTotal()
to return 0. Fixed by reordering operations:
1. Track order completion (while checkout data exists)
2. Then clear the checkout

Added console log to verify total is captured correctly.
2026-03-30 05:02:34 +02:00
Unchained 05b0a64c84 debug: Add console logging for revenue tracking
Add detailed console logs to debug why revenue tracking isn't working:
- Log when trackOrderCompleted is called
- Log revenue amount and currency
- Log success/failure of revenue tracking

This will help identify if the issue is with the op.revenue() call
or if it's failing silently.
2026-03-29 20:52:21 +02:00
Unchained a516b3a536 fix: Remove auto-order confirmation code
The order confirmation requires MANAGE_ORDERS permission which
the storefront API token doesn't have. Removing the auto-confirmation
attempt to prevent console errors. Orders will remain UNCONFIRMED
until manually confirmed in Saleor Dashboard.
2026-03-29 20:49:52 +02:00
Unchained aa737a1449 fix: Simplify analytics to fix OpenPanel errors
Remove complex tracking implementation that was causing errors:
- Remove op.increment/decrement calls (causing Duplicate event errors)
- Remove complex type definitions
- Remove unused tracking methods
- Keep only essential tracking with proper error handling

This reverts to a simpler, working analytics implementation.
2026-03-29 20:41:27 +02:00
Unchained 51a41cbb89 fix: Add missing currency field to checkout items tracking
CartItemData requires currency field for each item.
Added currency extraction from variant pricing.
2026-03-29 20:31:57 +02:00
Unchained 3c3f4129c8 feat: Implement comprehensive OpenPanel analytics tracking
Complete analytics overhaul with 30+ tracking events:

E-commerce Events:
- Product views, image views, variant selection
- Add/remove from cart, quantity changes
- Cart open and abandonment tracking
- Checkout funnel (all steps)
- Payment/shipping method selection
- Order completion with revenue tracking

User Engagement:
- Search queries with filters
- CTA clicks, external link clicks
- Element engagement (click/hover/view)
- Newsletter signups
- Promo code usage
- Wishlist actions

User Identity:
- User identification
- Property setting
- Screen/session tracking

Technical:
- Proper TypeScript types for all events
- Increment/decrement counters
- Pending revenue for cart abandonment
- Comprehensive error handling

Includes complete documentation in docs/ANALYTICS_GUIDE.md
2026-03-29 20:25:21 +02:00
Unchained 038a574c6e feat: Increase free shipping threshold from 3000 to 10000 RSD
Update free shipping minimum from 3,000 RSD to 10,000 RSD across:
- TickerBar component
- English translations (en.json)
- Serbian translations (sr.json)
- French translations (fr.json)
- German translations (de.json)
2026-03-29 19:47:26 +02:00
Unchained 31c6d2ce14 Merge dev: COD payment method implementation
Build and Deploy / build (push) Has been cancelled
Features:
- Add Cash on Delivery (COD) payment method
- Modular payment configuration system
- PaymentMethodSelector and PaymentMethodCard components
- 30-day money back guarantee badge
- Checkout language fix for multilingual emails
- Cart reset after order completion
- Service layer architecture

Note: Orders are UNCONFIRMED until manually confirmed in dashboard.
Auto-confirmation has permission issues in Saleor.
2026-03-29 19:40:03 +02:00
Unchained 7677037748 Merge feature/cash-on-delivery: COD payment method implementation
Features:
- Add Cash on Delivery (COD) payment method
- Modular payment configuration system
- Reusable PaymentMethodSelector and PaymentMethodCard components
- 30-day money back guarantee badge
- Checkout language fix for multilingual emails
- Cart reset after order completion
- Service layer architecture for checkout operations

Technical:
- Abstracted email system in saleor-core-extensions
- Payment method detection from order data
- Configuration-driven translations (EN, SR, DE, FR)

Note: Order auto-confirmation has permission issues in Saleor,
orders will be UNCONFIRMED until manually confirmed.
2026-03-29 19:33:18 +02:00
Unchained de4eb0852c feat: Add order auto-confirmation (best effort)
Added order confirmation after checkout completion.
Note: This requires MANAGE_ORDERS permission which currently
has the same bug as HANDLE_PAYMENTS. The try-catch ensures
checkout won't fail if confirmation fails. Orders will be
UNCONFIRMED until manually confirmed in dashboard.
2026-03-29 19:33:04 +02:00
Unchained 9c3d8b0d11 fix: Remove COD transaction creation to fix checkout errors
The transaction creation was failing due to HANDLE_PAYMENTS permission issues.
Removed the code to get checkout working again. Will implement via
order metadata or core-extensions webhook instead.
2026-03-29 19:17:06 +02:00
Unchained e15e6470d2 fix: Add SALEOR_API_TOKEN auth for COD transaction creation
- Add SALEOR_API_TOKEN environment variable support
- Update Apollo client to include auth header
- Enable COD transaction creation after checkout
2026-03-29 18:22:16 +02:00
Unchained 5f9b7bac3a fix: set checkout languageCode to ensure emails are sent in correct language
- Add CHECKOUT_LANGUAGE_CODE_UPDATE mutation to update checkout language
- Call language code update before completing checkout
- Language code (SR, EN, DE, FR) is now set on checkout before order creation
- This ensures order confirmation emails are sent in the customer's language
- Update step numbering in checkout flow (now 6 steps total)
2026-03-29 14:42:52 +02:00
Unchained fbe0761609 fix: remove manual transaction creation causing 400 error
- Remove CREATE_TRANSACTION_MUTATION call that's causing 400 error
- Saleor's checkoutComplete already creates order with NOT_CHARGED status for COD
- Order doesn't need manual transaction - staff handles fulfillment in dashboard
- Keep payment method selection and UI components intact
2026-03-29 14:31:42 +02:00
Unchained 10b18c6010 feat: add 30-day money back guarantee trust badge above complete order button
- Add green trust badge with checkmark icon above 'Complete Order' button
- Add translations for all locales (EN, SR, DE, FR)
- Badge includes: '30-Day Money-Back Guarantee' text
- Styled with green background and border to match trust/conversion theme
2026-03-29 14:27:05 +02:00
Unchained eaf599f248 style: improve COD payment card selected state
- Add black border-2 and shadow when selected
- Change icon background to black with white icon when selected
- Add 'Selected' badge with checkmark icon
- Make text bolder and more visible when selected
- Add hover shadow effects
- Add 'selected' translation key for all locales
- Overall more lively and prominent selected state
2026-03-29 09:06:29 +02:00
Unchained 82c23e37a1 fix: use lowercase 'cod' in CODInstructions translation key
- Change useTranslations from Payment.COD to Payment.cod
- Fixes MISSING_MESSAGE error in CODInstructions component
- Consistent with translation file structure
2026-03-29 08:59:59 +02:00