{"id":299662,"date":"2026-07-23T23:58:19","date_gmt":"2026-07-23T23:58:19","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/vollstart-repair-desk\/"},"modified":"2026-07-23T23:57:45","modified_gmt":"2026-07-23T23:57:45","slug":"vollstart-repair-desk","status":"publish","type":"plugin","link":"https:\/\/mri.wordpress.org\/plugins\/vollstart-repair-desk\/","author":18077756,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.3","stable_tag":"1.0.3","tested":"7.0.2","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"Vollstart Repair Desk","header_author":"Vollstart","header_description":"Repair management for workshops, bike shops, electronics repair, and service businesses. Track repairs, notify customers via QR code status page, and manage your workshop efficiently.","assets_banners_color":"4a4d54","last_updated":"2026-07-23 23:57:45","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/vollstart.com\/wordpress-plugins\/repair-desk\/","header_author_uri":"https:\/\/vollstart.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":36,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.3":{"tag":"1.0.3","author":"sasonikolov","date":"2026-07-23 23:57:45"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3620626,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3620626,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3620626,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3620626,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3620626,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.3"],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3620626,"resolution":"1","location":"assets","locale":"","width":1440,"height":900},"screenshot-2.jpg":{"filename":"screenshot-2.jpg","revision":3620626,"resolution":"2","location":"assets","locale":"","width":1440,"height":900},"screenshot-3.jpg":{"filename":"screenshot-3.jpg","revision":3620626,"resolution":"3","location":"assets","locale":"","width":1440,"height":900},"screenshot-4.jpg":{"filename":"screenshot-4.jpg","revision":3620626,"resolution":"4","location":"assets","locale":"","width":840,"height":900},"screenshot-5.jpg":{"filename":"screenshot-5.jpg","revision":3620626,"resolution":"5","location":"assets","locale":"","width":1440,"height":900}},"screenshots":{"1":"Repair dashboard \u2014 every job at a glance, filtered by status, with priority and unread-message badges","2":"Repair detail \u2014 status flow, device and customer data, defect description and customer access code","3":"Work steps \u2014 per-job checklist with time tracking and progress","4":"Public status page \u2014 customers enter their code or scan the QR code to see live status and message the workshop","5":"Device management \u2014 devices and vehicles linked to their owners and repair history"}},"plugin_section":[262246],"plugin_tags":[273061,260654,273062,52119,18341],"plugin_category":[],"plugin_contributors":[225541],"plugin_business_model":[],"class_list":["post-299662","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-repair-management","plugin_tags-repair-shop","plugin_tags-repair-tracking","plugin_tags-service-desk","plugin_tags-workshop","plugin_contributors-sasonikolov","plugin_committers-sasonikolov"],"banners":{"banner":"https:\/\/ps.w.org\/vollstart-repair-desk\/assets\/banner-772x250.jpg?rev=3620626","banner_2x":"https:\/\/ps.w.org\/vollstart-repair-desk\/assets\/banner-1544x500.jpg?rev=3620626","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/vollstart-repair-desk\/assets\/icon.svg?rev=3620626","icon":"https:\/\/ps.w.org\/vollstart-repair-desk\/assets\/icon.svg?rev=3620626","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/vollstart-repair-desk\/assets\/screenshot-1.jpg?rev=3620626","caption":"Repair dashboard \u2014 every job at a glance, filtered by status, with priority and unread-message badges"},{"src":"https:\/\/ps.w.org\/vollstart-repair-desk\/assets\/screenshot-2.jpg?rev=3620626","caption":"Repair detail \u2014 status flow, device and customer data, defect description and customer access code"},{"src":"https:\/\/ps.w.org\/vollstart-repair-desk\/assets\/screenshot-3.jpg?rev=3620626","caption":"Work steps \u2014 per-job checklist with time tracking and progress"},{"src":"https:\/\/ps.w.org\/vollstart-repair-desk\/assets\/screenshot-4.jpg?rev=3620626","caption":"Public status page \u2014 customers enter their code or scan the QR code to see live status and message the workshop"},{"src":"https:\/\/ps.w.org\/vollstart-repair-desk\/assets\/screenshot-5.jpg?rev=3620626","caption":"Device management \u2014 devices and vehicles linked to their owners and repair history"}],"raw_content":"<!--section=description-->\n<p>Vollstart Repair Desk helps repair shops manage jobs from intake to pickup. Customers get a QR code and check their repair status online \u2014 no more \"Is it done yet?\" phone calls.<\/p>\n\n<p><strong>Built for real workshops.<\/strong> Bike shops, electronics repair, cobblers, car workshops, phone repair \u2014 any business that takes items in, fixes them, and hands them back.<\/p>\n\n<p><strong>No cloud, no monthly fees.<\/strong> All data stays in your WordPress database. No external services required for core functionality.<\/p>\n\n<p><strong>GDPR-friendly by design.<\/strong> Customer data export, anonymization, and deletion built in.<\/p>\n\n<p><strong>Pro version available.<\/strong> A separate Vollstart Repair Desk Pro plugin with additional features is available at vollstart.com \u2014 see the Premium Features list below.<\/p>\n\n<h4>Perfect for<\/h4>\n\n<ul>\n<li><strong>Bike shops<\/strong> \u2014 track repairs, parts, and notify customers when ready<\/li>\n<li><strong>Electronics repair<\/strong> \u2014 intake photos, work steps, QR status tracking<\/li>\n<li><strong>Cobblers and tailors<\/strong> \u2014 simple repair tracking with pickup reminders<\/li>\n<li><strong>Car workshops<\/strong> \u2014 device and vehicle management with recurring maintenance<\/li>\n<li><strong>Phone repair<\/strong> \u2014 quick intake, status updates, QR code tracking<\/li>\n<li><strong>Any repair business<\/strong> that needs to track jobs and communicate with customers<\/li>\n<\/ul>\n\n<h4>Core Features<\/h4>\n\n<ul>\n<li><strong>Repair management<\/strong> \u2014 create, edit, and track repairs with configurable status flow<\/li>\n<li><strong>Customer database<\/strong> \u2014 contact info, repair history, customer numbers<\/li>\n<li><strong>Device tracking<\/strong> \u2014 devices and products linked to customers and repairs<\/li>\n<li><strong>Repair types<\/strong> \u2014 catalog with estimated duration, default pricing, and icon selection<\/li>\n<li><strong>Work steps<\/strong> \u2014 checklists with time tracking, progress indicators, and auto-status<\/li>\n<li><strong>Photo uploads<\/strong> \u2014 webcam, mobile camera, or file upload for intake documentation<\/li>\n<li><strong>QR code<\/strong> \u2014 unique QR per repair, printable labels, camera scanner in admin<\/li>\n<li><strong>Public status page<\/strong> \u2014 standalone URL or shortcode, customers check live status<\/li>\n<li><strong>PDF documents<\/strong> \u2014 pickup receipts, device reports and customer reports (A4, ready to print)<\/li>\n<li><strong>Messaging<\/strong> \u2014 communication between shop and customer per repair<\/li>\n<li><strong>Email notifications<\/strong> \u2014 automatic emails on status change, new repair, customer messages<\/li>\n<li><strong>Pickup reminders<\/strong> \u2014 automatic email reminders after configurable days<\/li>\n<li><strong>CSV export and import<\/strong> \u2014 repairs, customers, devices, repair types, work steps<\/li>\n<li><strong>GDPR tools<\/strong> \u2014 data export, anonymization, and deletion per customer<\/li>\n<li><strong>Dashboard widget<\/strong> \u2014 open and total repair counts on the WordPress dashboard<\/li>\n<li><strong>Bulk actions<\/strong> \u2014 change status, print QR labels, or delete multiple repairs<\/li>\n<li><strong>Internal rating system<\/strong> \u2014 staff rate customers, average shown on customer card<\/li>\n<li><strong>Device repair history<\/strong> \u2014 every repair linked to a device, visible in one click<\/li>\n<li><strong>Mobile-friendly<\/strong> \u2014 responsive admin interface, works on phones and tablets<\/li>\n<\/ul>\n\n<h4>Premium Features<\/h4>\n\n<p>Everything in the free version, plus:<\/p>\n\n<ul>\n<li><strong>Customer portal (PWA)<\/strong> \u2014 installable web app, customers see all their repairs, devices and unread messages in one place<\/li>\n<li><strong>Cost tracking &amp; billing<\/strong> \u2014 parts catalog, work items, hourly rate per staff member, time-based pricing per work step, invoice summary<\/li>\n<li><strong>Invoice PDF<\/strong> \u2014 full invoice with line items, tax, business header, sent by email or downloaded as PDF<\/li>\n<li><strong>PDF customization<\/strong> \u2014 paper size, font, margins, RTL direction, show staff names + status timeline on documents<\/li>\n<li><strong>WooCommerce integration<\/strong> \u2014 turn a repair billing summary into a WooCommerce order with one click<\/li>\n<li><strong>Parts inventory<\/strong> \u2014 stock levels, usage tracking, low-stock email alerts<\/li>\n<li><strong>Global item catalog<\/strong> \u2014 reusable parts and labor items with price history and per-item statistics<\/li>\n<li><strong>Custom email templates<\/strong> \u2014 HTML body customization for every notification (status change, new repair, customer message, pickup reminder)<\/li>\n<li><strong>Warranty tracking<\/strong> \u2014 expiry dates per repair and automatic reminder emails before they run out<\/li>\n<li><strong>Recurring maintenance<\/strong> \u2014 service intervals per device with cron-driven reminder emails<\/li>\n<li><strong>Custom status definitions<\/strong> \u2014 add your own workflow steps with colors and icons, fully integrated into the status flow<\/li>\n<li><strong>External rating system<\/strong> \u2014 ask customers to rate the repair via email link or directly on the public status page \/ customer portal<\/li>\n<li><strong>Staff management<\/strong> \u2014 multiple team members with auth tokens, intake PWA for walk-in reception<\/li>\n<li><strong>Remove branding<\/strong> \u2014 hide the Repair Desk credit link on public pages and PDF footers<\/li>\n<\/ul>\n\n<p>Premium features require the separate Pro add-on plugin, available at <a href=\"https:\/\/vollstart.com\/shop\/repair-desk-pro\/\">vollstart.com<\/a>.<\/p>\n\n<h4>How It Works<\/h4>\n\n<ol>\n<li><strong>Intake<\/strong> \u2014 Create a repair, snap photos, assign a repair type with estimated duration<\/li>\n<li><strong>Track<\/strong> \u2014 Move through status flow, log work steps, communicate with customer<\/li>\n<li><strong>Notify<\/strong> \u2014 Customer gets automatic emails and checks QR code for live status<\/li>\n<li><strong>Deliver<\/strong> \u2014 Mark as done, send pickup reminder, track warranty<\/li>\n<\/ol>\n\n<h4>Languages<\/h4>\n\n<p>Vollstart Repair Desk is translated into 20 languages:<\/p>\n\n<ul>\n<li>English (default), German (DE\/AT\/CH), French, Spanish, Italian, Dutch, Portuguese (PT\/BR), Hungarian, Polish, Czech, Swedish, Danish, Finnish, Greek, Romanian, Bulgarian, Chinese (Simplified), Japanese<\/li>\n<\/ul>\n\n<p>All translations are included in the plugin. Community contributions welcome via the WordPress.org translation platform.<\/p>\n\n<h4>Links<\/h4>\n\n<ul>\n<li><a href=\"https:\/\/vollstart.com\/shop\/repair-desk-pro\/\">Premium Add-on<\/a><\/li>\n<li><a href=\"mailto:support@vollstart.com\">Support<\/a><\/li>\n<\/ul>\n\n<h4>Third-Party Libraries<\/h4>\n\n<p>This plugin includes the following third-party libraries, bundled locally within the plugin. No external CDN calls are made.<\/p>\n\n<ul>\n<li><strong>DataTables<\/strong> v2.3.7 \u2014 Table sorting, filtering, and pagination \u2014 MIT License \u2014 <a href=\"https:\/\/github.com\/DataTables\/DataTablesSrc\">Source<\/a><\/li>\n<li><strong>DataTables Responsive<\/strong> v3.0.6 \u2014 Responsive table layout \u2014 MIT License \u2014 <a href=\"https:\/\/github.com\/DataTables\/Responsive\">Source<\/a><\/li>\n<li><strong>QRCode.js<\/strong> v1.0.0 \u2014 QR code generation in browser \u2014 MIT License \u2014 <a href=\"https:\/\/github.com\/davidshimjs\/qrcodejs\">Source<\/a><\/li>\n<li><strong>html5-qrcode<\/strong> v2.3.8 \u2014 QR\/barcode scanner via camera \u2014 Apache 2.0 License \u2014 <a href=\"https:\/\/github.com\/mebjas\/html5-qrcode\">Source<\/a><\/li>\n<li><strong>TCPDF<\/strong> v6.11.3 \u2014 PDF generation \u2014 LGPL-3.0 License \u2014 <a href=\"https:\/\/github.com\/tecnickcom\/TCPDF\">Source<\/a><\/li>\n<\/ul>\n\n<h3>External Services<\/h3>\n\n<p>This plugin does not connect to any third-party or external services. All data is stored locally in your WordPress database. No customer data leaves your server.<\/p>\n\n<p>The optional Pro add-on plugin (sold separately at <a href=\"https:\/\/vollstart.com\/\">vollstart.com<\/a>) connects to vollstart.com solely for license validation and plugin update checks. The free plugin hosted on WordPress.org does not make any external connections.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code> or install directly via the WordPress plugin search.<\/li>\n<li>Activate through the \"Plugins\" menu in WordPress.<\/li>\n<li>Go to \"Repair Desk\" in the admin menu.<\/li>\n<li>Configure your repair status flow and business settings in the Options tab.<\/li>\n<li>Create repair types for your most common jobs.<\/li>\n<li>Start creating repairs \u2014 each one gets a unique QR code for customer tracking.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20customers%20need%20a%20wordpress%20account%3F\"><h3>Do customers need a WordPress account?<\/h3><\/dt>\n<dd><p>No. Customers check their repair status by scanning the QR code or using a direct link. The public status page uses secure token URLs \u2014 no login required.<\/p><\/dd>\n<dt id=\"can%20i%20customize%20the%20repair%20status%20flow%3F\"><h3>Can I customize the repair status flow?<\/h3><\/dt>\n<dd><p>The default flow covers most workshops: received, diagnosis, quote, waiting for parts, in progress, quality check, done, and delivered. With the Pro add-on, you can define your own custom statuses.<\/p><\/dd>\n<dt id=\"how%20does%20the%20qr%20code%20work%3F\"><h3>How does the QR code work?<\/h3><\/dt>\n<dd><p>Each repair gets a unique QR code. Print it as a label and attach it to the item. When the customer scans it, they see the current status, timeline, and any messages from your shop.<\/p><\/dd>\n<dt id=\"can%20reception%20staff%20use%20the%20plugin%20without%20a%20wordpress%20account%3F\"><h3>Can reception staff use the plugin without a WordPress account?<\/h3><\/dt>\n<dd><p>This is a Pro feature. The Pro add-on provides a staff management system with auth tokens and a mobile intake PWA, so reception staff can create repairs from their phone without a WordPress account. The free plugin requires staff to have a WordPress login.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20require%20woocommerce%3F\"><h3>Does the plugin require WooCommerce?<\/h3><\/dt>\n<dd><p>No. Vollstart Repair Desk works fully standalone. WooCommerce integration is available in the Pro add-on for creating orders from repair billing.<\/p><\/dd>\n<dt id=\"can%20i%20track%20parts%20and%20inventory%3F\"><h3>Can I track parts and inventory?<\/h3><\/dt>\n<dd><p>Parts and inventory tracking is available in the Pro add-on. You can manage stock levels per item and track which parts are used in each repair.<\/p><\/dd>\n<dt id=\"is%20customer%20data%20stored%20on%20my%20server%3F\"><h3>Is customer data stored on my server?<\/h3><\/dt>\n<dd><p>Yes. All data is stored in your WordPress database. No external services are used for core functionality. GDPR tools for export, anonymization, and deletion are included in the free version.<\/p><\/dd>\n<dt id=\"can%20customers%20communicate%20with%20my%20shop%3F\"><h3>Can customers communicate with my shop?<\/h3><\/dt>\n<dd><p>Yes. The messaging system lets customers and staff exchange messages per repair. You can configure it as read-only, reply-only, or full two-way messaging.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.3 \u2014 2026-07-06<\/h4>\n\n<ul>\n<li>Settings that were previously only editable via the add-on are now built-in free options: PDF tax ID and label (Settings \u2192 General), and the body text of every email the plugin sends \u2014 status change, new repair, customer message, admin notification on customer message, and pickup reminder (Settings \u2192 Email Notifications and \u2192 Pickup Reminder). The PDF receipt and reports automatically pick them up.<\/li>\n<li>Fixed (WP.org review): removed <code>ini_set('display_errors', '0')<\/code> from the admin AJAX handler. A plugin must not change PHP's global error-reporting configuration \u2014 it would interfere with debugging on the site owner's server. Clean JSON responses are still guaranteed by <code>wpdb-&gt;hide_errors()<\/code> and the existing output buffer that strips any stray noise before the payload, so behaviour is unchanged.<\/li>\n<li>Fixed (WP.org review \u2014 SQL safety): <code>db.php<\/code> no longer suppresses the SQL-injection sniff file-wide. Every <code>$wpdb<\/code> query is built with <code>$wpdb-&gt;prepare()<\/code> and <code>%i<\/code>\/<code>%s<\/code>\/<code>%d<\/code> placeholders; the few unavoidable static-analysis false positives (a generic prepared-query wrapper whose template is a hardcoded internal literal) now each carry a narrowly scoped, justified <code>phpcs:ignore<\/code> on the exact line instead of a blanket <code>phpcs:disable<\/code>. No behaviour change.<\/li>\n<li>Cleanup: removed stray \"(Premium)\" wording from option descriptions, removed the unused <code>hasPremium()<\/code> method, and neutralized add-on\/license references in code comments throughout the free plugin.<\/li>\n<li>Fixed: <code>ratingShowOnStatusPage<\/code> and <code>ratingAllowUpdate<\/code> are now registered in the free options schema \u2014 the public customer-rating widget on the status page is fully controllable without Pro.<\/li>\n<li>Fixed: ratings card in admin repair and customer views no longer requires Pro \u2014 shows based on the <code>enableRatings<\/code> option alone.<\/li>\n<li>Fixed: warranty_until field (display + edit form) and the Maintenance card in the device view were hidden behind a Pro gate, but the full implementation (DB column, PHP CRUD, dismiss-maintenance AJAX) is in the free plugin. Guard removed; all three now available without Pro.<\/li>\n<li>Fixed: maintenance warning badge in the repair view had the same gate \u2014 removed.<\/li>\n<li>Added: warrantyDefaultDays option in Settings \u2192 Warranty &amp; Maintenance. When set &gt; 0, a quick-fill button pre-fills the warranty date to today + N days.<\/li>\n<li>i18n: wrapped all remaining hardcoded user-facing strings in translation functions \u2014 AJAX error responses in the admin and public handlers, and every label, heading and table column in the receipt \/ device \/ customer report PDFs (with <code>translators:<\/code> comments on placeholders). Nothing user-visible is left untranslatable.<\/li>\n<li>Security: the data-URI (base64) image upload path now derives the real MIME type from the decoded bytes via <code>getimagesizefromstring()<\/code> \/ <code>finfo<\/code> instead of trusting the client-declared <code>data:<\/code> prefix, enforces the same 10 MB limit and image-type whitelist as the regular upload path, and rejects anything outside it.<\/li>\n<li>Cleanup: removed the empty <code>loadTextDomain()<\/code> stub and its <code>init<\/code> hook \u2014 WordPress 4.6+ loads translations for WordPress.org-hosted plugins automatically. <code>uninstall.php<\/code> now also removes the <code>vollstart_rd_first_activated_at<\/code> option.<\/li>\n<li>Added: <code>assets\/js\/libs\/CREDITS.txt<\/code> documenting the bundled third-party JS\/CSS libraries, their versions, licenses and upstream sources (WordPress.org guideline for minified bundled assets).<\/li>\n<li>Fixed (WP.org interface review \u2014 root cause of \"Connection error\"): on a fresh install the database schema builder skipped every timestamp column (created_at \/ changed_at \/ time on 13 tables) because the internal column-definition validator rejected the <code>:<\/code> in their <code>00:00:00<\/code> default, so the columns were never created. The very first admin screen query then ordered by the missing <code>repairs.created_at<\/code>, threw a fatal, and the resulting error page replaced the JSON \u2014 which the UI showed as \"Connection error. Please try again.\" The validator now accepts time literals, the timestamp columns default to <code>CURRENT_TIMESTAMP<\/code> (valid on strict MySQL too), and the DB version was bumped so existing installs self-repair on update. Verified end to end on a clean install (activate \u2192 read \u2192 create \u2192 display).<\/li>\n<li>Fixed (WP.org interface review): as defense in depth, the admin screen is now also resilient to stray output corrupting its AJAX responses, which can surface as \"Connection error. Please try again.\" Defense in depth: (1) the AJAX handler silences database error printing for the request (still logged via WP_DEBUG_LOG); (2) it buffers the response and strips any noise emitted before the JSON payload \u2014 e.g. a notice or echo from another active plugin on the site; (3) the admin JavaScript parses responses defensively, recovering the JSON payload even if something prepends or appends text to the body.<\/li>\n<li>Added: a \"WP_DEBUG\" indicator badge in the admin header so it is obvious at a glance when debug mode is active (mirrors the value already shown in Support Info).<\/li>\n<\/ul>\n\n<h4>1.0.2 \u2014 2026-05-13<\/h4>\n\n<ul>\n<li>WP.org compliance: removed all hard caps. The free plugin no longer enforces per-month repair limits, customer limits, repair-type limits, photo-per-repair limits, or staff limits \u2014 and the boot-data array that exposed those limits to JS is gone. The dashboard's Pro-features box no longer documents trialware-style caps.<\/li>\n<li>Migrated the License-Key field and the entire Staff system (CRUD, AuthTokens, Intake PWA, DB table) to the separate Vollstart Repair Desk Pro plugin at vollstart.com. The free plugin no longer ships any license or staff code.<\/li>\n<li>Migrated invoice-PDF generation (tax-rate \/ tax-label \/ VAT-ID rendering, ~300 LOC) from the free plugin to the Pro add-on. The free plugin retains the repair-receipt PDF and the device \/ customer report PDFs; their render helpers are now public so Pro can compose the invoice from the same building blocks.<\/li>\n<li>Options framework: switched to a section-based extension filter (<code>vollstart_rd_option_sections<\/code>) \u2014 Pro can inject options into existing Free sections by key (Tax under General, email-body templates under Email Notifications, pickup-reminder body under Pickup Reminder, customer-facing rating settings under Ratings) and register its own new sections (License at top, Invoice PDF, SMS, Cost Tracking, Billing, Catalog, Maintenance, Warranty, Customer Points, Staff Intake, Customer Portal, Branding). Options UI sticky-nav is alphabetical; the form content follows the array order so License lands at the top.<\/li>\n<li>New extension hooks for Pro: <code>vollstart_rd_enrich_repair<\/code>, <code>vollstart_rd_enrich_repair_response<\/code>, <code>vollstart_rd_enrich_status_log_entry<\/code>, <code>vollstart_rd_pdf_repair_data<\/code>, <code>vollstart_rd_handle_two_segment_route<\/code>, <code>vollstart_rd_query_vars<\/code>, <code>vollstart_rd_options_for_js<\/code>, <code>vollstart_rd_option_sections<\/code>, <code>vollstart_rd_support_info<\/code>.<\/li>\n<li>Security: new <code>VollstartRD::sanitizePostArray()<\/code> helper sanitizes <code>$_POST<\/code> at every AJAX entry point (wp_unslash + sanitize_text_field, with sanitize_textarea_field for declared textarea fields) before reaching manager methods.<\/li>\n<li>Security: all dynamic table\/column names in <code>db.php<\/code> now use <code>%i<\/code> identifier placeholders in <code>$wpdb-&gt;prepare()<\/code> (WordPress 6.2+).<\/li>\n<li>Compatibility: switched the WooCommerce-detection checks from <code>class_exists('WooCommerce')<\/code> to <code>function_exists('WC')<\/code> so the check no longer triggers the WP 6.7 \"translation loaded too early\" notice.<\/li>\n<li>Frontend: the status-page QR-overlay URL no longer assumes <code>wp-admin\/admin-ajax.php<\/code> location \u2014 uses <code>home_url('\/')<\/code> via a new <code>siteUrl<\/code> localize key.<\/li>\n<li>Repair Receipt + basic PDF format options (paper size, font, margin, direction, the 8 receipt visibility toggles and footer text) live in Free again so the receipt PDF renders correctly without Pro installed.<\/li>\n<li>README: dropped the \"Unlimited limits\" trialware doc and scrubbed Pro features (Customer Portal, Repair Intake PWA, Staff Management) from the Core Features \/ Description \/ Screenshots so the free plugin only advertises features it actually ships.<\/li>\n<li>API: <code>VollstartRD_Options::makeOption()<\/code> is now public so add-on plugins can build option entries without duplicating the helper.<\/li>\n<li>API: <code>VollstartRD_Notifications<\/code> exposes <code>getBusinessEmail()<\/code>, <code>getBusinessName()<\/code>, <code>getBusinessPhone()<\/code> (new), <code>getCustomerForRepair()<\/code>, <code>replacePlaceholders()<\/code>, <code>sendHtmlEmail()<\/code>, <code>logEmail()<\/code> as public so add-on plugins can build their own notification emails without duplicating ~150 lines of helper code.<\/li>\n<\/ul>\n\n<h4>1.0.1 - 2026-05-05<\/h4>\n\n<ul>\n<li>WP.org compliance: removed all premium feature gates and trialware locks. Limits are filterable defaults (<code>vollstart_rd_max_repairs_per_month<\/code>, <code>_max_customers<\/code>, <code>_max_repair_types<\/code>, <code>_max_photos_per_repair<\/code>, <code>_max_staff<\/code>) with neutral error messages, no \"Upgrade to Pro\" wording.<\/li>\n<li>Premium code extracted from free plugin: catalog\/inventory, cost tracking &amp; work items, billing summary, custom statuses, step materials, hourly rate \/ time-based pricing, customer portal (PWA), maintenance reminders, warranty tracking, WooCommerce integration, external rating system, PDF customization (paper, font, margins, RTL, show staff\/timeline) and email body customization. The Pro add-on registers these via filters and a JS handler \u2014 the free plugin no longer ships unused premium code.<\/li>\n<li>PDF generation moved to the free plugin: receipts, device reports and customer reports work without Pro. PDF customization options and invoice PDFs (with cost tracking) remain Pro.<\/li>\n<li>Footer label: <code>VollstartRD::getFooterLabelHtml()<\/code> and <code>getFooterLabelText()<\/code> render an optional credit link on the status page, customer portal, and PDF footer \u2014 filtered through <code>vollstart_rd_footer_label_html<\/code> \/ <code>vollstart_rd_footer_label_text<\/code>. Shown only when the admin enables the <code>showFooterLabel<\/code> option (off by default).<\/li>\n<li>Admin shell rewritten: <code>renderPage()<\/code> ships only <code>&lt;div id=\"rd-app\"&gt;<\/code> with a centered spinner; JS <code>bootApp()<\/code> renders header, tabs, content, footer and roadmap overlay after the Pro JS has loaded. Pro extends through <code>_proHandler.getTabs\/beforeRender\/afterRender<\/code> callbacks.<\/li>\n<li>New extension filter <code>vollstart_rd_options<\/code> so the Pro plugin can register its own option rows + section headings without touching the free options class.<\/li>\n<li>Roadmap rewrite: PDF receipts\/reports, repair intake PWA, device repair history and internal rating moved to free tier; customer portal, custom statuses, cost tracking, billing, WooCommerce, maintenance\/warranty reminders, external rating remain premium.<\/li>\n<li>Removed silent Pro plugin auto-upgrade that was triggered when a license key was saved. Updates go through the standard WordPress plugin update flow.<\/li>\n<li>Library: TCPDF updated from 6.7.7 to 6.11.3. Single-source <code>getTcpdfVersion()<\/code> helper in support info shows the bundled version, plus a warning when a sister plugin has loaded a different copy (\"6.11.3 (loaded: 6.4.4)\").<\/li>\n<li>Security: hardened upload handler \u2014 <code>$_FILES<\/code> metadata is sanitized at the entry point and the mime type is always re-derived from the filename via <code>wp_check_filetype()<\/code> (no fallback to attacker-controlled <code>$_FILES[...]['type']<\/code>). Pro AJAX filter receives <code>wp_unslash()<\/code>-cleaned data.<\/li>\n<li>New: \"First Activated\" date in Support Info \u2014 shows when the plugin was first activated, included in the copyable support text. Marked as \"(estimate)\" for installs predating this version.<\/li>\n<li>UI: card-action buttons consistently right-aligned via <code>.rd-card-actions<\/code> wrapper; toolbar switched to <code>display: block<\/code> + <code>text-align: right<\/code>; new <code>.rd-info-box<\/code> helper with a single <code>infoBox(html)<\/code> JS function used at the top of Repair Types and Work Steps tabs. PDF footer now carries the branding link centered under the document code.<\/li>\n<li>Internal: added <code>vollstart_rd_pre_create_repair<\/code> \/ <code>post_create_repair<\/code>, <code>pre_update_repair<\/code> \/ <code>post_update_repair<\/code>, <code>pre_change_status<\/code> \/ <code>post_change_status<\/code>, <code>vollstart_rd_status_definitions<\/code>, <code>vollstart_rd_admin_boot_data<\/code>, <code>vollstart_rd_license_info<\/code>, <code>vollstart_rd_ajax_action<\/code> extension hooks for the Pro plugin.<\/li>\n<\/ul>\n\n<h4>1.0.0 - 2026-04-20<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>Repair management with configurable status flow and timeline<\/li>\n<li>Customer database with contact info and repair history<\/li>\n<li>Device and product tracking linked to repairs and customers<\/li>\n<li>Repair types catalog with estimated duration and pricing<\/li>\n<li>Work steps with checklists, time tracking, and auto-progress<\/li>\n<li>Photo uploads for intake documentation<\/li>\n<li>QR code per repair with public status page<\/li>\n<li>Customer portal as progressive web app with secure token access<\/li>\n<li>Customer messaging system (configurable: read-only, reply, or full)<\/li>\n<li>Email notifications on status changes<\/li>\n<li>Pickup reminder emails via WP-Cron<\/li>\n<li>Staff management with auth tokens<\/li>\n<li>CSV export for repairs, customers, and devices<\/li>\n<li>GDPR tools: data export, anonymization, and deletion<\/li>\n<li>WordPress dashboard widget<\/li>\n<li>Bulk actions: status change, print QR labels, delete<\/li>\n<li>Rating system for internal staff rating and customer feedback<\/li>\n<\/ul>","raw_excerpt":"Repair tracking and customer notifications for workshops. QR code status page, work steps, photos, and email reminders \u2014 all in one plugin.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/mri.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/299662","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mri.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/mri.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/mri.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=299662"}],"author":[{"embeddable":true,"href":"https:\/\/mri.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/sasonikolov"}],"wp:attachment":[{"href":"https:\/\/mri.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=299662"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/mri.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=299662"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/mri.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=299662"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/mri.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=299662"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/mri.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=299662"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/mri.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=299662"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}