{"id":353553,"date":"2026-08-20T11:31:18","date_gmt":"2026-08-20T11:31:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/devdome-affiliate-manager\/"},"modified":"2026-08-20T11:30:49","modified_gmt":"2026-08-20T11:30:49","slug":"devdome-affiliate-manager","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/devdome-affiliate-manager\/","author":23522764,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.1","stable_tag":"1.0.1","tested":"7.0.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"DevDome Affiliate Manager","header_author":"DevDome","header_description":"Amazon affiliate link management \u2014 auto-tagging, geo-localization, dead-link recovery, link-health monitoring, keyword auto-linking, click protection, and WooCommerce support.","assets_banners_color":"f1f5fc","last_updated":"2026-08-20 11:30:49","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":25,"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":"devdome","date":"2026-08-20 11:30:49"}},"upgrade_notice":{"1.0.0":"<p>Identifier rename release. Settings, click stats and the link index migrate automatically on self-hosted upgrades, and the old button shortcode keeps working via an alias. Fresh installs are unaffected.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3656665,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3656665,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3656665,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3656665,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.1"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[369,5362,209,727,286],"plugin_category":[35,45],"plugin_contributors":[273385],"plugin_business_model":[],"class_list":["post-353553","plugin","type-plugin","status-publish","hentry","plugin_tags-affiliate","plugin_tags-affiliate-links","plugin_tags-amazon","plugin_tags-redirect","plugin_tags-woocommerce","plugin_category-advertising","plugin_category-ecommerce","plugin_contributors-devdome","plugin_committers-devdome"],"banners":{"banner":"https:\/\/ps.w.org\/devdome-affiliate-manager\/assets\/banner-772x250.png?rev=3656665","banner_2x":"https:\/\/ps.w.org\/devdome-affiliate-manager\/assets\/banner-1544x500.png?rev=3656665","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/devdome-affiliate-manager\/assets\/icon-128x128.png?rev=3656665","icon_2x":"https:\/\/ps.w.org\/devdome-affiliate-manager\/assets\/icon-256x256.png?rev=3656665","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>DevDome Affiliate Manager keeps your Amazon affiliate links correctly tagged, healthy, and converting, automatically.<\/p>\n\n<p><strong>Link Setup<\/strong>: Store an affiliate tag per Amazon store (22 marketplaces). Apply a tag sitewide or by post\/page\/category rules (priority: post\/page &gt; category &gt; sitewide). On the front end, Amazon links in your content get the right <code>?tag=<\/code>, plus <code>rel=\"nofollow sponsored\"<\/code> and an optional new tab. A <code>[devdaffi_button]<\/code> shortcode renders a styled, auto-tagged button from an ASIN or custom URL.<\/p>\n\n<p><strong>Click redirect (\/go)<\/strong>: All Amazon clicks route through a <code>\/go<\/code> endpoint that expands shortlinks, enforces an Amazon-only allowlist (no open redirect), applies the correct tag, and records the click. Unique-visitor counts use a temporary pseudonymous fingerprint (a hash of the visitor's IP address and browser user agent, kept for 30 minutes); the raw IP address and user agent are not stored by the click statistics.<\/p>\n\n<p><strong>Keyword Auto-Linker<\/strong>: Automatically turn chosen keywords in your content into tagged Amazon links, with per-rule limits, match types, and skip rules (headings, code, existing links, etc.).<\/p>\n\n<p><strong>Link Radar (Scanner + Monitor)<\/strong>: Scans your content (and WooCommerce external products) for Amazon ASINs, then checks each for <strong>Live \/ Out-of-Stock \/ 404<\/strong> status on a schedule.<\/p>\n\n<p><strong>Smart dead-link recovery<\/strong>: When a product is out of stock or its page is gone (404), redirect the click to a relevant live product (built from the product title\/metadata) or to the Amazon search page (chosen per status). Includes a one-click bulk <strong>Replace ASIN<\/strong> tool.<\/p>\n\n<p><strong>Geo-localization (OneLink alternative)<\/strong>: Detect a visitor's country and send them to their local Amazon store with your tag for that store, only where you have a tag (commission stays safe). Cross-region ASIN is validated; dead ASINs fall back to the local search page.<\/p>\n\n<p><strong>WooCommerce<\/strong>: Optionally rewrite external\/affiliate product buttons to route through <code>\/go<\/code> with your tag.<\/p>\n\n<p><strong>Click Protection<\/strong>: Block known bots from triggering affiliate links (built-in bot list, no external service needed), with selectable redirect methods.<\/p>\n\n<p><strong>Mobile App Opener<\/strong>: Optionally open Amazon links in the Amazon app on mobile (Android intent; iOS \"Open in Safari\" helper inside in-app browsers).<\/p>\n\n<p>DevDome Affiliate Manager is an independent project. Amazon, Amazon Associates and OneLink are trademarks of Amazon.com, Inc. or its affiliates; this plugin is not endorsed by, sponsored by, or otherwise affiliated with Amazon.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin talks to the DevDome server at <strong>https:\/\/api.devdome.com<\/strong> for the features that need data a plugin cannot ship (a geo-IP database, an Amazon status checker). API keys stay on the server; you never paste one.<\/p>\n\n<p>Terms of service: https:\/\/devdome.com\/terms-of-service\nPrivacy policy: https:\/\/devdome.com\/privacy-policy<\/p>\n\n<h4>Link Radar status checks, https:\/\/api.devdome.com\/amazon-404-oos-checker<\/h4>\n\n<p><strong>\/check-batch<\/strong> sends the Amazon <strong>ASINs<\/strong> found by your link scan, with each one's Amazon domain, to classify them as live \/ out of stock \/ 404. It runs when you press Check Now, and on the Link Radar schedule only while automatic re-scans are enabled; a fresh install that has never scanned makes no request.<\/p>\n\n<p><strong>\/search<\/strong> sends a product <strong>keyword<\/strong> (built from the product's title or metadata) to find a live replacement product. It is used by the bulk Replace ASIN tool and, when you enable per-status dead-link recovery, at click time. No visitor data is in either request.<\/p>\n\n<p>Both are part of the hosted Link Radar service and require a <strong>connected DevDome account<\/strong>. Creating the account costs nothing: each request carries this site's domain and secret token so the service can meter usage. The free plan includes <strong>500 checks + searches per month<\/strong> per account; paid plans raise the limit (20,000 \/ 50,000 \/ 100,000, see devdome.com\/pricing). The plugin shows your live usage meter on its settings screen. When the site is not connected or the monthly limit is reached, the service answers with an error and the plugin simply leaves link statuses unchanged, so nothing on your site breaks.<\/p>\n\n<h4>Geo-localization, https:\/\/api.devdome.com\/geo-resolve<\/h4>\n\n<p>Off by default. When you enable it, each <code>\/go<\/code> click sends the <strong>visitor's IP address<\/strong> and the destination ASIN\/domain, plus this site's domain and secret token, so the server can pick the visitor's local Amazon store from the stores you have a tag for. The IP is used for the country lookup only and cached briefly. Enable this feature only if you want visitor IPs used for country detection. Geo store-routing is part of the hosted DevDome service and is <strong>free with a connected DevDome account<\/strong>; without one, visitors simply keep the original link.<\/p>\n\n<h4>DevDome account, https:\/\/api.devdome.com\/plugin\/account, \/plugin\/disconnect and https:\/\/analytics.devdome.com\/api\/plugin\/connect\/*<\/h4>\n\n<p>Made by the shared DevDome library bundled with every plugin in the suite, and never before you have acted: until you press a Connect button, save an Account ID or complete a connection, no account request is made. The account check is a GET carrying this site's domain and its secret token, answered with the Account ID and account email address the token belongs to. Disconnect is a POST with the same two fields, sent only when you press Disconnect. Pressing Connect registers a short-lived connect request (<code>\/api\/plugin\/connect\/start<\/code>, a POST with the site domain and token) and, after you authorize on devdome.com, the plugin collects the resulting Account ID server-to-server (<code>\/api\/plugin\/connect\/claim<\/code>, same fields plus the request handle); the Account ID and token never travel in your browser's URL. <code>https:\/\/devdome.com\/connect\/<\/code> is a link you click, not a request the plugin makes: your browser goes there to sign in and comes back.<\/p>\n\n<h4>Amazon<\/h4>\n\n<p>At click time the <code>\/go<\/code> endpoint expands Amazon shortlinks (amzn.to, a.co, \u2026) by requesting them server-side from Amazon, so the final product URL can be validated and tagged. The result is cached for 12 hours. Only the shortlink URL is requested; no visitor data is sent to Amazon by the plugin.<\/p>\n\n<p>This service is provided by Amazon.com, Inc.: <a href=\"https:\/\/www.amazon.com\/gp\/help\/customer\/display.html?nodeId=GLSBYFE9MGKKQXXM\">Conditions of Use<\/a>, <a href=\"https:\/\/www.amazon.com\/gp\/help\/customer\/display.html?nodeId=GX7NJQ4ZB8MHFRNJ\">Privacy Notice<\/a>.<\/p>\n\n<h4>Not contacted on this WordPress.org build<\/h4>\n\n<p>The bundled shared library also references endpoints this build never calls: the <code>https:\/\/api.devdome.com\/bot-protection\/<\/code> signature feeds (Click Protection here uses the plugin's built-in bot list; no feed is fetched and no feed cron is scheduled) and <code>https:\/\/api.devdome.com\/plugin-updates\/<\/code> (self-hosted updates, disabled here; updates come only from WordPress.org).<\/p>\n\n<h4>Never sent, in any request<\/h4>\n\n<ul>\n<li>Passwords and password hashes.<\/li>\n<li>Visitor form input, names or email addresses.<\/li>\n<li>Post, page, comment or any other WordPress content: the link scanner runs locally, and only the extracted ASINs leave the site.<\/li>\n<\/ul>\n\n<h3>Source &amp; build<\/h3>\n\n<p>All PHP and JavaScript in this plugin ship human-readable. The admin screen bundle (<code>assets\/admin\/index.js<\/code> \/ <code>index.css<\/code>) is compiled with Vite from the JSX source included in this plugin at <code>admin-ui-src\/src\/<\/code>, and is deliberately built without minification, so the shipped file is the readable, running code. The stylesheet is likewise unminified.<\/p>\n\n<p>To rebuild the bundle from source: <code>cd admin-ui-src<\/code>, then <code>npm install<\/code> and <code>npm run build<\/code>. The build writes <code>index.js<\/code> and <code>index.css<\/code> into <code>assets\/admin\/<\/code>. The bundle inlines its npm dependencies, whose exact versions are pinned in <code>admin-ui-src\/package-lock.json<\/code>: <a href=\"https:\/\/github.com\/facebook\/react\">React<\/a> and <a href=\"https:\/\/github.com\/facebook\/react\">ReactDOM<\/a> (MIT), and <a href=\"https:\/\/github.com\/lucide-icons\/lucide\">Lucide React<\/a> (ISC); react-dom's production build contains pre-compressed code from the upstream npm package.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin ZIP via Plugins \u2192 Add New \u2192 Upload Plugin, or copy the folder to <code>wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate it.<\/li>\n<li>Go to the DevDome Affiliate Manager admin page, add your Amazon affiliate tag(s), and configure the features you want.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20an%20account%20or%20an%20api%20key%3F\"><h3>Do I need an account or an API key?<\/h3><\/dt>\n<dd><p>No. Everything works without a DevDome account; the shared services run on the DevDome backend and need no key on your side.<\/p><\/dd>\n<dt id=\"does%20geo-localization%20need%20every%20regional%20amazon%20tag%3F\"><h3>Does geo-localization need every regional Amazon tag?<\/h3><\/dt>\n<dd><p>It only redirects to stores you've added a tag for. Visitors from other countries keep the original link, so you never lose a commission.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20a%20product%20is%20discontinued%3F\"><h3>What happens when a product is discontinued?<\/h3><\/dt>\n<dd><p>The monitor flags it, and (if enabled) clicks are redirected to a live replacement product or the Amazon search page instead of a dead page.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>The two redirect pages emit their scripts via <code>wp_print_inline_script_tag()<\/code>.<\/li>\n<li>The admin bundle's JSX\/Vite source is included at <code>admin-ui-src\/<\/code>; build steps are in the Source &amp; build section.<\/li>\n<li>The External services section links Amazon's Conditions of Use and Privacy Notice.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>WordPress.org release. Every identifier the plugin owns now uses its own <code>devdaffi_<\/code> prefix (options, tables, cron hooks, REST namespace, script handles, shortcode \u2014 the button shortcode is now <code>[devdaffi_button]<\/code>). Self-hosted upgrades migrate stored settings, click stats and the link index automatically, and the old button shortcode keeps working via an alias.<\/li>\n<li>Click Protection now has a built-in bot list, so it works with no external service or feed.<\/li>\n<li>Link Radar's scheduled auto-scan is off by default; run a scan or enable the schedule to start link monitoring.<\/li>\n<li>Removed the robots.txt writer and unused legacy settings; <code>\/go<\/code> redirects now always send an <code>X-Robots-Tag: noindex, nofollow<\/code> header, the standard behavior for a redirect endpoint.<\/li>\n<li>The admin bundle ships unminified.<\/li>\n<\/ul>\n\n<h4>0.5.4<\/h4>\n\n<ul>\n<li>Expanded External services disclosure.<\/li>\n<\/ul>\n\n<h4>0.5.3<\/h4>\n\n<ul>\n<li>Readme copy polish.<\/li>\n<\/ul>\n\n<h4>0.5.2<\/h4>\n\n<ul>\n<li>WordPress.org build support: the self-hosted suite updater is excluded from this package (updates come from WordPress.org only), the shared bot-list feed and the suite dashboard's one-click installs are disabled in WordPress.org builds, the bundled devdome-core library was updated, uninstall now removes the remaining plugin options, transients and scheduled events, and the External services disclosure was extended.<\/li>\n<\/ul>\n\n<h4>0.5.1<\/h4>\n\n<ul>\n<li>Click attribution privacy: outbound hops now carry an opaque token instead of the site hostname in the URL; the token is resolved server-side. (Version numbering: 0.4.9 is followed by 0.5.1. No version segment goes above 9.)<\/li>\n<\/ul>\n\n<h4>0.4.9<\/h4>\n\n<ul>\n<li>Fixed: in DevDome Analytics, a <code>\/go<\/code> button click is now attributed to the page it was clicked from instead of appearing as a separate page.<\/li>\n<\/ul>\n\n<h4>0.4.8<\/h4>\n\n<ul>\n<li>Click reports to DevDome Analytics now declare the link type explicitly, so click classification keeps working even if the <code>\/go<\/code> slug is ever renamed.<\/li>\n<\/ul>\n\n<h4>0.4.7<\/h4>\n\n<ul>\n<li>Fixed: the mobile App Opener bridge page now sends the same no-referrer policy as every other redirect path.<\/li>\n<\/ul>\n\n<h4>0.4.6<\/h4>\n\n<ul>\n<li><code>\/go<\/code> redirects now send a <code>Referrer-Policy: no-referrer<\/code> header so the redirecting page is not exposed to the destination.<\/li>\n<\/ul>\n\n<h4>0.4.5<\/h4>\n\n<ul>\n<li>Fixed: WooCommerce generated buttons now use the Amazon store you selected instead of always amazon.com.<\/li>\n<li>Fixed: a link scan that fails part-way no longer wipes the link index; the previous index is kept until a full scan completes.<\/li>\n<li>Fixed: the keyword auto-linker keeps the original text when a regex limit is hit instead of blanking the content.<\/li>\n<\/ul>\n\n<h4>0.4.4<\/h4>\n\n<ul>\n<li>Split into a public edition and an in-house edition; controls that are not part of the public plugin were removed from this build.<\/li>\n<\/ul>\n\n<h4>0.3.8<\/h4>\n\n<ul>\n<li>WordPress.org readiness pass: security and escaping review, Plugin Check fixes.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>Button Link: choose the Amazon marketplace for generated links via Edit \/ Regenerate, with an option to omit the affiliate tag.<\/li>\n<li>Custom button links now support an {ASIN} placeholder that is filled with the product's ASIN at render time.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Per-status dead-link routing (replacement product \/ search page) for Out-of-Stock and 404.<\/li>\n<li>WooCommerce external-button rewrite; bulk Replace ASIN tool.<\/li>\n<li>Geo-localization, click protection, mobile app opener, link monitor.<\/li>\n<\/ul>","raw_excerpt":"Manage Amazon affiliate links: auto-tagging, geo-localization, dead-link recovery, link health monitoring, and click protection.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/353553","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=353553"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/devdome"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=353553"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=353553"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=353553"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=353553"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=353553"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=353553"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}