{"id":376871,"date":"2026-09-28T08:50:55","date_gmt":"2026-09-28T08:50:55","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/zinn-reseller-toolkit\/"},"modified":"2026-09-29T02:36:45","modified_gmt":"2026-09-29T02:36:45","slug":"zinn-reseller","status":"publish","type":"plugin","link":"https:\/\/en-ca.wordpress.org\/plugins\/zinn-reseller\/","author":23304153,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.4.0","stable_tag":"1.4.0","tested":"7.1.2","requires":"6.6","requires_php":"8.2","requires_plugins":null,"header_name":"Zinn\u00ae Reseller Toolkit","header_author":"Neil Lock \u2014 CEO, Zinn Digital\u00ae Ltd","header_description":"Sell Zinn Digital\u00ae hosting from your own WordPress site \u2014 WordPress, WooCommerce, agency, reseller, cloud and VPS hosting. Search and offer domains from your reseller account, sign your clients straight into their hosting panel, and provision hosting automatically when a WooCommerce order is paid.","assets_banners_color":"9ea3b3","last_updated":"2026-09-29 02:36:45","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/zinndigital.com\/wordpress-plugins\/zinn-reseller","header_author_uri":"https:\/\/zinndigital.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":92,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.2.8":{"tag":"1.2.8","author":"zinndigital","date":"2026-09-28 08:48:33","revision":3716679},"1.2.9":{"tag":"1.2.9","author":"zinndigital","date":"2026-09-28 10:51:55","revision":3716955},"1.3.0":{"tag":"1.3.0","author":"zinndigital","date":"2026-09-28 22:13:10","revision":3717974},"1.4.0":{"tag":"1.4.0","author":"zinndigital","date":"2026-09-29 02:36:45","revision":3718165}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3716678,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3716678,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3716678,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3716678,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.2.8","1.2.9","1.3.0","1.4.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3716952,"resolution":"1","location":"assets","locale":"","width":1280,"height":860},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3716952,"resolution":"2","location":"assets","locale":"","width":1280,"height":860},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3716952,"resolution":"3","location":"assets","locale":"","width":1280,"height":860}},"screenshots":{"1":"The settings screen and its connection status.","2":"Domain search results on a page.","3":"A WooCommerce order: the Zinn\u00ae hosting panel shows what provisioning did, or why it did not."}},"plugin_section":[262246],"plugin_tags":[1556,3013,1456,23720,286],"plugin_category":[45],"plugin_contributors":[280285],"plugin_business_model":[],"class_list":["post-376871","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-api","plugin_tags-domains","plugin_tags-hosting","plugin_tags-reseller","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-zinndigital","plugin_committers-zinndigital"],"banners":{"banner":"https:\/\/ps.w.org\/zinn-reseller\/assets\/banner-772x250.png?rev=3716678","banner_2x":"https:\/\/ps.w.org\/zinn-reseller\/assets\/banner-1544x500.png?rev=3716678","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/zinn-reseller\/assets\/icon-128x128.png?rev=3716678","icon_2x":"https:\/\/ps.w.org\/zinn-reseller\/assets\/icon-256x256.png?rev=3716678","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/zinn-reseller\/assets\/screenshot-1.png?rev=3716952","caption":"The settings screen and its connection status."},{"src":"https:\/\/ps.w.org\/zinn-reseller\/assets\/screenshot-2.png?rev=3716952","caption":"Domain search results on a page."},{"src":"https:\/\/ps.w.org\/zinn-reseller\/assets\/screenshot-3.png?rev=3716952","caption":"A WooCommerce order: the Zinn\u00ae hosting panel shows what provisioning did, or why it did not."}],"raw_content":"<!--section=description-->\n<p>If you resell Zinn\u00ae hosting, this plugin connects your own WordPress site to your reseller account so your customers never have to leave it.<\/p>\n\n<p>It has three parts and <strong>they are separate switches<\/strong>. Turn on only what you need \u2014 nothing that is switched off loads any code, registers any hook or enqueues any stylesheet.<\/p>\n\n<p><strong>1. Domain search<\/strong><\/p>\n\n<p>Put <code>[zinn_domain_search]<\/code> on any page. A visitor types a name, and the results come back live. Once your reseller key is set they come from your own domain account with your own prices on them; before that, the search already works against the public catalogue and its prices.<\/p>\n\n<ul>\n<li>No JavaScript at all. The form is a plain search that works with scripting off, is crawlable, and produces a shareable result URL.<\/li>\n<li>Three honest answers, not two. Available, already registered, and <strong>\"we could not check\"<\/strong> \u2014 because when no registrar can be reached, telling a visitor a name is taken makes them abandon a name that may well be free.<\/li>\n<li>Results are cached for five minutes so a busy page does not hammer the registry.<\/li>\n<\/ul>\n\n<p>Attributes:<\/p>\n\n<pre><code>[zinn_domain_search placeholder=\"Find your domain\" button=\"Search\" tlds=\"com,co.uk,io\"]\n\ntlds accepts up to five extensions. Leave it out and the default set is used.\n<\/code><\/pre>\n\n<p><strong>2. Panel link<\/strong><\/p>\n\n<p>Put <code>[zinn_panel_link]<\/code> anywhere a signed-in customer will see it \u2014 a My Account page is the usual home. It renders a single link that takes them straight into their hosting panel, already signed in.<\/p>\n\n<p>The sign-in link is minted <strong>when the link is clicked<\/strong>, not when the page is rendered, so it never sits in a page cache and never reaches a crawler. It is single-use and expires within minutes.<\/p>\n\n<pre><code>[zinn_panel_link label=\"Manage my hosting\"]\n<\/code><\/pre>\n\n<p><strong>3. WooCommerce provisioning<\/strong><\/p>\n\n<p>Sell hosting as an ordinary WooCommerce product, take the money through your own gateway into your own account, and hosting is set up the moment the order is paid.<\/p>\n\n<ul>\n<li>Set the Zinn\u00ae product line on the product's <strong>Inventory<\/strong> tab, or set one default for the whole shop in the plugin settings.<\/li>\n<li>The customer's chosen hostname is read from the order item's <code>zinn_domain<\/code> meta \u2014 set it from your own domain field, or from the domain search above.<\/li>\n<li>A returning customer's second order lands under the <strong>same<\/strong> client account, not a second one.<\/li>\n<li>Every call is idempotent, so a gateway retry or an order moved from Processing to Completed can never provision twice.<\/li>\n<li>If provisioning fails, the reason is written to the order as a note <strong>and<\/strong> shown in a panel on the order screen \u2014 never only to a PHP log where nobody would find it.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin lets you sell Zinn Digital\u00ae hosting from your own WordPress site. It is a front end\nfor the Zinn\u00ae reseller API and requires a reseller account.<\/p>\n\n<p><strong>What is sent, and when<\/strong><\/p>\n\n<ul>\n<li><strong>Domain search (when a visitor searches).<\/strong> The search term is sent to\n  https:\/\/api.zinndigital.com\/v1\/public\/domains\/search (or <code>\/v1\/domains\/search<\/code> when\nauthenticated) to check availability and price. <strong>The search term is the visitor's input; no\nother visitor data, IP address or identifier is added by this plugin.<\/strong><\/li>\n<li><strong>Programme and plan data.<\/strong> <code>\/v1\/reseller\/program<\/code> is read to render your plans and prices.<\/li>\n<li><strong>Provisioning (when a WooCommerce order is paid).<\/strong> Two requests, in order. The customer's\nname and e-mail go to <code>\/v1\/orgs<\/code> so their hosting account can be created, and the ordered\nplan and domain name then go to <code>\/v1\/sites<\/code> so the site itself can be provisioned. This is a\ntransfer of your customer's personal data to Zinn Digital\u00ae as a processor, and you should\nreflect it in your own privacy policy.<\/li>\n<li><strong>Client sign-in (when a signed-in customer presses \"Open hosting panel\").<\/strong> This site asks\n  \/v1\/reseller\/services\/\/sso, using your reseller credential, for a one-time link\nand then redirects the browser to <code>https:\/\/app.zinndigital.com<\/code>. No password and no customer\ncredential passes through this site \u2014 only the identifier of the service being opened.<\/li>\n<\/ul>\n\n<p>Nothing is transmitted until you enter reseller API credentials.<\/p>\n\n<p>Service terms: https:\/\/zinndigital.com\/legal\/terms\nPrivacy policy: https:\/\/zinndigital.com\/legal\/privacy<\/p>\n\n<ul>\n<li><strong>Support diagnostics (only when you press send).<\/strong> If you ask us for help, the plugin can send\na support report to <code>https:\/\/api.zinndigital.com\/v1\/connector\/diagnostics<\/code>. <strong>You are shown the\nexact payload first, already redacted, and nothing leaves your site until you press send.<\/strong>\nCredentials are excluded by declaration rather than by matching key names, and render as\n  [not sent \u2014 credential]. The plugin never sends this on its own initiative.<\/li>\n<\/ul>\n\n<h3>Translations<\/h3>\n\n<p><strong>Every string this plugin adds to your admin is translated into 57 languages<\/strong> \u2014 labels, notices,\nerrors and settings, not a subset. The catalogues are bundled in the plugin, so they work as soon\nas you set your site language; there is no separate language pack to install.<\/p>\n\n<p>Every user-visible string is complete in every one of the 53 languages WordPress can serve\ntoday:<\/p>\n\n<p>Amharic (am), Arabic (ar), Azerbaijani (az), Bulgarian (bg_BG), Bengali (Bangladesh)\n(bn_BD), Czech (cs_CZ), German (de_DE), Greek (el), Spanish (Spain) (es_ES), Persian\n(fa_IR), French (France) (fr_FR), Gujarati (gu), Hebrew (he_IL), Hindi (hi_IN), Croatian\n(hr), Hungarian (hu_HU), Armenian (hy), Indonesian (id_ID), Italian (it_IT), Japanese\n(ja), Georgian (ka_GE), Kazakh (kk), Khmer (km), Kannada (kn), Korean (ko_KR), Lao (lo),\nMalayalam (ml_IN), Mongolian (mn), Marathi (mr), Malay (ms_MY), Myanmar (Burmese)\n(my_MM), Nepali (ne_NP), Dutch (nl_NL), Panjabi (India) (pa_IN), Polish (pl_PL), Pashto\n(ps), Portuguese (Brazil) (pt_BR), Romanian (ro_RO), Russian (ru_RU), Sinhala (si_LK),\nAlbanian (sq), Serbian (sr_RS), Swahili (sw), Tamil (ta_IN), Telugu (te), Thai (th),\nTagalog (tl), Turkish (tr_TR), Ukrainian (uk), Urdu (ur), Uzbek (uz_UZ), Vietnamese\n(vi), Chinese (China) (zh_CN)<\/p>\n\n<p>A further 4 ship complete in the plugin \u2014 Hausa (ha), Somali (so_SO), Tajik (tg), Yoruba (yo) \u2014 but\nWordPress core does not currently provide a locale for them, so WordPress cannot load them.<\/p>\n\n<h4>Right-to-left<\/h4>\n\n<p>Arabic, Persian, Hebrew, Pashto and Urdu are right-to-left. Every screen this plugin adds was\nrendered in a real WordPress install in each of those languages and checked, not assumed.<\/p>\n\n<h4>For translators<\/h4>\n\n<pre><code>languages\/ holds the `.pot` template plus a `.po`, `.mo` and `.l10n.php` for every language, so\n<\/code><\/pre>\n\n<p>corrections and new languages can be contributed directly.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin.<\/li>\n<li>In your Zinn\u00ae dashboard, go to <strong>Developer \u2192 API keys<\/strong> and create a key. Give it only the permissions you need: <code>sites.create<\/code> and <code>org.read<\/code> for WooCommerce provisioning, <code>reseller.view<\/code> and <code>reseller.provision<\/code> for the panel link.<\/li>\n<li>In WordPress, go to <strong>Zinn Digital\u00ae \u2192 Reseller Toolkit<\/strong>, paste the key on the <strong>Account<\/strong> tab, and save.<\/li>\n<li>The status panel at the top of that screen tells you whether a key is set and which features are switched on.<\/li>\n<li>Switch on the modules you want on the <strong>Features<\/strong> tab.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20my%20customers%27%20payments%20go%20through%20zinn%C2%AE%3F\"><h3>Do my customers' payments go through Zinn\u00ae?<\/h3><\/dt>\n<dd><p>No. WooCommerce settles the money into your own account through your own gateway. This plugin runs after the order is paid and only tells the hosting platform to provision.<\/p><\/dd>\n<dt id=\"can%20i%20restyle%20the%20domain%20search%3F\"><h3>Can I restyle the domain search?<\/h3><\/dt>\n<dd><p>Yes. It ships with a deliberately small stylesheet that sets layout and state colour and nothing else. Override these classes in your theme: <code>.zinn-domain-search<\/code>, <code>.zinn-domain-results<\/code>, <code>.zinn-domain-result<\/code>, <code>.zinn-domain-result--available<\/code>, <code>.zinn-domain-result--taken<\/code>, <code>.zinn-domain-result--unknown<\/code>, <code>.zinn-domain-name<\/code>, <code>.zinn-domain-state<\/code>, <code>.zinn-domain-buy<\/code>, <code>.zinn-domain-error<\/code>.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20deactivate%20the%20plugin%3F\"><h3>What happens if I deactivate the plugin?<\/h3><\/dt>\n<dd><p>Nothing is provisioned or cancelled. Uninstalling removes the plugin's own settings; it deliberately leaves the links between your customers and their hosting alone, because those are the only record of what a customer is paying for.<\/p><\/dd>\n<dt id=\"does%20it%20work%20on%20multisite%3F\"><h3>Does it work on multisite?<\/h3><\/dt>\n<dd><p>Yes. Settings are per site, and uninstalling clears them on every site in the network.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Smaller download: the editable translation sources (.po) are no longer shipped; WordPress only ever loads the compiled .mo and .l10n.php files, which are unchanged.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Updates install whenever you click Update, even months later: the download link is fetched fresh at install time instead of expiring in WordPress's saved update data.<\/li>\n<\/ul>\n\n<h4>1.2.10<\/h4>\n\n<ul>\n<li>Security hardening: the design-token stylesheet validates every component id and strips anything that could close the inline style.<\/li>\n<\/ul>\n\n<h4>1.2.9<\/h4>\n\n<ul>\n<li>WooCommerce provisioning no longer writes \"No Zinn\u00ae API key is configured\" onto orders that are not hosting; the settings screen says domain search already works before a key is set; readme and screenshot captions corrected; listed on WordPress.org.<\/li>\n<\/ul>\n\n<h4>1.2.8<\/h4>\n\n<ul>\n<li>A neutral plugin description. The installation steps and the missing-key message now point at the real settings screen, Zinn Digital\u00ae \u2192 Reseller Toolkit, and describe its status panel as it is. Its \"Open my Zinn\u00ae dashboard\" button opened a page that does not exist; it now opens API keys.<\/li>\n<\/ul>\n\n<h4>1.2.7<\/h4>\n\n<ul>\n<li>Translations: a word written in the wrong alphabet (for example a Korean word inside a Malayalam sentence, or an Urdu word ending a Punjabi one) is corrected in every language that had one. Each affected string was translated again and checked.<\/li>\n<\/ul>\n\n<h4>1.2.6<\/h4>\n\n<ul>\n<li>Tested up to: 7.1 \u2014 the major version only, as WordPress.org's Plugin Check requires (7.1.1 was refused as invalid_tested_upto_minor).<\/li>\n<\/ul>\n\n<h4>1.2.5<\/h4>\n\n<ul>\n<li>Tested up to WordPress 7.1.1.<\/li>\n<\/ul>\n\n<h4>1.2.4<\/h4>\n\n<ul>\n<li>In a right-to-left admin language, the Zinn Digital\u00ae menu entry showed its trademark symbol on the wrong side of the name. The name is now isolated so it reads correctly in Arabic, Hebrew, Persian, Pashto and Urdu.<\/li>\n<\/ul>\n\n<h4>1.2.3<\/h4>\n\n<ul>\n<li>The admin screens' styles and scripts are now enqueued through WordPress rather than printed into the page, so they can be dequeued, deferred or optimised by your site like any other asset \u2014 and they still work on a site whose security policy forbids inline code.<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>Translations: every string this plugin's admin shows is now translated in every bundled language. A few strings the machine translator refused were shipping in English; they are now translated by hand.<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Hardening: a settings rule can no longer be mistaken for a PHP function with the same name. The same shared settings code is what stopped Zinn\u00ae Translate saving its settings. Nothing about how this plugin behaves changes.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<p>The domain-search widget can be styled \u2014 four presets and eight colours and sizes you can override \u2014 and the settings screen now tells you whether anything is actually switched on.<\/p>\n\n<h4>1.1.3<\/h4>\n\n<ul>\n<li>Documented two API requests the plugin has always made and the readme did not mention: creating the site after an order is paid, and minting the one-time hosting-panel sign-in link.<\/li>\n<\/ul>\n\n<h4>1.1.2<\/h4>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Added the Zinn\u00ae panel: links to Zinn Digital\u00ae hosting, the Zinn\u00ae marketplace, Zinn Hub\u00ae and this plugin's user guide, from inside the WordPress admin.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release: domain search, panel sign-in link, and WooCommerce provisioning.<\/li>\n<\/ul>","raw_excerpt":"Sell Zinn Digital\u00ae hosting from your own site: search domains, sign clients into their panel, provision hosting on a paid WooCommerce order.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/376871","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=376871"}],"author":[{"embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/zinndigital"}],"wp:attachment":[{"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=376871"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=376871"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=376871"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=376871"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=376871"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=376871"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}