Last Update: October 2026
QRcdr PRO log history
= 1.2.7 =
- New: accounts with a system-generated password (e.g. created by an OAuth plugin) can set a new password and delete their account without entering the current one
- New: filter qrcdr_unknown_password_meta_keys to declare the user meta keys that identify such accounts
- New: Feedback QR star ratings tracked as an extra stat (total, average and 1-5 distribution), with one vote per IP (changing vote replaces the previous one) and bot filtering
- New: QrCdr_Pro_Tracking, a filterable event registry (qrcdr_tracked_events) writing any stat into the existing qrcdr_tracking blob
- New: generic qrcdr_track_event AJAX endpoint (new nonce) for all public tracking events
- New: shared public beacon partial (window.qrcdrTrack) used by Social Hub, Business Card and Feedback templates, replacing the duplicated sendBeacon code
- New: Feedback review platform link clicks tracked in Top Links, like Social Hub and Business Card
- New: rating stats in the QR details modal (advanced plans) and in GET /qrcodes/{id}/stats (total_ratings, rating_average, ratings)
- Update: Current Password field hidden in the profile for those accounts, with an explanatory hint
- Update: user IP resolution moved to QrCdr_Pro_Utils::get_the_user_ip() and shared with the tracking registry
- Fix: removal of the non-existent _qrcdr_oauth_user meta, replaced by generic flag clearing whenever a password is set
- Fix: invalid type="button disabled" attribute on the Delete Account button
- Fix: undefined $top_link_clicks variable in the QR details modal (Top Links list)
= 1.2.6 =
- New: Optional field Coupon redirect url after redemption
- New: advanced custom Logo UI for AppStore, Business Card, Feedback, Restaurant, Social Hub
- New: App Store automatic redirect switch, per-device store detection (iOS/Mac to the App Store, Android only when a single Android store is set) with the choice page when ambiguous
- Update: UI layout for Media Library
- New: Bots, link previews and prefetch requests are no longer counted as scans (separate counter in the QR analytics)
- Fix: Media picker, Get filename of files that are not images
- Fix: Form switch restored unchecked when saving it off
- Fix: media library loaded twice on pages with multiple generators
- Fix: blurred locked screen for dynamic feature tabs on page load
- Update: App Store no-cache headers on the device redirect, to prevent caches from serving it to the wrong device
- Update: Coupon animated confirmation screeen check
- Update: interactive Coupon preview
- Update: performance table progressive image loading with shared shimmer and request cancellation
- Update: media library and media picker paginated with Load more, request caching and lazy loaded thumbnails
- Update: user usage requested once on page load instead of once per generator
= 1.2.5 =
- New: Restaurant Digital Menu QR
- Update: scrollIntoView generator when dynamic qr is selected
- Update: preview mockup improvements
- Update: Gallery loading optimized with Batch request
- Update: visual feedback for actions with expired nonce
- Fix: footer branding/credits not shown on public landing pages when served via non-pretty-link URLs (e.g. ?qrcdr=ID)
- Fix: MP3/Video players keep playing audio/video when switching to another feature tab
= 1.2.4 =
- Fix: login redirect on Safari iOS (reload instead of same-URL assignment)
- Update: rename redirect_success attribute to redirect_to in login form shortcode
= 1.2.3 =
- New: refresh login / subscription nonces at submit time for cache compatibility
- Update: nonce refresh endpoint served with anti-cache headers
= 1.2.2 =
- New: Manual subscription expiration date with automatic downgrade to Free
- Update: generic New Subscription email for payments and manual grants
- Fix: render bold placeholders in email templates
- Fix: subscription expiration date sync (read Stripe top-level current_period_end)
- Fix: keep paid plan on transient Stripe statuses (incomplete, unpaid, paused)
- Update: downgrade to Free only on real cancellation
- Update: Tested up to WordPress 7.1
= 1.2.1 =
- Update: save contact from Business Card
- Update: Sync subscription if updated from Stripe Dashboard
= 1.2.0 =
- Update: set Login button before Generator
- Fix: login column if no pricing page is set
- Fix: prevent js errors if no stripe credentials are set
= 1.1.9 =
- Update: Defer Stripe scripts
- Update: Responsive editor phone preview
- Update: UI optimization for Dynamic tabs
= 1.1.8 =
- New: Toggle verified customers.
- New: Chunk upload to bypass server limits.
- New: Media Upload progress bar
- Update: Exclude qrcdr CPT from search.
- Update: UI accessibility standards improved.
- Update: Masked purchase code field.
- New: Thank You email after purchase
- New: Customizable service emails content
= 1.1.7 =
- Update: Tested up to WordPress 7.0
- Fix: Manual Subscription Persistence
- Fix: Unified timings to avoid race conditions
- Fix: Improved permalink reliability and anti-404 fallback system for dynamic QR codes
- Fix: Closing div for API keys panel
= 1.1.6 =
- New: API Rest
- Update: Analytics data optimized
- Update: Translations
- Fix: PHP >= 8.1 updater notice
= 1.1.5 =
- Fix: Early load Stripe API keys
= 1.1.4 =
- Update: load generator tab immediately on select qr
- Update: better performance for qr listing
- Update: sicky-top Dashboard CTA
- Update: Check QRcdr minimum required version
- Fix: load user-login script
= 1.1.3 =
- Update: Remove placeholder from new QR UI
= 1.1.2 =
- Update: SignIn / SignUp button
- Update: Script loading optimized
- Fix: Text dark on analytics teaser
= 1.1.1 =
- New: Setting qrcdr_disable_registration
- Fix: Load_textdomain
- Fix: Load templates preview
= 1.1.0 =
- New: Recalculate user quota inside Customers table actions
- Update: Create qr with links to post IDs
- Update: Prevent double redirect after qr scan
- Update: Prefixed post_meta
- Update: Deep sanitize for qr code content and style
- Update: Real MIME type validation for file uploads
- Update: Better performance for statistics
- Update: Better performance for user quota calculate
- Update: Sticky top cta buttons
- Fix: Sort order by statistics
- Fix: CSRF risk on cpt base slug settings
- Fix: Available space progress bar size
= 1.0.9 =
- New: Custom email templates
- Update: Verify new users from standard WP registration and OAuth
- Update: Bot honeypot detection (security)
= 1.0.8 =
- New: qrcdr_email_verified flag
- New: Filter subscribers by active account
- New: Purge inactive users
- Update: Admin payments connect Stripe UI
- Update: Plans admin drag-collapse improved
- Update: General default copyright inside Qrcdr settings
- Fix: Dynamic landings UI
= 1.0.7 =
- Fix: Secured login / payment flow nonces
- Update: Escape $content for static QR codes
- Update: Better IP tracking
- Update: Anonimized IP tracking
- Update: Rate limiting to ipapi.co calls
= 1.0.6 =
- Update: Subscription flow improved
- Fix: Count as free users without plan assigned
- Update: CTA to open Select Dynamic
- UI improvements
= 1.0.5 =
- New: Pricing plans grouped by period
- New: Shortcode qrcdr_danger_zone to delete account
- New: Admin submenu page: Registration & Account
- New: Delete Uploaded media & QRcdr cpt when user deletes account.
- Fix: update media library on QR change
= 1.0.4 =
- Update: Manage all the registrations from frontend
- New: qrcdr_set_password_form shortcode to render reset password form and user profile
- New: Page Qrcdr Account, with qrcdr_set_password_form shortcode
= 1.0.3 =
- Update: Translations
- Update: Sync media library with attached qrs
= 1.0.2 =
- New: Qrcdr Plan block
- Update: Separate Advanced analytics + Export data
- Update: Redirect pdf to real file
- Update: CTA Lock Screen to login / registration tab
- Update: Show analytics tab and link only if available in any active plan
= 1.0.1 =
- New: Manual subscription
- New: qrcdr_static_preview (wifi)
- Update: Coupon UI improved
- Update: Feedback UI improved
- Update: Frontend login / subscribe mask
- Update: Select pricing page
- Update: Shortcode button below each plan
= 1.0.0 =
- New: First release