CHANGELOG

What's New in Kartivo

We ship continuously. Everything below is grouped by the week it went out — newest first.

Last shipped 8 August 2026

August 2026

Week of 3 August

21 updates
New 8
  • portal One-click magic login in the welcome email and on the thank-you page
  • portal Course-first mobile buyer dashboard + one-tap resume + bottom nav
  • collection Per-course Welcome email editor
  • collection Self-serve Meta CAPI settings on the Pixel & GTM page
  • analytics Course geo (state/city) + per-page funnel reports (seller + admin) + session-IP geo backfill
  • course-analytics Add Unique Visitors column to the funnel (from pl.visitor_id) — matches the dashboard traffic-funnel visitor metric
  • course-analytics Per-course funnel (landing page → checkout → sale), by-time-of-day breakdown, + add to Courses sidebar menu
  • course-analytics Render By time of day as an ApexCharts graph (Page Views area + Sales columns) instead of a table
Fixed 13
  • portal Make account recovery actually work; unpublish the TEST course
  • portal Recovery email branded itself as an arbitrary seller
  • portal Name the seller brand in the recovery email again
  • meta-capi Send each Purchase exactly once (send-once ledger)
  • meta-capi Resolve payment_log by payment_intent so both senders share one event_id
  • billing Heal COMPLETED-but-unprovisioned in-portal orders
  • meta-capi Claim before sending Purchase from the thank-you page
  • phonepe Null-guard the IPN event checks + track the live controller
  • checkout GST preview must follow the discounted total, not the base price
  • billing Stop the in-portal reconciler reporting a false all-clear
  • checkout Backport the kv-nothanks-fallback hotfix from production
  • security Clear all 35 dependabot alerts + CI4 4.7.0 -> 4.7.4
  • security Patch the vendored Requests deserialization gadget; drop dead composer metadata

July 2026

Week of 27 July

11 updates
New 4
  • checkout Auto-apply coupon from ?coupon=/?kvcoupon= URL param
  • courses Add Certificates to the Courses sidebar submenu (All Courses / Students / Analytics / Certificates)
  • pricing USD/INR currency toggle on the public pricing page
  • courses Certificate registry + auto-issue & email on completion
Fixed 7
  • meta Dedup GTM-fired Purchase pixel on thank-you page via event_id
  • courses Public certificate link fixes email 404 + enables sharing/verification
  • invoices Wait for DataTables lib before initialising the drafts table
  • invoices Confirm no longer blocks on email failure
  • invoices Make Confirm&Send modal physically unable to full-reload the page
  • courses Certificates registry queried non-existent ct.created_at (column is issued_at) -> 500
  • portal Lesson page horizontal overflow on mobile (content unreadable, cut off right)

Week of 20 July

12 updates
New 4
  • courses Show student Mobile column on students admin page (member_phone_no + payment-log fallback)
  • phonepe App:phonepe-reconcile — verify NULL PhonePe orders against PhonePe + finalize the paid ones (fixes silent webhook-miss orphans)
  • invoice-drafts Server-side currency/profile/country/search filters (no datagrid)
  • invoice-drafts Server-side DataTables (pagination/search/ordering) matching platform pattern; filters+tabs drive ajax; no page reloads
Fixed 8
  • ui Proper content-page typography site-wide (About/Privacy/Terms/Refund readable + styled)
  • phonepe Divide payment timestamp by 1000 not 100 — /100 made order_date 10x (year 2535) on PhonePe sales
  • portal Resolve real currency symbol from wl_global_currency — customer portal showed static USD for INR/non-USD courses
  • checkout Coupon usage-limit guard read max_discount, not max_usages
  • checkout Coupon usage-limit guard read max_discount, not max_usages
  • checkout Coupon usage-limit guard use >= so max_usages is an exact cap
  • checkout Coupon usage-limit guard use >= so max_usages is an exact cap
  • invoice-drafts Don't full-reload after send/void — remove row in place, preserve filters/scroll (bulk-send workflow)

Week of 13 July

2 updates
New 2
  • webhook Error-level [ipn-dispatch] logging on IPN delivery failure (observability; no behavior change)
  • checkout Require valid email before Stripe confirm (Link can't complete email-less) + receipt_email on PaymentIntent

Week of 6 July

38 updates
New 24
  • bridge Checkout-side _fbp/_fbc cookie rehydration from kvfbp/kvfbc URL params + node tests
  • bridge Landing side — capture _fbp/_fbc + wbraid/gbraid, decorate checkout links with kvfbp/kvfbc + node tests
  • bridge Kartivo_capi_identity() falls back to kv_fbp/kv_fbc (cross-domain mirror) when _fbp/_fbc cookies absent
  • bridge Load bridge-rehydrate.js first on checkout (before GTM/pixel)
  • conversions Wl_conversion_tracking table (multi-level Meta/GTM/Google config, Phase B)
  • conversions TrackingConfigResolver — cascade product→funnel→collection + collection fallback + unit tests
  • conversions Browser + server CAPI resolve pixel via TrackingConfigResolver (funnel/product cascade)
  • conversions /conversions funnel + product Meta-pixel override UI (writes wl_conversion_tracking)
  • checkout Auto-apply coupon from ?coupon_code= URL param (reuses Apply button, hides the box on success) — for exit-intent links
  • conversions Add landing_pixel_id to wl_meta_connections (Phase C2)
  • conversions Inject seller landing-page Meta pixel on custom-domain pages (Phase C2) + unit tests
  • conversions Landing-page pixel selector on /conversions (writes wl_meta_connections.landing_pixel_id)
  • conversions GTM per-level dataLayer on thank-you page (value/currency/ids/hashed identity/click-ids)
  • conversions Per-level GTM container field on /conversions (writes wl_conversion_tracking.gtm_container_id)
  • conversions Searchable pixel dropdown (select2) — type to find a pixel by name/ID among the 74
  • integration Bunny.net Stream CDN provider — connect-form fields + connected-list card + webhook receiver (BunnyWebhook) + route
  • integration Show copyable Bunny webhook URL on the connected CDN card (guarded, can't throw)
  • courses App:send-course-welcome command — send/resend collection Welcome (login) email to specific members
  • courses Admin-initiated password reset — regenerate + email student password from the students screen
  • portal World-class My Courses — resume hero, progress stats, elevated course cards
  • portal Course overview — per-module progress bars + 'Up next' resume marker
  • portal Lesson player — per-module progress in sidebar + auto-scroll to current lesson
  • courses-admin Analytics dashboard — KPIs, enrolments-over-time, per-course performance, completion funnel, active/idle split
  • courses-admin Courses sidebar submenu (All Courses/Students/Analytics) + global Students datagrid with filter, pagination, CSV/print export
Improved 1
  • courses-admin Course-list KPI cards match analytics style (icon badges, consistent typography)
Fixed 13
  • conversions Add funnel_id to checkout $logData select (funnel cascade was dead on browser path) + de-shadow $productId (review)
  • conversions Try/catch saveLandingPixel write (graceful pre-migration) — matches saveLevelPixel (review)
  • refunds Same wl_payment_log column fix in API v1 RefundsController — login_id from apiUserId, drop absent login_id/buyer_email select
  • conversions Filter/sort now use delegated events (survive HTMX swaps) + add 'With funnel' filter option
  • conversions Don't redeclare inherited public $db/$login_id (PHP visibility fatal)
  • conversions ConnectMeta returns HX-Redirect for HTMX requests so the cross-origin OAuth redirect always works
  • conversions Pixel discovery via field-expansion (1 call, was 100+ → timeout/spinner) + searchable/scrollable pixel picker
  • conversions Only list active collections (activation_status=1) — hide archived/deleted from the conversions list
  • courses Durable product->course map so UI product edits (which wipe custom_details.course_id) can't silently break enrollment
  • courses Auto-enroll order-bump buyers into bonus courses (map wl_payment_log.offer_bumps token -> bump product -> course)
  • email Welcome/reset emails greet 'Hi there,' instead of 'Hi ,' when member has no name
  • checkout Surface validation block on Complete Payment (India-GST State field) instead of silent no-op
  • portal Course buyers can log in — add member-record password fallback (sha1 purchase pw + bcrypt register pw) when no wl_users_login row

June 2026

Week of 29 June

1 update
Fixed 1
  • checkout Offer-bumps '+ Add' second row rendered 'undefined'

Want These Features?

Start your free trial and get everything above — no credit card required.

Start Free Trial See All Features