{"id":296122,"date":"2026-04-09T16:10:32","date_gmt":"2026-04-09T16:10:32","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/modern-shipping-for-speedy\/"},"modified":"2026-04-11T03:15:15","modified_gmt":"2026-04-11T03:15:15","slug":"drusoft-shipping-for-speedy","status":"publish","type":"plugin","link":"https:\/\/frp.wordpress.org\/plugins\/drusoft-shipping-for-speedy\/","author":23474490,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.0.1","stable_tag":"1.0.1","tested":"6.9.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Drusoft Shipping for Speedy","header_author":"DRUSOFT LTD","header_description":"A clean, conflict-free Speedy integration for Bulgaria.","assets_banners_color":"7da190","last_updated":"2026-04-11 03:15:15","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/ventzie555\/drusoft-shipping-for-speedy","header_author_uri":"https:\/\/drusoft.dev\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":115,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"ventzie","date":"2026-04-09 16:34:54"},"1.0.1":{"tag":"1.0.1","author":"ventzie","date":"2026-04-11 03:15:15"}},"upgrade_notice":{"1.0.1":"<p>Recommended update with WordPress.org compatibility improvements, WooCommerce dependency metadata, Playground Live Preview support, and checkout recalculation fixes.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3502669,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3502669,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3502646,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3502646,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3503705,"resolution":false,"location":"assets","locale":"","contents":"{\"landingPage\":\"\\\/wp-admin\\\/admin.php?page=wc-settings&tab=shipping\",\"login\":true,\"plugins\":[\"woocommerce\"],\"steps\":[{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"drusoft-shipping-for-speedy\"},\"options\":{\"activate\":true}}]}"}},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Checkout page with Speedy delivery type selection (Address, Office, Automat).","2":"Shipping method settings in the WooCommerce shipping zone modal.","3":"Speedy Shipment metabox on the order edit screen.","4":"Speedy Orders admin page with bulk actions."},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[2986,13827,3546,206280,286],"plugin_category":[45],"plugin_contributors":[259833],"plugin_business_model":[],"class_list":["post-296122","plugin","type-plugin","status-publish","hentry","plugin_tags-bulgaria","plugin_tags-delivery","plugin_tags-shipping","plugin_tags-speedy","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-ventzie","plugin_committers-ventzie"],"banners":{"banner":"https:\/\/ps.w.org\/drusoft-shipping-for-speedy\/assets\/banner-772x250.png?rev=3502646","banner_2x":"https:\/\/ps.w.org\/drusoft-shipping-for-speedy\/assets\/banner-1544x500.png?rev=3502646","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/drusoft-shipping-for-speedy\/assets\/icon-128x128.png?rev=3502669","icon_2x":"https:\/\/ps.w.org\/drusoft-shipping-for-speedy\/assets\/icon-256x256.png?rev=3502669","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>Drusoft Shipping for Speedy<\/strong> is a high-performance, conflict-free WooCommerce integration for Speedy delivery services in Bulgaria. Designed for speed, reliability, and ease of use, it provides a seamless shipping experience for both merchants and customers.<\/p>\n\n<h4>Important Compatibility Note<\/h4>\n\n<p>This plugin is currently <strong>not compatible<\/strong> with the WooCommerce Block Cart and Block Checkout pages. Please ensure your store uses the classic shortcode-based Cart (<code>[woocommerce_cart]<\/code>) and Checkout (<code>[woocommerce_checkout]<\/code>) pages.<\/p>\n\n<h4>For Your Customers<\/h4>\n\n<ul>\n<li><strong>Dynamic Checkout Experience<\/strong> \u2014 Real-time city and office selection directly on the checkout page.<\/li>\n<li><strong>Multiple Delivery Types<\/strong> \u2014 Choose between delivery to Address, Speedy Office, or Speedy Automat (APS).<\/li>\n<li><strong>Smart Street Search<\/strong> \u2014 Built-in autocomplete for Bulgarian street names with intelligent prefix handling (e.g., stripping \"\u0443\u043b.\", \"\u0431\u0443\u043b.\").<\/li>\n<li><strong>Live Service Selection<\/strong> \u2014 Customers can choose between available services (Economy, Express, etc.) with real-time price updates.<\/li>\n<li><strong>Region Mapping<\/strong> \u2014 Automated city filtering based on the selected Bulgarian province.<\/li>\n<\/ul>\n\n<h4>For Merchants<\/h4>\n\n<ul>\n<li><strong>HPOS Compatible<\/strong> \u2014 Fully supports WooCommerce High-Performance Order Storage.<\/li>\n<li><strong>Automated Data Sync<\/strong> \u2014 Uses Action Scheduler to keep Bulgarian cities and Speedy offices up-to-date in the background.<\/li>\n<li><strong>Credential Validation<\/strong> \u2014 Validates API credentials in real-time before saving.<\/li>\n<li><strong>Custom Pricing<\/strong> \u2014 Support for custom pricing CSV files for specialized shipping rates.<\/li>\n<li><strong>Advanced Order Management<\/strong> \u2014 Dedicated metabox in the order edit screen, integrated waybill generation, and bulk actions for managing multiple Speedy orders.<\/li>\n<li><strong>Clean Codebase<\/strong> \u2014 Built with modern PHP standards and conflict-free architecture.<\/li>\n<\/ul>\n\n<h3>External Services<\/h3>\n\n<p>This plugin relies on the <strong>Speedy REST API<\/strong>, a third-party service provided by <strong>Speedy AD<\/strong> (Speedy Bulgaria), to deliver its shipping functionality. The plugin cannot operate without a valid Speedy API account.<\/p>\n\n<h4>What the service is<\/h4>\n\n<p>Speedy AD is a courier and logistics company operating in Bulgaria. Their REST API allows merchants to calculate shipping rates, create shipments (waybills), manage deliveries, and retrieve location data (cities, offices, automats, streets).<\/p>\n\n<h4>What data is sent and when<\/h4>\n\n<ul>\n<li><strong>API credentials<\/strong> (username and password) \u2014 sent with every API request for authentication.<\/li>\n<li><strong>Recipient address data<\/strong> (city, street, office ID) \u2014 sent when calculating shipping rates at cart\/checkout and when creating a waybill after order placement.<\/li>\n<li><strong>Shipment details<\/strong> (weight, dimensions, COD amount, service type, sender\/recipient info) \u2014 sent when generating a waybill.<\/li>\n<li><strong>Waybill ID<\/strong> \u2014 sent when cancelling a shipment, requesting a courier pickup, or printing a waybill label.<\/li>\n<li><strong>Location queries<\/strong> (city name, street name) \u2014 sent when the customer or admin searches for cities, offices, or streets.<\/li>\n<\/ul>\n\n<p>Data is transmitted only when the corresponding action is triggered (e.g., a customer proceeds to checkout, a merchant generates a waybill, or the background sync runs).<\/p>\n\n<h4>Service links<\/h4>\n\n<ul>\n<li>Speedy API base URL: <a href=\"https:\/\/api.speedy.bg\/v1\/\">https:\/\/api.speedy.bg\/v1\/<\/a><\/li>\n<li>Speedy Terms and Conditions: <a href=\"https:\/\/www.speedy.bg\/en\/general-conditions\">https:\/\/www.speedy.bg\/en\/general-conditions<\/a><\/li>\n<li>Speedy Privacy Policy: <a href=\"https:\/\/www.speedy.bg\/en\/privacy-policy\">https:\/\/www.speedy.bg\/en\/privacy-policy<\/a><\/li>\n<li>Speedy API Documentation: <a href=\"https:\/\/api.speedy.bg\/\">https:\/\/api.speedy.bg\/<\/a><\/li>\n<\/ul>\n\n<h3>Speedy API Endpoints<\/h3>\n\n<p>This plugin communicates with the <strong>Speedy REST API v1<\/strong> (<code>https:\/\/api.speedy.bg\/v1\/<\/code>). All requests are authenticated using the <code>userName<\/code> and <code>password<\/code> fields configured in the shipping method settings. Below is a summary of every endpoint used, along with its purpose and where it is called in the plugin.<\/p>\n\n<h4>Authentication &amp; Account<\/h4>\n\n<ul>\n<li><strong><code>POST \/v1\/client\/contract<\/code><\/strong> \u2014 Validates API credentials and retrieves the list of client contracts (sender accounts). Used during credential validation when the merchant saves settings, and to populate the \"Sender (Object)\" dropdown in the shipping method configuration.<\/li>\n<li><strong><code>POST \/v1\/client\/contract\/info<\/code><\/strong> \u2014 Retrieves detailed contract information, including special delivery requirements (e.g., mandatory open-on-test, two-way receipt). Used to populate the \"Special Requirements\" multi-select in the shipping method settings.<\/li>\n<\/ul>\n\n<h4>Location Data<\/h4>\n\n<ul>\n<li><strong><code>POST \/v1\/location\/site<\/code><\/strong> \u2014 Searches for cities\/sites by name within Bulgaria (<code>countryId: 100<\/code>). Used by the admin Select2 city search when configuring the sender city, and for the public-facing city autocomplete on checkout.<\/li>\n<li><strong><code>POST \/v1\/location\/site\/csv\/100<\/code><\/strong> \u2014 Downloads the complete list of Bulgarian cities in CSV format. Used by the background syncer (<code>Drushfo_Syncer<\/code>) to populate and update the <code>wp_drushfo_cities<\/code> database table via Action Scheduler.<\/li>\n<li><strong><code>POST \/v1\/location\/office<\/code><\/strong> \u2014 Retrieves all Speedy offices and automats for Bulgaria. Used in two contexts: (1) the background syncer updates the <code>wp_drushfo_offices<\/code> table, and (2) the admin Select2 office search for configuring the sender office.<\/li>\n<li><strong><code>POST \/v1\/location\/street<\/code><\/strong> \u2014 Searches for streets within a specific city (<code>siteId<\/code>). Used on the checkout page to provide street autocomplete when the customer selects \"Delivery to Address.\"<\/li>\n<\/ul>\n\n<h4>Services &amp; Pricing<\/h4>\n\n<ul>\n<li><strong><code>POST \/v1\/services<\/code><\/strong> \u2014 Retrieves the list of available shipping services (e.g., Standard 505, Express 501) for the authenticated account. Used to populate the \"Active Services\" multi-select in the shipping method settings.<\/li>\n<li><strong><code>POST \/v1\/calculate<\/code><\/strong> \u2014 Calculates the shipping price for a specific service, weight, destination, and delivery type. Used at cart\/checkout time when the pricing method is set to \"Speedy Calculator\" or \"Calculator + Surcharge.\"<\/li>\n<\/ul>\n\n<h4>Shipment Management<\/h4>\n\n<ul>\n<li><strong><code>POST \/v1\/shipment\/<\/code><\/strong> \u2014 Creates a new shipment (waybill) with the Speedy system. Includes sender\/recipient details, service, weight, COD amount, and delivery type. Used by the waybill generator, either automatically on order status change or manually from the order metabox.<\/li>\n<li><strong><code>POST \/v1\/shipment\/cancel<\/code><\/strong> \u2014 Cancels an existing shipment by its waybill ID. Used from the \"Cancel Shipment\" button in the Speedy order metabox or the Speedy Orders bulk action.<\/li>\n<li><strong><code>POST \/v1\/pickup<\/code><\/strong> \u2014 Requests a courier pickup for one or more shipments. Accepts a visit end time and auto-adjusts the pickup date. Used from the \"Request Courier\" button in the order metabox.<\/li>\n<li><strong><code>POST \/v1\/print<\/code><\/strong> \u2014 Generates a printable waybill label (PDF) for a shipment. Supports A4, A6, and label formats with optional additional barcode copy. Used from the \"Print Waybill\" button in the order metabox and the Speedy Orders page.<\/li>\n<\/ul>\n\n<h4>Rate Limiting &amp; Caching<\/h4>\n\n<p>The plugin minimizes API calls through several strategies:<\/p>\n\n<ul>\n<li><strong>Local database tables<\/strong> \u2014 Cities and offices are synced periodically via Action Scheduler and queried locally, avoiding per-request API calls for location data.<\/li>\n<li><strong>Transient caching<\/strong> \u2014 Service lists, contract data, and client information are cached using WordPress transients to reduce redundant API calls.<\/li>\n<li><strong>Session storage<\/strong> \u2014 Cart selections (city, delivery type, office) are stored in the WooCommerce session, so shipping calculations reuse the customer's choices without extra lookups.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>drusoft-shipping-for-speedy<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory.<\/li>\n<li>Ensure <strong>WooCommerce<\/strong> is installed and active.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> menu in WordPress.<\/li>\n<li>Navigate to <strong>WooCommerce &gt; Settings &gt; Shipping &gt; Shipping Zones<\/strong>.<\/li>\n<li>Add or edit a shipping zone (e.g., \"Bulgaria\").<\/li>\n<li>Click <strong>Add shipping method<\/strong> and select <strong>Drusoft Shipping for Speedy<\/strong>.<\/li>\n<li>Enter your <strong>Speedy API Username<\/strong> and <strong>Password<\/strong>, then click <strong>Save Changes<\/strong>.<\/li>\n<li>The plugin will validate your credentials and unlock additional configuration options.<\/li>\n<li>Background sync for cities and offices starts automatically via the WooCommerce Action Scheduler.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20speedy%20api%20credentials%20do%20i%20need%3F\"><h3>What Speedy API credentials do I need?<\/h3><\/dt>\n<dd><p>You need the username and password provided by Speedy for their REST API (v1). Contact Speedy Bulgaria to obtain API access.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20support%20the%20woocommerce%20block%20checkout%3F\"><h3>Does this plugin support the WooCommerce Block Checkout?<\/h3><\/dt>\n<dd><p>Not yet. The plugin currently requires the classic shortcode-based Checkout page (<code>[woocommerce_checkout]<\/code>). Block Checkout support is planned for a future release.<\/p><\/dd>\n<dt id=\"how%20are%20cities%20and%20offices%20kept%20up%20to%20date%3F\"><h3>How are cities and offices kept up to date?<\/h3><\/dt>\n<dd><p>The plugin uses the WooCommerce Action Scheduler to sync cities and offices from the Speedy API in the background. You can monitor the scheduled action (<code>drushfo_sync_locations_event<\/code>) under <strong>WooCommerce &gt; Status &gt; Scheduled Actions<\/strong>.<\/p><\/dd>\n<dt id=\"what%20pricing%20methods%20are%20available%3F\"><h3>What pricing methods are available?<\/h3><\/dt>\n<dd><ul>\n<li><strong>Speedy Calculator<\/strong> \u2014 Real-time API calculation based on weight, destination, and service.<\/li>\n<li><strong>Fixed Price<\/strong> \u2014 Configurable per delivery type (Address, Office, Automat).<\/li>\n<li><strong>Free Shipping<\/strong> \u2014 Always free, or triggered by a minimum order amount per delivery type.<\/li>\n<li><strong>Custom Prices (CSV)<\/strong> \u2014 Upload a CSV file for complex pricing rules based on weight and order total.<\/li>\n<li><strong>Calculator + Surcharge<\/strong> \u2014 API price plus a fixed additional fee.<\/li>\n<\/ul><\/dd>\n<dt id=\"how%20does%20the%20csv%20custom%20pricing%20work%3F\"><h3>How does the CSV custom pricing work?<\/h3><\/dt>\n<dd><p>Upload a CSV with columns: <code>service_id, delivery_type, max_weight, max_order_total, price<\/code>. Delivery type mapping: <code>0<\/code> = Address, <code>1<\/code> = Office, <code>2<\/code> = Automat. The plugin matches rows where the order's weight and subtotal are within the specified limits.<\/p><\/dd>\n<dt id=\"can%20i%20automatically%20generate%20waybills%3F\"><h3>Can I automatically generate waybills?<\/h3><\/dt>\n<dd><p>Yes. Enable the <strong>Automatic Waybill<\/strong> option in the shipping method settings. A waybill will be created automatically when an order reaches the \"Processing\" or \"On Hold\" status.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Added a WordPress Playground blueprint for plugin page Live Preview with WooCommerce preinstalled.<\/li>\n<li>Declared WooCommerce as a required plugin and updated installation instructions accordingly.<\/li>\n<li>Improved WordPress.org compatibility, including plugin metadata, text domain alignment, and compliance fixes.<\/li>\n<li>Fixed shipping recalculation when switching payment methods during checkout.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Full Speedy API integration for shipping calculation and waybill generation.<\/li>\n<li>Support for delivery to Address, Office, and Automat (APS).<\/li>\n<li>Dynamic city, office, and street selection on checkout.<\/li>\n<li>Multiple pricing methods: Speedy Calculator, Fixed Price, Free Shipping, Custom CSV, Calculator + Surcharge.<\/li>\n<li>Free shipping thresholds configurable per delivery type.<\/li>\n<li>Background sync of Bulgarian cities and Speedy offices via Action Scheduler.<\/li>\n<li>HPOS (High-Performance Order Storage) compatibility.<\/li>\n<li>Admin order management: waybill generation, printing, courier requests, and cancellation.<\/li>\n<li>Nonce-protected AJAX handlers with separate public and admin scopes.<\/li>\n<li>Bulgarian (bg_BG) translation included.<\/li>\n<\/ul>","raw_excerpt":"A clean, conflict-free Speedy integration for WooCommerce stores in Bulgaria.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/296122","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=296122"}],"author":[{"embeddable":true,"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/ventzie"}],"wp:attachment":[{"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=296122"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=296122"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=296122"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=296122"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=296122"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=296122"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}