{"id":344574,"date":"2026-07-24T21:23:48","date_gmt":"2026-07-24T21:23:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/tax-exemption-certificates-for-woocommerce\/"},"modified":"2026-07-24T21:23:33","modified_gmt":"2026-07-24T21:23:33","slug":"rankd-tax-exemption-certificates-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/rankd-tax-exemption-certificates-for-woocommerce\/","author":23191840,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.2","stable_tag":"1.1.2","tested":"7.0.2","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Rankd Tax Exemption Certificates for WooCommerce","header_author":"Rankd.site","header_description":"Complete tax exemption management for WooCommerce. Role-based exemption, per-user overrides, customer certificate submission, approval workflow, enforced expiry, and audit trail. Free and Pro tiers via Freemius.","assets_banners_color":"","last_updated":"2026-07-24 21:23:33","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/rankd.site\/plugins-from-rankd-site\/tax-exempt-certificate-manager-for-woocommerce\/","header_author_uri":"https:\/\/rankd.site","rating":0,"author_block_rating":0,"active_installs":0,"downloads":52,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.1.2":{"tag":"1.1.2","author":"coolhuntersgt","date":"2026-07-24 21:23:33"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3621946,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3621946,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.1.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3621946,"resolution":"1","location":"assets","locale":"","width":1185,"height":303},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3621946,"resolution":"2","location":"assets","locale":"","width":1018,"height":736},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3621946,"resolution":"3","location":"assets","locale":"","width":1160,"height":574},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3621946,"resolution":"4","location":"assets","locale":"","width":786,"height":971},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3621946,"resolution":"5","location":"assets","locale":"","width":1752,"height":756},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3621946,"resolution":"6","location":"assets","locale":"","width":1757,"height":516},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3621946,"resolution":"7","location":"assets","locale":"","width":456,"height":304}},"screenshots":{"1":"The Tax Exemption section on a user's profile screen (Users \u2192 Edit User) \u2014 the Always\/Never\/follow-role-rules override and internal note field. Free.","2":"The Tax Exemption status column and filter dropdown on the Users list screen. Free.","3":"The plugin's settings tab at WooCommerce \u2192 Settings \u2192 Tax Exempt Certs \u2014 Tax-Exempt Roles and Who Can Manage Exemptions. Free.","4":"The customer-facing Tax Exemption tab under My Account, with the certificate submission form. Pro.","5":"The admin Certificate Review Queue \u2014 pending, approved, and rejected certificates with Approve\/Reject\/Revoke actions. Pro.","6":"The Role Exempt tab \u2014 role members who haven't yet provided certificate evidence, with per-row and bulk actions. Pro.","7":"The dashboard widget showing pending certificates and expiring-soon alerts. Pro."}},"plugin_section":[],"plugin_tags":[44546,26410,66629,222337,286],"plugin_category":[45],"plugin_contributors":[263191,78154],"plugin_business_model":[],"class_list":["post-344574","plugin","type-plugin","status-publish","hentry","plugin_tags-certificates","plugin_tags-sales-tax","plugin_tags-tax-exempt","plugin_tags-tax-exemption","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-coolhuntersgt","plugin_contributors-freemius","plugin_committers-coolhuntersgt"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/rankd-tax-exemption-certificates-for-woocommerce\/assets\/icon-128x128.png?rev=3621946","icon_2x":"https:\/\/ps.w.org\/rankd-tax-exemption-certificates-for-woocommerce\/assets\/icon-256x256.png?rev=3621946","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/rankd-tax-exemption-certificates-for-woocommerce\/assets\/screenshot-1.png?rev=3621946","caption":"The Tax Exemption section on a user's profile screen (Users \u2192 Edit User) \u2014 the Always\/Never\/follow-role-rules override and internal note field. Free."},{"src":"https:\/\/ps.w.org\/rankd-tax-exemption-certificates-for-woocommerce\/assets\/screenshot-2.png?rev=3621946","caption":"The Tax Exemption status column and filter dropdown on the Users list screen. Free."},{"src":"https:\/\/ps.w.org\/rankd-tax-exemption-certificates-for-woocommerce\/assets\/screenshot-3.png?rev=3621946","caption":"The plugin's settings tab at WooCommerce \u2192 Settings \u2192 Tax Exempt Certs \u2014 Tax-Exempt Roles and Who Can Manage Exemptions. Free."},{"src":"https:\/\/ps.w.org\/rankd-tax-exemption-certificates-for-woocommerce\/assets\/screenshot-4.png?rev=3621946","caption":"The customer-facing Tax Exemption tab under My Account, with the certificate submission form. Pro."},{"src":"https:\/\/ps.w.org\/rankd-tax-exemption-certificates-for-woocommerce\/assets\/screenshot-5.png?rev=3621946","caption":"The admin Certificate Review Queue \u2014 pending, approved, and rejected certificates with Approve\/Reject\/Revoke actions. Pro."},{"src":"https:\/\/ps.w.org\/rankd-tax-exemption-certificates-for-woocommerce\/assets\/screenshot-6.png?rev=3621946","caption":"The Role Exempt tab \u2014 role members who haven't yet provided certificate evidence, with per-row and bulk actions. Pro."},{"src":"https:\/\/ps.w.org\/rankd-tax-exemption-certificates-for-woocommerce\/assets\/screenshot-7.png?rev=3621946","caption":"The dashboard widget showing pending certificates and expiring-soon alerts. Pro."}],"raw_content":"<!--section=description-->\n<p>Rankd Tax Exemption Certificates for WooCommerce provides a complete, audit-ready tax exemption workflow for WooCommerce stores.<\/p>\n\n<p><strong>Compatibility notice:<\/strong> This plugin cannot guarantee compatibility with plugins that write directly to the WooCommerce customer session object rather than using the standard <code>woocommerce_customer_is_vat_exempt<\/code> filter. If your store uses such a plugin, this plugin may not function correctly for affected customers. See the Plugin Compatibility section below for details and resolution options.<\/p>\n\n<p><strong>FREE FEATURES:<\/strong><\/p>\n\n<ul>\n<li>Role-based exemption \u2014 mark whole user roles (e.g. wholesale, non-profit) tax exempt from one setting (trust-based; Pro adds certificate-backed compliance for role members)<\/li>\n<li>Per-user override on the user profile: Always exempt, Never exempt (hard block), or follow role rules<\/li>\n<li>Tax Exemption status column and filter on the Users list screen<\/li>\n<li>Configurable admin access \u2014 choose which roles may manage exemption data<\/li>\n<li>Uninstalling never deletes your data unless you explicitly opt in via a setting<\/li>\n<li>Optional internal admin note field (not visible to customer)<\/li>\n<li>WooCommerce session-level exemption \u2014 tax removed at cart and checkout automatically<\/li>\n<li>HPOS (High-Performance Order Storage) compatible<\/li>\n<li>Read-only status notice on My Account \u2192 Account Details<\/li>\n<li>Settings tab under WooCommerce \u2192 Settings \u2192 Tax Exempt Certs<\/li>\n<li>User Switching plugin compatibility<\/li>\n<li>PDF invoice integration (WooCommerce PDF Invoices &amp; Packing Slips, WP Overnight)<\/li>\n<li>Developer filter hooks for external system integration<\/li>\n<\/ul>\n\n<p><strong>PRO FEATURES (via Freemius license):<\/strong><\/p>\n\n<ul>\n<li>Customer-facing Tax Exemption tab in My Account<\/li>\n<li>Certificate submission form \u2014 org name, exemption certificate number, exemption type, country, state\/province<\/li>\n<li>Country-aware form \u2014 state dropdown and exemption types update dynamically per country<\/li>\n<li>International support \u2014 country-specific exemption types for US, CA, AU, GB, IN, all EU member states<\/li>\n<li>PDF and JPG certificate upload (max 5MB, stored in a protected directory served only through a permission-checked download handler)<\/li>\n<li>Pending \/ Approved \/ Rejected \/ Expired \/ Revoked \/ Superseded status system<\/li>\n<li>Admin review queue with pagination: WooCommerce \u2192 Tax Exempt Certs<\/li>\n<li>Approve \/ reject \/ revoke workflow \u2014 individual and bulk actions<\/li>\n<li>Admin manual certificate entry with Select2 AJAX user search<\/li>\n<li>Enforced expiry \u2014 exemption auto-disables on expiry date via WP-Cron<\/li>\n<li>Expired certificate renewal UX \u2014 prefilled resubmission form<\/li>\n<li>Renewal grace period \u2014 keep exempting while a renewal is under review (configurable)<\/li>\n<li>Past expiry date validation (client-side and server-side)<\/li>\n<li>Configurable expiry warning buffer (default: 30 days, max 90)<\/li>\n<li>Full email suite (WooCommerce template styled):\n\n<ul>\n<li>Customer: submission received, approved, rejected, expiry warning, expired<\/li>\n<li>Customer: certificate revoked (optional \u2014 disabled by default, enable in WooCommerce \u2192 Settings \u2192 Emails)<\/li>\n<li>Admin: new submission notification<\/li>\n<\/ul><\/li>\n<li>Automated document retention \u2014 optionally purge aged certificate files X years after they become inactive, while permanently preserving the certificate record and audit trail<\/li>\n<li>Dashboard widget \u2014 pending count, expiring soon alerts, status breakdown, export buttons<\/li>\n<li>CSV exports \u2014 expiry report, active accounts, full audit log<\/li>\n<li>Timestamped audit log per user (exportable per-user or full log)<\/li>\n<\/ul>\n\n<h3>Requirements<\/h3>\n\n<ul>\n<li>WordPress 6.0 or higher<\/li>\n<li>PHP 7.4 or higher<\/li>\n<li>WooCommerce 7.0 or higher (must be installed and active)<\/li>\n<\/ul>\n\n<p>WooCommerce is the only required dependency.<\/p>\n\n<h3>Usage<\/h3>\n\n<h4>Marking a customer as tax exempt (Free)<\/h4>\n\n<ol>\n<li>Go to Users \u2192 All Users<\/li>\n<li>Click Edit on any user<\/li>\n<li>Scroll to the Tax Exemption section<\/li>\n<li>Check the Tax Exempt checkbox<\/li>\n<li>Optionally add an internal note<\/li>\n<li>Click Update User<\/li>\n<\/ol>\n\n<p>Tax is removed from that customer's cart and checkout on their next page load.<\/p>\n\n<h4>Certificate submission workflow (Pro)<\/h4>\n\n<p>Customer flow:<\/p>\n\n<ol>\n<li>Customer logs in and goes to My Account \u2192 Tax Exemption<\/li>\n<li>Completes the form and uploads their certificate (PDF or JPG)<\/li>\n<li>Receives confirmation email<\/li>\n<li>Status shows as Pending until reviewed<\/li>\n<\/ol>\n\n<p>Admin flow:<\/p>\n\n<ol>\n<li>Admin receives notification email<\/li>\n<li>Goes to WooCommerce \u2192 Tax Exempt Certs<\/li>\n<li>Reviews the pending submission, views the certificate document<\/li>\n<li>Approves (verifying the expiry date) or rejects (providing a reason)<\/li>\n<li>Customer receives approval or rejection email<\/li>\n<\/ol>\n\n<p>Expiry:<\/p>\n\n<ul>\n<li>WP-Cron runs nightly and auto-expires certificates past their expiry date<\/li>\n<li>Warning emails fire X days before expiry (configurable, default 30 days)<\/li>\n<li>Expired customers see a prefilled resubmission form in My Account<\/li>\n<li>If a renewal is pending review when the old certificate expires, exemption continues for the configured grace period<\/li>\n<\/ul>\n\n<p>Role compliance (Pro):<\/p>\n\n<ul>\n<li>Members of Tax-Exempt Roles are NOT exempted until there is evidence: an approved certificate covering the order's jurisdiction, or your recorded override<\/li>\n<li>The Role Exempt tab of the review queue lists role members needing attention, with per-row and bulk actions: Add Certificate, Email for Certificate, or Override (\"accept the risk\", scoped to all or specific jurisdictions \u2014 the decision is written to the audit log)<\/li>\n<li>A certificate request email points the customer to the My Account submission form<\/li>\n<li>If the certificate backing a member later expires or is revoked, they automatically reappear for review<\/li>\n<\/ul>\n\n<h4>Settings<\/h4>\n\n<p>WooCommerce \u2192 Settings \u2192 Tax Exempt Certs:<\/p>\n\n<ul>\n<li>Tax-Exempt Roles: Users holding any of these roles are automatically tax exempt (free version). In Pro, role members are exempted only once there is evidence on file \u2014 an approved certificate covering the order's jurisdiction, or an override you record \u2014 so a role assignment alone never silently removes tax. Individual users can be excluded via the Never Exempt override on their profile. Default: none.<\/li>\n<\/ul>\n\n<p>Pro adds:<\/p>\n\n<ul>\n<li>Expiry Warning (days): How many days before expiry to send the renewal reminder and allow early renewal submissions (1\u201390).<\/li>\n<li>Admin Notification Email: Where to send new submission alerts.<\/li>\n<li>Customer Contact Email: Address shown to customers when their exemption is revoked.<\/li>\n<li>Renewal Grace Period (days): How long to keep exempting after expiry while a renewal is pending review (0 disables).<\/li>\n<\/ul>\n\n<h3>Wholesale &amp; Third-Party Compatibility<\/h3>\n\n<p>This plugin includes a developer filter for external systems to opt individual users out of its management entirely.<\/p>\n\n<p>Example \u2014 wholesale plugin integration:<\/p>\n\n<pre><code>add_filter( 'rankd_tx_skip_user', function( $skip, $user_id ) {\n    \/\/ Tell this plugin to ignore users managed by your wholesale system.\n    if ( has_wholesale_exemption( $user_id ) ) return true;\n    return $skip;\n}, 10, 2 );\n<\/code><\/pre>\n\n<p>The plugin also supports additional exemption sources via:<\/p>\n\n<pre><code>add_filter( 'rankd_tx_exemption_sources', function( $sources, $user_id ) {\n    if ( has_wholesale_exemption( $user_id ) ) $sources[] = 'wholesale';\n    return $sources;\n}, 10, 2 );\n<\/code><\/pre>\n\n<p>Exemption is applied if ANY source returns active. This plugin never removes an exemption granted by another system.<\/p>\n\n<h3>Data Storage<\/h3>\n\n<p>USER META (wp_usermeta):<\/p>\n\n<ul>\n<li><code>_rankd_tx_is_exempt<\/code> \u2014 String. Per-user override: <code>always<\/code>, <code>never<\/code>, or absent (follow role rules). Legacy <code>1<\/code> values from the pre-1.5.0 checkbox are read as <code>always<\/code>.<\/li>\n<li><code>_rankd_tx_exempt_note<\/code> \u2014 String. Admin note. Never shown to customer.<\/li>\n<\/ul>\n\n<p>CUSTOM TABLES (Pro):<\/p>\n\n<ul>\n<li><code>{prefix}rankd_tx_certificates<\/code> \u2014 One row per certificate submission.<\/li>\n<li><code>{prefix}rankd_tx_audit_log<\/code> \u2014 One row per status change event.<\/li>\n<\/ul>\n\n<p>UPLOADS (Pro):<\/p>\n\n<ul>\n<li>wp-content\/uploads\/rankd-tax-exempt-certs\/<\/li>\n<li>Protected by .htaccess (Apache\/LiteSpeed) plus an index.php fallback. Files are served only through a permission-checked PHP download handler. Nginx requires a one-time server rule \u2014 see Server Compatibility below.<\/li>\n<\/ul>\n\n<h3>Invoice Plugin Integration<\/h3>\n\n<p>Tax exemption details are automatically added to PDF invoices for:<\/p>\n\n<ul>\n<li>WooCommerce PDF Invoices &amp; Packing Slips (WP Overnight) \u2014 fires after order details table on invoices, proformas, and credit notes<\/li>\n<li>WooCommerce PDF Invoices (WP Overnight older plugin) \u2014 fires after order table<\/li>\n<li>WooCommerce order confirmation and My Account receipt pages \u2014 visible to the ordering customer and store managers only<\/li>\n<\/ul>\n\n<p>The notice includes: Organization name, Certificate number, Jurisdiction, Certificate expiry date. It always reflects the certificate that covered the order at purchase time, even if the customer's status changes later.<\/p>\n\n<p>Developer filters:<\/p>\n\n<ul>\n<li><code>rankd_tx_show_invoice_notice<\/code> \u2014 return false to suppress entirely<\/li>\n<li><code>rankd_tx_invoice_document_types<\/code> \u2014 array of document types to show on (default: invoice, proforma, credit-note)<\/li>\n<li><code>rankd_tx_invoice_notice_html<\/code> \u2014 replace the full notice HTML (args: $html, $order)<\/li>\n<\/ul>\n\n<h3>Plugin Compatibility &amp; Tax Exemption Conflicts<\/h3>\n\n<p><strong>Important:<\/strong> This plugin cannot guarantee compatibility with plugins that write directly to the WooCommerce customer session object rather than using the <code>woocommerce_customer_is_vat_exempt<\/code> filter. These plugins bypass the filter system entirely and no priority adjustment will resolve the conflict.<\/p>\n\n<h4>How this plugin handles conflicts<\/h4>\n\n<p>WooCommerce determines tax exemption via a single boolean flag on the customer session. This plugin hooks into this system at filter priority 20, which means:<\/p>\n\n<ul>\n<li>Any plugin setting exemption to true at priority 10 or lower will be respected \u2014 this plugin will not override it<\/li>\n<li>Any plugin setting exemption to false at priority 10 or lower may prevent this plugin from applying its own exemption, even if the customer is marked exempt here<\/li>\n<\/ul>\n\n<p>This is by design. This plugin deliberately avoids overriding other systems that have already made an exemption decision.<\/p>\n\n<h4>Developer integration \u2014 excluding users<\/h4>\n\n<p>If you are building or maintaining a plugin that manages tax exemption for certain users, you can tell this plugin to step aside entirely for those users using the <code>rankd_tx_skip_user<\/code> filter:<\/p>\n\n<pre><code>add_filter( 'rankd_tx_skip_user', function( $skip, $user_id ) {\n    if ( my_plugin_manages_this_user( $user_id ) ) {\n        return true;\n    }\n    return $skip;\n}, 10, 2 );\n<\/code><\/pre>\n\n<p>When <code>rankd_tx_skip_user<\/code> returns true for a user:<\/p>\n\n<ul>\n<li>The Tax Exemption Override does not appear on their WordPress user profile<\/li>\n<li>This plugin does not fire any checkout exemption logic for them<\/li>\n<li>Their tax status is entirely controlled by your plugin<\/li>\n<\/ul>\n\n<h4>Recommended approach for site owners<\/h4>\n\n<ol>\n<li>Use <code>rankd_tx_skip_user<\/code> to exclude users managed by the other plugin. This is the cleanest solution and eliminates the conflict at the source.<\/li>\n<li>Manage each user in only one system. Regular customers through this plugin; special user types, like wholesale customers, through the plugin that handles their exemption.<\/li>\n<li>Check filter priority. If the conflicting plugin uses the <code>woocommerce_customer_is_vat_exempt<\/code> filter, adjusting its priority relative to this plugin (priority 20) may resolve the conflict. Contact the other plugin's developer for guidance.<\/li>\n<\/ol>\n\n<h3>Server Compatibility<\/h3>\n\n<h4>Apache \/ LiteSpeed<\/h4>\n\n<p>Fully supported. The plugin writes an .htaccess file to the certificate upload directory that blocks all direct HTTP access. No additional configuration required.<\/p>\n\n<h4>Nginx<\/h4>\n\n<p>The .htaccess file has no effect on Nginx servers. If your site runs Nginx, add the following block to your server configuration to protect uploaded certificate files:<\/p>\n\n<pre><code>location ~* \/uploads\/rankd-tax-exempt-certs\/ {\n    deny all;\n    return 403;\n}\n<\/code><\/pre>\n\n<p>The plugin displays a persistent admin notice if it detects an Nginx server or a missing .htaccess file, with instructions for your hosting provider or server administrator. The notice can be dismissed once the configuration is confirmed.<\/p>\n\n<h4>Other servers<\/h4>\n\n<p>A fallback index.php is also written to the directory to prevent directory listing on servers that process neither .htaccess nor Nginx location blocks.<\/p>\n\n<h3>Scheduled Tasks<\/h3>\n\n<p>Certificate expiry enforcement and warning emails run as daily scheduled actions via <strong>Action Scheduler<\/strong> \u2014 the background job system built into WooCommerce. No hosting configuration, wp-config changes, or extra plugins are required.<\/p>\n\n<p>You can view, monitor, and manually run the plugin's scheduled actions at <strong>WooCommerce \u2192 Status \u2192 Scheduled Actions<\/strong> (search for \"rankd_tx\").<\/p>\n\n<p>As a safety net, if the checks have not completed in over 36 hours the plugin displays an admin notice with a one-click <strong>Run checks now<\/strong> button, so a store manager can trigger the expiry check and warning emails immediately from the dashboard.<\/p>\n\n<p>For additional reliability on very low-traffic sites, a server-side cron job in your hosting control panel is optional hardening:<\/p>\n\n<pre><code>curl -s \"https:\/\/yoursite.com\/wp-cron.php?doing_wp_cron\" &gt; \/dev\/null&lt;h3&gt;Developer Reference&lt;\/h3&gt;\n<\/code><\/pre>\n\n<p>Filters:<\/p>\n\n<ul>\n<li><code>rankd_tx_skip_user<\/code> \u2014 Return true to exclude a user from this plugin.<\/li>\n<li><code>rankd_tx_exemption_sources<\/code> \u2014 Add external exemption sources.<\/li>\n<li><code>rankd_tx_tax_id_labels<\/code> \u2014 Modify the per-country tax ID label map.<\/li>\n<li><code>rankd_tx_exemption_types_map<\/code> \u2014 Modify the per-country exemption type lists.<\/li>\n<li><code>rankd_tx_generic_exempt_types<\/code> \u2014 Modify the generic exemption type fallback list.<\/li>\n<li><code>rankd_tx_settings<\/code> \u2014 Add\/modify settings fields.<\/li>\n<li><code>rankd_tx_review_queue_per_page<\/code> \u2014 Change review queue page size (default 50).<\/li>\n<li><code>rankd_tx_show_invoice_notice<\/code>, <code>rankd_tx_invoice_document_types<\/code>, <code>rankd_tx_invoice_notice_html<\/code> \u2014 see Invoice Plugin Integration.<\/li>\n<\/ul>\n\n<p>Actions:<\/p>\n\n<ul>\n<li><code>rankd_tx_certificate_submitted<\/code> \u2014 Fires on new submission. Args: $user_id, $cert_id<\/li>\n<li><code>rankd_tx_certificate_approved<\/code> \u2014 Fires on approval. Args: $user_id, $cert_id, $expiry_date<\/li>\n<li><code>rankd_tx_certificate_rejected<\/code> \u2014 Fires on rejection. Args: $user_id, $cert_id, $reason<\/li>\n<li><code>rankd_tx_certificate_revoked<\/code> \u2014 Fires on revocation. Args: $user_id, $cert_id, $reason<\/li>\n<li><code>rankd_tx_certificate_expiry_warning<\/code> \u2014 Fires on warning. Args: $user_id, $cert_id, $expiry_date<\/li>\n<li><code>rankd_tx_certificate_expired<\/code> \u2014 Fires on expiry. Args: $user_id, $cert_id<\/li>\n<\/ul>\n\n<h3>Uninstalling<\/h3>\n\n<p>By default, deleting the plugin via the WordPress admin Plugins screen removes\nNOTHING beyond scheduled tasks \u2014 deactivating never removes data, and neither\ndoes deleting, unless you explicitly opt in.<\/p>\n\n<p>To permanently remove all plugin data on uninstall, enable \"Remove Data on\nUninstall\" at WooCommerce \u2192 Settings \u2192 Tax Exempt Certs before deleting the\nplugin. With that enabled, uninstalling removes:<\/p>\n\n<ul>\n<li>All plugin options<\/li>\n<li>All user meta (<code>_rankd_tx_is_exempt<\/code>, <code>_rankd_tx_exempt_note<\/code>)<\/li>\n<li>All order meta (<code>_rankd_tx_was_exempt<\/code>, <code>_rankd_tx_sources<\/code>, <code>_rankd_tx_cert_id<\/code>)<\/li>\n<li>Both custom database tables (Pro)<\/li>\n<li>Scheduled cron jobs<\/li>\n<\/ul>\n\n<p>Uploaded certificate files are never deleted automatically, even with this\nsetting enabled \u2014 remove them manually if required:\n    wp-content\/uploads\/rankd-tax-exempt-certs\/<\/p>\n\n<p>Uploaded certificate files in wp-content\/uploads\/rankd-tax-exempt-certs\/ are NOT automatically deleted as they may be needed for compliance records. Delete the directory manually if required.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the rankd-tax-exemption-certificates-for-woocommerce folder to \/wp-content\/plugins\/<\/li>\n<li>Activate via Plugins \u2192 Installed Plugins<\/li>\n<li>Optionally mark whole roles tax exempt at WooCommerce \u2192 Settings \u2192 Tax Exempt Certs<\/li>\n<li>For Pro: purchase a license and activate it from the license activation link on the settings tab<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%27s%20the%20difference%20between%20the%20free%20and%20pro%20exemption%20models%3F\"><h3>What's the difference between the Free and Pro exemption models?<\/h3><\/dt>\n<dd><p>Free is trust-based: mark a role as tax-exempt and every member of that role is exempted immediately, no evidence required. Pro adds a certificate-backed compliance layer \u2014 role members aren't exempted until there's an approved certificate on file covering the order's jurisdiction, or a recorded override accepting the risk. Individual users can always be excluded via the Never Exempt override regardless of tier.<\/p><\/dd>\n<dt id=\"will%20this%20conflict%20with%20my%20wholesale%20plugin%20or%20another%20tax%2Fvat%20plugin%3F\"><h3>Will this conflict with my wholesale plugin or another tax\/VAT plugin?<\/h3><\/dt>\n<dd><p>Usually not \u2014 this plugin is designed to defer to exemptions granted by other systems rather than override them. It can conflict with plugins that write directly to the WooCommerce customer session object instead of using the standard <code>woocommerce_customer_is_vat_exempt<\/code> filter. See the Plugin Compatibility section below if a customer's exemption isn't applying correctly.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20data%20if%20i%20deactivate%20or%20delete%20the%20plugin%3F\"><h3>What happens to my data if I deactivate or delete the plugin?<\/h3><\/dt>\n<dd><p>Deactivating never touches your data. Deleting the plugin also leaves all data in place by default \u2014 certificates, overrides, settings, and the audit log are only removed if you explicitly opt in via the \"Remove Data on Uninstall\" setting before deleting.<\/p><\/dd>\n<dt id=\"which%20staff%20roles%20can%20manage%20tax%20exemption%3F\"><h3>Which staff roles can manage tax exemption?<\/h3><\/dt>\n<dd><p>Configurable at WooCommerce \u2192 Settings \u2192 Tax Exempt Certs \u2192 Who Can Manage Exemptions. Administrator is always included and can't be removed. Roles left out of that setting still get read-only access to certificate and status information, but can't make changes.<\/p><\/dd>\n<dt id=\"is%20this%20compatible%20with%20high-performance%20order%20storage%20%28hpos%29%3F\"><h3>Is this compatible with High-Performance Order Storage (HPOS)?<\/h3><\/dt>\n<dd><p>Yes.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20a%20certificate%20expires%3F\"><h3>What happens when a certificate expires?<\/h3><\/dt>\n<dd><p>A scheduled daily check automatically expires certificates past their expiry date and removes the customer's exemption. If Expiry Warning is configured, a reminder email goes out X days beforehand, and the customer sees a prefilled renewal form in My Account. A configurable grace period can keep exemption active while a renewal is under review.<\/p><\/dd>\n<dt id=\"can%20a%20customer%20be%20exempt%20in%20some%20states%2Fjurisdictions%20but%20not%20others%3F\"><h3>Can a customer be exempt in some states\/jurisdictions but not others?<\/h3><\/dt>\n<dd><p>Yes (Pro) \u2014 certificates are jurisdiction-specific, and a customer can hold multiple certificates covering different states, provinces, or countries. Exemption is applied only when the order's destination matches an approved certificate's jurisdiction.<\/p><\/dd>\n<dt id=\"where%20are%20uploaded%20certificate%20documents%20stored%2C%20and%20are%20they%20secure%3F\"><h3>Where are uploaded certificate documents stored, and are they secure?<\/h3><\/dt>\n<dd><p>In a protected directory outside direct web access (via <code>.htaccess<\/code> on Apache, with an Nginx compatibility notice shown if detected), served only through a permission-checked download handler \u2014 never a public URL.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.2<\/h4>\n\n<ul>\n<li>Removed temporary debug logging added while investigating the order-badge inconsistency (only active under WP_DEBUG; no behavioral change).<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Changed: removed documentation of the admin order-edit-screen tax-exempt badge and order-stamping meta (feature list, screenshot, developer reference) while an inconsistency in when it appears is investigated. No code changes \u2014 the underlying functionality is unchanged and will be re-documented once resolved.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Initial public release.<\/li>\n<\/ul>","raw_excerpt":"This plugin exempts WooCommerce customers from tax by role or by hand, with a full audit trail of every change.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/344574","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=344574"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/coolhuntersgt"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=344574"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=344574"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=344574"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=344574"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=344574"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=344574"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}