{"id":393483,"date":"2026-11-10T11:26:32","date_gmt":"2026-11-10T11:26:32","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/teamzlab-shipping-rates-for-fedex\/"},"modified":"2026-11-10T11:26:03","modified_gmt":"2026-11-10T11:26:03","slug":"teamzlab-shipping-rates-for-fedex","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/teamzlab-shipping-rates-for-fedex\/","author":23593948,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.9","stable_tag":"1.2.9","tested":"7.1.4","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"Teamzlab Shipping Rates for FedEx","header_author":"TeamzLab LTD","header_description":"14 FedEx REST APIs for WooCommerce: live rates, tracking webhooks, paperless ETD customs, and a self-serve Return Tag portal \u2014 REST-native for the 2026 SOAP shutdown.","last_updated":"2026-11-10 11:26:03","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/fedex.teamzlab.com\/","header_author_uri":"https:\/\/teamzlab.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":88,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.2.9":{"tag":"1.2.9","author":"teamzlab","date":"2026-11-10 11:26:03","revision":3794234}},"upgrade_notice":{"1.2.1":"<p>Removes the Box library admin screen and built-in box picker from rate calls. Merchants who used only WooCommerce product dimensions are unaffected. Custom code may still use the <code>fshipping_rates_package_line_items<\/code> filter.<\/p>","1.2.0":"<p>Major feature release. Adds commercial-invoice auto-generation, FedEx One Rate comparator, box-library pack routine, dimensional-weight calculator, and full runtime wiring for the Wave-1 Migration Lifeboat. Zero breaking changes. Update recommended for all international-shipping merchants.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3794269,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3794269,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3794269,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3794269,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.2.9"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3794234,"resolution":"1","location":"assets","locale":"","width":1600,"height":1000},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3794234,"resolution":"2","location":"assets","locale":"","width":1600,"height":1000},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3794234,"resolution":"3","location":"assets","locale":"","width":1600,"height":1000},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3794234,"resolution":"4","location":"assets","locale":"","width":1600,"height":1000}},"screenshots":{"1":"Fedex \u2192 Settings, Authorization tab \u2014 enter your FedEx REST API credentials (core scope).","2":"Fedex \u2192 Settings, Account tab \u2014 FedEx account number, ship-from origin, and sandbox\/production environment.","3":"FedEx Pickup History \u2014 schedule one consolidated global pickup and audit which pickup covered which shipments.","4":"Shipments &amp; Labeling \u2014 every shipment with tracking ID, service, total charge, label actions, pickup, return, trade documents, status, and SPOD."}},"plugin_section":[262246],"plugin_tags":[5556,10821,3546,550,286],"plugin_category":[36,45],"plugin_contributors":[291797],"plugin_business_model":[],"class_list":["post-393483","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-fedex","plugin_tags-freight","plugin_tags-shipping","plugin_tags-tracking","plugin_tags-woocommerce","plugin_category-analytics","plugin_category-ecommerce","plugin_contributors-teamzlab","plugin_committers-teamzlab"],"banners":{"banner":"https:\/\/ps.w.org\/teamzlab-shipping-rates-for-fedex\/assets\/banner-772x250.png?rev=3794269","banner_2x":"https:\/\/ps.w.org\/teamzlab-shipping-rates-for-fedex\/assets\/banner-1544x500.png?rev=3794269","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/teamzlab-shipping-rates-for-fedex\/assets\/icon-128x128.png?rev=3794269","icon_2x":"https:\/\/ps.w.org\/teamzlab-shipping-rates-for-fedex\/assets\/icon-256x256.png?rev=3794269","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/teamzlab-shipping-rates-for-fedex\/assets\/screenshot-1.png?rev=3794234","caption":"Fedex \u2192 Settings, Authorization tab \u2014 enter your FedEx REST API credentials (core scope)."},{"src":"https:\/\/ps.w.org\/teamzlab-shipping-rates-for-fedex\/assets\/screenshot-2.png?rev=3794234","caption":"Fedex \u2192 Settings, Account tab \u2014 FedEx account number, ship-from origin, and sandbox\/production environment."},{"src":"https:\/\/ps.w.org\/teamzlab-shipping-rates-for-fedex\/assets\/screenshot-3.png?rev=3794234","caption":"FedEx Pickup History \u2014 schedule one consolidated global pickup and audit which pickup covered which shipments."},{"src":"https:\/\/ps.w.org\/teamzlab-shipping-rates-for-fedex\/assets\/screenshot-4.png?rev=3794234","caption":"Shipments &amp; Labeling \u2014 every shipment with tracking ID, service, total charge, label actions, pickup, return, trade documents, status, and SPOD."}],"raw_content":"<!--section=description-->\n<p><strong>Teamzlab Shipping Rates for FedEx<\/strong> wires 14 FedEx REST APIs into WooCommerce \u2014 rates, labels, tracking, customs and returns. Built REST-native, so the 2026 SOAP shutdown never touches your store.<\/p>\n\n<h4>Feature highlights<\/h4>\n\n<ul>\n<li><strong>Real-time tracking webhooks<\/strong> \u2014 FedEx AIV events (pickup, transit, delivery, customs holds) are pushed to your store via HMAC-signed webhooks. One-time setup: create the webhook subscription in the FedEx portal and paste the shared secret under <strong>Fedex \u2192 Settings \u2192 Tracking<\/strong>. No polling for status.<\/li>\n<li><strong>Self-serve Return Tag portal<\/strong> \u2014 drop the <code>[fshipping_return_portal]<\/code> shortcode on the My-Account page. Customers pick items, get a FedEx-compliant return label in their email, and the three nearest drop-off counters on the confirmation page.<\/li>\n<li><strong>Paperless ETD customs<\/strong> \u2014 one-click electronic trade documents upload for international shipments, plus commercial-invoice auto-generation from WooCommerce line items. No printing, no stapling.<\/li>\n<\/ul>\n\n<h4>FedEx APIs wired<\/h4>\n\n<p>OAuth, Ship, Rates + Transit Times, Basic Track, Address Validation, Postal Code Validation, Service Availability, Pickup Request, Locations Search, Tracking webhooks (AIV receiver), Open Ship, Global Trade, Trade Documents Upload, Return Tag \u2014 14 APIs, 1 plugin. A Freight LTL client class is included for developers, but it is not yet wired into checkout or the admin UI, so freight rates and BOLs are not available out of the box.<\/p>\n\n<h4>Customer-facing features<\/h4>\n\n<ul>\n<li>Dimensional-weight calculator shortcode <code>[fshipping_dim_weight]<\/code> \u2014 pure client-side, embed on any page.<\/li>\n<li>Embeddable live-rate calculator <code>[fshipping_rate_widget]<\/code> \u2014 merchants can drop a <code>&lt;script&gt;<\/code> on any site to show live FedEx rates there.<\/li>\n<li>Drop-off finder <code>[fshipping_locations]<\/code> \u2014 the nearest FedEx drop-off locations for any postcode (10 by default, configurable with the <code>limit<\/code> attribute).<\/li>\n<li>Live tracking timeline <code>[fshipping_tracking_timeline]<\/code> \u2014 the order-status timeline customers ask for, fed by AIV webhook events.<\/li>\n<li>Hold-at-Location suggestion \u2014 when a delivery-exception AIV event arrives, the customer is automatically emailed the nearest FedEx counters with directions (requires tracking webhooks + shared secret).<\/li>\n<li>Residential address classification \u2014 the Address Validation API can classify residential vs. commercial addresses; the <code>fshipping_address_classified<\/code> hook and the savings meter let developers record and display avoided residential surcharges. (Automatic checkout reclassification is not enabled by default.)<\/li>\n<\/ul>\n\n<h4>Admin features<\/h4>\n\n<ul>\n<li>Per-order special services \u2014 Saturday delivery, signature options, dry ice, COD and Hold-at-Location are honored from order meta when set (by custom code or the bundled meta-box classes).<\/li>\n<li>Dangerous goods flags \u2014 hazmat, alcohol and dry-ice markers per order are spliced into the label payload's special-services block.<\/li>\n<li>Shipment dashboard \u2014 every shipment with tracking ID, service, charges, label actions, pickup, returns, trade documents, status badges and SPOD.<\/li>\n<\/ul>\n\n<h4>Built for production<\/h4>\n\n<ul>\n<li>REST-native. Zero SOAP. The 2026 FedEx SOAP retirement is a non-event.<\/li>\n<li>Checkout Safety Net \u2014 if the FedEx rate lookup returns nothing, the <code>fshipping_safety_net_fallback<\/code> filter lets developers serve a configured fallback rate so checkout still renders. No fallback is applied unless you register one.<\/li>\n<li>Staging Mode \u2014 set the <code>fshipping_staging_mode<\/code> option to log every rate call (destination, item count, method) to the staging debug log for review.<\/li>\n<li>HPOS (High-Performance Order Storage) compatible.<\/li>\n<\/ul>\n\n<h4>External services<\/h4>\n\n<p>This plugin connects to the following third-party services to do its job:<\/p>\n\n<ul>\n<li><strong>FedEx REST APIs (production)<\/strong> (<code>apis.fedex.com<\/code>) \u2014 used for OAuth access tokens, live rate quotes, label creation (Ship and Open Ship), pickup scheduling and cancellation, shipment tracking, address and postal-code validation, service-availability lookups, Global Trade (customs) data, Return Tag generation, and AIV tracking webhooks (webhook events are received <em>from<\/em> FedEx, not sent). The plugin sends your FedEx API credentials (Client ID \/ Client Secret for the OAuth token request) and account number, plus the data needed for the requested operation: shipper and recipient names, addresses and phone numbers, package dimensions and weight, order totals, and customs descriptions for international shipments. Data is sent only when you (or your customer's checkout) trigger a FedEx operation \u2014 a rate lookup at checkout, a label purchase, a pickup request, a tracking query, or an address validation. An account at <a href=\"https:\/\/developer.fedex.com\">developer.fedex.com<\/a> is required. <a href=\"https:\/\/www.fedex.com\/en-us\/terms-of-use.html\">Terms of use<\/a> \u00b7 <a href=\"https:\/\/www.fedex.com\/en-us\/trust-center\/privacy.html\">Privacy policy<\/a><\/li>\n<li><strong>FedEx REST APIs (sandbox)<\/strong> (<code>apis-sandbox.fedex.com<\/code>) \u2014 the same endpoints against FedEx's test environment, used only when you set <strong>Fedex \u2192 Settings \u2192 Environment<\/strong> to \"sandbox\". Identical data is sent as above, against test credentials and test orders. <a href=\"https:\/\/www.fedex.com\/en-us\/terms-of-use.html\">Terms of use<\/a> \u00b7 <a href=\"https:\/\/www.fedex.com\/en-us\/trust-center\/privacy.html\">Privacy policy<\/a><\/li>\n<li><strong>FedEx Trade Documents API<\/strong> (<code>documentapi.prod.fedex.com<\/code>, <code>documentapitest.prod.fedex.com<\/code>) \u2014 used for electronic trade documents (paperless customs invoices uploaded with an international shipment). When ETD is enabled, the plugin uploads the generated commercial invoice (or your custom document PDF) to these endpoints; the upload contains the customs document content and shipment\/tracking references. Only runs when you create an international shipment with ETD enabled. <a href=\"https:\/\/www.fedex.com\/en-us\/terms-of-use.html\">Terms of use<\/a> \u00b7 <a href=\"https:\/\/www.fedex.com\/en-us\/trust-center\/privacy.html\">Privacy policy<\/a><\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>teamzlab-shipping-rates-for-fedex<\/code> folder to <code>\/wp-content\/plugins\/<\/code> (or install via <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>).<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen.<\/li>\n<li>Go to <strong>WooCommerce \u2192 Settings \u2192 Shipping \u2192 Zones<\/strong> and enable <strong>FedEx Shipping<\/strong> on the zones that need it.<\/li>\n<li>Open <strong>Fedex \u2192 Settings<\/strong> and enter:\n\n<ul>\n<li>Client ID + Client Secret (core scope) \u2014 from <a href=\"https:\/\/developer.fedex.com\">developer.fedex.com<\/a>.<\/li>\n<li>Account number \u2014 your FedEx billing account.<\/li>\n<li>Environment \u2014 sandbox to start, production when ready.<\/li>\n<\/ul><\/li>\n<li>(Optional) <strong>Fedex \u2192 Settings<\/strong> (tracking section) \u2014 add your separate tracking-scope Client ID + Secret (FedEx issues them as two separate projects).<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20this%20break%20when%20fedex%20soap%20retires%3F\"><h3>Will this break when FedEx SOAP retires?<\/h3><\/dt>\n<dd><p>No. This plugin has always been REST-native; there is no SOAP code to retire. If you're coming from a SOAP-based plugin whose store broke after 2026-06-01, enter FedEx sandbox credentials under <strong>Fedex \u2192 Settings<\/strong> and switch the environment to sandbox to verify your flows before going back to production.<\/p><\/dd>\n<dt id=\"is%20there%20a%20free%20tier%3F\"><h3>Is there a free tier?<\/h3><\/dt>\n<dd><p>Yes \u2014 and it is not a trial. The WordPress.org version of this plugin is 100% free and fully functional: every feature listed above is included and unlocked, with no daily limits and no feature locks. Your store's checkout is never throttled.<\/p><\/dd>\n<dt id=\"is%20paid%20support%20available%3F\"><h3>Is paid support available?<\/h3><\/dt>\n<dd><p>Optional priority support and agency services are offered separately at teamzlab.com. The plugin itself has no paid tier, no licence key and no locked features.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20dokan%20%2F%20wcfm%20multi-vendor%3F\"><h3>Does it work with Dokan \/ WCFM multi-vendor?<\/h3><\/dt>\n<dd><p>The plugin uses one store origin from <strong>Fedex \u2192 Settings<\/strong> for FedEx rate calls. Multi-vendor marketplaces can still vary ship-from per package by attaching <code>_fshipping_origin<\/code> (<code>postal_code<\/code>, <code>country<\/code>, <code>state<\/code>) in custom code on the <code>woocommerce_cart_shipping_packages<\/code> filter; the rate client reads that when building the FedEx payload.<\/p><\/dd>\n<dt id=\"does%20it%20support%20hpos%20%28high-performance%20order%20storage%29%3F\"><h3>Does it support HPOS (High-Performance Order Storage)?<\/h3><\/dt>\n<dd><p>Yes. The plugin declares HPOS compatibility in its header and uses <code>\\WC_Order<\/code> APIs exclusively \u2014 never direct post-meta for order fields that HPOS migrated to <code>wc_orders_*<\/code>.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20fedex%20returns%20a%20500%3F\"><h3>What happens if FedEx returns a 500?<\/h3><\/dt>\n<dd><p>FedEx rates simply don't render for that recalculation \u2014 the plugin logs the failure and checkout continues with any other configured shipping methods; it never blocks the order. If you want a fallback price instead, register one with the <code>fshipping_safety_net_fallback<\/code> filter (no fallback is applied unless you do \u2014 there is no settings field for it).<\/p><\/dd>\n<dt id=\"do%20i%20need%20two%20fedex%20developer%20accounts%3F\"><h3>Do I need two FedEx developer accounts?<\/h3><\/dt>\n<dd><p>Technically FedEx issues OAuth credentials as <strong>two separate projects<\/strong> \u2014 one covering Ship + Rates + Address (the \"core\" scope), one covering Tracking + AIV webhooks. They're free to create on the same FedEx developer account. Enter both pairs in the plugin settings; otherwise tracking calls return 401.<\/p><\/dd>\n<dt id=\"is%20there%20a%20live%20demo%3F\"><h3>Is there a live demo?<\/h3><\/dt>\n<dd><p>Install the plugin on a WordPress sandbox \u2014 every feature works with FedEx's public sandbox credentials. Enter them under <strong>Fedex \u2192 Settings<\/strong> and switch the environment to sandbox.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.9<\/h4>\n\n<ul>\n<li>Packaging: removed build-only files (development templates and a build marker) from the plugin zip.<\/li>\n<\/ul>\n\n<h4>1.2.8<\/h4>\n\n<ul>\n<li>Fixed: No longer fatals when WooCommerce is inactive \u2014 the plugin now shows an admin notice pointing to the plugins screen instead of calling WooCommerce-dependent code (guards old WordPress cores where the \"Requires Plugins\" header is not enforced).<\/li>\n<li>Changed: Dropped the bundled Select2 library; admin dropdowns now use the SelectWoo library that ships with WooCommerce (wc-enhanced-select handle + admin styles), so the plugin no longer loads a duplicate select2 copy.<\/li>\n<\/ul>\n\n<h4>1.2.7<\/h4>\n\n<ul>\n<li>Fixed: Replaced the privacy-policy link (readme \"External services\" section) with our own privacy policy at teamzlab.com \u2014 the FedEx privacy-policy page intermittently returns 404 to automated crawlers.<\/li>\n<li>Changed: Bundled Select2 library updated to 4.1.0 (latest stable).<\/li>\n<li>Fixed: Simplified the namespace autoloader (plain prefix\/str_replace mapping instead of a regex) to avoid ambiguity in namespace-to-path resolution.<\/li>\n<\/ul>\n\n<h4>1.2.6<\/h4>\n\n<ul>\n<li>Security: Hardened input sanitization in AJAX and settings handlers.<\/li>\n<li>Fixed: Admin and frontend scripts are now properly enqueued and load with the defer strategy (WP 6.3+ script loading strategies; safely ignored on older versions).<\/li>\n<li>Changed: Bundled Select2 library updated to the latest stable release (4.0.13), replacing a beta build.<\/li>\n<li>Changed: Expanded External services documentation with per-service data, timing, and FedEx terms\/privacy links.<\/li>\n<\/ul>\n\n<h4>1.2.5<\/h4>\n\n<ul>\n<li>Changed: Fully functional \u2014 no daily checkout quota, no locked features, no licensing code. Every capability ships unlocked.<\/li>\n<li>Removed: Bundled third-party licensing SDK. The plugin now talks only to the FedEx REST APIs.<\/li>\n<\/ul>\n\n<h4>1.2.4<\/h4>\n\n<ul>\n<li>Added: <strong>FedEx packaging presets on Product Box<\/strong> \u2014 box cards can auto-fill dimensions (and name) from FedEx Envelope\/Pak\/Tube\/Box supplies.<\/li>\n<li>Changed: Human-readable dropdown labels everywhere \u2014 settings selects and the shipments Service column no longer show raw FedEx API enums.<\/li>\n<li>Changed: Admin tables scroll cleanly on narrow screens; the shipments list keeps its <strong>Download SPOD<\/strong> action pinned while scrolling.<\/li>\n<li>Fixed: Invisible labels on <strong>Schedule pickup<\/strong> \/ <strong>Save Product Box<\/strong> primary buttons.<\/li>\n<li>Fixed: Select2 multi-select chip overlap and collapsed search field.<\/li>\n<li>Fixed: <strong>Remove box<\/strong> \/ <strong>Remove<\/strong> buttons rendered as raw browser chrome.<\/li>\n<li>Fixed: Ghost controls bleeding through the sticky Settings save bar.<\/li>\n<li>Fixed: Open Ship weight-normalization fatal (<code>Class \"FSHIPPING\\OpenShip\\Helper\" not found<\/code>) on the affected code path.<\/li>\n<\/ul>\n\n<h4>1.2.3<\/h4>\n\n<ul>\n<li>Fixed: <strong>WooCommerce Block Checkout is fully supported<\/strong> \u2014 rates render for the entered address, address and cart changes re-quote through the Store API, the placed order keeps the correct destination and shipping amount, and instant labels use the final saved order data. A FedEx error during post-checkout label creation no longer breaks checkout with an HTTP 500 (orders can no longer be stranded at pending by label errors).<\/li>\n<li>Fixed: Deactivating and reactivating the plugin no longer removes the FedEx method from your shipping zones.<\/li>\n<li>Fixed: Rate caching rebuilt \u2014 no per-request FedEx hammering, no stale UI rates, no re-quote on rate selection; a settings change forces exactly one recalculation.<\/li>\n<li>Fixed: Shipment-confirmation emails can no longer repeat when WP-Cron re-delivers a scheduled event.<\/li>\n<li>Fixed: Uninstall cleanup now removes all plugin options (including staging mode and savings events) and scheduled email events.<\/li>\n<li>Security: Label, return-label, and SPOD PDFs now live in randomized per-install storage directories (old guessable URLs stop resolving); existing shipments keep working.<\/li>\n<li>Security: Full request\/response payloads (customer PII) are no longer written to logs unless WP_DEBUG is enabled.<\/li>\n<li>Security: AIV webhook deliveries are deduplicated (body hash + event id) with a staleness window.<\/li>\n<li>Security: Public tracking \/ address-validation \/ postal-validation AJAX endpoints are rate-limited per IP.<\/li>\n<li>Security: Order deletion is HPOS-aware (no orphaned order stubs left behind).<\/li>\n<li>Added: Shipped mocked regression tests (<code>php tests\/regression.php hpos|legacy<\/code> \u2014 no WordPress needed).<\/li>\n<li>Changed: wp-admin screens and public shortcodes redesigned with a FedEx-branded design system.<\/li>\n<li>Changed: Removed <strong>Webhook<\/strong> and <strong>Freight<\/strong> tabs from <strong>Fedex \u2192 Settings<\/strong> (<code>admin.php?page=fedex_shipping<\/code>).<\/li>\n<li>Removed: <strong>Fedex \u2192 Warehouses<\/strong> admin page (<code>fshipping_warehouses<\/code>), <code>Origin\\WarehouseRouter<\/code>, and automatic multi-warehouse cart splitting. Package <code>_fshipping_origin<\/code> is still honored when set by custom code (see FAQ: Dokan \/ WCFM).<\/li>\n<li>Removed: <strong>Fedex \u2192 Migration Doctor<\/strong> admin page (<code>fshipping_migration_doctor<\/code>) and its staging-mode POST handler. Staging mode remains via the <code>fshipping_staging_mode<\/code> option.<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>Security: AIV webhook receiver now <strong>fails closed<\/strong> \u2014 with no shared secret configured every delivery is rejected instead of trusted.<\/li>\n<li>Security: Cancel-shipment AJAX requires shop-manager capability and is no longer reachable by logged-out visitors.<\/li>\n<li>Security: Shipment records are no longer publicly queryable (REST \/ permalinks disabled).<\/li>\n<li>Security: Return Tag portal and the tracking-timeline shortcode now require the order's billing email as proof of ownership.<\/li>\n<li>Security: Rate-quote rate limiting no longer trusts spoofable forwarding headers; the label PDF folder is hardened against direct browsing.<\/li>\n<li>Fixed: Orders placed through <strong>block checkout<\/strong> now create instant FedEx shipments (the Store API hook was never wired, so block-checkout orders silently got no label).<\/li>\n<li>Fixed: Multi-quantity orders no longer fail label purchase with <code>DIMENSIONS.EXCEEDS.LIMITS<\/code> \u2014 package dimensions are now stacked along the smallest dimension instead of multiplying every axis by quantity.<\/li>\n<li>Fixed: LB\u2194KG weight conversion silently no-opped (Woo expects the <code>lbs<\/code> slug), so labels could declare the wrong weight.<\/li>\n<li>Fixed: Duplicate checkout events can no longer purchase duplicate labels for one order (per-order guard + order note).<\/li>\n<li>Fixed: Locations asset versioning referenced an undefined constant.<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Removed: <strong>FedEx \u2192 Box library<\/strong> admin submenu and the built-in box packer (<code>Packing\\BoxLibrary<\/code>, <code>Packing\\BoxPicker<\/code>, <code>Admin\\BoxLibraryPage<\/code>). The <code>fshipping_rates_package_line_items<\/code> filter in rate requests is unchanged for custom code.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>New: Commercial invoice auto-generator \u2014 FedEx now produces the customs invoice PDF from your WooCommerce line items. <code>TradeDocuments<\/code> upload remains the escape hatch for custom templates.<\/li>\n<li>New: FedEx One Rate comparator \u2014 surfaces flat-rate pricing alongside standard rates at checkout with \"save $X\" badge when cheaper.<\/li>\n<li>New: Dimensional-weight calculator shortcode <code>[fshipping_dim_weight]<\/code> \u2014 pure client-side, embed on any page.<\/li>\n<li>New: Box picker \u2014 rate calls now use the smallest merchant-registered box that fits the cart.<\/li>\n<li>New: Multi-warehouse cart split \u2014 Dokan \/ WCFM stores get per-warehouse sub-packages automatically.<\/li>\n<li>New: Staging Mode dry-run logging + Checkout Safety Net runtime wiring.<\/li>\n<li>New: <code>Trade\\CommercialInvoiceBuilder<\/code>, <code>Shipping\\OneRateComparator<\/code>, <code>Packing\\BoxPicker<\/code>, <code>Events\\RuntimeIntegrator<\/code>, <code>Widget\\DimensionalWeightCalculator<\/code>, plus Migration Doctor \/ Warehouses \/ Box Library admin pages.<\/li>\n<li>Fixed: Residential-surcharge savings are now recorded whenever Address Validation reclassifies residential \u2192 business. Dashboard widget previously always showed $0.<\/li>\n<li>Security: internal secret-scanning patterns tightened \u2014 now require value-looking literals after the key.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Added shortcodes: <code>[fshipping_track]<\/code>, <code>[fshipping_locations]<\/code>, <code>[fshipping_tracking_timeline]<\/code>, <code>[fshipping_return_portal]<\/code>, <code>[fshipping_rate_widget]<\/code>.<\/li>\n<li>Added AIV tracking-webhook receiver + HMAC-SHA256 signature verification.<\/li>\n<li>Added REST <code>\/fshipping\/v1\/rate-quote<\/code> endpoint for the embeddable widget.<\/li>\n<li>Added admin meta-boxes: Special Services, ETD Invoice, Close Day page.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release \u2014 15 FedEx REST APIs, WooCommerce shipping method, tracking + labels.<\/li>\n<\/ul>","raw_excerpt":"FedEx REST shipping for WooCommerce: live rates, labels, tracking webhooks, paperless ETD customs, and a self-serve Return Tag portal.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/393483","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=393483"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/teamzlab"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=393483"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=393483"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=393483"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=393483"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=393483"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=393483"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}