{"id":393914,"date":"2026-10-28T15:54:31","date_gmt":"2026-10-28T15:54:31","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/affiliatant-for-woocommerce\/"},"modified":"2026-10-28T15:54:09","modified_gmt":"2026-10-28T15:54:09","slug":"affiliatant-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/affiliatant-for-woocommerce\/","author":12911309,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.1","stable_tag":"1.0.1","tested":"7.1.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Affiliatant for WooCommerce","header_author":"Havenswift Hosting","header_description":"Reports WooCommerce sales, refunds and subscription renewals to Affiliatant. Captures the referral server side, queues every event locally and never interrupts a checkout.","assets_banners_color":"a8acb1","last_updated":"2026-10-28 15:54:09","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/affiliatant.com\/","header_author_uri":"https:\/\/havenswift-hosting.co.uk\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":43,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.1":{"tag":"1.0.1","author":"havenswift-hosting","date":"2026-10-28 15:54:09","revision":3771014}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3771013,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3771013,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3771013,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3771013,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3771013,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3771013,"resolution":"1","location":"assets","locale":"","width":1280,"height":900},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3771013,"resolution":"2","location":"assets","locale":"","width":1280,"height":900}},"screenshots":{"1":"WooCommerce, Affiliatant: the status panel and the settings. The status\nrows answer the questions support would otherwise have to ask, including\nwhether the key in use is a live key or a test one.","2":"The plugin on the Plugins screen, declaring that it requires WooCommerce."}},"plugin_section":[],"plugin_tags":[369,2580,199783,3082,186373],"plugin_category":[35],"plugin_contributors":[284648],"plugin_business_model":[],"class_list":["post-393914","plugin","type-plugin","status-publish","hentry","plugin_tags-affiliate","plugin_tags-affiliate-program","plugin_tags-affiliate-tracking","plugin_tags-affiliates","plugin_tags-woocommerce-affiliates","plugin_category-advertising","plugin_contributors-havenswift-hosting","plugin_committers-havenswift-hosting"],"banners":{"banner":"https:\/\/ps.w.org\/affiliatant-for-woocommerce\/assets\/banner-772x250.png?rev=3771013","banner_2x":"https:\/\/ps.w.org\/affiliatant-for-woocommerce\/assets\/banner-1544x500.png?rev=3771013","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/affiliatant-for-woocommerce\/assets\/icon.svg?rev=3771013","icon":"https:\/\/ps.w.org\/affiliatant-for-woocommerce\/assets\/icon.svg?rev=3771013","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/affiliatant-for-woocommerce\/assets\/screenshot-1.png?rev=3771013","caption":"WooCommerce, Affiliatant: the status panel and the settings. The status\nrows answer the questions support would otherwise have to ask, including\nwhether the key in use is a live key or a test one."},{"src":"https:\/\/ps.w.org\/affiliatant-for-woocommerce\/assets\/screenshot-2.png?rev=3771013","caption":"The plugin on the Plugins screen, declaring that it requires WooCommerce."}],"raw_content":"<!--section=description-->\n<p>This plugin connects a WooCommerce store to an affiliate programme you run at\nAffiliatant. It records which referral brought a shopper to the store, and it\ntells Affiliatant when that shopper buys, when the order is refunded and when\na subscription renews. Affiliatant works out what is owed. Nothing in this\nplugin moves money.<\/p>\n\n<p>An Affiliatant account is required. The plugin does nothing until you enter an\nAPI key and a programme id, and it requires WooCommerce: without WooCommerce\nactive it records nothing and says so on the Plugins screen.<\/p>\n\n<p>Everything described below is in this plugin. There is no trial, no licence\ncheck, and no feature here that waits for a payment.<\/p>\n\n<h4>What it does<\/h4>\n\n<ul>\n<li><strong>Click capture, server side.<\/strong> A shopper arriving with <code>?aftid=<\/code> is\nrecorded by PHP on the landing request. The click id is kept in a\nfirst-party cookie, for thirty days by default, and on the WooCommerce\nsession.<\/li>\n<li><strong>A beacon for cached pages.<\/strong> A cached page never runs PHP, and some edge\ncaches strip the query string before the request reaches the origin. A small\nscript reads the address bar and posts the click id to your own site's\n  admin-ajax.php. It posts to your site, not to ours, and it sends nothing\nwhen there is no click id in the URL.<\/li>\n<li><strong>Classic checkout and Blocks.<\/strong> The referral is bound to the order on both\nthe classic checkout hooks and the Store API hooks the Blocks checkout uses.<\/li>\n<li><strong>Sales.<\/strong> An order reaching a status you count as paid is reported once.\nThe default is whatever WooCommerce itself calls paid.<\/li>\n<li><strong>Refunds and cancellations.<\/strong> A refund or a cancellation is reported as a\nreversal, so a commission can be withdrawn.<\/li>\n<li><strong>Subscription renewals.<\/strong> Renewal payments taken by WooCommerce\nSubscriptions are reported, carrying the id of the order that started the\nsubscription.<\/li>\n<li><strong>Coupon codes.<\/strong> Codes used on the order are sent, so a sale can be\nattributed to a code when there was no click to follow.<\/li>\n<li><strong>sub1 to sub5.<\/strong> Five pass-through parameters are carried from the landing\nURL to the conversion.<\/li>\n<li><strong>A local queue.<\/strong> Every event is written to a table in your own database\nfirst and sent afterwards by a background job, through Action Scheduler\nwhere it is available and WP-Cron where it is not. A checkout is never held\nup by a network call, and an event that cannot be sent is retried rather\nthan lost.<\/li>\n<li><strong>Reconciliation.<\/strong> The server report and the receipt pixel carry the same\ndeterministic event id, so one sale is counted once.<\/li>\n<li><strong>A receipt pixel<\/strong>, which can be switched off.<\/li>\n<li><strong>A connection test<\/strong> that sends a real conversion marked as test data, so\npressing it proves the key, the programme id, the signature and the network\nat once without creating a commission.<\/li>\n<li><strong>A status panel<\/strong> showing the queue, the last event sent and the last\nerror, with retry and clear.<\/li>\n<li><strong>An order meta box<\/strong> showing the click id bound to that order, and letting\nyou set one by hand.<\/li>\n<li><strong>Test mode<\/strong>, which marks everything sent as test data.<\/li>\n<li><strong>HPOS and Blocks compatibility<\/strong>, declared. Order data is read and written\nthrough the WooCommerce CRUD API only.<\/li>\n<\/ul>\n\n<h4>What it does not do<\/h4>\n\n<p>It does not run the affiliate programme. Affiliates, links, commission rates,\napprovals and payouts live in Affiliatant, not in WordPress. It does not add\nan affiliate dashboard or a registration form to your site. It does not cloak\nlinks. It does not pay anybody.<\/p>\n\n<h4>Money<\/h4>\n\n<p>Every amount is sent as a whole number in the currency's minor unit, together\nwith the currency of the order, calculated with string arithmetic rather than\nfloating point.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin relies on one external service, Affiliatant, and contacts nothing\nelse. It contacts nothing on activation, and nothing on a schedule, until you\nhave entered an API key and a programme id on its settings screen.\nAffiliatant is a service run by Havenswift Hosting, and it is what makes the\nplugin useful: it holds the affiliate programme, matches each sale to the\nreferral that produced it and calculates the commission.<\/p>\n\n<p><strong>Affiliatant, from your server.<\/strong> When an order reaches a paid status, is\nrefunded, is cancelled, or a subscription renews, your server sends that event\nto Affiliatant. It is sent by a background job, not during the shopper's\ncheckout request. The settings screen's connection test sends one event the\nsame way, marked as test data.<\/p>\n\n<p>What is sent: your programme id and store reference; the order id and order\nnumber; an event id; the kind of event; the order total, tax, shipping and\ndiscount as whole numbers in the minor unit; the currency; the date of the\norder; a test flag; the line items, each with its name, SKU, product and\nvariation ids, quantity, unit and line amounts and tax; any coupon codes used;\nthe payment method identifier; for a renewal, the id of the original order;\nthe numeric WordPress customer id where the shopper has an account; the click\nid; sub1 to sub5; and the landing URL the shopper arrived on. The request\ncarries your API key and a user agent naming the versions of this plugin,\nWooCommerce and WordPress.<\/p>\n\n<p>What is not sent: no customer name, no email address, no postal address, no\ntelephone number and no IP address.<\/p>\n\n<p>Service: https:\/\/affiliatant.com\nTerms: https:\/\/affiliatant.com\/legal\/terms\nPrivacy: https:\/\/affiliatant.com\/legal\/privacy<\/p>\n\n<p><strong>Affiliatant, from the shopper's browser.<\/strong> When the receipt pixel is on, the\norder-received page includes a one-pixel image served by Affiliatant. The\nrequest is made by the shopper's browser and therefore carries their IP\naddress and the address of the page. It is sent only on the order-received\npage, and only when the plugin is configured and the pixel setting is on. Turn\nthe pixel off in the settings and no request is made from any visitor's\nbrowser.<\/p>\n\n<p>What is sent: your programme id and store id; the order id; the event id; the\nkind of event; the order total, tax and shipping as whole numbers in the minor\nunit; the currency; the date of the order; the click id; the coupon code; the\nnumeric WordPress customer id where the shopper has an account; and a test\nflag. The whole query is signed.<\/p>\n\n<p>Service: https:\/\/affiliatant.com\nTerms: https:\/\/affiliatant.com\/legal\/terms\nPrivacy: https:\/\/affiliatant.com\/legal\/privacy<\/p>\n\n<p>The click beacon described above posts to your own site's <code>admin-ajax.php<\/code>. It\nis not a request to Affiliatant and no third party receives it.<\/p>\n\n<p>There is no usage tracking, no telemetry and no analytics of any kind.<\/p>\n\n<p>The plugin is published by Havenswift Hosting,\nhttps:\/\/www.havenswift-hosting.co.uk\/<\/p>\n\n<h3>Third-party libraries<\/h3>\n\n<p>The Affiliatant PHP SDK is included at <code>lib\/AffiliatantClient.php<\/code>. It is one\nfile, written by us, and it is published under the MIT licence while the rest\nof the plugin is GPLv2 or later. MIT is GPL-compatible. No other library ships\nwith this plugin and nothing is minified.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate WooCommerce first. This plugin records nothing\nwithout it.<\/li>\n<li>Upload the folder to <code>\/wp-content\/plugins\/<\/code> and activate it, or install it\nfrom the Plugins screen.<\/li>\n<li>Create a programme at https:\/\/affiliatant.com and generate an API key for\nit.<\/li>\n<li>Go to WooCommerce &gt; Affiliatant and enter the API key, the key prefix, the\nsigning secret and the programme id.<\/li>\n<li>Press \"Send a test conversion\". It sends one conversion marked as test\ndata and tells you what came back.<\/li>\n<li>Place a test order on your store with <code>?aftid=<\/code> on the landing URL and\ncheck that it appears in the status panel.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20need%20an%20affiliatant%20account%3F\"><h3>Does it need an Affiliatant account?<\/h3><\/dt>\n<dd><p>Yes. The plugin reports to Affiliatant and has no function without an account\nthere. See \"External services\" above for exactly what is sent and when.<\/p><\/dd>\n<dt id=\"does%20it%20work%20without%20woocommerce%3F\"><h3>Does it work without WooCommerce?<\/h3><\/dt>\n<dd><p>No. It reads WooCommerce orders and hooks WooCommerce events. With WooCommerce\ninactive it records nothing and shows a notice saying so.<\/p><\/dd>\n<dt id=\"does%20it%20expire%2C%20or%20stop%20working%3F\"><h3>Does it expire, or stop working?<\/h3><\/dt>\n<dd><p>No. There is no trial, no licence check and no feature in this plugin that\nwaits for a payment. What is in the description is what it does, permanently.<\/p><\/dd>\n<dt id=\"can%20it%20slow%20down%20or%20break%20my%20checkout%3F\"><h3>Can it slow down or break my checkout?<\/h3><\/dt>\n<dd><p>The event is written to a table in your database during the request and sent\nafterwards by a background job, so a normal checkout makes no outbound call at\nall. Nothing in the sending code is allowed to throw out of a WooCommerce hook:\nif Affiliatant is unreachable the checkout completes and the event waits in the\nqueue.<\/p><\/dd>\n<dt id=\"what%20customer%20data%20leaves%20my%20site%3F\"><h3>What customer data leaves my site?<\/h3><\/dt>\n<dd><p>The numeric WordPress customer id, where the shopper has an account, and\nnothing else about the person. No name, email, address, telephone number or IP\naddress is sent from your server. The receipt pixel is a request from the\nshopper's own browser, so it carries their IP address the way any third-party\nimage does; turn the pixel off if you do not want that.<\/p><\/dd>\n<dt id=\"does%20it%20set%20a%20cookie%3F\"><h3>Does it set a cookie?<\/h3><\/dt>\n<dd><p>Only for a shopper who arrives with a referral in the URL. The cookie holds a\ntoken that points at the click, is first-party, HTTP-only, secure on HTTPS,\nand lasts thirty days by default. You can set it between one and 365 days.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20data%20if%20i%20delete%20the%20plugin%3F\"><h3>What happens to my data if I delete the plugin?<\/h3><\/dt>\n<dd><p>The settings are deleted. The queue table is left in place, because it is the\nrecord of which orders were reported and which were not. Drop it by hand if\nyou want it gone; the name is in <code>uninstall.php<\/code>.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20the%20blocks%20checkout%20and%20with%20hpos%3F\"><h3>Does it work with the Blocks checkout and with HPOS?<\/h3><\/dt>\n<dd><p>Yes. Compatibility with high-performance order storage and with the cart and\ncheckout blocks is declared, and order data is read and written only through\nthe WooCommerce CRUD API.<\/p><\/dd>\n<dt id=\"does%20it%20support%20woocommerce%20subscriptions%3F\"><h3>Does it support WooCommerce Subscriptions?<\/h3><\/dt>\n<dd><p>Renewal payments are reported when WooCommerce Subscriptions is active. The\nplugin does not require it.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>The bundled API client no longer contains cURL or stream fallbacks.\nAll HTTP goes through the WordPress HTTP API.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"Affiliate tracking for WooCommerce. Captures the referral server side and reports every sale, refund and renewal to your Affiliatant account.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/393914","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=393914"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/havenswift-hosting"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=393914"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=393914"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=393914"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=393914"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=393914"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=393914"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}