{"id":367064,"date":"2026-09-14T19:58:47","date_gmt":"2026-09-14T19:58:47","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/amino-engine\/"},"modified":"2026-09-14T19:58:29","modified_gmt":"2026-09-14T19:58:29","slug":"amino-engine","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/amino-engine\/","author":23563959,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.13","stable_tag":"1.0.13","tested":"7.1","requires":"6.0","requires_php":"8.1","requires_plugins":null,"header_name":"Amino Engine","header_author":"Amino Engine","header_description":"Sends WooCommerce store events (orders, carts, checkouts, customers, catalog) to Amino Engine for email marketing automation. Durable queue, per-event retry, visible dead letters, and a consent record that is an artifact rather than a guess.","assets_banners_color":"31251c","last_updated":"2026-09-14 19:58:29","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/aminoengine.com\/","header_author_uri":"https:\/\/aminoengine.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":52,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.13":{"tag":"1.0.13","author":"aminoengine","date":"2026-09-14 19:58:29","revision":3695865}},"upgrade_notice":{"1.0.13":"<p>The buttons on the plugin&#039;s own settings screens work again, and the wholesale sign-in door gets a security fix. If a page of yours still uses the old <code>[ae_code_gate]<\/code> shortcode, edit it and change the tag to <code>[aminoengine_code_gate]<\/code>, or that page shows the tag as plain text.<\/p>","1.0.12":"<p>New shops start with no marketing opt-in checkbox; shops already running keep the setting they have. Checkout email capture no longer loses shoppers who leave inside a second.<\/p>","1.0.11":"<p>Fixes abandoned cart and abandoned checkout for guests: since 1.0.9 a shopper who typed their\nemail at checkout and left was never recorded, so no reminder could be sent. Upgrade if you\nsend cart reminders.<\/p>","1.0.10":"<p>Fixes marketing opt-ins at the classic checkout: only the first shopper&#039;s tick was being\nrecorded, every one after it was dropped. Upgrade if you collect consent at checkout.<\/p>","1.0.9":"<p>Renames everything the plugin stores, as WordPress.org requires. Your shop moves itself\nacross on the first page load: still connected, nothing queued lost, wholesale buyers still\nsigned in. The shortcode and four PHP functions were renamed \u2014 see the changelog.<\/p>","1.0.8":"<p>Adds a password-free code gate for wholesale buyers, sends your shop&#039;s WordPress email\nthrough your own verified address, reports form submissions, and tracks pages whose theme\nnever calls wp_head(). Fixes a fresh copy being refused as out of date.<\/p>","1.0.7":"<p>Fixes tracking that was never printed on some shops, an anonymous id the plugin and the\ntracker each kept overwriting, cart recovery that ran too early to see a cart, and an\norder event that could fire twice. Worth taking.<\/p>","1.0.6":"<p>Required for every store. The plugin&#039;s connection check was being refused even with a good key,\nso shops showed as waiting forever. Also lets Amino Engine set this plugin up for you when you\nconnect your store from your Amino Engine account.<\/p>","1.0.5":"<p>Required for every store. Earlier versions sent to an address that does not exist, and stores\nthat connected automatically never sent anything at all. Update and your shop&#039;s activity\nreaches Amino Engine.<\/p>","1.0.4":"<p>Required for anyone on 1.0.3: 1.0.3 broke every WordPress admin page. Update to\n1.0.4 and the admin works again.<\/p>","1.0.3":"<p>Recommended: a store holding an old, dead key can now connect again on its own,\nand the Connection tab tells the truth when a key has stopped working.<\/p>","1.0.2":"<p>Recommended: a plugin downloaded from your Amino Engine account now connects\nitself, so nobody has to press Connect after activating it.<\/p>","1.0.1":"<p>Recommended for every store: the queue can no longer overrun its time budget\nduring checkout.<\/p>","1.0.0":"<p>First release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3695883,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3695883,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3695883,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3695883,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.13"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3695883,"resolution":"1","location":"assets","locale":"","width":1280,"height":676},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3695883,"resolution":"2","location":"assets","locale":"","width":1280,"height":694},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3695883,"resolution":"3","location":"assets","locale":"","width":1280,"height":670},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3695883,"resolution":"4","location":"assets","locale":"","width":1280,"height":1664},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3695883,"resolution":"5","location":"assets","locale":"","width":1280,"height":390}},"screenshots":{"1":"The Connection tab, showing a connected account and the tracking domain.","2":"The Events tab, with a toggle and a last-sent time for each event.","3":"The Consent tab, with editable wording and a live preview.","4":"The Diagnostics tab, showing the detected checkout type and the last twenty deliveries.","5":"The Queue tab, showing waiting, retrying and dead-lettered events."}},"plugin_section":[],"plugin_tags":[15962,282,264,1034,286],"plugin_category":[45],"plugin_contributors":[280733],"plugin_business_model":[],"class_list":["post-367064","plugin","type-plugin","status-publish","hentry","plugin_tags-abandoned-cart","plugin_tags-ecommerce","plugin_tags-email-marketing","plugin_tags-marketing-automation","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-aminoengine","plugin_committers-aminoengine"],"banners":{"banner":"https:\/\/ps.w.org\/amino-engine\/assets\/banner-772x250.png?rev=3695883","banner_2x":"https:\/\/ps.w.org\/amino-engine\/assets\/banner-1544x500.png?rev=3695883","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/amino-engine\/assets\/icon-128x128.png?rev=3695883","icon_2x":"https:\/\/ps.w.org\/amino-engine\/assets\/icon-256x256.png?rev=3695883","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/amino-engine\/assets\/screenshot-1.png?rev=3695883","caption":"The Connection tab, showing a connected account and the tracking domain."},{"src":"https:\/\/ps.w.org\/amino-engine\/assets\/screenshot-2.png?rev=3695883","caption":"The Events tab, with a toggle and a last-sent time for each event."},{"src":"https:\/\/ps.w.org\/amino-engine\/assets\/screenshot-3.png?rev=3695883","caption":"The Consent tab, with editable wording and a live preview."},{"src":"https:\/\/ps.w.org\/amino-engine\/assets\/screenshot-4.png?rev=3695883","caption":"The Diagnostics tab, showing the detected checkout type and the last twenty deliveries."},{"src":"https:\/\/ps.w.org\/amino-engine\/assets\/screenshot-5.png?rev=3695883","caption":"The Queue tab, showing waiting, retrying and dead-lettered events."}],"raw_content":"<!--section=description-->\n<p>Amino Engine for WooCommerce is the official connector for <strong>Amino Engine<\/strong>, an email marketing\nautomation service for online stores.<\/p>\n\n<p>It sends your store's events to Amino Engine so that automated emails \u2014 abandoned cart, welcome,\norder confirmation, back in stock, price drop, win-back \u2014 fire on real facts about real orders.<\/p>\n\n<p><strong>Connecting takes no clicks at all<\/strong> if you downloaded this plugin from your own Amino Engine\naccount: activate it and it connects itself, because the download you asked for already carries a\none-time code for your account. There is no key to copy and nothing to paste.<\/p>\n\n<p><strong>A copy installed from WordPress.org has no such code<\/strong>, so after you activate it a notice appears\nat the top of your dashboard with a single <strong>Connect to Amino Engine<\/strong> button. Press it and the\nplugin is connected. Nothing at all leaves your site until you press that button. (You can still\npaste a key by hand on the settings page if you prefer.)<\/p>\n\n<p><strong>What makes this connector different<\/strong><\/p>\n\n<ul>\n<li><strong>Nothing is sent and forgotten.<\/strong> Every event goes into a queue in your own database, is\ndelivered with a real HTTP request whose status code is actually read, and is retried on a\n1 minute \/ 5 minute \/ 30 minute \/ 2 hour \/ 12 hour schedule. Anything that still fails lands in a\ndead-letter list you can see and re-drive from the settings page. There is no configuration in\nwhich an event disappears without you being able to see that it did.<\/li>\n<li><strong>Purchases are never inferred from a page load.<\/strong> Order events come from the order record\nchanging state, not from the shopper reaching the thank-you page. If a shopper closes the tab,\npays through a redirecting gateway, or the receipt page is cached, the purchase is still recorded.<\/li>\n<li><strong>The opt-in checkbox is an artifact, not a guess.<\/strong> The exact sentence the shopper saw is stored\nwith their consent. A box that was never on screen \u2014 an Apple Pay or Google Pay express checkout,\nfor example \u2014 records nothing at all, rather than being treated as a refusal.<\/li>\n<li><strong>Works on both checkouts.<\/strong> The classic (shortcode) checkout and the Blocks checkout are both\nsupported, using the Additional Checkout Fields API on Blocks. The Diagnostics tab tells you which\none your store is actually running.<\/li>\n<li><strong>Abandoned-cart links that rebuild the cart.<\/strong> The recovery link is a short, expiring, opaque\ntoken pointing at a snapshot held on your own server. It contains no personal data, it cannot be\nedited to add a product, and it merges into an existing cart rather than wiping it.<\/li>\n<li><strong>High-Performance Order Storage (HPOS) compatible<\/strong>, declared and implemented \u2014 the plugin uses\nthe WooCommerce CRUD API exclusively and never touches order post meta.<\/li>\n<li><strong>A password-free door for wholesale customers.<\/strong> Put <code>[aminoengine_code_gate purpose=\"wholesale_portal\"\nredirect=\"\/wholesale\/\"]<\/code> on a page and your wholesale buyers get in by typing their email address and\nthe six-digit code Amino Engine emails them. There is no password for them to forget, nothing for you\nto reset, and <strong>the code is never stored on your site<\/strong> \u2014 your site only ever asks Amino Engine whether\nthe code somebody typed was the right one.<\/li>\n<li><strong>Safe on staging.<\/strong> The plugin binds your key to the site URL it was activated on. A staging\nclone carrying a copy of your live database will queue and log events but send nothing, and it\nsays so in a banner. This stops a staging refresh from firing duplicate emails at real customers.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin is an interface to <strong>Amino Engine<\/strong>, an email marketing automation service operated by\nAmino Engine (https:\/\/aminoengine.com). The plugin is not useful without an Amino Engine account.<\/p>\n\n<p><strong>If you installed this plugin from WordPress.org, nothing at all is transmitted until you press\nConnect, or paste an API key and it validates. Installing or activating the plugin sends nothing.<\/strong><\/p>\n\n<p><strong>If you downloaded this plugin from your own Amino Engine account, it connects itself.<\/strong> That copy\ncontains a file called <code>connect.json<\/code> holding a one-time connection code that was created for your\naccount while you were signed in to Amino Engine and pressed the button to download it \u2014 the screen\nyou pressed it on says, in one sentence, that the plugin will connect itself. So on the first\nWordPress admin page you open after activating it, the plugin sends that code and connects. You are\nthen shown \"Connected to Amino Engine\" and there is nothing to press. It does this <strong>once<\/strong>, never\nover a plain-http site, and never when the plugin already holds a working key. If it is refused for\nany reason you are shown why, and a Connect button to try again.<\/p>\n\n<p>If that copy finds a key already stored on this site, it first asks Amino Engine whether that key\nstill exists (a <code>GET https:\/\/app.aminoengine.com\/api\/v1\/ping<\/code> presenting the stored key, the same\nrequest the \"Validate and save\" button makes). If the key still works, nothing further happens and\nthe connection code is not used. If Amino Engine answers that it does not recognise the key, the\nplugin forgets it and connects with the code from your download. If Amino Engine cannot be reached,\nthe key is left exactly as it is. <strong>This check only ever happens on a copy downloaded from your own\nAmino Engine account. A copy installed from WordPress.org never makes it.<\/strong><\/p>\n\n<p><strong>The one request it makes<\/strong> goes to <code>https:\/\/app.aminoengine.com<\/code>\n(<code>\/api\/connect\/wordpress\/plugin\/hello<\/code>) and carries only: the one-time connection code that came\nwith your download, your site address, the plugin, WordPress and WooCommerce version numbers, and\nyour site's public appearance \u2014 your site title, your logo URL, the colour palette and font names\nyour theme declares, and the addresses of any Google Fonts stylesheets your storefront loads. That\nlast part is so your emails come out in your own colours and type without you setting them up by\nhand; every one of those values is already visible in the source of every page of your shop. Amino\nEngine answers with the API key for your account and the plugin stores it.<\/p>\n\n<p>If you installed this plugin from WordPress.org rather than downloading it from your Amino Engine\naccount, the Connect button instead opens <code>https:\/\/app.aminoengine.com<\/code> in your browser so you can\napprove the connection while signed in; Amino Engine then delivers the key back to this site's own\nREST endpoint (<code>\/wp-json\/amino-engine\/v1\/connect<\/code>), which accepts it only for the request you just\nstarted. No data about your store or your customers is sent in either case.<\/p>\n\n<p><strong>If you connected your store from inside Amino Engine using WordPress's own \"Authorize\nApplication\" screen<\/strong>, Amino Engine already holds an administrator application password for this\nsite. It may then install and switch this plugin on for you, and hand it the key straight away\nthrough this site's own REST endpoint (<code>\/wp-json\/amino-engine\/v1\/adopt<\/code>). That request has to be\nsigned in as an administrator of this site to be accepted, and it is refused outright if this store\nis already connected and working. You can stop it at any time by revoking the \"Amino Engine\"\napplication password at Users -&gt; Profile.<\/p>\n\n<p><strong>Connecting also creates a WordPress application password<\/strong> named \"Amino Engine\" for the\nadministrator who pressed it, and sends it in that same request so Amino Engine can read your\norders, customers and products. It is created with WordPress's own Application Passwords feature \u2014\nthe same thing the approval screen at Users \u2192 Profile creates \u2014 and you can see and revoke it there\nat any time. Revoking it stops Amino Engine reading your store and nothing else. If your site does\nnot have application passwords available, this step is skipped and the plugin connects without one.<\/p>\n\n<p>Once connected, the plugin sends the following to <code>https:\/\/app.aminoengine.com<\/code>:<\/p>\n\n<ul>\n<li><strong>Store events<\/strong> \u2014 order id, order number, order status, order date, line items (product id,\nvariant id, SKU, name, quantity, price), order totals, coupon codes, payment and shipping method,\nbilling and shipping address, customer note; cart contents and totals; checkout state; product\ncatalog records including price and stock. Sent when the corresponding thing happens in your store.<\/li>\n<li><strong>Customer identity<\/strong> \u2014 the billing email address on an order, or the account email of a logged-in\ncustomer, plus an anonymous random browser identifier. Sent alongside the events above.<\/li>\n<li><strong>Consent records<\/strong> \u2014 the email address, the exact wording of the opt-in checkbox that was shown,\nwhether it was ticked, the shopper's IP address and browser user agent, and the time. Sent when a\nshopper submits a form that contained the checkbox.<\/li>\n<li><strong>Diagnostic information<\/strong> \u2014 your site URL, plugin version and WooCommerce version, as request\nheaders, so support can identify the installation.<\/li>\n<\/ul>\n\n<p>The plugin also loads a small JavaScript file (<code>ae.js<\/code>) from the tracking hostname shown on the\nsettings page, on your storefront pages. It records page views, product views and cart activity\nagainst the anonymous browser identifier described above. It is a first-party, service-related\nscript and is not loaded until you connect a key.<\/p>\n\n<p><strong>Why that one script tag is printed directly rather than enqueued.<\/strong> Everything else this plugin\nputs on a page \u2014 all of its CSS, and the small checkout listener \u2014 goes through <code>wp_enqueue_style()<\/code>,\n    wp_enqueue_script() and <code>wp_add_inline_script()<\/code>. The tracking tag is the single exception, and\nthere are three reasons it has to be:<\/p>\n\n<ol>\n<li>It carries its own <code>data-key<\/code> and <code>data-host<\/code> attributes, which is how it knows which store it is\nfor. <code>wp_enqueue_script()<\/code> produces a plain <code>src<\/code> tag; attributes need a <code>script_loader_tag<\/code>\nfilter, and a filter can be unhooked, reordered or stripped by another plugin without anything\nsaying so.<\/li>\n<li>It must load <code>async<\/code> and as early in <code>&lt;head&gt;<\/code> as possible, because everything it measures happens\nafter it. Enqueueing resolves dependency ORDER, not absolute position.<\/li>\n<li>It has to print on themes that never call <code>wp_head()<\/code>. Some do, and on those the enqueue system\nnever runs at all \u2014 which is exactly how one shop's homepage went untracked for weeks. The plugin\nwatches the page being built and inserts the tag before <code>&lt;\/head&gt;<\/code> itself when that happens.<\/li>\n<\/ol>\n\n<p>The tag is a fixed string with no user input in it, and nothing per-visitor is ever written into it,\nso a cached copy of a page is safe to serve to anybody.<\/p>\n\n<ul>\n<li>Service: https:\/\/aminoengine.com<\/li>\n<li>Terms of service: https:\/\/app.aminoengine.com\/legal\/terms<\/li>\n<li>Acceptable use policy: https:\/\/app.aminoengine.com\/legal\/acceptable-use<\/li>\n<li>Sub-processors: https:\/\/app.aminoengine.com\/legal\/sub-processors<\/li>\n<li>Privacy policy: https:\/\/aminoengine.com\/privacy<\/li>\n<\/ul>\n\n<p>Deleting the plugin removes all of its own data from your WordPress database. It does <strong>not<\/strong>\ndelete anything on the Amino Engine side \u2014 that is a separate, deliberate action in the Amino\nEngine console.<\/p>\n\n<h3>Wholesale and portal gates<\/h3>\n\n<p>Some of your customers need to get into something that is not for everybody \u2014 a wholesale price list, a\nreseller portal, a document library, a page of bulk order forms.<\/p>\n\n<p>This plugin can put a door in front of any page, with no password and no extra account:<\/p>\n\n<ol>\n<li>The customer types the email address you have for them.<\/li>\n<li>Amino Engine emails them a six-digit code that expires in ten minutes.<\/li>\n<li>They type the code and they are in, for twelve hours, on that browser.<\/li>\n<\/ol>\n\n<p><strong>Setting it up takes one line.<\/strong> Put this shortcode on the page you want people to arrive at first:<\/p>\n\n<pre><code>[aminoengine_code_gate purpose=\"wholesale_portal\" redirect=\"\/wholesale\/\"]\n<\/code><\/pre>\n\n<p>(If a page of yours still has the old <code>[ae_code_gate]<\/code> on it from version 1.0.8 or 1.0.9, edit that\npage and change the tag to <code>[aminoengine_code_gate]<\/code>. Keep the same settings inside the brackets.)<\/p>\n\n<pre><code>purpose is your own name for this door \u2014 use a different one for each door, and a code for one will\n<\/code><\/pre>\n\n<p>never open another. <code>redirect<\/code> is where somebody lands once they are through; it must be a page on your\nown site.<\/p>\n\n<p>Then protect the page itself. In your theme's template, or in a block that runs PHP:<\/p>\n\n<pre><code>if ( ! aminoengine_gate_passed( 'wholesale_portal' ) ) {\n    wp_safe_redirect( home_url( '\/wholesale-login\/' ) );\n    exit;\n}\n\naminoengine_gate_email( 'wholesale_portal' ) hands you the address they proved, so you can show their own\n<\/code><\/pre>\n\n<p>prices.<\/p>\n\n<p><strong>Building your own screens instead.<\/strong> Two PHP functions and two REST endpoints do the same job:<\/p>\n\n<pre><code>$sent = aminoengine_send_code( 'buyer@example.com', 'wholesale_portal' );\n$ok   = aminoengine_verify_code( 'buyer@example.com', 'wholesale_portal', '481920' );\n\nPOST \/wp-json\/amino-engine\/v1\/code\/send     {\"to\":\"\u2026\",\"purpose\":\"\u2026\"}\nPOST \/wp-json\/amino-engine\/v1\/code\/verify   {\"to\":\"\u2026\",\"purpose\":\"\u2026\",\"code\":\"481920\"}\n<\/code><\/pre>\n\n<p>Both answer <code>{\"ok\":true}<\/code> or <code>{\"ok\":false,\"reason\":\"\u2026\",\"error\":\"a sentence you can show somebody\"}<\/code>.<\/p>\n\n<p><strong>What this is, and what it is not.<\/strong> Passing the gate proves that whoever is holding that browser can\nread email sent to that address. That is the right strength for a price list. It is <strong>not<\/strong> a WordPress\nlogin and it grants no permissions, so do not use it in place of a customer account for anything a\nWordPress role already protects \u2014 order history, downloads, or anything that can be changed.<\/p>\n\n<p><strong>The safety rules, so you do not have to think about them.<\/strong><\/p>\n\n<ul>\n<li>Codes are six digits and expire in ten minutes.<\/li>\n<li>Asking for a new code cancels the old one.<\/li>\n<li>Five wrong codes locks that address for fifteen minutes.<\/li>\n<li>Your site never stores the code \u2014 not in the database, not in a log, not anywhere.<\/li>\n<li>The \"you are signed in\" cookie is signed, cannot be read by JavaScript, cannot be edited to say\nsomebody else's address, and cannot be used on a different door.<\/li>\n<li>A staging copy of your site will not send codes, for the same reason it does not send anything else.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<p><strong>If you downloaded the plugin from your own Amino Engine account:<\/strong><\/p>\n\n<ol>\n<li>Upload the plugin from the Plugins screen and activate it.<\/li>\n<li>That's it. It connects itself, and the notice at the top of your dashboard says <strong>Connected to\nAmino Engine<\/strong>. The <strong>WooCommerce \u2192 Amino Engine<\/strong> screen shows the account you are connected to.<\/li>\n<\/ol>\n\n<p><strong>If you installed it from WordPress.org:<\/strong><\/p>\n\n<ol>\n<li>Install it from the Plugins screen and activate it.<\/li>\n<li>A notice appears at the top of your dashboard. Click <strong>Connect to Amino Engine<\/strong>.<\/li>\n<li>That's it. The <strong>WooCommerce \u2192 Amino Engine<\/strong> screen will show the name of the account you are\nconnected to.<\/li>\n<li>Optional but recommended: add the CNAME record shown on the Connection tab at your DNS provider.\nThis makes the tracker first-party, which materially improves how long visitors stay recognised.<\/li>\n<li>Check the <strong>Diagnostics<\/strong> tab, and click <strong>Send a test event<\/strong> to confirm the round trip.<\/li>\n<\/ol>\n\n<p>If you would rather connect by hand, the settings page still accepts a secret API key pasted from\nthe Amino Engine console.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20have%20to%20paste%20an%20api%20key%3F\"><h3>Do I have to paste an API key?<\/h3><\/dt>\n<dd><p>No. Press <strong>Connect to Amino Engine<\/strong> on the notice after you activate the plugin and it connects\nitself. Pasting a key by hand still works if you prefer it.<\/p><\/dd>\n<dt id=\"do%20i%20need%20an%20amino%20engine%20account%3F\"><h3>Do I need an Amino Engine account?<\/h3><\/dt>\n<dd><p>Yes. This plugin is the store-side connector for the Amino Engine service. It does nothing on its\nown.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20the%20blocks%20checkout%3F\"><h3>Does it work with the Blocks checkout?<\/h3><\/dt>\n<dd><p>Yes, and with the classic shortcode checkout, and with a store running both. The Diagnostics tab\ntells you which one it detected. Cart and order events are identical on both, because the Blocks\nStore API raises the same WooCommerce actions internally.<\/p><\/dd>\n<dt id=\"will%20it%20slow%20down%20my%20checkout%3F\"><h3>Will it slow down my checkout?<\/h3><\/dt>\n<dd><p>No. Events are written to a queue during the request, and the network call happens after the page\nhas already been delivered to the shopper, using <code>fastcgi_finish_request()<\/code> where the host provides\nit. If your host does not, the send is capped at two seconds per request and the rest is handed to\nAction Scheduler.<\/p><\/dd>\n<dt id=\"is%20the%20opt-in%20box%20pre-ticked%3F\"><h3>Is the opt-in box pre-ticked?<\/h3><\/dt>\n<dd><p>No, and there is no setting to make it so.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20amino%20engine%20is%20down%3F\"><h3>What happens if Amino Engine is down?<\/h3><\/dt>\n<dd><p>Events queue up and retry. Nothing is lost, and the Queue tab shows you exactly what is waiting.<\/p><\/dd>\n<dt id=\"i%20deactivated%20the%20plugin.%20did%20i%20lose%20my%20events%3F\"><h3>I deactivated the plugin. Did I lose my events?<\/h3><\/dt>\n<dd><p>No. Deactivating stops sending and keeps everything. Only deleting the plugin removes its data.<\/p><\/dd>\n<dt id=\"does%20it%20support%20high-performance%20order%20storage%3F\"><h3>Does it support High-Performance Order Storage?<\/h3><\/dt>\n<dd><p>Yes, declared and implemented.<\/p><\/dd>\n<dt id=\"can%20wholesale%20customers%20get%20in%20without%20a%20password%3F\"><h3>Can wholesale customers get in without a password?<\/h3><\/dt>\n<dd><p>Yes. Put <code>[aminoengine_code_gate purpose=\"wholesale_portal\" redirect=\"\/wholesale\/\"]<\/code> on a page. They type their\nemail address, Amino Engine emails them a six-digit code, they type it, and they are in for twelve hours.\nThere is no password to reset and your site never stores the code.<\/p><\/dd>\n<dt id=\"is%20the%20code%20gate%20a%20login%3F\"><h3>Is the code gate a login?<\/h3><\/dt>\n<dd><p>No. It proves somebody can read email at that address, which is the right strength for a price list or a\nportal. It is not a WordPress user and it grants no permissions, so keep using real customer accounts for\norder history and anything that can be changed.<\/p><\/dd>\n<dt id=\"does%20the%20code%20gate%20work%20with%20my%20page%20cache%3F\"><h3>Does the code gate work with my page cache?<\/h3><\/dt>\n<dd><p>Yes. The gate page tells every common cache plugin not to cache it (it carries a security token that must\nbe fresh), and if a cached copy does reach somebody anyway the form simply says \"that form expired,\nplease try again\" and works on the second press. Nothing about a visitor is ever written into the page.<\/p><\/dd>\n<dt id=\"what%20if%20somebody%20keeps%20asking%20for%20codes%3F\"><h3>What if somebody keeps asking for codes?<\/h3><\/dt>\n<dd><p>Your site allows five attempts per ten minutes from one device, and Amino Engine allows three emails per\naddress per ten minutes on top of that. Five wrong codes locks that address for fifteen minutes.<\/p><\/dd>\n<dt id=\"can%20my%20shop%27s%20own%20wordpress%20emails%20go%20out%20through%20amino%20engine%3F\"><h3>Can my shop's own WordPress emails go out through Amino Engine?<\/h3><\/dt>\n<dd><p>Yes, and it is off until you switch it on. <strong>WooCommerce \u2192 Amino Engine \u2014 Email<\/strong> has one switch and a\ntick-list of every email your shop can send. If anything at all goes wrong \u2014 we are unreachable, your\nsending domain stops being verified, the message has an attachment \u2014 WordPress sends that message itself,\nin the same request. A receipt is never lost.<\/p><\/dd>\n<dt id=\"which%20forms%20does%20the%20plugin%20watch%3F\"><h3>Which forms does the plugin watch?<\/h3><\/dt>\n<dd><p>Gravity Forms, Fluent Forms, WPForms, Contact Form 7 and the WooCommerce registration form. Pick which\none is your wholesale application on the <strong>Forms<\/strong> tab and Amino Engine will be told whenever somebody\napplies, so you can answer them automatically. Filling in a form is never treated as subscribing to\nmarketing unless the form carried a ticked box saying so.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.13<\/h4>\n\n<ul>\n<li>The shortcode for the wholesale sign-in door is now only <code>[aminoengine_code_gate]<\/code>. The short 1.0.8 spelling <code>[ae_code_gate]<\/code> has been withdrawn, because WordPress.org asks every plugin to keep its names to itself. <strong>If a page of yours still has the old tag on it, edit that page and change the tag<\/strong> \u2014 keep everything inside the brackets the same. A page left with the old tag prints it as plain text instead of showing the sign-in form.<\/li>\n<li>The sign-in door now checks a form's security token before it acts on anything, including \"use a different email\". Until now that one button was acted on first and checked afterwards, which meant another website could have posted at your shop and thrown away a wholesale buyer's half-finished sign-in.<\/li>\n<li>The way the plugin adds its tracking tag to themes that never call <code>wp_head()<\/code> was rebuilt so it never leaves a page half-held. On WordPress 6.9 and newer it uses WordPress's own mechanism for this; on older versions it wraps the theme template and closes up in the same breath.<\/li>\n<li>Fixed: <strong>the buttons on the plugin's own settings screens work again.<\/strong> Since 1.0.9, pressing Save on any of the plugin's tabs \u2014 or Disconnect, Check connection, Send a test event, the queue buttons, Save on the Email screen, Send test email, or the <strong>Connect to Amino Engine<\/strong> button \u2014 did nothing at all, silently. Shops that connected themselves when you installed the plugin were never affected, because that happens without the button.<\/li>\n<li>Removed the old, short names the plugin still answered to from before 1.0.9 \u2014 the checkout email and newsletter sign-up handlers. Everything the plugin registers now carries its full name. Nothing you set up changes.<\/li>\n<\/ul>\n\n<h4>1.0.12<\/h4>\n\n<ul>\n<li>New shops start with NO marketing opt-in checkbox. A shopper who types their address into your checkout has asked to hear from you; a second, unticked box beside it only loses people. A shop that is already running keeps exactly the setting it has \u2014 the upgrade writes it down explicitly rather than letting the new default move it.<\/li>\n<li>The checkout email listener now flushes a pending address when the page is closed or the tab is hidden, instead of losing it with the one-second debounce timer. The fastest abandoners are the ones abandoned-checkout exists for.<\/li>\n<\/ul>\n\n<h4>1.0.11<\/h4>\n\n<ul>\n<li>Fixed: <strong>\"you left something behind\" emails can reach guests again.<\/strong> When a shopper typed their\nemail address at your checkout and then left without ordering, your shop was not telling us \u2014 so\nthere was nobody to send an abandoned cart or abandoned checkout email to. It has been that way\nsince 1.0.9. Shoppers who complete an order were never affected. Nothing on your side changes and\nnothing needs setting up again.<\/li>\n<\/ul>\n\n<h4>1.0.10<\/h4>\n\n<ul>\n<li>Fixed: <strong>the marketing tick box at your classic checkout now records every shopper, not just the\nfirst one.<\/strong> The plugin was filing every checkout consent under the same reference, because\nWooCommerce has not given the order its number yet at the moment we read the box. Your shop's own\nqueue treated the second shopper, and every shopper after them, as a repeat of the first and\nquietly dropped them. The consent is now filed under the real order number. Nothing that was\nalready recorded changes; from this version on, everyone who ticks the box is recorded.<\/li>\n<\/ul>\n\n<h4>1.0.9<\/h4>\n\n<ul>\n<li>Changed: everything this plugin stores on your site now carries a longer, unmistakable name \u2014\n  aminoengine_ instead of <code>ae_<\/code>. WordPress.org asks every plugin to do this so that two plugins\ncan never quietly overwrite each other's settings. <strong>Your shop upgrades itself.<\/strong> The first time\n1.0.9 loads it moves every setting, both of its database tables and its scheduled job across, and\nchecks each one arrived before removing the old copy. Your store stays connected, your queue keeps\nevery event in it, and anyone signed in to a wholesale portal stays signed in.<\/li>\n<li>Changed: the shortcode is now <code>[aminoengine_code_gate]<\/code>.<\/li>\n<li>Changed: if your theme or another plugin calls <code>ae_gate_passed()<\/code>, <code>ae_gate_email()<\/code>,\n  ae_send_code() or <code>ae_verify_code()<\/code>, those are now <code>aminoengine_gate_passed()<\/code>,\n  aminoengine_gate_email(), <code>aminoengine_send_code()<\/code> and <code>aminoengine_verify_code()<\/code>. The four\nfilters <code>ae_cart_token_ttl<\/code>, <code>ae_label_is_marketing_consent<\/code>,\n  ae_checkout_started_requires_email and <code>ae_claimed_email_events<\/code> gained the same prefix.<\/li>\n<li>Changed: our styles now go through WordPress's own stylesheet system instead of being written\nstraight into the page, so your caching and security plugins can see them.<\/li>\n<li>Changed: our admin messages now appear only on the dashboard, the Plugins screen and your shop's\nown screens \u2014 and each one can be dismissed for good.<\/li>\n<li>Fixed: the page address recorded with an event is now cleaned before it is stored.<\/li>\n<\/ul>\n\n<h4>1.0.8<\/h4>\n\n<ul>\n<li>Added: a password-free door for wholesale customers. Put one shortcode on a page and your buyers\nget in by typing their email address and the six-digit code we email them. No password to reset,\nand your site never stores the code.<\/li>\n<li>Added: your shop can now send its own WordPress and WooCommerce email through Amino Engine, from\nyour own verified address, with every message in your Messages log. Off until you switch it on,\nand if anything goes wrong WordPress sends that message itself \u2014 a receipt is never lost.<\/li>\n<li>Added: the plugin now tells Amino Engine when somebody fills in a form \u2014 including which form is\nyour wholesale application \u2014 so an application can start an email automatically. Gravity Forms,\nFluent Forms, WPForms, Contact Form 7 and the WooCommerce registration form.<\/li>\n<li>Added: the tracking script now goes on every page of your shop, including pages whose theme never\ncalls wp_head(). Some themes' homepages were not being tracked at all.<\/li>\n<li>Added: product and category pages now tell the tracker what they are about, read from WooCommerce\nitself rather than guessed from your SEO plugin's page data. On shops selling variable products\nthat guess was usually finding nothing.<\/li>\n<li>Fixed: a brand-new copy of the plugin could be refused as \"more than a day old\" if an older copy\nhad been on the site before. It now measures the copy that is actually there.<\/li>\n<li>Fixed: a plugin folder replaced over SSH, or a zip installed over an existing copy, now connects\nitself instead of waiting for an activation that WordPress never announces.<\/li>\n<li>Fixed: a form event recorded the address of the form's own submission handler rather than the page\nthe person was on, and a plain WooCommerce registration arrived carrying seventeen of WooCommerce's\nown hidden tracking fields.<\/li>\n<\/ul>\n\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>Fixed: on four of the five ways of connecting a store, the tracking script was never put\non the shop \u2014 so nobody who visited was recognised and no automatic email had anybody to\ngo to. Tracking now works the moment a store is connected, from Amino Engine's own\naddress. Your own tracking domain is still worth setting up, but it is an upgrade, not\nsomething your shop waits for.<\/li>\n<li>Fixed: the plugin ignored everything Amino Engine told it when it checked in, so a shop\nthat was set up wrongly could never repair itself. It now applies the answer, checks in\non its own every few hours, and there is a <strong>Check connection<\/strong> button on the Connection\ntab that repairs a store on the spot.<\/li>\n<li>Fixed: the plugin could throw away its own working key and disconnect your store with\nnothing on screen to explain it. A key our server refuses is now kept and flagged, with\nthe reason and a Reconnect button.<\/li>\n<li>Fixed: one shopper was being counted as a new stranger on every page. Your shop and the\ntracking script now agree on one visitor id, and the record of somebody who clicked a\nlink in one of your emails is no longer wiped out by the next page they open.<\/li>\n<li>Fixed: an abandoned checkout on WooCommerce's new block-based checkout produced nothing\nat all, and the classic checkout only noticed an email address if the shopper also\nchanged an address field. Both now report the address a second after it is typed.<\/li>\n<li>Fixed: \"here is your cart back\" links now genuinely put the cart back, skip anything\nthat has since sold out, and are only used up once something really is in the basket.<\/li>\n<li>Fixed: product updates were retried until they died even though every attempt had\nworked.<\/li>\n<li>Fixed: the Diagnostics tab said a store connected by pasting a key had never completed a\nconnection.<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Fixed: the plugin's \"am I connected\" check was being refused by Amino Engine even when\nthe key was perfectly good, so stores were told their key was not recognised. This was the\nlast of the three reasons a connected store still showed as waiting.<\/li>\n<li>Added: if you connect your store from your Amino Engine account, Amino Engine can now install\nand switch on this plugin for you and connect it in the same step. Nothing to download, nothing\nto upload, nothing to paste.<\/li>\n<li>A store that is already connected and working is never taken over by that step.<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Fixed: the plugin was sending to an address that did not exist, so Amino Engine never saw a\nstore as connected. Every store on this version now talks to the right place, and uses the\naddress Amino Engine gives it when you connect.<\/li>\n<li>Fixed: stores connected automatically were holding events back as a dry run and never sending\nthem. Orders, carts and sign-ups from those stores now go out as they always should have.<\/li>\n<li>Added: the Diagnostics tab now shows which address this store is talking to.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Fixed: version 1.0.3 could show \"There has been a critical error on this website\" on every\nWordPress admin page. Nothing was wrong with your store or your data \u2014 one line inside the\nplugin was written in a way WordPress could not call. Every admin page works again.<\/li>\n<li>Added: an automatic check that stops that kind of mistake being released again. Every place\nthis plugin asks WordPress to call it is now run through WordPress's own hook code as part\nof the plugin's test suite.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Fixed: a store that still held an old, dead key could not connect. If the key this store is\nholding is one Amino Engine no longer recognises, the plugin now forgets it and connects itself\nwith the code inside the download, instead of sitting on a key that does not work. A key that\nstill works is never touched, and if Amino Engine cannot be reached the key is left exactly as\nit is.<\/li>\n<li>Fixed: pressing Disconnect on a plugin downloaded from your Amino Engine account now lets it\nconnect itself again on the next admin page, instead of needing the plugin turned off and on.\nThe message after Disconnect says so, and tells you how to stop it if that is not what you want.<\/li>\n<li>Fixed: the Connection tab no longer says \"Connected\" above a key that has been refused. It says\nthe key no longer works and what to do about it.<\/li>\n<li>Fixed: a crash on the admin page immediately after a successful automatic connection.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>A plugin downloaded from your own Amino Engine account now <strong>connects itself<\/strong> on the first admin\npage you open after activating it. No button, no key, nothing to paste. A copy installed from\nWordPress.org is unchanged \u2014 it still contacts nothing until you press Connect.<\/li>\n<li>The connection now also tells Amino Engine what your shop looks like \u2014 your site title, logo,\ntheme palette, font names and any Google Fonts your storefront loads \u2014 so your emails come out\nin your own colours and type without setting them up by hand.<\/li>\n<li>Clearer notices: \"Connected to Amino Engine\" when it worked, and the reason plus a Try again\nbutton when it did not.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fixed: the queue's time budget is now a hard cap. It is checked before every\nrequest instead of once per run, so a slow or unreachable server can no longer\nhold up a checkout on hosts where the flush runs in front of the shopper.\nAnything not sent stays queued and goes out on the next scheduled pass.<\/li>\n<li>Fixed: the text domain now matches the plugin slug, so translations can load.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<li>One-click connect: no API key to copy or paste.<\/li>\n<\/ul>","raw_excerpt":"Connects your WooCommerce store to Amino Engine so orders, carts, checkouts, customers and products reach your email automation reliably.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/367064","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=367064"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/aminoengine"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=367064"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=367064"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=367064"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=367064"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=367064"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=367064"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}