{"id":358753,"date":"2026-08-25T05:50:48","date_gmt":"2026-08-25T05:50:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/catcode-shipping-with-ukrposhta-for-woocommerce\/"},"modified":"2026-09-25T06:12:11","modified_gmt":"2026-09-25T06:12:11","slug":"catcode-shipping-with-ukrposhta-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/vec.wordpress.org\/plugins\/catcode-shipping-with-ukrposhta-for-woocommerce\/","author":23504569,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.7","stable_tag":"1.2.7","tested":"7.1.2","requires":"5.6","requires_php":"7.4","requires_plugins":null,"header_name":"CatCode Shipping with Ukrposhta for WooCommerce","header_author":"CatCode","header_description":"Ukrposhta delivery for WooCommerce: the customer picks region, city and post office at checkout from the official Address Classifier, and the delivery price is quoted live. International destinations are quoted by country and weight. Shipment (barcode) creation and sticker printing come in a later update.","assets_banners_color":"ebddeb","last_updated":"2026-09-25 06:12:11","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/catcode.com.ua\/modules\/ukrposhta-shipping-for-woocommerce\/","header_author_uri":"https:\/\/catcode.com.ua","rating":0,"author_block_rating":0,"active_installs":0,"downloads":356,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.2.0":{"tag":"1.2.0","author":"catcodestudio","date":"2026-08-30 08:12:25","revision":3672199},"1.2.1":{"tag":"1.2.1","author":"catcodestudio","date":"2026-09-18 15:06:59","revision":3702202},"1.2.2":{"tag":"1.2.2","author":"catcodestudio","date":"2026-09-23 08:47:39","revision":3708877},"1.2.3":{"tag":"1.2.3","author":"catcodestudio","date":"2026-09-24 10:10:24","revision":3711032},"1.2.4":{"tag":"1.2.4","author":"catcodestudio","date":"2026-09-24 14:24:40","revision":3711491},"1.2.5":{"tag":"1.2.5","author":"catcodestudio","date":"2026-09-24 16:26:16","revision":3711678},"1.2.6":{"tag":"1.2.6","author":"catcodestudio","date":"2026-09-24 16:56:17","revision":3711716},"1.2.7":{"tag":"1.2.7","author":"catcodestudio","date":"2026-09-25 06:12:11","revision":3712469}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3664632,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3664632,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3664632,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3664632,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.2.0","1.2.1","1.2.2","1.2.3","1.2.4","1.2.5","1.2.6","1.2.7"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3664632,"resolution":"1","location":"assets","locale":"","width":1440,"height":900},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3664632,"resolution":"2","location":"assets","locale":"","width":1440,"height":900},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3664632,"resolution":"3","location":"assets","locale":"","width":1440,"height":900},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3664632,"resolution":"4","location":"assets","locale":"","width":1440,"height":900}},"screenshots":[]},"plugin_section":[],"plugin_tags":[13827,3546,161818,169397,286],"plugin_category":[45],"plugin_contributors":[271712],"plugin_business_model":[],"class_list":["post-358753","plugin","type-plugin","status-publish","hentry","plugin_tags-delivery","plugin_tags-shipping","plugin_tags-ukraine","plugin_tags-ukrposhta","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-catcodestudio","plugin_committers-catcodestudio"],"banners":{"banner":"https:\/\/ps.w.org\/catcode-shipping-with-ukrposhta-for-woocommerce\/assets\/banner-772x250.png?rev=3664632","banner_2x":"https:\/\/ps.w.org\/catcode-shipping-with-ukrposhta-for-woocommerce\/assets\/banner-1544x500.png?rev=3664632","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/catcode-shipping-with-ukrposhta-for-woocommerce\/assets\/icon-128x128.png?rev=3664632","icon_2x":"https:\/\/ps.w.org\/catcode-shipping-with-ukrposhta-for-woocommerce\/assets\/icon-256x256.png?rev=3664632","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/catcode-shipping-with-ukrposhta-for-woocommerce\/assets\/screenshot-1.png?rev=3664632","caption":""},{"src":"https:\/\/ps.w.org\/catcode-shipping-with-ukrposhta-for-woocommerce\/assets\/screenshot-2.png?rev=3664632","caption":""},{"src":"https:\/\/ps.w.org\/catcode-shipping-with-ukrposhta-for-woocommerce\/assets\/screenshot-3.png?rev=3664632","caption":""},{"src":"https:\/\/ps.w.org\/catcode-shipping-with-ukrposhta-for-woocommerce\/assets\/screenshot-4.png?rev=3664632","caption":""}],"raw_content":"<!--section=description-->\n<p>CatCode Shipping with Ukrposhta for WooCommerce integrates the official Ukrposhta (\u0423\u043a\u0440\u043f\u043e\u0448\u0442\u0430) API into your store:<\/p>\n\n<ul>\n<li><strong>Checkout picker<\/strong> \u2014 customers choose region \u2192 city \u2192 post office, backed by the official Ukrposhta Address Classifier. The selected post index is stored on the order.<\/li>\n<li><strong>Live tariff<\/strong> \u2014 domestic delivery price is fetched from the Ukrposhta eCom API (<code>\/domestic\/delivery-price<\/code>); a configurable flat rate is used as fallback. Optional free shipping over a threshold.<\/li>\n<li><strong>Encrypted credentials<\/strong> \u2014 the Bearer key is stored obfuscated at rest.<\/li>\n<\/ul>\n\n<p>To fetch the address classifier and the tariff you need a Ukrposhta eCom <strong>Bearer<\/strong> (issued by your Ukrposhta manager after signing the eCom contract). Enter it under <strong>WooCommerce \u2192 Settings \u2192 Shipping \u2192 Ukrposhta<\/strong>.<\/p>\n\n<p>Shipment (barcode \/ \u0422\u0422\u041d) creation, sticker printing and cash-on-delivery ship in a later update, once verified end-to-end against a live contract.<\/p>\n\n<p>Ukrposhta is a third-party service. This plugin is an independent integration built by CatCode; it is not affiliated with, endorsed by or sponsored by Ukrposhta.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to the official Ukrposhta eCom API so the store can show real\npost offices and real delivery prices at checkout. Nothing is sent anywhere else.<\/p>\n\n<p><strong>Ukrposhta eCom API and Address Classifier<\/strong> (https:\/\/www.ukrposhta.ua, or\nhttps:\/\/dev.ukrposhta.ua when the Sandbox option is enabled).<\/p>\n\n<ul>\n<li>When: while a customer is choosing a post office at checkout, and whenever the\ndelivery price for a cart has to be quoted.<\/li>\n<li>What is sent for the address lookup: the region, the city name being typed and\nthe chosen city id. No customer name, e-mail, phone or order data.<\/li>\n<li>What is sent for the price quote: the sender post index from the settings, the\nchosen post office index, the total weight and dimensions of the cart, and -\nonly when you enable them - the order total as the declared value and the\ncash-on-delivery amount.<\/li>\n<li>Authentication: the eCom Bearer key you enter in the plugin settings.<\/li>\n<li>Terms of service: https:\/\/www.ukrposhta.ua\/ua\/informatsiia-pro-poslugu<\/li>\n<li>Privacy policy: https:\/\/www.ukrposhta.ua\/ua\/polityka-konfidentsiinosti<\/li>\n<\/ul>\n\n<p>Using this plugin therefore means the store agrees to Ukrposhta's terms; the key\nis issued by Ukrposhta after an eCom contract is signed.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to <code>\/wp-content\/plugins\/<\/code> and activate it.<\/li>\n<li>Go to WooCommerce \u2192 Settings \u2192 Shipping, add the <strong>Ukrposhta<\/strong> method to a shipping zone.<\/li>\n<li>Enter your eCom Bearer and sender postcode. Save.<\/li>\n<li>Enable the method. The office picker appears on the checkout.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20a%20ukrposhta%20contract%3F\"><h3>Do I need a Ukrposhta contract?<\/h3><\/dt>\n<dd><p>Yes. The Address Classifier and tariff both require a Bearer issued by Ukrposhta after signing the eCom contract.<\/p><\/dd>\n<dt id=\"does%20it%20support%20the%20block%20checkout%3F\"><h3>Does it support the block checkout?<\/h3><\/dt>\n<dd><p>The office picker targets the classic checkout. Order meta is also captured on the Store API (block) checkout path.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.7<\/h4>\n\n<ul>\n<li>Fixed: while the full version from catcode.com.ua is installed, deleting this copy keeps the shared settings and the post office table, so the full version goes on working with them. Without the full version, deleting still removes everything.<\/li>\n<li>Changed: while the full version is active, this copy switches itself off instead of loading next to it (no more PHP warnings).<\/li>\n<\/ul>\n\n<h4>1.2.6<\/h4>\n\n<ul>\n<li>Fixed: uninstalling the plugin now also removes its settings (woocommerce_ukrposhta_settings, including the API tokens) and the city search cache.<\/li>\n<\/ul>\n\n<h4>1.2.5<\/h4>\n\n<ul>\n<li>Fixed: a guest who creates an account at checkout (or on the order confirmation page) no longer gets the post office as the new account's address.<\/li>\n<\/ul>\n\n<h4>1.2.4<\/h4>\n\n<ul>\n<li>Fixed: after an Ukrposhta order WooCommerce saved the post office as the logged-in shopper's billing and shipping address (block and classic checkout), so the next checkout offered the office instead of the shopper's own address. The order still gets the office; the account keeps the shopper's address.<\/li>\n<\/ul>\n\n<h4>1.2.3<\/h4>\n\n<ul>\n<li>Fixed: an office picked earlier no longer leaks into an order shipped by another method (courier, Nova Poshta) - such orders used to show an \"Ukrposhta post office\" row in the e-mails and on the order screen.<\/li>\n<li>Fixed: on the block checkout, when the only available rate was another method, the picker still opened and wrote the office into the address fields; the chosen rate is now read from the cart. The international rate no longer opens the post-office picker either.<\/li>\n<li>Switching from Ukrposhta to another method puts the shopper's own address back into the fields instead of the office.<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>The post-office picker now works on the block-based Checkout (the \"Checkout\" block), where it did not appear at all: the customer chose \"Ukrposhta\" and had no way to pick a region, a city or an office. The widget mounted only into a container the classic checkout prints, read the chosen rate from classic <code>shipping_method<\/code> inputs that the block checkout does not have, wrote the address into classic <code>#shipping_*<\/code> field ids, and re-mounted only on jQuery's <code>updated_checkout<\/code>, which the block checkout never fires. All four now handle both checkouts.<\/li>\n<li>A block checkout order can no longer be placed with the Ukrposhta rate and no post office - the same check the classic checkout already had now also runs on the Store API path.<\/li>\n<li>The script is also enqueued when the Checkout block sits on a page other than the one configured as the WooCommerce checkout page.<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Security: stored API keys are now encrypted with AES-256 (OpenSSL) instead of the old XOR obfuscation, which some hosting antivirus scanners flagged and deleted. Keys saved by earlier versions keep working.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>International shipments: the rate for a destination outside Ukraine is calculated from the country and the parcel weight (no post office involved).<\/li>\n<li>Transport type, package type, content category and tariff currency are configurable; an unavailable country\/package combination reports Ukrposhta's own reason to the log instead of quoting the domestic flat rate.<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Source strings are now English with a bundled Ukrainian translation, so the plugin can be translated into any language.<\/li>\n<li>Checkout widget labels are translatable too - they used to be hard-coded in JavaScript.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Fixed: the delivery price no longer sticks to the first quote \u2014 changing the post office (or the payment method) now re-rates the cart.<\/li>\n<li>Fixed: cash-on-delivery commission was added to every order, including prepaid ones. It is now charged only for the payment methods you list as COD.<\/li>\n<li>Added: order screen box with the chosen city, post office and post index \u2014 the meta was stored but invisible to the shop manager.<\/li>\n<li>Added: the chosen post office is shown on the thank-you page, in the customer account and in order e-mails.<\/li>\n<li>Added: the checkout refuses to go through with Ukrposhta selected but no post office chosen.<\/li>\n<li>Added: declared value is now optional \u2014 turn it off to quote a cheaper tariff without insurance.<\/li>\n<li>Added: city search falls back to transliteration, so \"Drohobych\" finds \u0414\u0440\u043e\u0433\u043e\u0431\u0438\u0447.<\/li>\n<li>Fixed: the picker no longer renders on the \"order received\" page and stays hidden until Ukrposhta is the selected shipping method.<\/li>\n<li>Fixed: the office cache compared local time against the database clock in UTC.<\/li>\n<li>Fixed: the tariff request never returned a price - measurements have to be sent inside <code>parcels<\/code>, and a sender index starting with 0 (01001) was cast to a number and rejected. Every quote used to fall back to the flat rate.<\/li>\n<li>Fixed: switching the payment method now refreshes the delivery price instead of leaving a stale one on screen.<\/li>\n<li>Added: the picker restores the chosen office after a page reload.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Works on hosts without the mbstring extension - city search and parcel description no longer fail silently.<\/li>\n<li>Lowered requirements to WordPress 5.6 \/ WooCommerce 6.0 \/ PHP 7.4.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release \u2014 checkout post-office picker and live tariff.<\/li>\n<\/ul>","raw_excerpt":"Ukrposhta (\u0423\u043a\u0440\u043f\u043e\u0448\u0442\u0430) shipping for WooCommerce \u2014 post office picker at checkout and live delivery tariff.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/358753","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=358753"}],"author":[{"embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/catcodestudio"}],"wp:attachment":[{"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=358753"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=358753"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=358753"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=358753"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=358753"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=358753"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}