{
  "generated_by": "bin/harvest-actions.py",
  "note": "Described rows only. Loaded at runtime; the full index is not.",
  "count": 421,
  "actions": [
    {
      "id": "account_handling.save",
      "ajax": "aieo_dmm_account_handling_save",
      "page": "account_handling",
      "handler": "includes/dmm/modules/class-aieo-dmm-account-handling.php:36",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-account-handling.php:348"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-ah-form",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets how customer accounts behave, such as whether guests may order and what happens after signing up.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes how real people register and sign in"
    },
    {
      "id": "account_handling.repeat_order_save",
      "ajax": "aieo_dmm_repeat_order_save",
      "page": "account_handling",
      "handler": "includes/dmm/modules/class-aieo-dmm-account-handling.php:41",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-account-handling.php:354",
        "includes/dmm/modules/class-aieo-dmm-account-handling.php:395"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-ah-form",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets the buy-again control on past orders, which is the quickest route to a repeat sale.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what shoppers see on the storefront",
      "context": "repeat orders"
    },
    {
      "id": "ad_connectors.adc_sync",
      "ajax": "aieo_adc_sync",
      "page": "ad_connectors",
      "handler": "includes/dmm/modules/class-aieo-dmm-ad-connectors.php:62",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-ad-connectors.php:958"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".adc-sync",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Fetch spend",
      "description": "Pulls what you spent on advertising into the shop, which is the cost side of every return calculation.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "writes real spend figures that the profit reports divide by"
    },
    {
      "id": "ad_connectors.adc_save",
      "ajax": "aieo_adc_save",
      "page": "ad_connectors",
      "handler": "includes/dmm/modules/class-aieo-dmm-ad-connectors.php:60",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-ad-connectors.php:956"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".adc-save",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save connection",
      "description": "Stores the login for an advertising account so the shop can read what you spent there.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "stores credentials for an outside advertising account"
    },
    {
      "id": "ad_connectors.adc_test",
      "ajax": "aieo_adc_test",
      "page": "ad_connectors",
      "handler": "includes/dmm/modules/class-aieo-dmm-ad-connectors.php:61",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-ad-connectors.php:957"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".adc-test",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Test connection",
      "description": "Signs in with the details as saved and reports whether they work, without pulling any figures.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "one sign-in attempt; nothing is imported"
    },
    {
      "id": "add_to_cart_text.save",
      "ajax": "aieo_dmm_add_to_cart_text_save",
      "page": "add_to_cart_text",
      "handler": "includes/dmm/modules/class-aieo-dmm-add-to-cart-text.php:55",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-add-to-cart-text.php:379"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-actt-form",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets the wording on the buy button, so it can say what suits your shop rather than the default.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what shoppers see on the storefront",
      "context": "add-to-cart text"
    },
    {
      "id": "address_autocomplete.save",
      "ajax": "aieo_dmm_address_autocomplete_save",
      "page": "address_autocomplete",
      "handler": "includes/dmm/modules/class-aieo-dmm-address-autocomplete.php:38",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-address-autocomplete.php:231"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-aac-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets the address suggestions at checkout, including which service supplies them.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes checkout for every shopper and may cost money per lookup"
    },
    {
      "id": "ads.archive",
      "ajax": "aieo_ads_archive",
      "page": "ads",
      "handler": "includes/dmm/modules/class-aieo-dmm-ads.php:88",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-ads.php:728"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-ads-archive",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Archive",
      "description": "Files a draft away here to keep the list tidy. Anything already in Google Ads is left exactly as it is.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes our records only; nothing at Google is touched",
      "context": "ad draft"
    },
    {
      "id": "ads.compose",
      "ajax": "aieo_ads_compose",
      "page": "ads",
      "handler": "includes/dmm/modules/class-aieo-dmm-ads.php:85",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-ads.php:700"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-ads-name",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Draft the ads",
      "description": "Writes ad headlines and descriptions for the products you picked, so you have a starting point to edit.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "uses your AI credits; nothing reaches Google"
    },
    {
      "id": "ads.activate",
      "ajax": "aieo_ads_activate",
      "page": "ads",
      "handler": "includes/dmm/modules/class-aieo-dmm-ads.php:87",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-ads.php:727"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-ads-activate",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Mark as live",
      "description": "Records that you have switched these ads on at Google, so the reports here line up with what is actually running.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes our records only; it does not start or stop anything at Google"
    },
    {
      "id": "ads.push",
      "ajax": "aieo_ads_push",
      "page": "ads",
      "handler": "includes/dmm/modules/class-aieo-dmm-ads.php:86",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-ads.php:726"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-ads-push",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Send to Google Ads",
      "description": "Sends the drafted ads to your Google Ads account, where they are created paused so nothing spends until you say so.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "creates real entries in your Google Ads account"
    },
    {
      "id": "ai_chat_analytics.chat_analytics_stats_cadence",
      "ajax": "aieo_chat_analytics_stats_cadence",
      "page": "ai_chat_analytics",
      "handler": "includes/dmm/modules/class-aieo-dmm-ai-chat-analytics.php:73",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-ai-chat-analytics.php:97"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-cac-cadence",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Rebuild cadence",
      "description": "Sets how often the chat analytics aggregates rebuild themselves, trading freshness of the reports against the cost of recomputing them.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "changes a schedule only"
    },
    {
      "id": "ai_chat_analytics.chat_analytics_refresh_stats",
      "ajax": "aieo_chat_analytics_refresh_stats",
      "page": "ai_chat_analytics",
      "handler": "includes/dmm/modules/class-aieo-dmm-ai-chat-analytics.php:72",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-ai-chat-analytics.php:96",
        "includes/dmm/modules/class-aieo-dmm-ai-chat-analytics.php:99"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-cac-refresh",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Refresh now",
      "description": "Rebuilds the chat analytics aggregates from the raw conversation log, which is what the six report tabs read from.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "recomputes aggregate tables from existing logs; no conversation is altered"
    },
    {
      "id": "ai_chat_analytics.chat_analytics_save_retention",
      "ajax": "aieo_chat_analytics_save_retention",
      "page": "ai_chat_analytics",
      "handler": "includes/dmm/modules/class-aieo-dmm-ai-chat-analytics.php:74",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-ai-chat-analytics.php:98"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-cac-retention-save",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save",
      "description": "Sets how many days of chat transcripts are kept, after which older conversations are deleted permanently and cannot be read back.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "shortening the window deletes transcripts permanently on the next cleanup run"
    },
    {
      "id": "attribution.rows",
      "ajax": "aieo_attribution_rows",
      "page": "attribution",
      "handler": "includes/dmm/modules/class-aieo-dmm-attribution.php:86",
      "callers": [
        "assets/js/aieo-attribution-admin.js:202",
        "assets/js/aieo-attribution-admin.js:5",
        "assets/js/aieo-attribution-admin.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-attr-dt-body",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Attribution detail",
      "description": "Opens the orders behind a figure, so a surprising number can be traced to the orders that caused it.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "audience_builder.audience_list",
      "ajax": "aieo_dmm_audience_list",
      "page": "audience_builder",
      "handler": "includes/dmm/modules/class-aieo-dmm-audience-builder.php:40",
      "callers": [
        "assets/pages/dmm/audience-builder.php:194"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Audience list",
      "description": "Loads your saved groups so you can pick one instead of building the same rules again.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "audience_builder.audience_generate",
      "ajax": "aieo_dmm_audience_generate",
      "page": "audience_builder",
      "handler": "includes/dmm/modules/class-aieo-dmm-audience-builder.php:37",
      "callers": [
        "assets/pages/dmm/audience-builder.php:157"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Build from a description",
      "description": "Turns a plain description of who you want to reach into a working set of rules you can check and adjust.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "uses your AI credits"
    },
    {
      "id": "audience_builder.audience_delete",
      "ajax": "aieo_dmm_audience_delete",
      "page": "audience_builder",
      "handler": "includes/dmm/modules/class-aieo-dmm-audience-builder.php:41",
      "callers": [
        "assets/pages/dmm/audience-builder.php:210"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-ab-del",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Delete audience",
      "description": "Removes a saved group of customers. Anything still pointing at it is left with nobody to send to.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "campaigns using it lose their audience"
    },
    {
      "id": "audience_builder.audience_count",
      "ajax": "aieo_dmm_audience_count",
      "page": "audience_builder",
      "handler": "includes/dmm/modules/class-aieo-dmm-audience-builder.php:38",
      "callers": [
        "assets/pages/dmm/audience-builder.php:167"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "How many people",
      "description": "Counts how many customers match the rules as they stand, so you can see the size before saving or sending anything.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "counts only"
    },
    {
      "id": "audience_builder.audience_save",
      "ajax": "aieo_dmm_audience_save",
      "page": "audience_builder",
      "handler": "includes/dmm/modules/class-aieo-dmm-audience-builder.php:39",
      "callers": [
        "assets/pages/dmm/audience-builder.php:221"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Save audience",
      "description": "Stores a group of customers defined by the rules you built, ready to aim a campaign or an offer at.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "an audience already used by a campaign changes who that campaign reaches"
    },
    {
      "id": "audience_builder.audience_suggest",
      "ajax": "aieo_dmm_audience_suggest",
      "page": "audience_builder",
      "handler": "includes/dmm/modules/class-aieo-dmm-audience-builder.php:42",
      "callers": [
        "assets/pages/dmm/audience-builder.php:174"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Suggest audiences",
      "description": "Offers ready-made groups worth targeting, such as lapsed buyers or your best customers, based on what your orders show.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; nothing is saved until you save it"
    },
    {
      "id": "badges.save",
      "ajax": "aieo_dmm_badges_save",
      "page": "badges",
      "handler": "includes/dmm/modules/class-aieo-dmm-badges.php:33",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-badges.php:848"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-badges-order",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets the badges that sit over product pictures, such as new or on sale, and when each one shows.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what shoppers see on the storefront",
      "context": "badges"
    },
    {
      "id": "birthday.aw_migrate",
      "ajax": "aieo_dmm_aw_migrate",
      "page": "birthday",
      "handler": "includes/dmm/modules/class-aieo-dmm-birthday.php:35",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-birthday.php:199"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-aw-job]",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Bring across the old birthdays",
      "description": "Copies birthday data over from the previous automation plugin so the dates are not lost.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "writes onto real customer records"
    },
    {
      "id": "birthday.save",
      "ajax": "aieo_dmm_birthday_save",
      "page": "birthday",
      "handler": "includes/dmm/modules/class-aieo-dmm-birthday.php:34",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-birthday.php:179"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-bday-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets the birthday field at checkout and the gift message that goes with it.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what shoppers are asked for at checkout",
      "context": "birthday"
    },
    {
      "id": "branch_scanner.branch_delete",
      "ajax": "aieo_dmm_branch_delete",
      "page": "branch_scanner",
      "handler": "includes/dmm/modules/class-aieo-dmm-branch-scanner.php:44",
      "callers": [
        "assets/pages/dmm/branch-scanner.php:86"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_branch_delete\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Delete branch",
      "description": "Removes a physical shop. Staff attached to it lose their branch and its stock counts stop being kept.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "irreversible; staff and stock history lose their branch"
    },
    {
      "id": "branch_scanner.scanner_customer_lookup",
      "ajax": "aieo_dmm_scanner_customer_lookup",
      "page": "branch_scanner",
      "handler": "includes/dmm/modules/class-aieo-dmm-branch-scanner.php:51",
      "callers": [
        "assets/js/dmm-scanner.js:30",
        "assets/js/dmm-scanner.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": true,
      "declared_at": "",
      "selector": ".aieo-dmm-customer-scanner",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Find customer",
      "description": "Looks up a customer at the counter by phone or email, so an in-shop sale can be put against their account.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "branch_scanner.scanner_staff_lookup",
      "ajax": "aieo_dmm_scanner_staff_lookup",
      "page": "branch_scanner",
      "handler": "includes/dmm/modules/class-aieo-dmm-branch-scanner.php:47",
      "callers": [
        "assets/js/dmm-scanner.js:71",
        "assets/js/dmm-scanner.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-branch-select",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Find staff member",
      "description": "Looks up a member of staff by their code so the scanner knows who is doing the counting.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "branch_scanner.branch_save",
      "ajax": "aieo_dmm_branch_save",
      "page": "branch_scanner",
      "handler": "includes/dmm/modules/class-aieo-dmm-branch-scanner.php:43",
      "callers": [
        "assets/pages/dmm/branch-scanner.php:56"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_branch_save\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Save branch",
      "description": "Stores one physical shop, which is what lets its staff scan stock and lets orders be assigned to it.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "adds a shop that staff and orders can be assigned to"
    },
    {
      "id": "brand_discounts.search_brand_terms",
      "ajax": "aieo_dmm_search_brand_terms",
      "page": "brand_discounts",
      "handler": "includes/dmm/modules/class-aieo-dmm-brand-discounts.php:26",
      "callers": [
        "assets/js/dmm.js:68",
        "assets/js/dmm.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-dmm-brand-select",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Brand search",
      "description": "Finds brands by name while you are writing a rule, so you pick one from a list instead of typing its id.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "brand_discounts.csv_clear",
      "ajax": "aieo_dmm_csv_clear",
      "page": "brand_discounts",
      "handler": "includes/dmm/modules/class-aieo-dmm-brand-discounts.php:30",
      "callers": [
        "assets/pages/dmm/brand-discounts.php:606"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Clear CSV prices",
      "description": "Strips the prices this feature set from every product it touched, putting them back to whatever they were priced at before.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "bulk-clears live prices; there is no undo beyond re-uploading the file"
    },
    {
      "id": "brand_discounts.brand_discount_delete",
      "ajax": "aieo_dmm_brand_discount_delete",
      "page": "brand_discounts",
      "handler": "includes/dmm/modules/class-aieo-dmm-brand-discounts.php:25",
      "callers": [
        "assets/js/dmm.js:484",
        "assets/js/dmm.min.js:1",
        "assets/pages/dmm/brand-discounts.php:217"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_brand_discount_delete\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Delete",
      "description": "Removes a brand discount rule, after which that brand's products go back to their normal prices immediately.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "prices revert on the storefront at once",
      "context": "brand discount"
    },
    {
      "id": "brand_discounts.csv_process_batch",
      "ajax": "aieo_dmm_csv_process_batch",
      "page": "brand_discounts",
      "handler": "includes/dmm/modules/class-aieo-dmm-brand-discounts.php:29",
      "callers": [
        "assets/pages/dmm/brand-discounts.php:550"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Process batch",
      "description": "Applies the uploaded price file to products a few at a time, and is called repeatedly until the whole file has been worked through.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "writes real prices onto live products"
    },
    {
      "id": "brand_discounts.save_badge_settings",
      "ajax": "aieo_dmm_save_badge_settings",
      "page": "brand_discounts",
      "handler": "includes/dmm/modules/class-aieo-dmm-brand-discounts.php:32",
      "callers": [
        "assets/pages/dmm/brand-discounts.php:628",
        "includes/dmm/modules/class-aieo-dmm-badges.php:553",
        "includes/dmm/modules/class-aieo-dmm-badges.php:564"
      ],
      "caller_kinds": [
        "php",
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-badge-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save badge settings",
      "description": "Sets how long a product counts as new and what the badges over product images say, which shoppers see on every listing.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what the storefront shows immediately"
    },
    {
      "id": "brand_discounts.brand_discount_save",
      "ajax": "aieo_dmm_brand_discount_save",
      "page": "brand_discounts",
      "handler": "includes/dmm/modules/class-aieo-dmm-brand-discounts.php:24",
      "callers": [
        "assets/pages/dmm/brand-discounts.php:148"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_brand_discount_save\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Save discount",
      "description": "Stores one brand-wide discount rule, which starts changing what shoppers pay for that brand as soon as it is saved.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes live storefront prices for every product of that brand"
    },
    {
      "id": "brand_discounts.save_lowest_price_message",
      "ajax": "aieo_dmm_save_lowest_price_message",
      "page": "brand_discounts",
      "handler": "includes/dmm/modules/class-aieo-dmm-brand-discounts.php:34",
      "callers": [
        "assets/pages/dmm/brand-discounts.php:516"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-lowest-price-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save lowest-price message",
      "description": "Sets the wording of the thirty-day lowest-price line the Omnibus directive requires beside a discounted price, and whether it shows at all.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes a legally required price disclosure on the storefront"
    },
    {
      "id": "brand_discounts.save_price_appearance",
      "ajax": "aieo_dmm_save_price_appearance",
      "page": "brand_discounts",
      "handler": "includes/dmm/modules/class-aieo-dmm-brand-discounts.php:36",
      "callers": [
        "assets/pages/dmm/brand-discounts.php:487"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-price-appearance-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save price appearance",
      "description": "Chooses how the old and new price sit together on product pages and listings, which changes how a discount reads to a shopper.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes the live storefront layout of every price"
    },
    {
      "id": "brand_discounts.csv_upload",
      "ajax": "aieo_dmm_csv_upload",
      "page": "brand_discounts",
      "handler": "includes/dmm/modules/class-aieo-dmm-brand-discounts.php:28",
      "callers": [
        "assets/pages/dmm/brand-discounts.php:581"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Upload CSV",
      "description": "Accepts a spreadsheet of per-product prices and prepares it for processing, without applying anything until you run the batches.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "stores an uploaded file ready to be applied"
    },
    {
      "id": "brand_display.save",
      "ajax": "aieo_dmm_brand_display_save",
      "page": "brand_display",
      "handler": "includes/dmm/modules/class-aieo-dmm-brand-display.php:43",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-brand-display.php:624"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-bd-form",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets where the brand name and logo appear on product pages and listings.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what shoppers see on the storefront",
      "context": "brand display"
    },
    {
      "id": "brand_extras.brand_pods_migrate_run",
      "ajax": "aieo_brand_pods_migrate_run",
      "page": "brand_extras",
      "handler": "includes/dmm/migrators/class-aieo-dmm-brand-pods-migrator.php:42",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-brand-extras.php:467"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Migrate brands",
      "description": "Copies brand details over from the old Pods setup so nothing is lost when you move off it.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "writes brand data in bulk and overwrites what is there"
    },
    {
      "id": "brand_gifts.brand_gift_pick",
      "ajax": "aieo_dmm_brand_gift_pick",
      "page": "brand_gifts",
      "handler": "includes/dmm/modules/class-aieo-dmm-brand-gifts.php:68",
      "callers": [
        "assets/js/aieo-brand-gifts.js:143",
        "assets/js/aieo-brand-gifts.js:4",
        "assets/js/aieo-brand-gifts.js:70",
        "assets/js/aieo-brand-gifts.js:97",
        "assets/js/aieo-brand-gifts.min.js:1",
        "assets/js/aieo-side-cart.js:702"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": true,
      "declared_at": "",
      "selector": ".aieo-bg-variation-select",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Choose a gift",
      "description": "The shopper own control: picks which free gift they want when the rule offers them a choice.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes a real shopper basket"
    },
    {
      "id": "brand_gifts.brand_gift_delete",
      "ajax": "aieo_dmm_brand_gift_delete",
      "page": "brand_gifts",
      "handler": "includes/dmm/modules/class-aieo-dmm-brand-gifts.php:64",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-brand-gifts.php:572"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_brand_gift_delete\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Delete gift rule",
      "description": "Removes a gift rule, so qualifying orders stop having the free item added.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "the gift stops being given out immediately"
    },
    {
      "id": "brand_gifts.search_need_terms",
      "ajax": "aieo_dmm_search_need_terms",
      "page": "brand_gifts",
      "handler": "includes/dmm/modules/class-aieo-dmm-brand-gifts.php:66",
      "callers": [
        "assets/js/dmm.js:141",
        "assets/js/dmm.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-dmm-need-select",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Needs search",
      "description": "Finds shopper needs by name while you are building a rule, so you pick from a list rather than typing codes.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "brand_gifts.search_products",
      "ajax": "aieo_dmm_search_products",
      "page": "brand_gifts",
      "handler": "includes/dmm/modules/class-aieo-dmm-brand-gifts.php:65",
      "callers": [
        "assets/js/dmm.js:92",
        "assets/js/dmm.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-flash",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Product search",
      "description": "Finds products by name while you are choosing which one to give away or which ones qualify.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only",
      "context": "gift rule"
    },
    {
      "id": "brand_gifts.brand_gift_save",
      "ajax": "aieo_dmm_brand_gift_save",
      "page": "brand_gifts",
      "handler": "includes/dmm/modules/class-aieo-dmm-brand-gifts.php:63",
      "callers": [
        "assets/pages/dmm/brand-gifts.php:211"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_brand_gift_save\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Save gift rule",
      "description": "Stores a rule that adds a free gift to the basket when an order qualifies for it.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "shoppers start receiving the gift at once, which costs you stock"
    },
    {
      "id": "brand_gifts.brand_gift_variations",
      "ajax": "aieo_dmm_brand_gift_variations",
      "page": "brand_gifts",
      "handler": "includes/dmm/modules/class-aieo-dmm-brand-gifts.php:70",
      "callers": [
        "assets/js/aieo-brand-gifts.js:29",
        "assets/js/aieo-brand-gifts.min.js:1",
        "assets/js/aieo-side-cart.js:708",
        "assets/js/aieo-side-cart.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": true,
      "declared_at": "",
      "selector": ".aieo-bg-product-select",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Show variations",
      "description": "Lists a product sizes and colours so a gift rule can offer one specific version rather than the whole product.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only",
      "context": "gift picker"
    },
    {
      "id": "brand_margins.tools_apply_cogs",
      "ajax": "aieo_dmm_tools_apply_cogs",
      "page": "brand_margins",
      "handler": "includes/dmm/modules/class-aieo-dmm-brand-margins.php:59",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-brand-margins.php:151"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-bm-apply",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Apply cost prices",
      "description": "Writes the imported cost prices onto the products themselves, so profit is calculated per item.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "writes cost prices onto real products"
    },
    {
      "id": "brand_margins.tools_export_brand_margins",
      "ajax": "aieo_dmm_tools_export_brand_margins",
      "page": "brand_margins",
      "handler": "includes/dmm/modules/class-aieo-dmm-brand-margins.php:57",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-brand-margins.php:101"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Export costs",
      "description": "Downloads your recorded cost prices as a spreadsheet, for checking or for editing and sending back.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; the file contains your buying prices, so treat it accordingly"
    },
    {
      "id": "brand_margins.tools_import_brand_margins",
      "ajax": "aieo_dmm_tools_import_brand_margins",
      "page": "brand_margins",
      "handler": "includes/dmm/modules/class-aieo-dmm-brand-margins.php:58",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-brand-margins.php:139"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-bm-file",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Import costs",
      "description": "Reads what your products cost you from a spreadsheet, which is what every profit figure is worked out from.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "writes cost prices in bulk; wrong figures make every profit report wrong"
    },
    {
      "id": "button_styles.save_button_styles",
      "ajax": "aieo_dmm_save_button_styles",
      "page": "button_styles",
      "handler": "includes/dmm/modules/class-aieo-dmm-button-styles.php:122",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-button-styles.php:350"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-btn-styles-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save button styles",
      "description": "Sets the colours, corners and sizing every button in the shop uses, so they match your branding.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes the live storefront for everyone"
    },
    {
      "id": "campaigns.campaign_save",
      "ajax": "aieo_dmm_campaign_save",
      "page": "campaigns",
      "handler": "includes/dmm/modules/class-aieo-dmm-campaigns-admin.php:62",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-campaigns-admin.php:310"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-camp-form",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save campaign",
      "description": "Stores what you spent on a campaign and over what dates, so its return can be worked out.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes the cost side of the return figures"
    },
    {
      "id": "cancellations.metrics_backfill_step",
      "ajax": "aieo_dmm_metrics_backfill_step",
      "page": "cancellations",
      "handler": "includes/dmm/modules/class-aieo-dmm-cancellations.php:51",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-cancellations.php:694",
        "includes/dmm/modules/class-aieo-dmm-cancellations.php:721",
        "includes/dmm/modules/class-aieo-dmm-cancellations.php:752"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Backfill metrics",
      "description": "Walks historical cancelled, refunded and failed orders in chunks and rebuilds the product and customer behaviour metrics from them.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "long-running; rewrites the behaviour metrics tables that feed recommendations"
    },
    {
      "id": "cancellations.outbound_cost_step",
      "ajax": "aieo_dmm_outbound_cost_step",
      "page": "cancellations",
      "handler": "includes/dmm/modules/class-aieo-dmm-cancellations.php:54",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-cancellations.php:791"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-oc-msg",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Backfill outbound cost",
      "description": "Fills in what each historical shipment cost you to send, a hundred orders at a time, so the returns ledger can show a true loss.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "long-running; writes shipping cost meta onto historical orders"
    },
    {
      "id": "cancellations.cancel_reason_disable",
      "ajax": "aieo_dmm_cancel_reason_disable",
      "page": "cancellations",
      "handler": "includes/dmm/modules/class-aieo-dmm-cancellations.php:49",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-cancellations.php:1378"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-cn-disable",
      "selector_source": "derived",
      "variants": [],
      "confirm": "Disable this reason?",
      "label": "Disable",
      "description": "Takes a reason out of the pickers without deleting it, so past orders keep the reason they were filed under and nothing new can be filed with it.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "the reason disappears from every picker immediately; historical rows are untouched"
    },
    {
      "id": "cancellations.risk_gating_toggle",
      "ajax": "aieo_dmm_risk_gating_toggle",
      "page": "cancellations",
      "handler": "includes/dmm/modules/class-aieo-dmm-cancellations.php:53",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-cancellations.php:1477"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-rg-msg",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Risk gating switches",
      "description": "Turns on the checkout warning for serial returners, or the block that stops them paying cash on delivery, one switch at a time.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes live checkout behaviour for flagged customers the moment it is set"
    },
    {
      "id": "cancellations.metrics_recompute_stale",
      "ajax": "aieo_dmm_metrics_recompute_stale",
      "page": "cancellations",
      "handler": "includes/dmm/modules/class-aieo-dmm-cancellations.php:52",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-cancellations.php:775"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-bm-sweep",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Run daily sweep now",
      "description": "Recomputes up to two hundred product and customer metric rows that have gone stale in the last day, instead of waiting for the nightly job.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "recomputes at most 200 rows of each kind from existing order data; no order is changed"
    },
    {
      "id": "cancellations.cancel_reason_save",
      "ajax": "aieo_dmm_cancel_reason_save",
      "page": "cancellations",
      "handler": "includes/dmm/modules/class-aieo-dmm-cancellations.php:48",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-cancellations.php:1361",
        "includes/dmm/modules/class-aieo-dmm-cancellations.php:1385"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-cn-save",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save / Add",
      "description": "Stores one cancellation reason's label, sort order, enabled state and whether customers see it, adding the reason if the slug is new.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes the list customers pick from at checkout and on the order screen"
    },
    {
      "id": "captcha.sso_captcha_save_settings",
      "ajax": "aieo_sso_captcha_save_settings",
      "page": "captcha",
      "handler": "includes/dmm/modules/class-aieo-dmm-captcha.php:71",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-captcha.php:213"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-captcha-save-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets the bot protection on your sign-in and registration forms, including its keys and how strict it is.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "too strict and real customers cannot sign in; too loose and bots get through",
      "context": "bot protection"
    },
    {
      "id": "catalog_importer.catalog_import_process",
      "ajax": "aieo_catalog_import_process",
      "page": "catalog_importer",
      "handler": "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:47",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:334"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-cati-errors",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Keep importing",
      "description": "Carries the import on from where it stopped, a chunk at a time, until the whole catalogue is through.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "long-running; keeps creating and updating real products"
    },
    {
      "id": "catalog_importer.catalog_import_save_conn",
      "ajax": "aieo_catalog_import_save_conn",
      "page": "catalog_importer",
      "handler": "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:44",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:317"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-cati-save",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save connection",
      "description": "Stores the login for the supplier or marketplace you are importing from, so future imports can sign in.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "stores credentials for an outside service"
    },
    {
      "id": "catalog_importer.catalog_import_start",
      "ajax": "aieo_catalog_import_start",
      "page": "catalog_importer",
      "handler": "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:46",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:347"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-cati-prog",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Start import",
      "description": "Begins pulling in the catalogue, creating the products as drafts so nothing appears in the shop before you have looked at it.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "creates real products, as drafts"
    },
    {
      "id": "catalog_importer.catalog_import_test",
      "ajax": "aieo_catalog_import_test",
      "page": "catalog_importer",
      "handler": "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:45",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:324"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-cati-test-out",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Test connection",
      "description": "Signs in with the details as saved and reports whether they work, without importing anything.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "one sign-in attempt; nothing is imported"
    },
    {
      "id": "category_extras.migrate",
      "ajax": "aieo_dmm_category_extras_migrate",
      "page": "category_extras",
      "handler": "includes/dmm/modules/class-aieo-dmm-category-extras.php:104",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-category-extras.php:2774"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Bring across the old data",
      "description": "Copies category banners and text over from the previous plugin, so you keep what you had without retyping it.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "writes into the category fields in bulk and overwrites what is there"
    },
    {
      "id": "category_extras.marketplace_tax_browse",
      "ajax": "aieo_dmm_marketplace_tax_browse",
      "page": "category_extras",
      "handler": "includes/dmm/modules/class-aieo-dmm-category-extras.php:108",
      "callers": [
        "assets/js/aieo-dmm-category-extras-admin.js:299",
        "assets/js/aieo-dmm-category-extras-admin.min.js:1",
        "includes/dmm/modules/class-aieo-dmm-category-extras.php:1373"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-ce-mt-clear",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Browse marketplace categories",
      "description": "Walks the marketplace category tree level by level, for when you would rather look than search.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "category_extras.save_settings",
      "ajax": "aieo_dmm_category_extras_save_settings",
      "page": "category_extras",
      "handler": "includes/dmm/modules/class-aieo-dmm-category-extras.php:110",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-category-extras.php:2824"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets how category pages behave across the shop, which every category then follows unless it overrides it.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes the layout of every category page",
      "context": "category extras"
    },
    {
      "id": "category_extras.search",
      "ajax": "aieo_dmm_category_extras_search",
      "page": "category_extras",
      "handler": "includes/dmm/modules/class-aieo-dmm-category-extras.php:107",
      "callers": [
        "assets/js/aieo-dmm-category-extras-admin.js:222",
        "assets/js/aieo-dmm-category-extras-admin.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#description",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Search categories",
      "description": "Finds a category by name while you are linking one to another, so you pick from a list rather than typing codes.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "category_extras.marketplace_tax_search",
      "ajax": "aieo_dmm_marketplace_tax_search",
      "page": "category_extras",
      "handler": "includes/dmm/modules/class-aieo-dmm-category-extras.php:109",
      "callers": [
        "assets/js/aieo-dmm-category-extras-admin.js:461",
        "assets/js/aieo-dmm-category-extras-admin.min.js:1",
        "includes/dmm/modules/class-aieo-dmm-category-extras.php:1374"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-ce-mt-results",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Search marketplace categories",
      "description": "Finds the matching category on Skroutz or another marketplace by name, so your products are filed correctly there.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "category_extras.h3_migrate",
      "ajax": "aieo_dmm_category_extras_h3_migrate",
      "page": "category_extras",
      "handler": "includes/dmm/modules/class-aieo-dmm-category-extras.php:105",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-category-extras.php:2800"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-ce-h3-migrate-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Tidy old headings",
      "description": "Rewrites headings left over from older category text so they sit at the right level for search engines.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "rewrites stored category text in bulk"
    },
    {
      "id": "checkout_invoicing.om_checkout_aade_lookup",
      "ajax": "om_checkout_aade_lookup",
      "page": "checkout_invoicing",
      "handler": "includes/dmm/modules/class-aieo-dmm-checkout-invoicing.php:43",
      "callers": [
        "assets/js/aieo-checkout-invoicing.js:116",
        "assets/js/aieo-checkout-invoicing.min.js:1",
        "includes/dmm/data/action-strings.php:302",
        "includes/dmm/modules/class-aieo-dmm-checkout-invoicing.php:134"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": true,
      "declared_at": "",
      "selector": "#billing_vat_field",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Look up the company",
      "description": "Looks a tax number up with the Greek tax authority and fills in the company name and address for the shopper.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "asks an outside government service on a real shopper behalf"
    },
    {
      "id": "checkout_invoicing.save",
      "ajax": "aieo_dmm_checkout_invoicing_save",
      "page": "checkout_invoicing",
      "handler": "includes/dmm/modules/class-aieo-dmm-checkout-invoicing.php:39",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-checkout-invoicing.php:475"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-inv-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets the invoice fields at checkout, including the tax number and activity boxes businesses fill in.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what shoppers are asked for at checkout",
      "context": "invoicing"
    },
    {
      "id": "checkout_layout.reset_ab",
      "ajax": "aieo_dmm_checkout_layout_reset_ab",
      "page": "checkout_layout",
      "handler": "includes/dmm/modules/class-aieo-dmm-checkout-layout.php:62",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-checkout-layout.php:726"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-cl-reset-ab",
      "selector_source": "derived",
      "variants": [],
      "confirm": "Reset both impression counters?",
      "label": "Reset the test",
      "description": "Clears the results of the checkout layout test so a fresh comparison can start.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "the figures gathered so far are discarded"
    },
    {
      "id": "checkout_layout.save",
      "ajax": "aieo_dmm_checkout_layout_save",
      "page": "checkout_layout",
      "handler": "includes/dmm/modules/class-aieo-dmm-checkout-layout.php:61",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-checkout-layout.php:641"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-cl-form",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save layout",
      "description": "Sets the order and grouping of the checkout fields shoppers fill in.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes checkout for every shopper; mistakes here cost orders"
    },
    {
      "id": "checkout_modal.save",
      "ajax": "aieo_dmm_checkout_modal_save",
      "page": "checkout_modal",
      "handler": "includes/dmm/modules/class-aieo-dmm-checkout-modal.php:34",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-checkout-modal.php:144"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-cm-form",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets how checkout errors are announced, so a shopper who cannot pay is told why in a way they will notice.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes how problems are reported to shoppers at checkout"
    },
    {
      "id": "checkout_product_images.save",
      "ajax": "aieo_dmm_checkout_product_images_save",
      "page": "checkout_product_images",
      "handler": "includes/dmm/modules/class-aieo-dmm-checkout-product-images.php:44",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-checkout-product-images.php:227"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-cpi-form",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Chooses whether product pictures appear in the checkout summary.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what shoppers see while paying"
    },
    {
      "id": "competitions.competition_draw_winners",
      "ajax": "aieo_competition_draw_winners",
      "page": "competitions",
      "handler": "includes/dmm/modules/class-aieo-dmm-competitions.php:78",
      "callers": [
        "assets/js/aieo-competitions-admin.js:83",
        "assets/js/aieo-competitions-admin.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-comp-winners-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Draw winners",
      "description": "Picks the number of winners you asked for at random from everyone who entered, and records who they are.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "records a real result; drawing again picks a different set"
    },
    {
      "id": "competitions.stats_cadence",
      "ajax": "aieo_competitions_stats_cadence",
      "page": "competitions",
      "handler": "includes/dmm/modules/class-aieo-dmm-competitions.php:92",
      "callers": [
        "assets/js/aieo-competitions-admin.js:221",
        "assets/js/aieo-competitions-admin.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-comp-stats-asof",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "How often to recount",
      "description": "Sets how often competition figures recount themselves, trading freshness against the work it costs the shop.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "changes a schedule only"
    },
    {
      "id": "competitions.refresh_stats",
      "ajax": "aieo_competitions_refresh_stats",
      "page": "competitions",
      "handler": "includes/dmm/modules/class-aieo-dmm-competitions.php:91",
      "callers": [
        "assets/js/aieo-competitions-admin.js:193",
        "assets/js/aieo-competitions-admin.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-comp-stats-asof",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Refresh figures",
      "description": "Recounts entries and shares for your competitions so the figures on screen match what has actually happened.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "recounts from entries already recorded; nothing is changed",
      "context": "competitions"
    },
    {
      "id": "competitions.save",
      "ajax": "aieo_competitions_save",
      "page": "competitions",
      "handler": "includes/dmm/modules/class-aieo-dmm-competitions.php:76",
      "callers": [
        "assets/js/aieo-competitions-admin.js:152",
        "assets/js/aieo-competitions-admin.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-comp-image-id",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save",
      "description": "Stores a competition with its dates, prize and entry rules, and it starts accepting entries once it is running.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "a live competition begins taking real entries",
      "context": "competition"
    },
    {
      "id": "competitions.settings_save",
      "ajax": "aieo_competitions_settings_save",
      "page": "competitions",
      "handler": "includes/dmm/modules/class-aieo-dmm-competitions.php:77",
      "callers": [
        "assets/js/aieo-competitions-admin.js:112",
        "assets/js/aieo-competitions-admin.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-comp-settings-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets the shop-wide rules every competition follows, such as who may enter and what they have to agree to.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "applies to competitions that are already running",
      "context": "competitions"
    },
    {
      "id": "competitions.competition_toggle_winner",
      "ajax": "aieo_competition_toggle_winner",
      "page": "competitions",
      "handler": "includes/dmm/modules/class-aieo-dmm-competitions.php:79",
      "callers": [
        "assets/js/aieo-competitions-admin.js:98",
        "assets/js/aieo-competitions-admin.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-comp-winner-remove",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Winner",
      "description": "Adds or removes one entrant from the winners list by hand, for when a draw needs correcting.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes the recorded result of a real competition"
    },
    {
      "id": "complementary.add",
      "ajax": "aieo_dmm_complementary_add",
      "page": "complementary",
      "handler": "includes/dmm/modules/class-aieo-dmm-complementary.php:97",
      "callers": [
        "assets/js/aieo-complementary.js:71",
        "assets/js/aieo-complementary.min.js:1",
        "includes/dmm/modules/class-aieo-dmm-complementary.php:776",
        "includes/dmm/modules/class-aieo-dmm-complementary.php:988"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": true,
      "declared_at": "",
      "selector": ".aieo-compl-add",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Add these too",
      "description": "The shopper's own button: puts every suggested extra into their basket in one go, rather than one at a time.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes a real shopper's basket"
    },
    {
      "id": "complementary.migrate",
      "ajax": "aieo_dmm_complementary_migrate",
      "page": "complementary",
      "handler": "includes/dmm/modules/class-aieo-dmm-complementary.php:90",
      "callers": [
        "assets/pages/dmm/complementary.php:266"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-dmm-complementary-migrate-btn",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Bring across the old rules",
      "description": "Copies cross-sell rules over from the old Pods promo campaigns, so you do not have to type them in again.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "adds rules in bulk; does nothing if there is no old data to find"
    },
    {
      "id": "complementary.delete",
      "ajax": "aieo_dmm_complementary_delete",
      "page": "complementary",
      "handler": "includes/dmm/modules/class-aieo-dmm-complementary.php:87",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-complementary.php:289"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_complementary_delete\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Delete",
      "description": "Removes a cross-sell rule, so those extra products stop being suggested with anything.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "the suggestions disappear from the shop at once",
      "context": "cross-sell rule"
    },
    {
      "id": "complementary.export",
      "ajax": "aieo_dmm_complementary_export",
      "page": "complementary",
      "handler": "includes/dmm/modules/class-aieo-dmm-complementary.php:89",
      "callers": [
        "assets/pages/dmm/complementary.php:221"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-dmm-complementary-export-btn",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Export",
      "description": "Downloads all your cross-sell rules as a spreadsheet, so you can check them over or copy them to another shop.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; produces a file",
      "context": "cross-sell rules"
    },
    {
      "id": "complementary.import",
      "ajax": "aieo_dmm_complementary_import",
      "page": "complementary",
      "handler": "includes/dmm/modules/class-aieo-dmm-complementary.php:88",
      "callers": [
        "assets/pages/dmm/complementary.php:240"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-complementary-csv-file",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Import",
      "description": "Reads cross-sell rules from a spreadsheet and adds them, which is the quick way to set up a lot of them at once.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "adds rules in bulk, and they go live immediately",
      "context": "cross-sell rules"
    },
    {
      "id": "complementary.save",
      "ajax": "aieo_dmm_complementary_save",
      "page": "complementary",
      "handler": "includes/dmm/modules/class-aieo-dmm-complementary.php:85",
      "callers": [
        "assets/pages/dmm/complementary.php:192",
        "assets/pages/dmm/complementary.php:65"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_complementary_save\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Save",
      "description": "Stores one cross-sell rule, so the products you picked start appearing alongside the ones that trigger them.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what shoppers are offered straight away",
      "context": "cross-sell rule"
    },
    {
      "id": "complementary.save_appearance",
      "ajax": "aieo_dmm_complementary_save_appearance",
      "page": "complementary",
      "handler": "includes/dmm/modules/class-aieo-dmm-complementary.php:86",
      "callers": [
        "assets/pages/dmm/complementary-display.php:79",
        "includes/dmm/modules/class-aieo-dmm-complementary-display.php:10"
      ],
      "caller_kinds": [
        "php",
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_complementary_save_appearance\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Save appearance",
      "description": "Sets how the suggestion box looks, meaning its text sizes, borders and corners, wherever it appears in the shop.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what every shopper sees"
    },
    {
      "id": "connections.usage_sharing_optin",
      "ajax": "aieo_usage_sharing_optin",
      "page": "connections",
      "handler": "includes/dmm/class-aieo-action-telemetry.php:59",
      "callers": [
        "includes/dmm/class-aieo-action-telemetry.php:70",
        "includes/dmm/modules/class-aieo-dmm-connections.php:583",
        "includes/dmm/modules/class-aieo-dmm-connections.php:672"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "includes/dmm/modules/class-aieo-dmm-connections.php:661",
      "selector": "[data-aieo-action=\"connections.usage_sharing_optin\"]",
      "selector_source": "markup",
      "variants": [
        "grant",
        "revoke"
      ],
      "confirm": "",
      "label": "I agree, record which controls we use",
      "description": "Records or withdraws your agreement to share which admin controls your own staff use, against your name and the date, and withdrawing deletes what was collected.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "withdrawing deletes the collected counters permanently",
      "context": "staff usage sharing"
    },
    {
      "id": "consent.clear",
      "ajax": "aieo_dmm_consent_clear",
      "page": "consent",
      "handler": "includes/dmm/modules/class-aieo-dmm-consent.php:34",
      "callers": [
        "assets/pages/dmm/consent.php:425"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-cmp-inv-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "Clear the whole cookie inventory? It will repopulate as visitors browse.",
      "label": "Clear the cookie list",
      "description": "Empties the record of cookies found, so the next scan starts from nothing.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "the list rebuilds as visitors browse; categories you sorted by hand are lost"
    },
    {
      "id": "consent.save",
      "ajax": "aieo_dmm_consent_save",
      "page": "consent",
      "handler": "includes/dmm/modules/class-aieo-dmm-consent.php:32",
      "callers": [
        "assets/pages/dmm/consent.php:384"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-consent-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets what the cookie banner says, which categories shoppers can refuse, and how it looks.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes the banner every visitor sees and what tracking is allowed",
      "context": "cookie banner"
    },
    {
      "id": "consent.classify",
      "ajax": "aieo_dmm_consent_classify",
      "page": "consent",
      "handler": "includes/dmm/modules/class-aieo-dmm-consent.php:33",
      "callers": [
        "assets/pages/dmm/consent.php:406"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-cmp-inv-service",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Sort the cookies",
      "description": "Files the cookies found on your site into categories, so refusing a category actually stops the right ones.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes which cookies are blocked when a visitor refuses"
    },
    {
      "id": "contact_discovery.contacts_start",
      "ajax": "aieo_contacts_start",
      "page": "contact_discovery",
      "handler": "includes/dmm/modules/class-aieo-dmm-contact-discovery.php:30",
      "callers": [
        "assets/pages/dmm/contact-discovery.php:244"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "Create customer accounts for every detected contact in the ticked sources? Existing accounts are left alone and nobody’s marketing consent changes.",
      "label": "Create the accounts",
      "description": "Creates a real customer account for every contact found in the sources you ticked, and emails each person when notify is switched on.",
      "informs_customer": true,
      "safe_to_demo": false,
      "side_effects": "creates real accounts in bulk and emails people when notify is on"
    },
    {
      "id": "contact_discovery.contacts_preview",
      "ajax": "aieo_contacts_preview",
      "page": "contact_discovery",
      "handler": "includes/dmm/modules/class-aieo-dmm-contact-discovery.php:28",
      "callers": [
        "assets/pages/dmm/contact-discovery.php:205"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-cd-pick",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Preview",
      "description": "Shows twenty-five examples of the accounts that would be created, so you can check the result before committing to it.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "a dry run; nothing is created"
    },
    {
      "id": "contact_discovery.contacts_progress",
      "ajax": "aieo_contacts_progress",
      "page": "contact_discovery",
      "handler": "includes/dmm/modules/class-aieo-dmm-contact-discovery.php:31",
      "callers": [
        "assets/pages/dmm/contact-discovery.php:260"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Progress",
      "description": "Reports how far the account creation has got, so a long run can be watched without reloading the page.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "contact_discovery.contacts_settings",
      "ajax": "aieo_contacts_settings",
      "page": "contact_discovery",
      "handler": "includes/dmm/modules/class-aieo-dmm-contact-discovery.php:29",
      "callers": [
        "assets/pages/dmm/contact-discovery.php:188"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Chooses which sources are searched for contacts and whether people are told when an account is made for them.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "decides whether future runs contact real people",
      "context": "contacts"
    },
    {
      "id": "contact_discovery.contacts_scan",
      "ajax": "aieo_contacts_scan",
      "page": "contact_discovery",
      "handler": "includes/dmm/modules/class-aieo-dmm-contact-discovery.php:27",
      "callers": [
        "assets/pages/dmm/contact-discovery.php:165"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Scan",
      "description": "Looks through the places people have left their details and counts how many could be turned into customer accounts.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "counts only; nothing is created"
    },
    {
      "id": "contact_discovery.contacts_cancel",
      "ajax": "aieo_contacts_cancel",
      "page": "contact_discovery",
      "handler": "includes/dmm/modules/class-aieo-dmm-contact-discovery.php:32",
      "callers": [
        "assets/pages/dmm/contact-discovery.php:256"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Stop",
      "description": "Halts the account creation part-way through, leaving every account already made in place.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "accounts already created are not removed"
    },
    {
      "id": "contact_optin.save",
      "ajax": "aieo_dmm_contact_optin_save",
      "page": "contact_optin",
      "handler": "includes/dmm/modules/class-aieo-dmm-contact-optin.php:36",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-contact-optin.php:163"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-optin-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets the wording of the marketing permission box at checkout, which is what shoppers agree to.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes the wording of a consent shoppers give you",
      "context": "checkout opt-in"
    },
    {
      "id": "contributors.contributor_delete",
      "ajax": "aieo_dmm_contributor_delete",
      "page": "contributors",
      "handler": "includes/dmm/modules/class-aieo-dmm-contributors-page.php:29",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-contributors-page.php:208"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-ct-del",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Delete contributor",
      "description": "Removes an author. Articles credited to them lose their byline.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "public articles lose their author details"
    },
    {
      "id": "contributors.contributor_save",
      "ajax": "aieo_dmm_contributor_save",
      "page": "contributors",
      "handler": "includes/dmm/modules/class-aieo-dmm-contributors-page.php:28",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-contributors-page.php:193"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ct-save",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save contributor",
      "description": "Stores an author with their details, so articles can be credited to a real named person.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "the name and photo appear publicly on articles"
    },
    {
      "id": "conversion_goals.goal_analyze",
      "ajax": "aieo_goal_analyze",
      "page": "conversion_goals",
      "handler": "includes/dmm/modules/class-aieo-dmm-conversion-goals.php:38",
      "callers": [
        "assets/pages/dmm/conversion-goals.php:120",
        "includes/dmm/modules/class-aieo-dmm-seo.php:55"
      ],
      "caller_kinds": [
        "php",
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-goal-context",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Analyse goal",
      "description": "Looks at what is helping or hurting one goal and explains the pattern in plain words.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "uses your AI credits"
    },
    {
      "id": "conversion_goals.goals_form_insights",
      "ajax": "aieo_goals_form_insights",
      "page": "conversion_goals",
      "handler": "includes/dmm/modules/class-aieo-dmm-conversion-goals.php:39",
      "callers": [
        "assets/pages/dmm/form-insights.php:243",
        "assets/pages/dmm/form-insights.php:357"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Form results",
      "description": "Shows how people are getting on with a form, including where they give up.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "conversion_goals.goals_save",
      "ajax": "aieo_goals_save",
      "page": "conversion_goals",
      "handler": "includes/dmm/modules/class-aieo-dmm-conversion-goals.php:37",
      "callers": [
        "assets/pages/dmm/conversion-goals.php:110",
        "includes/dmm/modules/class-aieo-dmm-seo.php:55"
      ],
      "caller_kinds": [
        "php",
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-goal-builtin",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save goals",
      "description": "Stores the targets you are measuring against, such as revenue or sign-ups.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what the goal reports measure"
    },
    {
      "id": "conversions.save",
      "ajax": "aieo_dmm_conversions_save",
      "page": "conversions",
      "handler": "includes/dmm/modules/class-aieo-dmm-conversions.php:102",
      "callers": [
        "assets/pages/dmm/conversions.php:350"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-conv-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets what counts as a conversion, which is what the success figures across the reports are counted against.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what every conversion figure means",
      "context": "conversions"
    },
    {
      "id": "custom_slots.add",
      "ajax": "aieo_dmm_custom_slots_add",
      "page": "custom_slots",
      "handler": "includes/dmm/modules/class-aieo-dmm-custom-slots.php:70",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-custom-slots.php:528"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-aieo-cs-add]",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Add slot",
      "description": "Creates a new place in the shop layout where you can put your own content.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "adds an empty area; nothing shows until you put something in it"
    },
    {
      "id": "custom_slots.delete",
      "ajax": "aieo_dmm_custom_slots_delete",
      "page": "custom_slots",
      "handler": "includes/dmm/modules/class-aieo-dmm-custom-slots.php:71",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-custom-slots.php:539"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-aieo-cs-delete]",
      "selector_source": "derived",
      "variants": [],
      "confirm": "Delete this slot?",
      "label": "Delete slot",
      "description": "Removes one of your own content areas, and whatever was in it stops being shown.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "the content disappears from the storefront at once"
    },
    {
      "id": "custom_slots.save",
      "ajax": "aieo_dmm_custom_slots_save",
      "page": "custom_slots",
      "handler": "includes/dmm/modules/class-aieo-dmm-custom-slots.php:69",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-custom-slots.php:514"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-cs-save",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save slot",
      "description": "Stores what goes in one of your own content areas and where it appears.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what shoppers see on the storefront"
    },
    {
      "id": "custom_tabs.migrate",
      "ajax": "aieo_dmm_custom_tabs_migrate",
      "page": "custom_tabs",
      "handler": "includes/dmm/modules/class-aieo-dmm-custom-tabs.php:142",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-custom-tabs.php:335"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ct-migrate",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Bring across the old tabs",
      "description": "Copies product tabs over from the previous plugin so the content is not lost.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "writes tab content in bulk and overwrites what is there"
    },
    {
      "id": "custom_tabs.save",
      "ajax": "aieo_dmm_custom_tabs_save",
      "page": "custom_tabs",
      "handler": "includes/dmm/modules/class-aieo-dmm-custom-tabs.php:141",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-custom-tabs.php:327"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-custom-tabs-form",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save tabs",
      "description": "Stores your own tabs on the product page, such as care instructions or sizing.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what shoppers see on the storefront",
      "context": "product tabs"
    },
    {
      "id": "customer_profile.describe",
      "ajax": "aieo_dmm_customer_profile_describe",
      "page": "customer_profile",
      "handler": "includes/dmm/modules/class-aieo-dmm-customer-profile.php:37",
      "callers": [
        "assets/pages/dmm/customer-profile.php:166"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Describe this customer",
      "description": "Sums up one customer buying history in plain words, so you know who you are talking to before you call.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "uses your AI credits; reads real customer data"
    },
    {
      "id": "customer_profile.narrate",
      "ajax": "aieo_dmm_customer_profile_narrate",
      "page": "customer_profile",
      "handler": "includes/dmm/modules/class-aieo-dmm-customer-profile.php:38",
      "callers": [
        "assets/pages/dmm/customer-profile.php:152"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-cp-narrate",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Explain the figures",
      "description": "Explains what a customer numbers actually mean, rather than leaving you to read a table.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "uses your AI credits; reads real customer data"
    },
    {
      "id": "data_prep_scheduler.identity_backfill",
      "ajax": "aieo_dmm_identity_backfill",
      "page": "data_prep_scheduler",
      "handler": "includes/dmm/modules/class-aieo-dmm-data-prep-scheduler.php:55",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-data-prep-scheduler.php:1523"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-identity-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Match up returning customers",
      "description": "Goes back over past orders and links the ones placed by the same person, so a guest who later signs up is recognised.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "long-running; rewrites who past orders are attributed to"
    },
    {
      "id": "data_prep_scheduler.data_prep_full_substrate",
      "ajax": "aieo_dmm_data_prep_full_substrate",
      "page": "data_prep_scheduler",
      "handler": "includes/dmm/modules/class-aieo-dmm-data-prep-scheduler.php:54",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-data-prep-scheduler.php:1374"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dp-substrate",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Rebuild everything",
      "description": "Rebuilds the whole set of prepared figures from scratch, which is the last resort when the reports look wrong.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "very long-running and heavy; rebuilds everything the reports read"
    },
    {
      "id": "data_prep_scheduler.data_prep_run_now",
      "ajax": "aieo_dmm_data_prep_run_now",
      "page": "data_prep_scheduler",
      "handler": "includes/dmm/modules/class-aieo-dmm-data-prep-scheduler.php:53",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-data-prep-scheduler.php:1355"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Run now",
      "description": "Runs the data preparation immediately rather than waiting for tonight, which is what to press after a big import.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "heavy; best kept away from busy hours"
    },
    {
      "id": "data_prep_scheduler.data_prep_save",
      "ajax": "aieo_dmm_data_prep_save",
      "page": "data_prep_scheduler",
      "handler": "includes/dmm/modules/class-aieo-dmm-data-prep-scheduler.php:52",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-data-prep-scheduler.php:1340"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Save schedule",
      "description": "Sets how often and at what time the nightly data preparation runs, so it lands when the shop is quiet.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes when the overnight work happens"
    },
    {
      "id": "events.save",
      "ajax": "aieo_events_save",
      "page": "events",
      "handler": "includes/dmm/modules/class-aieo-dmm-events.php:97",
      "callers": [
        "assets/js/aieo-events-admin.js:93",
        "assets/js/aieo-events-admin.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-event-image-id",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save event",
      "description": "Stores an event with its dates and details, which shoppers can then see and sign up to.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "an event goes live and can take real sign-ups"
    },
    {
      "id": "events.settings_save",
      "ajax": "aieo_events_settings_save",
      "page": "events",
      "handler": "includes/dmm/modules/class-aieo-dmm-events.php:98",
      "callers": [
        "assets/js/aieo-events-admin.js:57",
        "assets/js/aieo-events-admin.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-event-settings-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets the shop-wide rules events follow, such as who may sign up and what they are asked.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "applies to events that are already running",
      "context": "events"
    },
    {
      "id": "exit_intent.save",
      "ajax": "aieo_dmm_exit_intent_save",
      "page": "exit_intent",
      "handler": "includes/dmm/modules/class-aieo-dmm-exit-intent.php:43",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-exit-intent.php:572"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-ei-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets the message shown when a shopper looks like they are about to leave, and how often they may see it.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "a real message starts appearing to real shoppers",
      "context": "exit message"
    },
    {
      "id": "faq.create",
      "ajax": "aieo_faq_create",
      "page": "faq",
      "handler": "includes/dmm/modules/class-aieo-dmm-faq.php:32",
      "callers": [
        "assets/js/aieo-faq-admin.js:118",
        "assets/js/aieo-faq-admin.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-faq-new-group",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Add FAQ",
      "description": "Publishes a new question and answer in the group you chose, which then appears wherever that group is displayed.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "publishes content visible to shoppers"
    },
    {
      "id": "faq.add_group",
      "ajax": "aieo_faq_add_group",
      "page": "faq",
      "handler": "includes/dmm/modules/class-aieo-dmm-faq.php:36",
      "callers": [
        "assets/js/aieo-faq-admin.js:83",
        "assets/js/aieo-faq-admin.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-faq-new-group",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Add group",
      "description": "Creates a new FAQ group, which is how one set of questions is shown on a product page and another in the footer.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "creates an empty group; nothing is shown until questions are added to it"
    },
    {
      "id": "faq.delete",
      "ajax": "aieo_faq_delete",
      "page": "faq",
      "handler": "includes/dmm/modules/class-aieo-dmm-faq.php:33",
      "callers": [
        "assets/js/aieo-faq-admin.js:128",
        "assets/js/aieo-faq-admin.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-faq-item",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Delete",
      "description": "Sends one question and answer to the trash, so it stops appearing on the storefront but can still be restored from there.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "removes live content, recoverable from the WordPress trash",
      "context": "FAQ"
    },
    {
      "id": "faq.delete_group",
      "ajax": "aieo_faq_delete_group",
      "page": "faq",
      "handler": "includes/dmm/modules/class-aieo-dmm-faq.php:38",
      "callers": [
        "assets/js/aieo-faq-admin.js:106",
        "assets/js/aieo-faq-admin.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-faq-group-chip",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Delete group",
      "description": "Removes a group entirely, leaving the questions that were in it without one and out of wherever the group was shown.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "irreversible; the questions survive but stop being displayed"
    },
    {
      "id": "faq.update_q",
      "ajax": "aieo_faq_update_q",
      "page": "faq",
      "handler": "includes/dmm/modules/class-aieo-dmm-faq.php:34",
      "callers": [
        "assets/js/aieo-faq-admin.js:149",
        "assets/js/aieo-faq-admin.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-faq-item",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Edit question",
      "description": "Renames one question in place, changing what shoppers read and what the AI chat matches their wording against.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes live storefront content"
    },
    {
      "id": "faq.rename_group",
      "ajax": "aieo_faq_rename_group",
      "page": "faq",
      "handler": "includes/dmm/modules/class-aieo-dmm-faq.php:37",
      "callers": [
        "assets/js/aieo-faq-admin.js:97",
        "assets/js/aieo-faq-admin.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-faq-group-name",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Rename group",
      "description": "Changes a group's name, which is the heading shoppers see above the questions it holds.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes a live storefront heading"
    },
    {
      "id": "faq.reorder",
      "ajax": "aieo_faq_reorder",
      "page": "faq",
      "handler": "includes/dmm/modules/class-aieo-dmm-faq.php:35",
      "callers": [
        "assets/js/aieo-faq-admin.js:58",
        "assets/js/aieo-faq-admin.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-faq-group-count",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Reorder",
      "description": "Saves the order you dragged the questions into, which is the order shoppers meet them in.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "changes display order on the storefront",
      "context": "FAQs"
    },
    {
      "id": "food_beverages.food_save_settings",
      "ajax": "aieo_food_save_settings",
      "page": "food_beverages",
      "handler": "includes/dmm/modules/class-aieo-dmm-food-beverages.php:38",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-food-beverages.php:153"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-food-save",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets the extra details food and drink products need by law, such as ingredients and allergens.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes information shoppers rely on, some of it legally required",
      "context": "food and drink"
    },
    {
      "id": "form_insights.form_respondents",
      "ajax": "aieo_form_respondents",
      "page": "form_insights",
      "handler": "includes/dmm/modules/class-aieo-dmm-form-insights.php:37",
      "callers": [
        "assets/pages/dmm/form-insights.php:391"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ins-modal-csv",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Who answered",
      "description": "Lists the people behind the form answers, so you can follow one up.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; shows real customer details on screen"
    },
    {
      "id": "free_shipping.delete_rule",
      "ajax": "aieo_dmm_free_shipping_delete_rule",
      "page": "free_shipping",
      "handler": "includes/dmm/modules/class-aieo-dmm-free-shipping.php:42",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-free-shipping.php:575"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_free_shipping_delete_rule\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Delete rule",
      "description": "Removes a free delivery rule, so those orders start paying postage again.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "shoppers who expected free delivery will now be charged",
      "context": "free shipping"
    },
    {
      "id": "free_shipping.remove_exclusion",
      "ajax": "aieo_dmm_free_shipping_remove_exclusion",
      "page": "free_shipping",
      "handler": "includes/dmm/modules/class-aieo-dmm-free-shipping.php:36",
      "callers": [
        "assets/js/dmm.js:352",
        "assets/js/dmm.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-dmm-remove-exclusion",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Remove exclusion",
      "description": "Lets a product qualify for free delivery again after it had been left out.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "that product now ships free where the rule applies"
    },
    {
      "id": "free_shipping.save_rule",
      "ajax": "aieo_dmm_free_shipping_save_rule",
      "page": "free_shipping",
      "handler": "includes/dmm/modules/class-aieo-dmm-free-shipping.php:41",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-free-shipping.php:534"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_free_shipping_save_rule\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Save rule",
      "description": "Stores a free delivery rule, such as over a certain basket value, which shoppers get straight away.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "free delivery starts being given, which costs you the postage"
    },
    {
      "id": "free_shipping_display.free_shipping_save",
      "ajax": "aieo_dmm_free_shipping_save",
      "page": "free_shipping_display",
      "handler": "includes/dmm/class-aieo-dmm-cod-country-block.php:55",
      "callers": [
        "assets/pages/dmm/free-shipping.php:103",
        "includes/dmm/modules/class-aieo-dmm-free-shipping-display.php:15",
        "includes/dmm/modules/class-aieo-dmm-free-shipping.php:232",
        "includes/dmm/modules/class-aieo-dmm-free-shipping.php:259",
        "includes/dmm/modules/class-aieo-dmm-free-shipping.php:383"
      ],
      "caller_kinds": [
        "php",
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_free_shipping_save\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Chooses which countries may pay cash on delivery.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "a mistake here stops real shoppers from being able to pay",
      "context": "cash on delivery"
    },
    {
      "id": "fulfillment.ff_migrate_audit",
      "ajax": "aieo_ff_migrate_audit",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:326",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:9205"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ff-migrate-audit",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Audit legacy data",
      "description": "Counts what a migration from the old shipment-tracking data would move, without moving any of it, so the work is visible first.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; nothing is written"
    },
    {
      "id": "fulfillment.ff_toggle_auto_close",
      "ajax": "aieo_ff_toggle_auto_close",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:316",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:6904"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ff-auto-close-toggle",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Automatic daily close",
      "description": "Closes the day with every carrier automatically each night so nobody has to remember, or hands that job back to you when switched off.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "when on, parcels are declared dispatched at the carrier every day without anyone pressing anything"
    },
    {
      "id": "fulfillment.ff_backfill_costs",
      "ajax": "aieo_ff_backfill_costs",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:291",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:8625"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-ff-cb-missing",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Backfill carrier costs",
      "description": "Pulls what a carrier charged for past shipments, batch by batch, so the shipping reports stop guessing at cost.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "long-running; one carrier API call per shipment and writes costs onto orders"
    },
    {
      "id": "fulfillment.ff_backfill_customer_paid",
      "ajax": "aieo_ff_backfill_customer_paid",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:294",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:8499"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-ff-cpb-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Backfill customer-paid shipping",
      "description": "Copies what the customer paid for shipping from each WooCommerce order onto its voucher, which is the other half of the margin calculation.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "long-running; writes onto voucher rows, reading order totals that already exist"
    },
    {
      "id": "fulfillment.ff_backfill_delivered",
      "ajax": "aieo_ff_backfill_delivered",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:290",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:8194"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ff-bf-sweep",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Backfill delivery dates",
      "description": "Asks a carrier for the final status of past shipments in small batches and records when each was actually delivered.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "long-running; one carrier API call per shipment and writes delivery dates onto orders"
    },
    {
      "id": "fulfillment.ff_backfill_detailed",
      "ajax": "aieo_ff_backfill_detailed",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:295",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:8390"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ff-db-sweep",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Backfill detailed charges",
      "description": "Fetches the itemised charge breakdown for past shipments from a carrier, which is what separates fuel and area surcharges from the base rate.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "long-running; one carrier API call per shipment"
    },
    {
      "id": "fulfillment.ff_cancel_voucher",
      "ajax": "aieo_ff_cancel_voucher",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:288",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:1127"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "Cancel this voucher? This calls the carrier API.",
      "label": "Cancel voucher",
      "description": "Asks the carrier to cancel a booked shipment, which only works on carriers whose driver supports cancelling and only before the parcel is collected.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "cancels a real booking at the carrier"
    },
    {
      "id": "fulfillment.ff_close_and_print",
      "ajax": "aieo_ff_close_and_print",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:321",
      "callers": [
        "includes/dmm/fulfillment/class-aieo-fulfillment-closings.php:15",
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:6922"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ff-close-carrier",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Close and print manifest",
      "description": "Closes the round and immediately returns the manifest the driver signs, which is the paper record that the parcels left your premises.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "declares parcels dispatched at the carrier and cannot be taken back"
    },
    {
      "id": "fulfillment.ff_close_pending_by_date",
      "ajax": "aieo_ff_close_pending_by_date",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:315",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:6960"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ff-close-to",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Close by date",
      "description": "Closes the pending shipments that fall inside a date range you type, for catching up after a day when nobody closed the round.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "declares parcels dispatched for the whole range at the carrier"
    },
    {
      "id": "fulfillment.ff_close_pending_now",
      "ajax": "aieo_ff_close_pending_now",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:314",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:6890"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ff-close-pending",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Close pending now",
      "description": "Runs the end-of-day close for every carrier that has one and produces a local dispatch manifest for those that do not, telling the carrier the parcels are ready.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "declares today's parcels dispatched at the carrier and cannot be taken back"
    },
    {
      "id": "fulfillment.ff_create_document",
      "ajax": "aieo_ff_create_document",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:303",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:1148"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-aieo-ff-create-doc]",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Create document",
      "description": "Generates an invoice, packing slip, proforma or credit note for one order and files it against that order permanently.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "creates a numbered document, and invoice numbering is sequential and not meant to be reused"
    },
    {
      "id": "fulfillment.ff_create_voucher",
      "ajax": "aieo_ff_create_voucher",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:285",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:1062"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ff-received-date",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Create voucher",
      "description": "Books a real shipment with the chosen carrier for this order and stores the voucher number it returns, without telling the customer anything.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "books a real collection with the carrier and costs money"
    },
    {
      "id": "fulfillment.ff_delete_custom_carrier",
      "ajax": "aieo_ff_delete_custom_carrier",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:374",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:6380"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-cc-delete",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Delete custom carrier",
      "description": "Removes a hand-made carrier, which leaves any order already filed under it pointing at a carrier that no longer exists.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "irreversible; historical orders keep the old carrier code and lose their tracking link"
    },
    {
      "id": "fulfillment.ff_delete_document",
      "ajax": "aieo_ff_delete_document",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:308",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:1190"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "Delete this document and its PDF file?",
      "label": "Delete document",
      "description": "Removes a generated document and its PDF from the order, leaving a gap in the numbering that will not be filled again.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "irreversible; leaves a hole in a sequential numbering series"
    },
    {
      "id": "fulfillment.ff_delete_voucher",
      "ajax": "aieo_ff_delete_voucher",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:300",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:1134"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "Remove this voucher row from this site only? Does NOT cancel at carrier.",
      "label": "Delete voucher",
      "description": "Removes the voucher row from this shop only, leaving the booking itself alive at the carrier, so use Cancel first if the parcel must not ship.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "deletes local records but does NOT cancel anything at the carrier"
    },
    {
      "id": "fulfillment.ff_bulk_zip",
      "ajax": "aieo_ff_bulk_zip",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:312",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:6723"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ff-bulk-zip",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Download as ZIP",
      "description": "Same selection as the merge, delivered as one file per order inside a ZIP, for when each document has to be filed separately.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "creates any missing documents for the whole range"
    },
    {
      "id": "fulfillment.ff_bulk_zip_labels",
      "ajax": "aieo_ff_bulk_zip_labels",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:313",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:6971",
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:6982"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ff-bulk-labels-zip",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Download labels ZIP",
      "description": "Collects the label PDFs already cached for a carrier and date range into one ZIP, and finds nothing if no labels have been printed yet.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads cached PDFs only; no carrier call and no new documents"
    },
    {
      "id": "fulfillment.ff_download_manifest",
      "ajax": "aieo_ff_download_manifest",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:323",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:5129"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Download manifest",
      "description": "Downloads the stored manifest file for one past closing, identified by its closing id in the run log.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads a stored file"
    },
    {
      "id": "fulfillment.ff_metrics_drill",
      "ajax": "aieo_ff_metrics_drill",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:296",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:7704",
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:7749"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Drill into a postcode",
      "description": "Opens the shipments behind one postcode area in the cost report, so a bad average can be traced to the orders that caused it.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "fulfillment.ff_metrics_export_aggregate",
      "ajax": "aieo_ff_metrics_export_aggregate",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:298",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:7204"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Export by area",
      "description": "Writes the same figures totalled by postcode prefix instead of by shipment, which is the version to take to a carrier negotiation.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; produces a file"
    },
    {
      "id": "fulfillment.ff_metrics_export",
      "ajax": "aieo_ff_metrics_export",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:297",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:7611"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Export shipments",
      "description": "Writes one spreadsheet row per shipment for the chosen carrier, with cost, what the customer paid and the destination area.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; produces a file"
    },
    {
      "id": "fulfillment.ff_import_carrier_csv",
      "ajax": "aieo_ff_import_carrier_csv",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:293",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:8803"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Import carrier CSV",
      "description": "Does the same for any other carrier's billing export, matching rows to orders by voucher number so the shipping P&L reflects invoices rather than estimates.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "writes real shipping costs onto historical orders"
    },
    {
      "id": "fulfillment.ff_import_geniki_csv",
      "ajax": "aieo_ff_import_geniki_csv",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:292",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:8939"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Import Geniki CSV",
      "description": "Reads the billing CSV Geniki sends you and files what each shipment actually cost against the order it belongs to.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "writes real shipping costs onto historical orders"
    },
    {
      "id": "fulfillment.ff_save_carrier_map",
      "ajax": "aieo_ff_save_carrier_map",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:307",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:5962",
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:5971"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-courier-link-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Link shipping method",
      "description": "Ties a WooCommerce shipping method title to a carrier, which is how an order picks its carrier automatically instead of you choosing each time.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes which carrier new orders default to"
    },
    {
      "id": "fulfillment.ff_merge_couriers",
      "ajax": "aieo_ff_merge_couriers",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:375",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:6090"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-merge-from",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Merge carriers",
      "description": "Rewrites every order and voucher filed under one carrier code to another, for cleaning up after a rename or a duplicate carrier.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "bulk-rewrites historical order and voucher rows; there is no undo"
    },
    {
      "id": "fulfillment.ff_bulk_merge",
      "ajax": "aieo_ff_bulk_merge",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:311",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:6709"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ff-bulk-merge",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Merge to one PDF",
      "description": "Builds every document of one type for the orders in your date range and status filter, then merges them into a single PDF to print in one go.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "creates any missing documents for the whole range, which can be hundreds of numbered records"
    },
    {
      "id": "fulfillment.ff_print_doc_for_order",
      "ajax": "aieo_ff_print_doc_for_order",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:305",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:3771",
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:446"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Print",
      "description": "Produces the chosen document type for one order and returns it ready to print, creating it first if that order has none yet.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "may create a numbered document as a side effect of printing"
    },
    {
      "id": "fulfillment.ff_get_label",
      "ajax": "aieo_ff_get_label",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:287",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:1105"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-aieo-ff-action]",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Print label",
      "description": "Fetches the printable A4 label from the carrier and keeps a copy, so you can reprint it later without asking them again.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "fetches and caches a PDF; the shipment is not altered"
    },
    {
      "id": "fulfillment.ff_reprint_last_closing",
      "ajax": "aieo_ff_reprint_last_closing",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:322",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:6939"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ff-close-carrier",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Reprint last manifest",
      "description": "Fetches the manifest from the most recent closing for a carrier again, for when the first copy was lost or never reached the printer.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reprints a stored manifest; closes nothing"
    },
    {
      "id": "fulfillment.ff_migrate_reset",
      "ajax": "aieo_ff_migrate_reset",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:328",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:9222"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ff-migrate-reset",
      "selector_source": "derived",
      "variants": [],
      "confirm": "Reset migration progress counters? Already-migrated rows stay (idempotency keys block dupes), but counters restart from zero.",
      "label": "Reset migration progress",
      "description": "Forgets how far a migration step has got so it starts again from the beginning, which does not undo anything it has already written.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "clears progress markers only; already-migrated rows stay and can be duplicated by a re-run"
    },
    {
      "id": "fulfillment.ff_migrate_batch",
      "ajax": "aieo_ff_migrate_batch",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:327",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:9237"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-ff-migrate-run",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Run migration step",
      "description": "Runs one named step of the legacy migration over five hundred rows at a time, and is meant to be called until that step reports no rows left.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "long-running; writes voucher and order rows from legacy data"
    },
    {
      "id": "fulfillment.ff_save_courier",
      "ajax": "aieo_ff_save_courier",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:283",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:5948"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Save carrier",
      "description": "Stores one carrier driver's credentials and options, which is what decides whether booking, printing, tracking and closing work at all for it.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "overwrites live carrier credentials"
    },
    {
      "id": "fulfillment.ff_save_custom_carrier",
      "ajax": "aieo_ff_save_custom_carrier",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:373",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:6349",
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:6498"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-cc-new-title",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save custom carrier",
      "description": "Adds a carrier that has no driver, with a label and a tracking URL template, so vouchers you enter by hand still produce a working tracking link.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "adds a carrier that appears in every carrier picker"
    },
    {
      "id": "fulfillment.ff_save_general",
      "ajax": "aieo_ff_save_general",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:299",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:8057"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ff-general-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save general settings",
      "description": "Stores the shop-wide fulfilment defaults, including which carrier a voucher uses when nobody picks one.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes the default carrier for every new voucher"
    },
    {
      "id": "fulfillment.ff_save_manual_voucher",
      "ajax": "aieo_ff_save_manual_voucher",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:306",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:490",
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:604"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-ff-print-doc",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save voucher number",
      "description": "Files a voucher number you booked yourself against the order, and emails the customer a tracking link if you tick the notify box.",
      "informs_customer": true,
      "safe_to_demo": false,
      "side_effects": "emails the customer when notify is ticked; otherwise writes order meta only"
    },
    {
      "id": "fulfillment.ff_test_courier",
      "ajax": "aieo_ff_test_courier",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:284",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:5948"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Test connection",
      "description": "Calls the carrier with the credentials as saved and reports whether they authenticate, without booking or changing anything.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "one authentication call to the carrier; books nothing"
    },
    {
      "id": "fulfillment.ff_track_now",
      "ajax": "aieo_ff_track_now",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:289",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:1116"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Track now",
      "description": "Asks the carrier where this parcel is right now, instead of waiting for the overnight update.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "one read-only carrier API call"
    },
    {
      "id": "fulfillment.ff_get_document_pdf",
      "ajax": "aieo_ff_get_document_pdf",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:304",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:1169",
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:1179"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-aieo-ff-doc-action]",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "View PDF",
      "description": "Opens a document's PDF, optionally regenerating it from the current order data instead of serving the copy that was stored when it was issued.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "regenerating replaces the stored PDF with one built from today's order data"
    },
    {
      "id": "google_reviews.grv_delete_location",
      "ajax": "aieo_grv_delete_location",
      "page": "google_reviews",
      "handler": "includes/dmm/modules/class-aieo-dmm-google-reviews.php:107",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-google-reviews.php:497"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-aieo-grv-delete]",
      "selector_source": "derived",
      "variants": [],
      "confirm": "Delete this location? Its review history stays in the table.",
      "label": "Delete",
      "description": "Removes a location from the sync list while leaving every review already pulled for it in the history table.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "irreversible for the location row; review history is kept"
    },
    {
      "id": "google_reviews.grv_fetch_all",
      "ajax": "aieo_grv_fetch_all",
      "page": "google_reviews",
      "handler": "includes/dmm/modules/class-aieo-dmm-google-reviews.php:110",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-google-reviews.php:555"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-grv-fetch-all",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Fetch all",
      "description": "Pulls reviews for every switched-on shop in one go, which Google charges you for once per shop and can take several minutes.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "spends one paid Google API call per enabled location"
    },
    {
      "id": "google_reviews.grv_fetch_now",
      "ajax": "aieo_grv_fetch_now",
      "page": "google_reviews",
      "handler": "includes/dmm/modules/class-aieo-dmm-google-reviews.php:109",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-google-reviews.php:584"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-aieo-grv-fetch]",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Fetch now",
      "description": "Pulls the latest reviews for this one location straight away and appends anything not seen before to the permanent history.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "spends one paid Google API call and writes new review rows"
    },
    {
      "id": "google_reviews.grv_lookup_place",
      "ajax": "aieo_grv_lookup_place",
      "page": "google_reviews",
      "handler": "includes/dmm/modules/class-aieo-dmm-google-reviews.php:108",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-google-reviews.php:527"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-grv-lookup-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Look up",
      "description": "Finds your shop on Google by name or Maps link and fills in its id for you. Google charges you for each attempt.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "spends a paid Google Places API call"
    },
    {
      "id": "google_reviews.grv_reorder_location",
      "ajax": "aieo_grv_reorder_location",
      "page": "google_reviews",
      "handler": "includes/dmm/modules/class-aieo-dmm-google-reviews.php:111",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-google-reviews.php:423"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-aieo-grv-move]",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Move up / Move down",
      "description": "Changes where a location sits in the list, which is the order the storefront review block shows branches in.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reorders live rows, and the storefront block follows the new order immediately"
    },
    {
      "id": "google_reviews.grv_save_location",
      "ajax": "aieo_grv_save_location",
      "page": "google_reviews",
      "handler": "includes/dmm/modules/class-aieo-dmm-google-reviews.php:106",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-google-reviews.php:505"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Save location",
      "description": "Stores one shop's Google Place id, language and enabled state, which is what ties that physical branch to the reviews pulled for it.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "overwrites a live location row"
    },
    {
      "id": "google_reviews.grv_save_settings",
      "ajax": "aieo_grv_save_settings",
      "page": "google_reviews",
      "handler": "includes/dmm/modules/class-aieo-dmm-google-reviews.php:105",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-google-reviews.php:924"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-grv-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Stores the Google API key, how often reviews sync and where the review block is allowed to appear on the storefront.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "overwrites the live Google Reviews settings, including the shared API key"
    },
    {
      "id": "header_actions.save",
      "ajax": "aieo_dmm_header_actions_save",
      "page": "header_actions",
      "handler": "includes/dmm/modules/class-aieo-dmm-header-actions.php:30",
      "callers": [
        "assets/pages/dmm/header-actions.php:127"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_header_actions_save\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Chooses which icons sit in the shop header, such as search, account, wishlist and basket.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes the live storefront for everyone",
      "context": "header"
    },
    {
      "id": "insights_manage.insights_seed",
      "ajax": "aieo_insights_seed",
      "page": "insights_manage",
      "handler": "includes/dmm/modules/class-aieo-dmm-insights-manage.php:44",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-insights-manage.php:251"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ins-menu",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Fill in the starting map",
      "description": "Fills the map in with sensible defaults, which is the quickest way to get the assistant answering.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "overwrites the current mapping"
    },
    {
      "id": "insights_manage.insights_save_map",
      "ajax": "aieo_insights_save_map",
      "page": "insights_manage",
      "handler": "includes/dmm/modules/class-aieo-dmm-insights-manage.php:43",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-insights-manage.php:239"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-ins-sel",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save the map",
      "description": "Says which of your figures answer which questions, so the assistant looks in the right place.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "a wrong mapping makes the assistant answer from the wrong figures"
    },
    {
      "id": "local_pickup.apply_orders",
      "ajax": "aieo_dmm_local_pickup_apply_orders",
      "page": "local_pickup",
      "handler": "includes/dmm/modules/class-aieo-dmm-local-pickup.php:52",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-local-pickup.php:524"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-lpm-apply-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Apply to past orders",
      "description": "Works through orders already placed and files each against the collection point it belongs to, a hundred at a time.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "long-running; rewrites the collection point recorded on real orders"
    },
    {
      "id": "local_pickup.import_legacy",
      "ajax": "aieo_dmm_local_pickup_import_legacy",
      "page": "local_pickup",
      "handler": "includes/dmm/modules/class-aieo-dmm-local-pickup.php:50",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-local-pickup.php:418"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-lp-import-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Bring across the old points",
      "description": "Creates collection points from the names the previous setup used, so you do not have to add them all by hand.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "adds collection points in bulk, and they are live at checkout"
    },
    {
      "id": "local_pickup.legacy_map_save",
      "ajax": "aieo_dmm_local_pickup_legacy_map_save",
      "page": "local_pickup",
      "handler": "includes/dmm/modules/class-aieo-dmm-local-pickup.php:51",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-local-pickup.php:542"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-lpm-sel",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Match up the old names",
      "description": "Says which old collection name means which new point, so past orders are read as belonging to the right shop.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes how historical orders are counted per shop"
    },
    {
      "id": "local_pickup.rename",
      "ajax": "aieo_dmm_local_pickup_rename",
      "page": "local_pickup",
      "handler": "includes/dmm/modules/class-aieo-dmm-local-pickup.php:53",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-local-pickup.php:692"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-lpr-to",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Rename pickup point",
      "description": "Changes the name a collection point is shown under at checkout, without disturbing orders already placed against it.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "shoppers see the new name at once; past orders keep the old one"
    },
    {
      "id": "local_pickup.save",
      "ajax": "aieo_dmm_local_pickup_save",
      "page": "local_pickup",
      "handler": "includes/dmm/modules/class-aieo-dmm-local-pickup.php:49",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-local-pickup.php:435"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-lp-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save pickup point",
      "description": "Stores a shop or locker customers can collect from, which then appears as a delivery choice at checkout.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes the collection options shoppers see at checkout"
    },
    {
      "id": "loyalty_classes.loyalty_points_adjust",
      "ajax": "aieo_dmm_loyalty_points_adjust",
      "page": "loyalty_classes",
      "handler": "includes/dmm/modules/class-aieo-dmm-loyalty-classes.php:28",
      "callers": [
        "assets/pages/dmm/loyalty-classes.php:312"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_loyalty_points_adjust\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Adjust points",
      "description": "Adds or removes loyalty points from one customer's balance with a note saying why, which is the record of a manual correction.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes a real customer's spendable balance"
    },
    {
      "id": "loyalty_classes.loyalty_assign_user",
      "ajax": "aieo_dmm_loyalty_assign_user",
      "page": "loyalty_classes",
      "handler": "includes/dmm/modules/class-aieo-dmm-loyalty-classes.php:23",
      "callers": [
        "assets/pages/dmm/loyalty-classes.php:237"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_loyalty_assign_user\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Assign",
      "description": "Puts one customer into a loyalty class by hand, giving them its benefits straight away regardless of whether they have earned it.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what a real customer pays and is entitled to"
    },
    {
      "id": "loyalty_classes.loyalty_search_users",
      "ajax": "aieo_dmm_loyalty_search_users",
      "page": "loyalty_classes",
      "handler": "includes/dmm/modules/class-aieo-dmm-loyalty-classes.php:27",
      "callers": [
        "assets/js/dmm.js:189",
        "assets/js/dmm.min.js:1",
        "includes/dmm/modules/class-aieo-dmm-contributors-page.php:114"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-dmm-user-select",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Customer search",
      "description": "Finds customers by name, login or address while you are assigning somebody to a class.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only",
      "context": "loyalty"
    },
    {
      "id": "loyalty_classes.loyalty_class_delete",
      "ajax": "aieo_dmm_loyalty_class_delete",
      "page": "loyalty_classes",
      "handler": "includes/dmm/modules/class-aieo-dmm-loyalty-classes.php:22",
      "callers": [
        "assets/pages/dmm/loyalty-classes.php:216"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_loyalty_class_delete\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Delete",
      "description": "Removes a loyalty class, which takes its benefits away from everyone who was in it.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "irreversible; members lose the class and its benefits at once",
      "context": "loyalty class"
    },
    {
      "id": "loyalty_classes.loyalty_bulk_process",
      "ajax": "aieo_dmm_loyalty_bulk_process",
      "page": "loyalty_classes",
      "handler": "includes/dmm/modules/class-aieo-dmm-loyalty-classes.php:26",
      "callers": [
        "assets/js/dmm.js:270",
        "assets/js/dmm.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-flash",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Process batch",
      "description": "Works through the uploaded file a batch at a time, moving each listed customer into the class named against them.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes live entitlements for many real customers",
      "context": "loyalty"
    },
    {
      "id": "loyalty_classes.loyalty_unassign_user",
      "ajax": "aieo_dmm_loyalty_unassign_user",
      "page": "loyalty_classes",
      "handler": "includes/dmm/modules/class-aieo-dmm-loyalty-classes.php:24",
      "callers": [
        "assets/js/dmm.js:361",
        "assets/js/dmm.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-dmm-unassign-loyalty",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Remove",
      "description": "Takes one customer out of a loyalty class, so they lose its benefits on their next visit.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "removes a live entitlement from a real customer",
      "context": "from loyalty class"
    },
    {
      "id": "loyalty_classes.loyalty_class_save",
      "ajax": "aieo_dmm_loyalty_class_save",
      "page": "loyalty_classes",
      "handler": "includes/dmm/modules/class-aieo-dmm-loyalty-classes.php:21",
      "callers": [
        "assets/pages/dmm/loyalty-classes.php:190"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_loyalty_class_save\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Save class",
      "description": "Stores one loyalty class with its thresholds and benefits, creating it if it is new, which changes what members of it are entitled to.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes live entitlements for everyone already in that class"
    },
    {
      "id": "loyalty_classes.loyalty_bulk_upload",
      "ajax": "aieo_dmm_loyalty_bulk_upload",
      "page": "loyalty_classes",
      "handler": "includes/dmm/modules/class-aieo-dmm-loyalty-classes.php:25",
      "callers": [
        "assets/js/dmm.js:270",
        "assets/js/dmm.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-flash",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Upload CSV",
      "description": "Accepts a spreadsheet of customers and the class each should be in, and prepares it without assigning anybody yet.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "stores an uploaded file ready to be applied",
      "context": "loyalty"
    },
    {
      "id": "marketplace_feeds.search_categories",
      "ajax": "aieo_dmm_search_categories",
      "page": "marketplace_feeds",
      "handler": "includes/dmm/modules/class-aieo-dmm-marketplace-feeds.php:32",
      "callers": [
        "assets/js/dmm.js:165",
        "assets/js/dmm.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-dmm-category-select",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Category search",
      "description": "Finds product categories by name while you are choosing what a feed covers, so you pick from a list rather than typing ids.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only",
      "context": "feed filter"
    },
    {
      "id": "marketplace_feeds.feed_delete",
      "ajax": "aieo_dmm_feed_delete",
      "page": "marketplace_feeds",
      "handler": "includes/dmm/modules/class-aieo-dmm-marketplace-feeds.php:28",
      "callers": [
        "assets/pages/dmm/_marketplace-feeds-table.php:91",
        "assets/pages/dmm/marketplace-feeds.php:616"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_feed_delete\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Delete",
      "description": "Removes a feed and cancels its schedule, so the marketplace stops receiving updates and keeps whatever it last read.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "irreversible; the marketplace's copy of your catalogue goes stale",
      "context": "marketplace feed"
    },
    {
      "id": "marketplace_feeds.feed_get",
      "ajax": "aieo_dmm_feed_get",
      "page": "marketplace_feeds",
      "handler": "includes/dmm/modules/class-aieo-dmm-marketplace-feeds.php:30",
      "callers": [
        "assets/pages/dmm/marketplace-feeds.php:1041"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Edit",
      "description": "Loads one feed's saved configuration into the form so you can change its filters, mapping or schedule.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only",
      "context": "marketplace feed"
    },
    {
      "id": "marketplace_feeds.feed_search_products",
      "ajax": "aieo_dmm_feed_search_products",
      "page": "marketplace_feeds",
      "handler": "includes/dmm/modules/class-aieo-dmm-marketplace-feeds.php:34",
      "callers": [
        "assets/pages/dmm/marketplace-feeds.php:885"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-pm-results",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Product search",
      "description": "Finds products by name or SKU while you are picking which ones a feed includes or excludes.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only",
      "context": "feed filter"
    },
    {
      "id": "marketplace_feeds.feed_run_now",
      "ajax": "aieo_dmm_feed_run_now",
      "page": "marketplace_feeds",
      "handler": "includes/dmm/modules/class-aieo-dmm-marketplace-feeds.php:29",
      "callers": [
        "assets/js/dmm.js:331",
        "assets/js/dmm.js:337",
        "assets/js/dmm.min.js:1",
        "assets/pages/dmm/_marketplace-feeds-table.php:88"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_feed_run_now\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Run now",
      "description": "Regenerates one feed file immediately rather than waiting for its schedule, which is how you check a change before the marketplace sees it.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "rewrites the feed file that marketplaces read"
    },
    {
      "id": "marketplace_feeds.feed_save_availability",
      "ajax": "aieo_dmm_feed_save_availability",
      "page": "marketplace_feeds",
      "handler": "includes/dmm/modules/class-aieo-dmm-marketplace-feeds.php:31",
      "callers": [
        "assets/pages/dmm/marketplace-feeds.php:96"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-feed-avail-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save availability wording",
      "description": "Sets the exact words written into the availability column for in-stock and out-of-stock items, which some marketplaces match literally.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what every feed exports from the next run"
    },
    {
      "id": "marketplace_feeds.feed_save",
      "ajax": "aieo_dmm_feed_save",
      "page": "marketplace_feeds",
      "handler": "includes/dmm/modules/class-aieo-dmm-marketplace-feeds.php:27",
      "callers": [
        "assets/pages/dmm/marketplace-feeds.php:1030",
        "assets/pages/dmm/marketplace-feeds.php:390"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_feed_save\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Save feed",
      "description": "Stores a marketplace feed's template, filters and schedule, creating it if it is new, so the next run exports the selection you just defined.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "overwrites a live feed definition and its schedule"
    },
    {
      "id": "marketplace_feeds.feed_get_variations",
      "ajax": "aieo_dmm_feed_get_variations",
      "page": "marketplace_feeds",
      "handler": "includes/dmm/modules/class-aieo-dmm-marketplace-feeds.php:35",
      "callers": [
        "assets/pages/dmm/marketplace-feeds.php:930"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-pm-vars",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Show variations",
      "description": "Lists a variable product's variations so a feed rule can name one size or colour rather than the whole product.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "media_cleanup.media_purge",
      "ajax": "aieo_media_purge",
      "page": "media_cleanup",
      "handler": "includes/dmm/modules/class-aieo-dmm-media-cleanup.php:58",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-media-cleanup.php:881"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Delete for good",
      "description": "Permanently deletes the quarantined pictures. There is no way back once this is done.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "irreversible; files are gone from the server"
    },
    {
      "id": "media_cleanup.media_scan_step",
      "ajax": "aieo_media_scan_step",
      "page": "media_cleanup",
      "handler": "includes/dmm/modules/class-aieo-dmm-media-cleanup.php:56",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-media-cleanup.php:848"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Keep scanning",
      "description": "Carries the scan on from where it stopped, so a large library can be checked without timing out.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "looks only; deletes nothing"
    },
    {
      "id": "media_cleanup.media_quarantine",
      "ajax": "aieo_media_quarantine",
      "page": "media_cleanup",
      "handler": "includes/dmm/modules/class-aieo-dmm-media-cleanup.php:57",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-media-cleanup.php:866"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Move to quarantine",
      "description": "Moves the pictures found to a holding area so you can check the shop still looks right before anything is lost.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "files move out of the library; the shop breaks visibly if something was still in use"
    },
    {
      "id": "media_cleanup.media_scan_start",
      "ajax": "aieo_media_scan_start",
      "page": "media_cleanup",
      "handler": "includes/dmm/modules/class-aieo-dmm-media-cleanup.php:55",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-media-cleanup.php:855"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Start the scan",
      "description": "Begins looking through your media library for pictures nothing in the shop uses any more.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "looks only; deletes nothing"
    },
    {
      "id": "min_order.save",
      "ajax": "aieo_dmm_min_order_save",
      "page": "min_order",
      "handler": "includes/dmm/modules/class-aieo-dmm-min-order.php:36",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-min-order.php:165"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-mo-form",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets the smallest order you will accept and the message shown when a basket is under it.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "baskets below the amount can no longer check out",
      "context": "minimum order"
    },
    {
      "id": "my_settings.save_my_settings",
      "ajax": "aieo_dmm_save_my_settings",
      "page": "my_settings",
      "handler": "includes/dmm/modules/class-aieo-dmm-my-settings.php:37",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-my-settings.php:149"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-my-settings-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save my settings",
      "description": "Stores your own preferences, such as the screen you land on. It affects nobody else.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "affects your own account only"
    },
    {
      "id": "navigator.regenerate",
      "ajax": "aieo_dmm_navigator_regenerate",
      "page": "navigator",
      "handler": "includes/dmm/modules/class-aieo-dmm-navigator.php:51",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-navigator.php:3058"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Rebuild the index",
      "description": "Rebuilds the list the quick navigator searches, which is the fix when a new screen cannot be found.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "rebuilds a search list; nothing else changes"
    },
    {
      "id": "navigator.save_settings",
      "ajax": "aieo_dmm_navigator_save_settings",
      "page": "navigator",
      "handler": "includes/dmm/modules/class-aieo-dmm-navigator.php:50",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-navigator.php:2959",
        "includes/dmm/modules/class-aieo-dmm-navigator.php:2970",
        "includes/dmm/modules/class-aieo-dmm-navigator.php:2993"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets how the quick navigator behaves, including its keyboard shortcut.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes the admin for everyone on the site",
      "context": "quick navigator"
    },
    {
      "id": "newsletter_signup.save",
      "ajax": "aieo_newsletter_signup_save",
      "page": "newsletter_signup",
      "handler": "includes/dmm/modules/class-aieo-dmm-newsletter-signup.php:40",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-newsletter-signup.php:663"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-nl-",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets the newsletter sign-up box wording and where it appears in the shop.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what shoppers see on the storefront",
      "context": "newsletter box"
    },
    {
      "id": "newsletter_signup.newsletter_subscribe",
      "ajax": "aieo_newsletter_subscribe",
      "page": "newsletter_signup",
      "handler": "includes/dmm/modules/class-aieo-dmm-newsletter-signup.php:42",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-newsletter-signup.php:178",
        "includes/dmm/modules/class-aieo-dmm-newsletter-signup.php:508",
        "includes/dmm/modules/class-aieo-dmm-newsletter-signup.php:611"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": true,
      "declared_at": "",
      "selector": ".aieo-nl__msg",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Subscribe",
      "description": "The shopper own control: adds their address to your newsletter list.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "adds a real person to a marketing list"
    },
    {
      "id": "offer_effectiveness.export",
      "ajax": "aieo_dmm_offer_effectiveness_export",
      "page": "offer_effectiveness",
      "handler": "includes/dmm/modules/class-aieo-dmm-offer-effectiveness.php:46",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-offer-effectiveness.php:266"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Export",
      "description": "Downloads what each offer earned or cost you as a spreadsheet, so the figures can go into a report or a meeting.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; produces a file",
      "context": "offer results"
    },
    {
      "id": "offer_effectiveness.offer_effectiveness",
      "ajax": "aieo_dmm_offer_effectiveness",
      "page": "offer_effectiveness",
      "handler": "includes/dmm/modules/class-aieo-dmm-offer-effectiveness.php:45",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-offer-effectiveness.php:180"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Offer results",
      "description": "Shows what each offer actually earned or cost you, rather than only how many were used.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "option_groups.og_delete",
      "ajax": "aieo_og_delete",
      "page": "option_groups",
      "handler": "includes/dmm/modules/class-aieo-dmm-option-groups.php:58",
      "callers": [
        "assets/js/aieo-option-groups-admin.js:149",
        "assets/js/aieo-option-groups-admin.js:228",
        "assets/js/aieo-option-groups-admin.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-og-del",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Delete",
      "description": "Removes a group or one of its choices. Products relying on it lose that selection.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "irreversible; products using it stop offering the choice",
      "context": "option group"
    },
    {
      "id": "option_groups.og_get_group",
      "ajax": "aieo_og_get_group",
      "page": "option_groups",
      "handler": "includes/dmm/modules/class-aieo-dmm-option-groups.php:59",
      "callers": [
        "assets/js/aieo-option-groups-admin.js:200",
        "assets/js/aieo-option-groups-admin.js:51",
        "assets/js/aieo-option-groups-admin.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-og-rule-woption",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Open group",
      "description": "Loads one set of choices so you can change its options or its name.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "option_groups.og_get_rules",
      "ajax": "aieo_og_get_rules",
      "page": "option_groups",
      "handler": "includes/dmm/modules/class-aieo-dmm-option-groups.php:60",
      "callers": [
        "assets/js/aieo-option-groups-admin.js:172",
        "assets/js/aieo-option-groups-admin.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-og-root",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Rule list",
      "description": "Loads the rules saying where each set of choices appears, so you can see what is attached to what.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "option_groups.og_save_group",
      "ajax": "aieo_og_save_group",
      "page": "option_groups",
      "handler": "includes/dmm/modules/class-aieo-dmm-option-groups.php:55",
      "callers": [
        "assets/js/aieo-option-groups-admin.js:74",
        "assets/js/aieo-option-groups-admin.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-og-name",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save group",
      "description": "Stores a set of choices shoppers pick from, such as sizes or extras, ready to attach to products.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what shoppers are offered on any product already using it"
    },
    {
      "id": "option_groups.og_save_option",
      "ajax": "aieo_og_save_option",
      "page": "option_groups",
      "handler": "includes/dmm/modules/class-aieo-dmm-option-groups.php:56",
      "callers": [
        "assets/js/aieo-option-groups-admin.js:131",
        "assets/js/aieo-option-groups-admin.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-og-opt-premium",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save option",
      "description": "Stores one individual choice inside a group, including anything it adds to the price.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what shoppers can pick and what it costs them"
    },
    {
      "id": "option_groups.og_save_rule",
      "ajax": "aieo_og_save_rule",
      "page": "option_groups",
      "handler": "includes/dmm/modules/class-aieo-dmm-option-groups.php:57",
      "callers": [
        "assets/js/aieo-option-groups-admin.js:213",
        "assets/js/aieo-option-groups-admin.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-og-rule-woption",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save rule",
      "description": "Decides which products a set of choices appears on, so you attach it once rather than product by product.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes which products show the choices"
    },
    {
      "id": "orders_export.process",
      "ajax": "aieo_dmm_orders_export_process",
      "page": "orders_export",
      "handler": "includes/dmm/modules/class-aieo-dmm-orders-export.php:60",
      "callers": [
        "assets/js/dmm.js:271",
        "assets/js/dmm.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-flash",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Keep exporting",
      "description": "Carries the order export on from where it stopped until the whole range is written out.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "long-running; the finished file contains real customer details"
    },
    {
      "id": "orders_export.save_fields",
      "ajax": "aieo_dmm_orders_export_save_fields",
      "page": "orders_export",
      "handler": "includes/dmm/modules/class-aieo-dmm-orders-export.php:58",
      "callers": [
        "assets/pages/dmm/orders-export.php:214"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_orders_export_save_fields\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Save columns",
      "description": "Chooses which columns the order export includes, so you send on only what is needed.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what personal data future exports contain"
    },
    {
      "id": "orders_export.start",
      "ajax": "aieo_dmm_orders_export_start",
      "page": "orders_export",
      "handler": "includes/dmm/modules/class-aieo-dmm-orders-export.php:59",
      "callers": [
        "assets/js/dmm.js:271",
        "assets/js/dmm.min.js:1",
        "assets/pages/dmm/orders-export.php:146"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_orders_export_start\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Start export",
      "description": "Begins building an order export with the columns you chose, so a large date range does not time out.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "builds a file containing real customer and order details"
    },
    {
      "id": "payment_country_block.payment_country_save",
      "ajax": "aieo_dmm_payment_country_save",
      "page": "payment_country_block",
      "handler": "includes/dmm/class-aieo-dmm-payment-country-block.php:48",
      "callers": [
        "includes/dmm/class-aieo-dmm-payment-country-block.php:162"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-pc-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Chooses which payment methods are offered in which countries.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "a mistake here stops real shoppers from being able to pay",
      "context": "payment by country"
    },
    {
      "id": "payment_gating.save",
      "ajax": "aieo_dmm_payment_gating_save",
      "page": "payment_gating",
      "handler": "includes/dmm/modules/class-aieo-dmm-payment-gating.php:115",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-payment-gating.php:405"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-pg-locs",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets the rules that hide a payment method, such as by basket value or customer group.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "a mistake here stops real shoppers from being able to pay",
      "context": "payment rules"
    },
    {
      "id": "payment_logos.save",
      "ajax": "aieo_dmm_payment_logos_save",
      "page": "payment_logos",
      "handler": "includes/dmm/modules/class-aieo-dmm-payment-logos.php:31",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-payment-logos.php:242"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-pl-form",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Chooses which card and payment logos are shown, so shoppers can see you take what they use.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what shoppers see on the storefront",
      "context": "payment logos"
    },
    {
      "id": "phone_orders.save",
      "ajax": "aieo_dmm_phone_orders_save",
      "page": "phone_orders",
      "handler": "includes/dmm/modules/class-aieo-dmm-phone-orders.php:28",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-phone-orders.php:153"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-po-form",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets how orders taken over the phone are handled, including who may place them.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes who can create orders on a customer behalf"
    },
    {
      "id": "pnl_settings.save",
      "ajax": "aieo_dmm_pnl_settings_save",
      "page": "pnl_settings",
      "handler": "includes/dmm/modules/class-aieo-dmm-pnl-settings.php:41",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-pnl-settings.php:89"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-pnl-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets the fixed monthly running costs, which are shared across the period when profit is worked out.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes every profit figure in the reports",
      "context": "profit and loss"
    },
    {
      "id": "price_export.process",
      "ajax": "aieo_dmm_price_export_process",
      "page": "price_export",
      "handler": "includes/dmm/modules/class-aieo-dmm-price-export.php:23",
      "callers": [
        "assets/js/dmm.js:273",
        "assets/js/dmm.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-flash",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Keep exporting",
      "description": "Carries the price list on from where it stopped until every product is written out.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; produces a file"
    },
    {
      "id": "price_export.start",
      "ajax": "aieo_dmm_price_export_start",
      "page": "price_export",
      "handler": "includes/dmm/modules/class-aieo-dmm-price-export.php:22",
      "callers": [
        "assets/js/dmm.js:273",
        "assets/js/dmm.min.js:1",
        "assets/pages/dmm/price-export.php:52"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_price_export_start\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Start export",
      "description": "Begins building a price list of your catalogue.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; produces a file"
    },
    {
      "id": "price_history.orderscan",
      "ajax": "aieo_price_history_orderscan",
      "page": "price_history",
      "handler": "includes/dmm/modules/class-aieo-dmm-price-history.php:65",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-price-history.php:680"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ph-scan-result",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Check against orders",
      "description": "Reads past orders to see what customers were actually charged, and reports where that disagrees with the recorded history.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; reports differences without changing anything"
    },
    {
      "id": "price_history.ordersave",
      "ajax": "aieo_price_history_ordersave",
      "page": "price_history",
      "handler": "includes/dmm/modules/class-aieo-dmm-price-history.php:66",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-price-history.php:712"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ph-scan-result",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Correct from orders",
      "description": "Rewrites the recorded price history to match what customers were actually charged, which the check above found.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "overwrites price history in bulk; it feeds a legally required disclosure"
    },
    {
      "id": "price_history.backfill",
      "ajax": "aieo_price_history_backfill",
      "page": "price_history",
      "handler": "includes/dmm/modules/class-aieo-dmm-price-history.php:64",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-price-history.php:656",
        "includes/dmm/modules/class-aieo-dmm-price-history.php:668"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ph-snapshot",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Fill in past prices",
      "description": "Reconstructs what each product used to cost from the records already held, so the lowest-price line has something to say.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "long-running; writes price history for the whole catalogue"
    },
    {
      "id": "price_history.save",
      "ajax": "aieo_price_history_save",
      "page": "price_history",
      "handler": "includes/dmm/modules/class-aieo-dmm-price-history.php:63",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-price-history.php:654",
        "includes/dmm/modules/class-aieo-dmm-price-history.php:661"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ph-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets how price history is kept, which is what the thirty-day lowest-price line is calculated from.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "affects a legally required price disclosure",
      "context": "price history"
    },
    {
      "id": "problematic_variations.mav_save",
      "ajax": "aieo_dmm_mav_save",
      "page": "problematic_variations",
      "handler": "includes/dmm/modules/class-aieo-dmm-problematic-variations.php:55",
      "callers": [
        "assets/pages/dmm/problematic-variations.php:91"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-mav-block",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets what counts as a problem variation, such as one with no price or no stock, so the list shows what matters.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "changes which products are flagged on this screen only",
      "context": "problem variations"
    },
    {
      "id": "product_archive_card.archive_card_save",
      "ajax": "aieo_dmm_archive_card_save",
      "page": "product_archive_card",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-archive-card.php:48",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-archive-card.php:674"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets how product tiles look on category and search pages specifically, where the layout can differ from elsewhere.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what shoppers see on the storefront",
      "context": "archive cards"
    },
    {
      "id": "product_card.save",
      "ajax": "aieo_dmm_product_card_save",
      "page": "product_card",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-card.php:30",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-card.php:362"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-product-card-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets what appears on a product tile in listings, such as the price, rating and buy button.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what shoppers see on the storefront",
      "context": "product cards"
    },
    {
      "id": "product_categories.save",
      "ajax": "aieo_dmm_product_categories_save",
      "page": "product_categories",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-categories.php:40",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-categories.php:240",
        "includes/dmm/modules/class-aieo-dmm-product-categories.php:251"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_product_categories_save\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets how the category list is shown to shoppers, including how deep it goes and what it displays.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what shoppers see on the storefront",
      "context": "category display"
    },
    {
      "id": "product_display.save_order",
      "ajax": "aieo_dmm_product_display_save_order",
      "page": "product_display",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-display.php:95",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-display.php:1412",
        "includes/dmm/modules/class-aieo-dmm-product-display.php:1610",
        "includes/dmm/modules/class-aieo-dmm-product-display.php:1659"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-pd-order-reset",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save layout order",
      "description": "Saves the order you dragged the product page sections into, which is the order shoppers meet them in.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes every product page in the shop"
    },
    {
      "id": "product_display.recommendations_save_order",
      "ajax": "aieo_dmm_recommendations_save_order",
      "page": "product_display",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-display.php:101",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-display.php:1727"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-reco-order-item",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save recommendation order",
      "description": "Saves which recommendation strips appear on a product page and in what order.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what is suggested to every shopper"
    },
    {
      "id": "product_display.save_tab_order",
      "ajax": "aieo_dmm_save_tab_order",
      "page": "product_display",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-display.php:108",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-display.php:1505"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-tab-order-item",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save tab order",
      "description": "Saves the order of the tabs under a product, such as description and delivery, as shoppers will see them.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes every product page in the shop"
    },
    {
      "id": "product_display.toggle",
      "ajax": "aieo_dmm_product_display_toggle",
      "page": "product_display",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-display.php:94",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-display.php:1586"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-aieo-pd-toggle]",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Show or hide a section",
      "description": "Turns one part of the product page on or off for every product at once.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes every product page in the shop"
    },
    {
      "id": "product_exchanger.exch_build_feed",
      "ajax": "aieo_exch_build_feed",
      "page": "product_exchanger",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-exchanger.php:55",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-exchanger.php:458"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-aieo-exch-build]",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Build now",
      "description": "Rebuilds the feed's sharded JSON straight away instead of waiting for its schedule, so destination sites see today's catalogue on their next pull.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "writes feed files and can run for a while on a large catalogue, but changes no product data"
    },
    {
      "id": "product_exchanger.exch_delete_feed",
      "ajax": "aieo_exch_delete_feed",
      "page": "product_exchanger",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-exchanger.php:54",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-exchanger.php:512"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-aieo-exch-delete-feed]",
      "selector_source": "derived",
      "variants": [],
      "confirm": "Delete this feed? Shops receiving it lose access until you pair them again.",
      "label": "Delete",
      "description": "Removes an outbound feed permanently, which cuts off every destination site that was pulling from it until you pair them with a different feed.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "irreversible; paired destination sites lose access immediately",
      "context": "feed"
    },
    {
      "id": "product_exchanger.exch_delete_import",
      "ajax": "aieo_exch_delete_import",
      "page": "product_exchanger",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-exchanger.php:59",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-exchanger.php:585"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-aieo-exch-delete-import]",
      "selector_source": "derived",
      "variants": [],
      "confirm": "Delete this import job?",
      "label": "Delete",
      "description": "Removes an inbound import job and its schedule, leaving behind any products it has already created in this shop.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "irreversible; the schedule stops but imported products remain",
      "context": "import job"
    },
    {
      "id": "product_exchanger.exch_notify_targets",
      "ajax": "aieo_exch_notify_targets",
      "page": "product_exchanger",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-exchanger.php:57",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-exchanger.php:499"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-aieo-exch-notify]",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Notify targets",
      "description": "Pings the sister sites paired to this feed so they pull the newest build now rather than at their own next scheduled run.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "triggers an immediate import on every paired destination site"
    },
    {
      "id": "product_exchanger.exch_rotate_token",
      "ajax": "aieo_exch_rotate_token",
      "page": "product_exchanger",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-exchanger.php:56",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-exchanger.php:474"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-aieo-exch-rotate]",
      "selector_source": "derived",
      "variants": [],
      "confirm": "Issue a new access key? Anything still using the old one stops working until you pair it again.",
      "label": "Rotate token",
      "description": "Issues a new bearer token for the feed, which stops every destination configured with the old one until you re-pair each of them by hand.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "breaks existing destination pairings until each is updated with the new token"
    },
    {
      "id": "product_exchanger.exch_run_import",
      "ajax": "aieo_exch_run_import",
      "page": "product_exchanger",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-exchanger.php:60",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-exchanger.php:571"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-aieo-exch-run]",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Run now",
      "description": "Pulls the whole source feed immediately and creates or updates products in this shop according to the job's matching key and mode.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "writes real products and stock into the live catalogue"
    },
    {
      "id": "product_exchanger.exch_save_feed",
      "ajax": "aieo_exch_save_feed",
      "page": "product_exchanger",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-exchanger.php:53",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-exchanger.php:440"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-exch-feed-save",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save feed",
      "description": "Stores an outbound feed's slug, schedule, shard size and the product rules that decide what goes into it, creating the feed if it is new.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "overwrites a live feed definition, so the next scheduled build publishes the new selection"
    },
    {
      "id": "product_exchanger.exch_save_import",
      "ajax": "aieo_exch_save_import",
      "page": "product_exchanger",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-exchanger.php:58",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-exchanger.php:553"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-exch-import-save",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save import",
      "description": "Stores an inbound job's source URL, token, matching key, create-or-update mode and schedule, creating the job if it is new.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "overwrites a live import definition, so the next scheduled run uses the new source and mode"
    },
    {
      "id": "product_labels.save",
      "ajax": "aieo_dmm_product_labels_save",
      "page": "product_labels",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-labels.php:31",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-labels.php:343"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-pll-form",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets the wording of the little labels around a product, such as stock status and delivery time.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what shoppers see on the storefront",
      "context": "product labels"
    },
    {
      "id": "product_meta.save",
      "ajax": "aieo_dmm_product_meta_save",
      "page": "product_meta",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-meta.php:45",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-meta.php:387"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-pm-form",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Chooses which product details are shown under the price, such as code, brand and category.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what shoppers see on the storefront",
      "context": "product details"
    },
    {
      "id": "product_needs.needs_create_term",
      "ajax": "aieo_dmm_needs_create_term",
      "page": "product_needs",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-needs.php:39",
      "callers": [
        "assets/pages/dmm/product-needs.php:372"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Add a need",
      "description": "Creates a new shopper need, so products can be filed under it and shoppers can browse by it.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "adds a category shoppers can see once products are attached to it"
    },
    {
      "id": "product_needs.needs_load_product",
      "ajax": "aieo_dmm_needs_load_product",
      "page": "product_needs",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-needs.php:35",
      "callers": [
        "assets/js/dmm.js:606",
        "assets/js/dmm.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-flash",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Open product",
      "description": "Loads one product needs so you can see what it is already filed under before changing anything.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "product_needs.needs_search_products",
      "ajax": "aieo_dmm_needs_search_products",
      "page": "product_needs",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-needs.php:37",
      "callers": [
        "assets/js/dmm.js:117",
        "assets/js/dmm.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-dmm-needs-product-search",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Product search",
      "description": "Finds products by name while you are assigning needs, so you pick from a list rather than typing codes.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only",
      "context": "needs"
    },
    {
      "id": "product_needs.needs_save_display",
      "ajax": "aieo_dmm_needs_save_display",
      "page": "product_needs",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-needs.php:38",
      "callers": [
        "assets/pages/dmm/product-needs-display.php:206"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_needs_save_display\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Save display settings",
      "description": "Sets where and how the need pills appear on the storefront, which changes what every shopper sees.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes the storefront for everyone"
    },
    {
      "id": "product_needs.needs_save",
      "ajax": "aieo_dmm_needs_save",
      "page": "product_needs",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-needs.php:36",
      "callers": [
        "assets/js/dmm.js:632",
        "assets/js/dmm.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-needs-product",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save needs",
      "description": "Records which shopper needs a product answers, which is what puts it in front of people browsing by need.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes where the product appears on the storefront"
    },
    {
      "id": "product_orders_analytics.analytics_predictor_step",
      "ajax": "aieo_analytics_predictor_step",
      "page": "product_orders_analytics",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-orders-analytics.php:166",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-orders-analytics.php:1211",
        "includes/dmm/modules/class-aieo-dmm-product-orders-analytics.php:1216",
        "includes/dmm/modules/class-aieo-dmm-product-orders-analytics.php:1223"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Rebuild the sales forecast",
      "description": "Works through the sales forecast a piece at a time, so a shop with years of orders can rebuild it without timing out.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "long-running and heavy; refuses to start if it is already running"
    },
    {
      "id": "product_orders_analytics.analytics_reinstall",
      "ajax": "aieo_analytics_reinstall",
      "page": "product_orders_analytics",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-orders-analytics.php:169",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-orders-analytics.php:1258"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-aj-reinstall",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Reinstall report engine",
      "description": "Rebuilds the routines the reports are calculated with, which is the fix when a report starts failing after an upgrade.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "replaces the calculation routines; existing figures are untouched"
    },
    {
      "id": "product_orders_analytics.analytics_run_all",
      "ajax": "aieo_analytics_run_all",
      "page": "product_orders_analytics",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-orders-analytics.php:167",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-orders-analytics.php:1249"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-aj-runall",
      "selector_source": "derived",
      "variants": [],
      "confirm": "Run every analytics job now, in order? This can take several minutes.",
      "label": "Run all",
      "description": "Rebuilds every report in turn and reports how many succeeded, which is the thing to press after a big data change.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "long-running and heavy; best done outside busy hours"
    },
    {
      "id": "product_orders_analytics.analytics_run_now",
      "ajax": "aieo_analytics_run_now",
      "page": "product_orders_analytics",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-orders-analytics.php:165",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-orders-analytics.php:1238"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-aj-run",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Run now",
      "description": "Rebuilds one report straight away instead of waiting for its usual time, and tells you how many rows it did and how long it took.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "can run for minutes on a large shop and works the database hard",
      "context": "one report"
    },
    {
      "id": "product_orders_analytics.analytics_save_pages",
      "ajax": "aieo_analytics_save_pages",
      "page": "product_orders_analytics",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-orders-analytics.php:168",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-tools.php:414",
        "includes/dmm/modules/class-aieo-dmm-tools.php:512"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-aj-pages-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save pages",
      "description": "Lists the pages that get the enhanced report tables, so the heavier layout is only loaded where you actually want it.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "changes which pages load the richer table layout"
    },
    {
      "id": "product_orders_analytics.analytics_save_schedule",
      "ajax": "aieo_analytics_save_schedule",
      "page": "product_orders_analytics",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-orders-analytics.php:164",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-orders-analytics.php:1199"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-aj-staleness",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save schedule",
      "description": "Sets how often each report rebuilds itself overnight, so you trade how fresh the figures are against how hard the shop works.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes when the overnight work happens"
    },
    {
      "id": "product_video.save",
      "ajax": "aieo_dmm_product_video_save",
      "page": "product_video",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-video.php:26",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-video.php:291"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-pv-form",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets how product videos are shown in the gallery and whether they play on their own.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what shoppers see on the storefront",
      "context": "product video"
    },
    {
      "id": "promo_surfaces.promo_delete_slot",
      "ajax": "aieo_promo_delete_slot",
      "page": "promo_surfaces",
      "handler": "includes/dmm/modules/class-aieo-dmm-promo-surfaces.php:84",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-promo-surfaces.php:1452"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-promo-slot-row",
      "selector_source": "derived",
      "variants": [],
      "confirm": "Delete this slot?",
      "label": "Delete promo",
      "description": "Removes a promotion, so it stops appearing wherever it was placed.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "disappears from the storefront at once"
    },
    {
      "id": "promo_surfaces.promo_reorder",
      "ajax": "aieo_promo_reorder",
      "page": "promo_surfaces",
      "handler": "includes/dmm/modules/class-aieo-dmm-promo-surfaces.php:85",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-promo-surfaces.php:1320"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-promo-slots-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Reorder promos",
      "description": "Saves the order you dragged the promotions into, which is the order shoppers see them in.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes the storefront order immediately"
    },
    {
      "id": "promo_surfaces.promo_save_slot",
      "ajax": "aieo_promo_save_slot",
      "page": "promo_surfaces",
      "handler": "includes/dmm/modules/class-aieo-dmm-promo-surfaces.php:83",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-promo-surfaces.php:1407"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-promo-slots-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save promo",
      "description": "Stores one promotion with its picture, link and dates. It appears in its area for as long as it is running.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "goes live on the storefront within its dates"
    },
    {
      "id": "promo_surfaces.promo_save_surface",
      "ajax": "aieo_promo_save_surface",
      "page": "promo_surfaces",
      "handler": "includes/dmm/modules/class-aieo-dmm-promo-surfaces.php:82",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-promo-surfaces.php:1270"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-promo-surface-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save promo area",
      "description": "Stores a place in the shop where promotions can appear, such as a banner strip or a spot on the home page.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what shoppers see once slots are placed in it"
    },
    {
      "id": "proposals.accept",
      "ajax": "aieo_dmm_proposals_accept",
      "page": "proposals",
      "handler": "includes/dmm/modules/class-aieo-dmm-proposals.php:39",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-proposals.php:217"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-prop-accept",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Accept",
      "description": "Turns a suggested offer into a real one, which starts changing what shoppers pay as soon as it runs.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "creates a live offer that costs you margin",
      "context": "proposal"
    },
    {
      "id": "proposals.dismiss",
      "ajax": "aieo_dmm_proposals_dismiss",
      "page": "proposals",
      "handler": "includes/dmm/modules/class-aieo-dmm-proposals.php:40",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-proposals.php:225"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-prop-dismiss",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Dismiss",
      "description": "Sets a suggestion aside so it stops being offered, without ruling out the same idea appearing again later.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "hides one suggestion from your list",
      "context": "proposal"
    },
    {
      "id": "proposals.narrate_toggle",
      "ajax": "aieo_dmm_proposals_narrate_toggle",
      "page": "proposals",
      "handler": "includes/dmm/modules/class-aieo-dmm-proposals.php:41",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-proposals.php:198"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-prop-narrate",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Explain in words",
      "description": "Turns the plain-English explanation of each suggestion on or off, for when the numbers alone are enough.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "changes how this screen reads; nothing else"
    },
    {
      "id": "proposals.scan",
      "ajax": "aieo_dmm_proposals_scan",
      "page": "proposals",
      "handler": "includes/dmm/modules/class-aieo-dmm-proposals.php:38",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-proposals.php:206"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-prop-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Look for proposals",
      "description": "Reviews your sales and suggests offers worth running, with the expected effect of each one.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; suggests without changing prices"
    },
    {
      "id": "ratings.save_appearance",
      "ajax": "aieo_dmm_ratings_save_appearance",
      "page": "ratings",
      "handler": "includes/dmm/modules/class-aieo-dmm-ratings.php:26",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-ratings-display.php:10"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Save appearance",
      "description": "Sets the size and colours of the rating stars wherever they appear.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what shoppers see on the storefront",
      "context": "ratings"
    },
    {
      "id": "ratings.save_settings",
      "ajax": "aieo_dmm_ratings_save_settings",
      "page": "ratings",
      "handler": "includes/dmm/modules/class-aieo-dmm-ratings.php:25",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-ratings.php:229",
        "includes/dmm/modules/class-aieo-dmm-ratings.php:370"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_ratings_save_settings\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets how star ratings work, including whether shoppers must sign in and where the stars appear.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes how and whether shoppers can rate products",
      "context": "ratings"
    },
    {
      "id": "related_tab.related_search",
      "ajax": "aieo_dmm_related_search",
      "page": "related_tab",
      "handler": "includes/dmm/class-aieo-dmm-related-tab.php:55",
      "callers": [
        "assets/js/aieo-dmm-related-tab.js:78",
        "assets/js/aieo-dmm-related-tab.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-tr-chip",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Search products",
      "description": "Finds products by name while you are choosing which ones to show as related.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "roi_wizard.roi_compute",
      "ajax": "aieo_roi_compute",
      "page": "roi_wizard",
      "handler": "includes/dmm/modules/class-aieo-dmm-roi-wizard.php:189",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-roi-wizard.php:997"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Calculate",
      "description": "Works out revenue, cost and return for the dimensions and date range you chose, charging a prorated share of fixed operating cost.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; a wide range over a large order history can take a while"
    },
    {
      "id": "roi_wizard.roi_cost_delete",
      "ajax": "aieo_roi_cost_delete",
      "page": "roi_wizard",
      "handler": "includes/dmm/modules/class-aieo-dmm-roi-wizard.php:191",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-roi-wizard.php:1030"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Delete",
      "description": "Removes one recorded cost, after which the returns for that period are calculated as though the money was never spent.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "irreversible; every report over that period changes",
      "context": "cost row"
    },
    {
      "id": "roi_wizard.roi_type_search",
      "ajax": "aieo_roi_type_search",
      "page": "roi_wizard",
      "handler": "includes/dmm/modules/class-aieo-dmm-roi-wizard.php:188",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-roi-wizard.php:848"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Dimension search",
      "description": "Finds which kinds of thing you can measure a return on, such as channel, campaign or brand, as you type.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "roi_wizard.roi_cost_export",
      "ajax": "aieo_roi_cost_export",
      "page": "roi_wizard",
      "handler": "includes/dmm/modules/class-aieo-dmm-roi-wizard.php:194",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-roi-wizard.php:1054"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Export costs",
      "description": "Downloads the recorded costs for the dimension and window on screen, for checking against an invoice.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; produces a file"
    },
    {
      "id": "roi_wizard.roi_cost_import",
      "ajax": "aieo_roi_cost_import",
      "page": "roi_wizard",
      "handler": "includes/dmm/modules/class-aieo-dmm-roi-wizard.php:192",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-roi-wizard.php:1051"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Import costs",
      "description": "Reads pasted CSV lines and records each as a cost, which is how a month of ad spend gets in without typing it row by row.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "adds cost rows in bulk, changing every report over the periods covered"
    },
    {
      "id": "roi_wizard.roi_cost_list",
      "ajax": "aieo_roi_cost_list",
      "page": "roi_wizard",
      "handler": "includes/dmm/modules/class-aieo-dmm-roi-wizard.php:193",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-roi-wizard.php:1034"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "List costs",
      "description": "Shows the costs already recorded for the dimension and window you picked, so you can check before adding another.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "roi_wizard.roi_cost_save",
      "ajax": "aieo_roi_cost_save",
      "page": "roi_wizard",
      "handler": "includes/dmm/modules/class-aieo-dmm-roi-wizard.php:190",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-roi-wizard.php:1048"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Save cost",
      "description": "Records what one channel, campaign or brand cost you over a date range, which is the figure every return calculation divides by.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes the cost basis of every report over that period"
    },
    {
      "id": "roi_wizard.roi_value_search",
      "ajax": "aieo_roi_value_search",
      "page": "roi_wizard",
      "handler": "includes/dmm/modules/class-aieo-dmm-roi-wizard.php:187",
      "callers": [
        "assets/js/aieo-value-picker.js:11",
        "includes/dmm/modules/class-aieo-dmm-roi-wizard.php:857",
        "includes/dmm/modules/class-aieo-dmm-roi-wizard.php:894"
      ],
      "caller_kinds": [
        "js",
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Value search",
      "description": "Finds the actual values inside a dimension, such as the individual campaign names, so a report can be narrowed to one of them.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "role_pricing.process_batch",
      "ajax": "aieo_dmm_role_pricing_process_batch",
      "page": "role_pricing",
      "handler": "includes/dmm/modules/class-aieo-dmm-role-pricing.php:36",
      "callers": [
        "assets/js/dmm.js:269",
        "assets/js/dmm.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-flash",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Apply price list",
      "description": "Works through the uploaded spreadsheet a chunk at a time, writing each special price onto the product it belongs to.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes real prices for real customers; there is no undo"
    },
    {
      "id": "role_pricing.download_template",
      "ajax": "aieo_dmm_role_pricing_download_template",
      "page": "role_pricing",
      "handler": "includes/dmm/modules/class-aieo-dmm-role-pricing.php:38",
      "callers": [
        "assets/js/dmm.js:366",
        "assets/js/dmm.min.js:1",
        "assets/pages/dmm/role-pricing.php:424"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_role_pricing_download_template\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Download template",
      "description": "Gives you an empty spreadsheet with the right columns, so an upload is not rejected for having the wrong shape.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; produces a file"
    },
    {
      "id": "role_pricing.gf_export",
      "ajax": "aieo_dmm_role_pricing_gf_export",
      "page": "role_pricing",
      "handler": "includes/dmm/modules/class-aieo-dmm-role-pricing.php:41",
      "callers": [
        "assets/js/dmm.js:404",
        "assets/js/dmm.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-dmm-gf-export-forms",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Export for the price form",
      "description": "Downloads the special prices in the layout the quote form expects, so the two stay in step.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; produces a file"
    },
    {
      "id": "role_pricing.export",
      "ajax": "aieo_dmm_role_pricing_export",
      "page": "role_pricing",
      "handler": "includes/dmm/modules/class-aieo-dmm-role-pricing.php:37",
      "callers": [
        "assets/js/dmm.js:390",
        "assets/js/dmm.min.js:1",
        "assets/pages/dmm/role-pricing.php:427"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_role_pricing_export\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Export prices",
      "description": "Downloads every special price you have set as a spreadsheet, for checking or for editing and sending back.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; produces a file"
    },
    {
      "id": "role_pricing.save_settings",
      "ajax": "aieo_dmm_role_pricing_save_settings",
      "page": "role_pricing",
      "handler": "includes/dmm/modules/class-aieo-dmm-role-pricing.php:34",
      "callers": [
        "assets/pages/dmm/role-pricing.php:397"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_role_pricing_save_settings\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Chooses which customer groups get their own prices, which is what switches special pricing on for them.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what whole groups of customers pay",
      "context": "role pricing"
    },
    {
      "id": "role_pricing.upload",
      "ajax": "aieo_dmm_role_pricing_upload",
      "page": "role_pricing",
      "handler": "includes/dmm/modules/class-aieo-dmm-role-pricing.php:35",
      "callers": [
        "assets/js/dmm.js:269",
        "assets/js/dmm.min.js:1",
        "assets/pages/dmm/role-pricing.php:418"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_role_pricing_upload\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Upload price list",
      "description": "Accepts a spreadsheet of special prices per customer group and prepares it, without changing any price yet.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "stores an uploaded file ready to be applied"
    },
    {
      "id": "saved_abandoned_carts.carts_capture_now",
      "ajax": "aieo_carts_capture_now",
      "page": "saved_abandoned_carts",
      "handler": "includes/dmm/modules/class-aieo-dmm-saved-abandoned-carts.php:84",
      "callers": [
        "assets/pages/dmm/saved-abandoned-carts.php:286"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-c-capture",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Capture now",
      "description": "Records the baskets that are currently abandoned, rather than waiting for the hourly check.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "records baskets that already exist; nothing is sent to anyone"
    },
    {
      "id": "saved_abandoned_carts.carts_export",
      "ajax": "aieo_carts_export",
      "page": "saved_abandoned_carts",
      "handler": "includes/dmm/modules/class-aieo-dmm-saved-abandoned-carts.php:83",
      "callers": [
        "assets/pages/dmm/saved-abandoned-carts.php:233"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Export",
      "description": "Downloads the saved and abandoned baskets as a spreadsheet, with what was in each one.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; the file contains customer details, so treat it accordingly",
      "context": "carts"
    },
    {
      "id": "saved_abandoned_carts.carts_save_settings",
      "ajax": "aieo_carts_save_settings",
      "page": "saved_abandoned_carts",
      "handler": "includes/dmm/modules/class-aieo-dmm-saved-abandoned-carts.php:82",
      "callers": [
        "assets/pages/dmm/saved-abandoned-carts.php:306"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-c-capture-enabled",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets how long saved baskets are kept and when a basket counts as abandoned.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "shortening the window discards saved baskets on the next tidy-up",
      "context": "carts"
    },
    {
      "id": "seo_backlinks.seo_disavow_action",
      "ajax": "aieo_seo_disavow_action",
      "page": "seo_backlinks",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-backlinks.php:30",
      "callers": [
        "assets/pages/dmm/seo/backlinks.php:137",
        "assets/pages/dmm/seo/backlinks.php:146"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-bl-disavow-all",
      "selector_source": "derived",
      "variants": [],
      "confirm": "Add every toxic domain to your disavow list?",
      "label": "Disavow",
      "description": "Tells Google to ignore links from the domains you ticked, which is the remedy for spam links pointing at you.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "affects how Google sees your site; disavowing good domains can cost you rankings"
    },
    {
      "id": "seo_backlinks.refresh",
      "ajax": "aieo_seo_backlinks_refresh",
      "page": "seo_backlinks",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-backlinks.php:29",
      "callers": [
        "assets/pages/dmm/seo/backlinks.php:128"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-bl-refresh",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Refresh backlinks",
      "description": "Pulls the latest list of sites linking to you.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "uses your ranking-service budget"
    },
    {
      "id": "seo_general.dfs_connect",
      "ajax": "aieo_dfs_connect",
      "page": "seo_general",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo.php:52",
      "callers": [
        "assets/pages/dmm/seo/general.php:385"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dfs-credentials",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Connect DataForSEO",
      "description": "Saves your DataForSEO login so the shop can look up where it ranks. That service charges for what it uses.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "stores credentials for a paid service"
    },
    {
      "id": "seo_general.dfs_disconnect",
      "ajax": "aieo_dfs_disconnect",
      "page": "seo_general",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo.php:53",
      "callers": [
        "assets/pages/dmm/seo/general.php:401"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dfs-disconnect",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Disconnect DataForSEO",
      "description": "Forgets the DataForSEO login, so no further ranking lookups are made or charged for.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "ranking figures stop updating"
    },
    {
      "id": "seo_general.dfs_pull",
      "ajax": "aieo_dfs_pull",
      "page": "seo_general",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo.php:54",
      "callers": [
        "assets/pages/dmm/seo/general.php:413"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dfs-pull",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Fetch rankings",
      "description": "Asks DataForSEO where your pages currently rank, within the spending limit you set, and records what comes back.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "spends real money at DataForSEO, up to your budget"
    },
    {
      "id": "seo_general.seo_backfill_canonical",
      "ajax": "aieo_seo_backfill_canonical",
      "page": "seo_general",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo.php:51",
      "callers": [
        "assets/pages/dmm/seo/general.php:438"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-seo-backfill-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Fill in missing addresses",
      "description": "Works through the whole shop filling in the preferred address for pages that have none, which stops search engines treating them as duplicates.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "a shop-wide change; long-running"
    },
    {
      "id": "seo_general.seo_rebuild_head_cache",
      "ajax": "aieo_seo_rebuild_head_cache",
      "page": "seo_general",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo.php:50",
      "callers": [
        "assets/pages/dmm/seo/general.php:341"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-seo-hc-count",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Rebuild SEO output",
      "description": "Regenerates the stored titles and descriptions so pages serve today rules, and refuses to run if another SEO plugin is in charge.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "long-running; overwrites every stored title and description"
    },
    {
      "id": "seo_general.save_seo",
      "ajax": "aieo_dmm_save_seo",
      "page": "seo_general",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo.php:49",
      "callers": [
        "assets/pages/dmm/seo/general.php:309"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-seo-general-form",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save SEO settings",
      "description": "Sets the shop-wide title separator and the other general rules every page inherits.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes the titles search engines see for every page"
    },
    {
      "id": "seo_health.seo_sugg_action",
      "ajax": "aieo_seo_sugg_action",
      "page": "seo_health",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-health.php:30",
      "callers": [
        "assets/pages/dmm/seo/health.php:116",
        "assets/pages/dmm/seo/health.php:125",
        "assets/pages/dmm/seo/health.php:188"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-sugg-approve-all",
      "selector_source": "derived",
      "variants": [],
      "confirm": "Apply ALL pending suggestions (titles + descriptions go live, heads rebuild)?",
      "label": "Apply suggestions",
      "description": "Puts the drafted titles and descriptions live, which is what search engines will show from then on.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what search engines display, across many pages at once"
    },
    {
      "id": "seo_health.recompute",
      "ajax": "aieo_seo_health_recompute",
      "page": "seo_health",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-health.php:29",
      "callers": [
        "assets/pages/dmm/seo/health.php:294"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-seo-recompute-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Recheck the shop",
      "description": "Goes back over your pages and works out where the SEO problems are now.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; reports without changing any page"
    },
    {
      "id": "seo_health.seo_sugg_generate",
      "ajax": "aieo_seo_sugg_generate",
      "page": "seo_health",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-health.php:31",
      "callers": [
        "assets/pages/dmm/seo/health.php:106"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-sugg-generate",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Write suggestions",
      "description": "Drafts titles and descriptions for the pages that need them, so you have something to edit.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "uses your AI credits; nothing goes live until applied"
    },
    {
      "id": "seo_import.seo_verify_parity",
      "ajax": "aieo_seo_verify_parity",
      "page": "seo_import",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-import.php:40",
      "callers": [
        "assets/pages/dmm/seo/import.php:162"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-seo-verify-results",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Compare with the old plugin",
      "description": "Checks page by page whether this engine would output the same as your previous SEO plugin, and lists the differences.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; compares without changing anything"
    },
    {
      "id": "seo_import.run",
      "ajax": "aieo_seo_import_run",
      "page": "seo_import",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-import.php:39",
      "callers": [
        "assets/pages/dmm/seo/import.php:125"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-seo-import-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Import from another SEO plugin",
      "description": "Copies titles, descriptions and settings across from your previous SEO plugin.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "overwrites SEO fields across the whole shop"
    },
    {
      "id": "seo_opportunities.seo_opp_apply",
      "ajax": "aieo_seo_opp_apply",
      "page": "seo_opportunities",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-opportunities.php:48",
      "callers": [
        "assets/pages/dmm/seo/opportunities.php:333",
        "assets/pages/dmm/seo/opportunities.php:338"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-opp-set-kp",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Apply",
      "description": "Puts the suggested title or description live on the page, which is what search engines will show from then on.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what search engines display for a real page"
    },
    {
      "id": "seo_opportunities.seo_opp_recompute",
      "ajax": "aieo_seo_opp_recompute",
      "page": "seo_opportunities",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-opportunities.php:46",
      "callers": [
        "assets/pages/dmm/seo/opportunities.php:301"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-opp-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Find opportunities",
      "description": "Looks over your pages and rankings again and lists the changes most likely to win traffic.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; suggests without changing any page"
    },
    {
      "id": "seo_opportunities.seo_opp_pin",
      "ajax": "aieo_seo_opp_pin",
      "page": "seo_opportunities",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-opportunities.php:47",
      "callers": [
        "assets/pages/dmm/seo/opportunities.php:313"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-opp-pin",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Pin",
      "description": "Marks an opportunity as one you are working on, so it stays at the top instead of sinking as new ones appear.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "changes the order of your own list only"
    },
    {
      "id": "seo_opportunities.seo_opp_save",
      "ajax": "aieo_seo_opp_save",
      "page": "seo_opportunities",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-opportunities.php:45",
      "callers": [
        "assets/pages/dmm/seo/opportunities.php:292"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-opp-save-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save suggestion",
      "description": "Keeps a draft against its page so you can come back to it, without changing what search engines currently see.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "stores a draft only; the live page is untouched"
    },
    {
      "id": "seo_opportunities.seo_opp_suggest",
      "ajax": "aieo_seo_opp_suggest",
      "page": "seo_opportunities",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-opportunities.php:49",
      "callers": [
        "assets/pages/dmm/seo/opportunities.php:344"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-opp-suggest-out",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Write a suggestion",
      "description": "Drafts wording for one page title or description so you have something to react to rather than a blank box.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "uses your AI credits; nothing goes live until you apply it"
    },
    {
      "id": "seo_redirects.seo_redirect_save",
      "ajax": "aieo_seo_redirect_save",
      "page": "seo_redirects",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-redirects.php:40",
      "callers": [
        "assets/pages/dmm/seo/redirects.php:230"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-rd-regex",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Add redirect",
      "description": "Stores a redirect from one path to another with its status code, and can match with a regular expression when you tick that box.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "takes effect on the live site at once, so a wrong source path can move a working page"
    },
    {
      "id": "seo_redirects.seo_redirect_delete",
      "ajax": "aieo_seo_redirect_delete",
      "page": "seo_redirects",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-redirects.php:41",
      "callers": [
        "assets/pages/dmm/seo/redirects.php:239"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-rd-del",
      "selector_source": "derived",
      "variants": [],
      "confirm": "Delete this redirect?",
      "label": "Delete",
      "description": "Removes a redirect permanently, after which its old URL goes back to answering however the site would answer it anyway.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "irreversible; any link relying on that redirect breaks at once",
      "context": "redirect"
    },
    {
      "id": "seo_redirects.seo_404_dismiss",
      "ajax": "aieo_seo_404_dismiss",
      "page": "seo_redirects",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-redirects.php:43",
      "callers": [
        "assets/pages/dmm/seo/redirects.php:264"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-404-dismiss",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Dismiss",
      "description": "Clears one row out of the not-found log, for a URL you have decided needs no redirect.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "deletes one log row; no redirect is created or removed",
      "context": "404 log"
    },
    {
      "id": "seo_redirects.seo_redirect_toggle",
      "ajax": "aieo_seo_redirect_toggle",
      "page": "seo_redirects",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-redirects.php:42",
      "callers": [
        "assets/pages/dmm/seo/redirects.php:245"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-rd-toggle",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Enabled",
      "description": "Turns one redirect on or off without deleting it, and refuses to enable a rule that would send visitors round in a loop.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes live redirect behaviour immediately"
    },
    {
      "id": "seo_redirects.seo_redirect_export",
      "ajax": "aieo_seo_redirect_export",
      "page": "seo_redirects",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-redirects.php:45",
      "callers": [
        "assets/pages/dmm/seo/redirects.php:292"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-rd-export",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Export",
      "description": "Downloads every redirect as a spreadsheet, with its source, target, code and whether it is a regular expression.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; produces a file",
      "context": "redirects"
    },
    {
      "id": "seo_redirects.seo_redirect_import",
      "ajax": "aieo_seo_redirect_import",
      "page": "seo_redirects",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-redirects.php:44",
      "callers": [
        "assets/pages/dmm/seo/redirects.php:270"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-rd-import",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Import from All in One SEO",
      "description": "Copies the redirects out of an existing All in One SEO installation so you do not retype them.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "adds live redirect rules in bulk"
    },
    {
      "id": "seo_redirects.seo_redirect_import_xlsx",
      "ajax": "aieo_seo_redirect_import_xlsx",
      "page": "seo_redirects",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-redirects.php:46",
      "callers": [
        "assets/pages/dmm/seo/redirects.php:307"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-rd-fullsync",
      "selector_source": "derived",
      "variants": [],
      "confirm": "Full sync will DELETE any rule that is not in the uploaded file. Continue?",
      "label": "Import spreadsheet",
      "description": "Loads redirects from an uploaded spreadsheet, and with full sync ticked it also deletes every rule that is not in the file.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "full sync deletes live redirects that the file omits; there is no undo"
    },
    {
      "id": "seo_redirects.seo_redirect_rebuild_edge",
      "ajax": "aieo_seo_redirect_rebuild_edge",
      "page": "seo_redirects",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-redirects.php:47",
      "callers": [
        "assets/pages/dmm/seo/redirects.php:323"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-rd-rebuild-edge",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Rebuild edge map",
      "description": "Writes the redirect map and the sitemap out for the web server to serve directly, which is what makes redirects answer without loading WordPress.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "rewrites generated map and sitemap files from the rules already stored"
    },
    {
      "id": "seo_redirects.seo_index_rebuild",
      "ajax": "aieo_seo_index_rebuild",
      "page": "seo_redirects",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-redirects.php:48",
      "callers": [
        "assets/pages/dmm/seo/redirects.php:344"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-seo-rebuild-btn",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Rebuild SEO index",
      "description": "Regenerates the stored title, description and schema for the content types you tick, in batches, so the pages serve today's rules.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "long-running; overwrites every cached head for the selected types"
    },
    {
      "id": "seo_redirects.seo_save_robots",
      "ajax": "aieo_seo_save_robots",
      "page": "seo_redirects",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-redirects.php:49",
      "callers": [
        "assets/pages/dmm/seo/redirects.php:373"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-robots-custom",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save robots.txt",
      "description": "Stores the extra lines appended to the generated robots file, which is what tells crawlers where they may not go.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "a mistake here can hide the whole site from search engines"
    },
    {
      "id": "seo_schema.seo_save_schema",
      "ajax": "aieo_seo_save_schema",
      "page": "seo_schema",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-schema.php:24",
      "callers": [
        "assets/pages/dmm/seo/schema.php:224"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-org-save",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets the structured details sent to search engines, which is what produces rich results.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes how your pages can appear in search results",
      "context": "schema"
    },
    {
      "id": "seo_search_queries.gsc_set_property",
      "ajax": "aieo_gsc_set_property",
      "page": "seo_search_queries",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-search-queries.php:32",
      "callers": [
        "assets/pages/dmm/seo/search-queries.php:317"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-gsc-property",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Choose the site",
      "description": "Picks which verified site in your Search Console account this shop figures come from.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "pointing at the wrong site silently fills the reports with another site data"
    },
    {
      "id": "seo_search_queries.gsc_disconnect",
      "ajax": "aieo_gsc_disconnect",
      "page": "seo_search_queries",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-search-queries.php:33",
      "callers": [
        "assets/pages/dmm/seo/search-queries.php:329"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-gsc-disconnect",
      "selector_source": "derived",
      "variants": [],
      "confirm": "Disconnect Google Search Console?",
      "label": "Disconnect",
      "description": "Forgets the Search Console connection, after which the search reports stop updating.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "figures already pulled in are kept; nothing new arrives",
      "context": "Search Console"
    },
    {
      "id": "seo_search_queries.gsc_refresh",
      "ajax": "aieo_gsc_refresh",
      "page": "seo_search_queries",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-search-queries.php:34",
      "callers": [
        "assets/pages/dmm/seo/search-queries.php:324",
        "includes/seo/class-aieo-gsc.php:183"
      ],
      "caller_kinds": [
        "php",
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-gsc-refresh",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Refresh now",
      "description": "Pulls the latest search terms and positions from Google rather than waiting for the usual update.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads from Google; changes nothing on your site"
    },
    {
      "id": "seo_search_queries.gsc_save_settings",
      "ajax": "aieo_gsc_save_settings",
      "page": "seo_search_queries",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-search-queries.php:31",
      "callers": [
        "assets/pages/dmm/seo/search-queries.php:306"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-gsc-cs",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Stores how often Search Console figures are pulled in and how far back to look.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes when search figures refresh",
      "context": "Search Console"
    },
    {
      "id": "seo_social.seo_save_social",
      "ajax": "aieo_seo_save_social",
      "page": "seo_social",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-social.php:24",
      "callers": [
        "assets/pages/dmm/seo/social.php:81"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-soc-save",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets the picture and wording used when a page is shared on social media.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes how your pages look when anyone shares them",
      "context": "social sharing"
    },
    {
      "id": "shipment_cost_reports.shipping_pnl",
      "ajax": "aieo_dmm_shipping_pnl",
      "page": "shipment_cost_reports",
      "handler": "includes/dmm/modules/class-aieo-dmm-shipment-cost-reports.php:53",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-shipment-cost-reports.php:305"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Delivery profit and loss",
      "description": "Compares what you charged for delivery against what it cost, so you can see where you are losing money.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "shipment_cost_reports.shipping_pnl_export",
      "ajax": "aieo_dmm_shipping_pnl_export",
      "page": "shipment_cost_reports",
      "handler": "includes/dmm/modules/class-aieo-dmm-shipment-cost-reports.php:54",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-shipment-cost-reports.php:435"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Export",
      "description": "Downloads the delivery profit and loss figures as a spreadsheet.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; produces a file",
      "context": "delivery costs"
    },
    {
      "id": "shipment_cost_reports.fs_cost_step",
      "ajax": "aieo_dmm_fs_cost_step",
      "page": "shipment_cost_reports",
      "handler": "includes/dmm/services/class-aieo-dmm-shipping-cost-resolver.php:72",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-shipment-cost-reports.php:10",
        "includes/dmm/modules/class-aieo-dmm-shipment-cost-reports.php:117",
        "includes/dmm/modules/class-aieo-dmm-shipment-cost-reports.php:75"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-fs-cost-progress-label",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Work out delivery costs",
      "description": "Goes through past orders working out what each delivery actually cost you, a batch at a time.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "long-running; writes cost figures onto real orders"
    },
    {
      "id": "side_cart.quick_view_add",
      "ajax": "aieo_side_cart_quick_view_add",
      "page": "side_cart",
      "handler": "includes/dmm/modules/class-aieo-dmm-side-cart.php:92",
      "callers": [
        "assets/js/aieo-side-cart.js:2280",
        "assets/js/aieo-side-cart.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-side-cart-contents-css",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Add from quick view",
      "description": "The shopper own control: adds a product to the basket from the quick preview without leaving the page they are on.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes a real shopper basket"
    },
    {
      "id": "side_cart.apply_coupon",
      "ajax": "aieo_side_cart_apply_coupon",
      "page": "side_cart",
      "handler": "includes/dmm/modules/class-aieo-dmm-side-cart.php:92",
      "callers": [
        "assets/js/aieo-side-cart.js:965",
        "assets/js/aieo-side-cart.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-aieo-sc-coupon-form]",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Apply coupon",
      "description": "The shopper own control: puts a discount code on their basket and shows what it takes off.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what a real shopper will pay"
    },
    {
      "id": "side_cart.update_qty",
      "ajax": "aieo_side_cart_update_qty",
      "page": "side_cart",
      "handler": "includes/dmm/modules/class-aieo-dmm-side-cart.php:92",
      "callers": [
        "assets/js/aieo-side-cart.js:1085",
        "assets/js/aieo-side-cart.min.js:1",
        "includes/dmm/class-aieo-dmm-role-price-filter.php:10"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-aieo-sc-subtotal]",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Change quantity",
      "description": "The shopper own control: changes how many of an item they are buying, and the total updates with it.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes a real shopper basket"
    },
    {
      "id": "side_cart.get",
      "ajax": "aieo_side_cart_get",
      "page": "side_cart",
      "handler": "includes/dmm/modules/class-aieo-dmm-side-cart.php:92",
      "callers": [
        "assets/js/aieo-side-cart.js:1181",
        "assets/js/aieo-side-cart.js:1196",
        "assets/js/aieo-side-cart.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-side-cart-contents-css",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Open the basket",
      "description": "The shopper own control: loads the current contents of their slide-out basket.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "side_cart.remove",
      "ajax": "aieo_side_cart_remove",
      "page": "side_cart",
      "handler": "includes/dmm/modules/class-aieo-dmm-side-cart.php:92",
      "callers": [
        "assets/js/aieo-side-cart.js:822",
        "assets/js/aieo-side-cart.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".mini_cart_item",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Remove item",
      "description": "The shopper own control: takes one line out of their basket.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes a real shopper basket"
    },
    {
      "id": "side_cart.save_settings",
      "ajax": "aieo_dmm_side_cart_save_settings",
      "page": "side_cart",
      "handler": "includes/dmm/modules/class-aieo-dmm-side-cart.php:57",
      "callers": [
        "assets/pages/dmm/side-cart.php:538"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_side_cart_save_settings\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets how the slide-out basket looks and what it offers, which every shopper sees the next time they open it.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes the storefront basket for everyone",
      "context": "side cart"
    },
    {
      "id": "smart_shipping_label.save",
      "ajax": "aieo_dmm_smart_shipping_label_save",
      "page": "smart_shipping_label",
      "handler": "includes/dmm/modules/class-aieo-dmm-smart-shipping-label.php:50",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-smart-shipping-label.php:652"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-ssl-form",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets the delivery message shown on product pages, such as how soon it would arrive.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "a wrong promise here is one shoppers will hold you to",
      "context": "delivery message"
    },
    {
      "id": "social_login.sso_migrate_settings",
      "ajax": "aieo_sso_migrate_settings",
      "page": "social_login",
      "handler": "includes/dmm/modules/class-aieo-dmm-social-login.php:93",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-social-login.php:410"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-sso-migrate-settings",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Migrate settings",
      "description": "Copies provider keys and toggles across from the old social-login plugin into these settings, overwriting whatever is here now.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "overwrites the current provider credentials with the legacy plugin's"
    },
    {
      "id": "social_login.sso_migrate_users",
      "ajax": "aieo_sso_migrate_users",
      "page": "social_login",
      "handler": "includes/dmm/modules/class-aieo-dmm-social-login.php:94",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-social-login.php:420"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-sso-migrate-users",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Migrate user links (batched)",
      "description": "Re-links existing accounts to their social identities five hundred at a time, so people who signed up under the old plugin can still sign in.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "long-running; writes identity links onto real user accounts"
    },
    {
      "id": "social_login.sso_migrate_audit",
      "ajax": "aieo_sso_migrate_audit",
      "page": "social_login",
      "handler": "includes/dmm/modules/class-aieo-dmm-social-login.php:92",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-social-login.php:403"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-sso-migrate-audit",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Re-audit",
      "description": "Counts what a migration from the old social-login plugin would find, without moving anything, so you can see the work before agreeing to it.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; nothing is written"
    },
    {
      "id": "social_login.sso_save_settings",
      "ajax": "aieo_sso_save_settings",
      "page": "social_login",
      "handler": "includes/dmm/modules/class-aieo-dmm-social-login.php:91",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-captcha.php:212",
        "includes/dmm/modules/class-aieo-dmm-social-login.php:367"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-captcha-save-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Stores which social providers are enabled and their client ids and secrets, which is what makes the sign-in buttons appear or disappear.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "overwrites live provider credentials; a blank field disables that provider"
    },
    {
      "id": "sticky_atc.om_sticky_atc_check_cart",
      "ajax": "om_sticky_atc_check_cart",
      "page": "sticky_atc",
      "handler": "includes/dmm/modules/class-aieo-dmm-sticky-atc.php:57",
      "callers": [
        "assets/js/aieo-sticky-add-to-cart.js:318",
        "assets/js/aieo-sticky-add-to-cart.min.js:1",
        "includes/dmm/data/action-strings.php:1452"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": true,
      "declared_at": "",
      "selector": "#om-sticky-atc-wrapper",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Check the basket",
      "description": "The shopper own control: checks whether the item is already in their basket so the bar shows the right thing.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "sticky_atc.om_sticky_atc_get_product",
      "ajax": "om_sticky_atc_get_product",
      "page": "sticky_atc",
      "handler": "includes/dmm/modules/class-aieo-dmm-sticky-atc.php:55",
      "callers": [
        "assets/js/aieo-sticky-add-to-cart.js:1585",
        "assets/js/aieo-sticky-add-to-cart.min.js:1",
        "includes/dmm/data/action-strings.php:1456"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": true,
      "declared_at": "",
      "selector": ".om-satc-persistent-placeholder",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Load product",
      "description": "The shopper own control: fetches the details the floating buy bar needs as they scroll.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "sticky_atc.save_settings",
      "ajax": "aieo_dmm_sticky_atc_save_settings",
      "page": "sticky_atc",
      "handler": "includes/dmm/modules/class-aieo-dmm-sticky-atc.php:34",
      "callers": [
        "assets/pages/dmm/sticky-add-to-cart.php:305"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_sticky_atc_save_settings\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets the bar that follows the shopper down a product page with the price and buy button on it.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what shoppers see on the storefront",
      "context": "sticky buy bar"
    },
    {
      "id": "stock_import.process",
      "ajax": "aieo_dmm_stock_import_process",
      "page": "stock_import",
      "handler": "includes/dmm/modules/class-aieo-dmm-stock-import.php:34",
      "callers": [
        "assets/js/dmm.js:272",
        "assets/js/dmm.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-flash",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Apply stock file",
      "description": "Works through the uploaded file writing each stock figure onto its product, a chunk at a time.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes real stock, so products can go on or off sale immediately"
    },
    {
      "id": "stock_import.download_sample",
      "ajax": "aieo_dmm_stock_import_download_sample",
      "page": "stock_import",
      "handler": "includes/dmm/modules/class-aieo-dmm-stock-import.php:35",
      "callers": [
        "assets/js/dmm.js:375",
        "assets/js/dmm.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-dmm-stock-sample",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Download example",
      "description": "Gives you an example file with the right columns, so an upload is not rejected for having the wrong shape.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; produces a file"
    },
    {
      "id": "stock_import.upload",
      "ajax": "aieo_dmm_stock_import_upload",
      "page": "stock_import",
      "handler": "includes/dmm/modules/class-aieo-dmm-stock-import.php:33",
      "callers": [
        "assets/js/dmm.js:272",
        "assets/js/dmm.min.js:1",
        "assets/pages/dmm/stock-import.php:52"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_stock_import_upload\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Upload stock file",
      "description": "Accepts a supplier stock file and prepares it, without changing any stock yet.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "stores an uploaded file ready to be applied"
    },
    {
      "id": "stock_recovery.pr_dismiss",
      "ajax": "aieo_pr_dismiss",
      "page": "stock_recovery",
      "handler": "includes/dmm/modules/class-aieo-dmm-physical-recovery.php:490",
      "callers": [
        "assets/pages/dmm/physical-recovery.php:476"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".pr-qty",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Dismiss",
      "description": "Takes one product out of the recovery queue for now without blocking it, so it can come back the next time detection runs.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "marks one candidate row dismissed; stock is untouched"
    },
    {
      "id": "stock_recovery.pr_gap_dismiss",
      "ajax": "aieo_pr_gap_dismiss",
      "page": "stock_recovery",
      "handler": "includes/dmm/modules/class-aieo-dmm-physical-recovery.php:495",
      "callers": [
        "assets/pages/dmm/missing-hot-sellers.php:356",
        "assets/pages/dmm/physical-recovery.php:482"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-mhs-save-excl",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Dismiss",
      "description": "Removes one SKU from the missing-hot-sellers list, for stock that sells in the shops and is never going to be listed online.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "adds the SKU to a blocklist that survives re-detection",
      "context": "catalogue gap"
    },
    {
      "id": "stock_recovery.pr_export_gaps",
      "ajax": "aieo_pr_export_gaps",
      "page": "stock_recovery",
      "handler": "includes/dmm/modules/class-aieo-dmm-physical-recovery.php:497",
      "callers": [
        "assets/pages/dmm/missing-hot-sellers.php:203"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Export",
      "description": "Downloads the full missing-hot-sellers list as a spreadsheet, not just the five hundred rows shown on screen.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; produces a file",
      "context": "missing hot sellers"
    },
    {
      "id": "stock_recovery.pr_export_recovery",
      "ajax": "aieo_pr_export_recovery",
      "page": "stock_recovery",
      "handler": "includes/dmm/modules/class-aieo-dmm-physical-recovery.php:498",
      "callers": [
        "assets/pages/dmm/physical-recovery.php:179"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Export",
      "description": "Downloads every candidate that is out of stock online and still selling in store, with its turnover and confidence figures.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; produces a file",
      "context": "recovery queue"
    },
    {
      "id": "stock_recovery.pr_export_restocks",
      "ajax": "aieo_pr_export_restocks",
      "page": "stock_recovery",
      "handler": "includes/dmm/modules/class-aieo-dmm-physical-recovery.php:499",
      "callers": [
        "assets/pages/dmm/physical-recovery.php:310"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Export",
      "description": "Downloads the history of restocks this feature has made, so you can check what it put back on sale and when.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; produces a file",
      "context": "restock history"
    },
    {
      "id": "stock_recovery.pr_blocklist",
      "ajax": "aieo_pr_blocklist",
      "page": "stock_recovery",
      "handler": "includes/dmm/modules/class-aieo-dmm-physical-recovery.php:491",
      "callers": [
        "assets/pages/dmm/physical-recovery.php:479"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".pr-qty",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Never suggest",
      "description": "Blocks a product from the recovery queue permanently, for lines you deliberately do not sell online however well they sell in store.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "writes a permanent block onto the product that only this button can lift"
    },
    {
      "id": "stock_recovery.pr_apply_one",
      "ajax": "aieo_pr_apply_one",
      "page": "stock_recovery",
      "handler": "includes/dmm/modules/class-aieo-dmm-physical-recovery.php:488",
      "callers": [
        "assets/pages/dmm/physical-recovery.php:470"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".pr-qty",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Restock",
      "description": "Puts one product back in stock online at the quantity in the row, which makes it buyable on the storefront again immediately.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes real stock on a live product, and shoppers can buy it at once"
    },
    {
      "id": "stock_recovery.pr_apply_bulk",
      "ajax": "aieo_pr_apply_bulk",
      "page": "stock_recovery",
      "handler": "includes/dmm/modules/class-aieo-dmm-physical-recovery.php:489",
      "callers": [
        "assets/pages/dmm/physical-recovery.php:405",
        "assets/pages/dmm/physical-recovery.php:413"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".js-pr-run",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Restock all",
      "description": "Restocks every candidate that meets your thresholds, fifty products per request, until none is left waiting.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes real stock across many live products in one pass"
    },
    {
      "id": "stock_recovery.pr_revert",
      "ajax": "aieo_pr_revert",
      "page": "stock_recovery",
      "handler": "includes/dmm/modules/class-aieo-dmm-physical-recovery.php:492",
      "callers": [
        "assets/pages/dmm/physical-recovery.php:486"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "Revert this product to its prior (out-of-stock) state?",
      "label": "Revert",
      "description": "Puts a product back to the out-of-stock state it was in before you restocked it, undoing that one restock and nothing else.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "takes a live product off sale again"
    },
    {
      "id": "stock_recovery.pr_run_detection",
      "ajax": "aieo_pr_run_detection",
      "page": "stock_recovery",
      "handler": "includes/dmm/modules/class-aieo-dmm-physical-recovery.php:493",
      "callers": [
        "assets/pages/dmm/missing-hot-sellers.php:327",
        "assets/pages/dmm/physical-recovery.php:396",
        "assets/pages/dmm/physical-recovery.php:435",
        "assets/pages/dmm/physical-recovery.php:441"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-mhs-run",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Run now",
      "description": "Re-scans the catalogue for products that are out of stock online but still selling in the physical shops, and refreshes the outcome figures.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "rebuilds the candidate table from existing sales data; no product is changed"
    },
    {
      "id": "stock_recovery.pr_save_gap_settings",
      "ajax": "aieo_pr_save_gap_settings",
      "page": "stock_recovery",
      "handler": "includes/dmm/modules/class-aieo-dmm-physical-recovery.php:487",
      "callers": [
        "assets/pages/dmm/missing-hot-sellers.php:338"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Save",
      "description": "Sets how many units and how recent a sale a SKU needs before it counts as a missing hot seller worth listing online.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "changes a read-time filter, so the list and totals change on the next render",
      "context": "gap thresholds"
    },
    {
      "id": "stock_recovery.pr_save_settings",
      "ajax": "aieo_pr_save_settings",
      "page": "stock_recovery",
      "handler": "includes/dmm/modules/class-aieo-dmm-physical-recovery.php:486",
      "callers": [
        "assets/pages/dmm/physical-recovery.php:431",
        "assets/pages/dmm/physical-recovery.php:461"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".js-pr-runnow",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets the thresholds that decide which products qualify for restocking, including minimum units, days on sale and the quantity cap.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes which products the automatic restock will act on"
    },
    {
      "id": "stock_recovery.pr_gap_restore",
      "ajax": "aieo_pr_gap_restore",
      "page": "stock_recovery",
      "handler": "includes/dmm/modules/class-aieo-dmm-physical-recovery.php:496",
      "callers": [
        "assets/pages/dmm/missing-hot-sellers.php:360"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-mhs-save-excl",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Undo dismiss",
      "description": "Puts a SKU back on the missing-hot-sellers list after it had been set aside.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "the SKU reappears on the list"
    },
    {
      "id": "store_pages.store_config_save",
      "ajax": "aieo_store_config_save",
      "page": "store_pages",
      "handler": "includes/dmm/modules/class-aieo-dmm-store.php:29",
      "callers": [
        "assets/js/aieo-store-admin.js:22",
        "assets/js/aieo-store-admin.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-store-save",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets which of your pages are the shop, basket and account pages, which is how the shop knows where to send people.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "pointing these at the wrong pages breaks navigation for every shopper",
      "context": "store pages"
    },
    {
      "id": "supplier_extras.supplier_pods_migrate_run",
      "ajax": "aieo_supplier_pods_migrate_run",
      "page": "supplier_extras",
      "handler": "includes/dmm/migrators/class-aieo-dmm-supplier-pods-migrator.php:26",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-supplier-extras.php:369"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-supplier-pods-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Migrate suppliers",
      "description": "Copies supplier details over from the old Pods setup so nothing is lost when you move off it.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "writes supplier data in bulk and overwrites what is there"
    },
    {
      "id": "surveys.verify_prices",
      "ajax": "aieo_dmm_surveys_verify_prices",
      "page": "surveys",
      "handler": "includes/dmm/modules/class-aieo-dmm-surveys.php:129",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-surveys.php:5006"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Check the prices",
      "description": "Compares the prices recorded against your products against what the shop actually charges, and lists any that disagree.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only; reports the differences without touching anything"
    },
    {
      "id": "surveys.fix_prices",
      "ajax": "aieo_dmm_surveys_fix_prices",
      "page": "surveys",
      "handler": "includes/dmm/modules/class-aieo-dmm-surveys.php:130",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-surveys.php:4952"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-surveys-fix-prices-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Correct the prices",
      "description": "Rewrites the recorded prices and discounts to match what the shop actually charges, which is what the checking step found.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "long-running; overwrites recorded prices in bulk"
    },
    {
      "id": "surveys.bootstrap_ci",
      "ajax": "aieo_dmm_surveys_bootstrap_ci",
      "page": "surveys",
      "handler": "includes/dmm/modules/class-aieo-dmm-surveys.php:128",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-surveys.php:3393"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-surveys-bootstrap-ci-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Create the customer table",
      "description": "Sets up the place customer figures are kept, which is the first step on a shop that has never used them.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "creates storage; you still have to run the recalculation afterwards"
    },
    {
      "id": "surveys.status",
      "ajax": "aieo_dmm_surveys_status",
      "page": "surveys",
      "handler": "includes/dmm/modules/class-aieo-dmm-surveys.php:127",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-surveys.php:5652"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Progress",
      "description": "Reports how far the customer figures have got, so a long rebuild can be watched without reloading the page.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "surveys.ingest",
      "ajax": "aieo_dmm_surveys_ingest",
      "page": "surveys",
      "handler": "includes/dmm/modules/class-aieo-dmm-surveys.php:126",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-surveys.php:5736"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Read in the answers",
      "description": "Starts reading survey answers into the customer records in the background, and refuses if a run is already going.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "long-running background work; writes onto customer records"
    },
    {
      "id": "surveys.recompute",
      "ajax": "aieo_dmm_surveys_recompute",
      "page": "surveys",
      "handler": "includes/dmm/modules/class-aieo-dmm-surveys.php:125",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-surveys.php:5737"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Recalculate customer figures",
      "description": "Rebuilds what the shop knows about each customer from their orders and answers. Administrators only, because it is heavy.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "long-running and heavy; rewrites the customer figures the reports read"
    },
    {
      "id": "swatches.get_categories",
      "ajax": "aieo_dmm_swatches_get_categories",
      "page": "swatches",
      "handler": "includes/dmm/modules/class-aieo-dmm-swatches.php:84",
      "callers": [
        "assets/pages/dmm/swatches.php:902"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-dmm-swatches-cat-select",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Category list",
      "description": "Loads the product categories into the pickers so a swatch rule can be limited to part of the catalogue.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only",
      "context": "swatches"
    },
    {
      "id": "swatches.clear",
      "ajax": "aieo_dmm_swatches_clear",
      "page": "swatches",
      "handler": "includes/dmm/modules/class-aieo-dmm-swatches.php:80",
      "callers": [
        "assets/pages/dmm/swatches.php:826"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-swatches-clear",
      "selector_source": "derived",
      "variants": [],
      "confirm": "Empty the swatch cache tables? The rows rebuild by themselves the next time a shopper opens a product.",
      "label": "Clear cache",
      "description": "Empties the swatch cache tables, after which each product rebuilds its own the first time a shopper opens it.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "the first shopper to open each product pays the rebuild cost",
      "context": "swatches"
    },
    {
      "id": "swatches.colour_flags",
      "ajax": "aieo_dmm_swatches_colour_flags",
      "page": "swatches",
      "handler": "includes/dmm/modules/class-aieo-dmm-swatches.php:85",
      "callers": [
        "assets/pages/dmm/swatches.php:847",
        "assets/pages/dmm/swatches.php:854"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-colour-flag-image",
      "selector_source": "derived",
      "variants": [],
      "confirm": "Mark ALL image swatch attributes as colours? The colours fill in again on the next rebuild.",
      "label": "Flag colour attributes",
      "description": "Marks image-type attributes as carrying colour, so the catalogue knows which swatches are colours and can group them.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "colours repopulate on the next data-prep rebuild, not immediately"
    },
    {
      "id": "swatches.migrate",
      "ajax": "aieo_dmm_swatches_migrate",
      "page": "swatches",
      "handler": "includes/dmm/modules/class-aieo-dmm-swatches.php:82",
      "callers": [
        "assets/pages/dmm/swatches.php:834"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-swatches-migrate",
      "selector_source": "derived",
      "variants": [],
      "confirm": "Bring the settings across from the old om-product-swatches plugin and rebuild every variable product?",
      "label": "Migrate from legacy",
      "description": "Brings settings across from the old om-product-swatches plugin and queues a rebuild of every variable product from its data.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "overwrites current swatch settings with the legacy plugin's",
      "context": "swatches"
    },
    {
      "id": "swatches.rebuild",
      "ajax": "aieo_dmm_swatches_rebuild",
      "page": "swatches",
      "handler": "includes/dmm/modules/class-aieo-dmm-swatches.php:81",
      "callers": [
        "assets/pages/dmm/swatches.php:818"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-swatches-rebuild",
      "selector_source": "derived",
      "variants": [],
      "confirm": "Queue a full rebuild of every variable product’s swatch cache?",
      "label": "Rebuild all",
      "description": "Queues a fresh swatch cache for every variable product, which is the fix after changing an attribute or importing a catalogue.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "long-running background work across the whole catalogue"
    },
    {
      "id": "swatches.stats",
      "ajax": "aieo_dmm_swatches_stats",
      "page": "swatches",
      "handler": "includes/dmm/modules/class-aieo-dmm-swatches.php:79",
      "callers": [
        "assets/pages/dmm/swatches.php:800"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Refresh stats",
      "description": "Counts how much of the swatch cache is built, so you can see whether a rebuild has finished before trusting the storefront.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "swatches.save",
      "ajax": "aieo_dmm_swatches_save",
      "page": "swatches",
      "handler": "includes/dmm/modules/class-aieo-dmm-swatches.php:78",
      "callers": [
        "assets/pages/dmm/swatches.php:894"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Save",
      "description": "Stores how swatches look and behave across the storefront, including their shape, size and which attributes get them.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes the live storefront appearance of every variable product",
      "context": "swatch settings"
    },
    {
      "id": "swatches.toggle_runtime",
      "ajax": "aieo_dmm_swatches_toggle_runtime",
      "page": "swatches",
      "handler": "includes/dmm/modules/class-aieo-dmm-swatches.php:83",
      "callers": [
        "assets/pages/dmm/swatches.php:862"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-swatches-runtime-toggle",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Storefront swatches",
      "description": "Turns the swatch rendering on the storefront on or off, which is the switch between shoppers seeing swatches and seeing dropdowns.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what every shopper sees on a variable product"
    },
    {
      "id": "tools.save_branding",
      "ajax": "aieo_dmm_tools_save_branding",
      "page": "tools",
      "handler": "includes/dmm/modules/class-aieo-dmm-tools.php:64",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-tools.php:566"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-tools-branding-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save branding",
      "description": "Renames the plugin menu for this shop, so staff see your own wording rather than ours.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes the admin menu for everyone on the site"
    },
    {
      "id": "tools.save_caps",
      "ajax": "aieo_dmm_tools_save_caps",
      "page": "tools",
      "handler": "includes/dmm/modules/class-aieo-dmm-tools.php:65",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-tools.php:748"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-tools-products-max",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save list lengths",
      "description": "Sets how many rows the admin lists show at once, which is the trade between scrolling and page speed.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes list lengths for everyone; administrators only"
    },
    {
      "id": "tools.save_quiet",
      "ajax": "aieo_dmm_tools_save_quiet",
      "page": "tools",
      "handler": "includes/dmm/modules/class-aieo-dmm-tools.php:66",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-tools.php:259"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-quiet-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save quiet hours",
      "description": "Sets the hours when the shop will not send marketing messages, so customers are not contacted overnight.",
      "informs_customer": true,
      "safe_to_demo": false,
      "side_effects": "decides when real customers may be messaged"
    },
    {
      "id": "tools.save",
      "ajax": "aieo_dmm_tools_save",
      "page": "tools",
      "handler": "includes/dmm/modules/class-aieo-dmm-tools.php:63",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-tools.php:377"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-tools-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save tools",
      "description": "Switches the optional admin conveniences on or off. Each is independent and costs nothing while it is off.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes which extras load in the admin"
    },
    {
      "id": "trust_badges.save",
      "ajax": "aieo_dmm_trust_badges_save",
      "page": "trust_badges",
      "handler": "includes/dmm/modules/class-aieo-dmm-trust-badges.php:68",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-trust-badges.php:354"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-tb-form",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets the reassurance icons near the buy button, such as secure payment and easy returns.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what shoppers see on the storefront",
      "context": "trust badges"
    },
    {
      "id": "user_vitals.migrate",
      "ajax": "aieo_user_vitals_migrate",
      "page": "user_vitals",
      "handler": "includes/dmm/modules/class-aieo-dmm-user-vitals.php:54",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-user-vitals.php:510",
        "includes/dmm/modules/class-aieo-dmm-user-vitals.php:516"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Bring across the old figures",
      "description": "Copies customer figures over from the previous setup so history is not lost when you move to this one.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "writes onto customer records in bulk"
    },
    {
      "id": "user_vitals.save_gf",
      "ajax": "aieo_user_vitals_save_gf",
      "page": "user_vitals",
      "handler": "includes/dmm/modules/class-aieo-dmm-user-vitals.php:56",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-user-vitals.php:407"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-gf-save",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save form mapping",
      "description": "Says which form fields hold which customer details, so answers land on the right part of the record.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "wrong mapping quietly files answers under the wrong field"
    },
    {
      "id": "user_vitals.save_loyalty",
      "ajax": "aieo_user_vitals_save_loyalty",
      "page": "user_vitals",
      "handler": "includes/dmm/modules/class-aieo-dmm-user-vitals.php:55",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-user-vitals.php:316"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-loy-save",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save loyalty settings",
      "description": "Sets the thresholds that decide when a customer counts as loyal, which is what the reports and audiences use.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes which customers are treated as loyal everywhere"
    },
    {
      "id": "user_vitals.scan",
      "ajax": "aieo_user_vitals_scan",
      "page": "user_vitals",
      "handler": "includes/dmm/modules/class-aieo-dmm-user-vitals.php:53",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-user-vitals.php:500"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-uv-migrate",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Scan customers",
      "description": "Goes through your customers and works out what is known about each one, such as how often they buy.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "long-running; rewrites the customer figures the reports read"
    },
    {
      "id": "utm_explorer.utm_explore",
      "ajax": "aieo_utm_explore",
      "page": "utm_explorer",
      "handler": "includes/dmm/modules/class-aieo-dmm-utm-explorer.php:80",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-utm-explorer.php:403"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Explore campaign tags",
      "description": "Breaks your traffic down by campaign tag, so you can see which links are actually bringing people in.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "utm_explorer.utm_search",
      "ajax": "aieo_utm_search",
      "page": "utm_explorer",
      "handler": "includes/dmm/modules/class-aieo-dmm-utm-explorer.php:81",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-utm-explorer.php:353"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Search campaign tags",
      "description": "Finds a campaign tag by name while you are narrowing the report down.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "variations_gallery.vg_migration_clear_as",
      "ajax": "aieo_dmm_vg_migration_clear_as",
      "page": "variations_gallery",
      "handler": "includes/dmm/modules/class-aieo-dmm-variations-gallery.php:34",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-variations-gallery.php:644"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Clear the queue",
      "description": "Empties the waiting list of gallery conversions, which is the way out when a run has jammed.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "abandons queued work; anything half-done stays half-done"
    },
    {
      "id": "variations_gallery.vg_migration_run_batch",
      "ajax": "aieo_dmm_vg_migration_run_batch",
      "page": "variations_gallery",
      "handler": "includes/dmm/modules/class-aieo-dmm-variations-gallery.php:32",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-variations-gallery.php:569",
        "includes/dmm/modules/class-aieo-dmm-variations-gallery.php:592"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Convert galleries",
      "description": "Converts product galleries from the old plugin format a batch at a time, so a large catalogue does not time out.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "long-running; rewrites picture galleries on real products"
    },
    {
      "id": "variations_gallery.vg_migration_status",
      "ajax": "aieo_dmm_vg_migration_status",
      "page": "variations_gallery",
      "handler": "includes/dmm/modules/class-aieo-dmm-variations-gallery.php:31",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-variations-gallery.php:550"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Progress",
      "description": "Reports how far the gallery conversion has got, so a long run can be watched without reloading the page.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "variations_gallery.save",
      "ajax": "aieo_dmm_variations_gallery_save",
      "page": "variations_gallery",
      "handler": "includes/dmm/modules/class-aieo-dmm-variations-gallery.php:26",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-variations-gallery.php:475"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-vg-form",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets how the picture gallery behaves when a shopper picks a size or colour, across every variable product.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what shoppers see on every variable product",
      "context": "variations gallery"
    },
    {
      "id": "variations_gallery.vg_migration_reset",
      "ajax": "aieo_dmm_vg_migration_reset",
      "page": "variations_gallery",
      "handler": "includes/dmm/modules/class-aieo-dmm-variations-gallery.php:33",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-variations-gallery.php:626"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Start the conversion again",
      "description": "Forgets how far the conversion has got so it begins from the first product again. It does not undo what is already converted.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "clears progress only; converted products stay converted"
    },
    {
      "id": "waitlist.delete",
      "ajax": "aieo_dmm_waitlist_delete",
      "page": "waitlist",
      "handler": "includes/dmm/modules/class-aieo-dmm-waitlist.php:52",
      "callers": [
        "assets/pages/dmm/waitlist.php:104"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-dmm-waitlist-delete",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Remove from the list",
      "description": "Takes one person off the waiting list for a product, so they will not be told when it comes back.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "that person stops being notified"
    },
    {
      "id": "waitlist.save",
      "ajax": "aieo_dmm_waitlist_save",
      "page": "waitlist",
      "handler": "includes/dmm/modules/class-aieo-dmm-waitlist.php:51",
      "callers": [
        "assets/pages/dmm/waitlist-display.php:153",
        "includes/dmm/modules/class-aieo-dmm-waitlist-display.php:9"
      ],
      "caller_kinds": [
        "php",
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_waitlist_save\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets the wording and rules for the back-in-stock list, including what the email says when stock returns.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what waiting customers will be sent",
      "context": "waitlist"
    },
    {
      "id": "waitlist.subscribe",
      "ajax": "aieo_waitlist_subscribe",
      "page": "waitlist",
      "handler": "includes/dmm/modules/class-aieo-dmm-waitlist.php:63",
      "callers": [
        "assets/js/aieo-waitlist.js:56",
        "assets/js/aieo-waitlist.min.js:1",
        "includes/class-aieo-signal-registry.php:2526",
        "includes/dmm/modules/class-aieo-dmm-waitlist.php:14"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": true,
      "declared_at": "",
      "selector": ".aieo-waitlist-container",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Tell me when it is back",
      "description": "The shopper own control: joins the waiting list for an out-of-stock product so they hear when it returns.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "adds a real person to a list that will email them later"
    },
    {
      "id": "waitlist.om_ppe_waitlist_subscribe",
      "ajax": "om_ppe_waitlist_subscribe",
      "page": "waitlist",
      "handler": "includes/dmm/modules/class-aieo-dmm-waitlist.php:65",
      "callers": [
        "includes/class-aieo-signal-registry.php:2526",
        "includes/dmm/data/action-strings.php:1673",
        "includes/dmm/modules/class-aieo-dmm-waitlist.php:14",
        "includes/dmm/modules/class-aieo-dmm-waitlist.php:390"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": true,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Tell me when it is back",
      "description": "The older version of the same shopper control, kept so links and pages from the previous plugin still work.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "adds a real person to a list that will email them later",
      "context": "legacy form"
    },
    {
      "id": "web-push.webpush_create_campaign",
      "ajax": "aieo_dmm_webpush_create_campaign",
      "page": "web-push",
      "handler": "includes/dmm/modules/class-aieo-dmm-web-push.php:243",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-web-push.php:2151"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_webpush_create_campaign\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Create campaign (draft)",
      "description": "Stores a new push campaign as a draft with its audience rules, and sends nothing until you launch it separately.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "creates a campaign row; nothing is sent"
    },
    {
      "id": "web-push.webpush_toggle_engine",
      "ajax": "aieo_dmm_webpush_toggle_engine",
      "page": "web-push",
      "handler": "includes/dmm/modules/class-aieo-dmm-web-push.php:245",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-web-push.php:3673"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-engine-toggle-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Engine live / paused",
      "description": "Switches the push engine between live and paused, and going live is what lets every campaign here start to notify the customer.",
      "informs_customer": true,
      "safe_to_demo": false,
      "side_effects": "going live lets queued campaigns start notifying customers"
    },
    {
      "id": "web-push.webpush_launch_campaign",
      "ajax": "aieo_dmm_webpush_launch_campaign",
      "page": "web-push",
      "handler": "includes/dmm/modules/class-aieo-dmm-web-push.php:244",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-web-push.php:2225"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-launch-campaign",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Launch",
      "description": "Notifies every customer its audience rules match, on their own devices, and refuses to run at all while the engine is paused.",
      "informs_customer": true,
      "safe_to_demo": false,
      "side_effects": "notifies real customers on their devices; it cannot be recalled"
    },
    {
      "id": "web-push.webpush_recompute",
      "ajax": "aieo_dmm_webpush_recompute",
      "page": "web-push",
      "handler": "includes/dmm/modules/class-aieo-dmm-web-push.php:236",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-surveys.php:3346",
        "includes/dmm/modules/class-aieo-dmm-web-push.php:4341"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-surveys-populate-ci-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Recalculate audiences",
      "description": "Works out again which subscribers belong to which group, so a send reaches the right people.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "rewrites group membership; nothing is sent"
    },
    {
      "id": "web-push.webpush_save_banner",
      "ajax": "aieo_dmm_webpush_save_banner",
      "page": "web-push",
      "handler": "includes/dmm/modules/class-aieo-dmm-web-push.php:238",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-web-push-display.php:11",
        "includes/dmm/modules/class-aieo-dmm-web-push.php:3526"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_webpush_save_banner\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Save banner settings",
      "description": "Sets whether the opt-in banner appears on the storefront, where it sits and what it says, which is what recruits subscribers.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what shoppers see on the storefront"
    },
    {
      "id": "web-push.webpush_save_newsletter",
      "ajax": "aieo_dmm_webpush_save_newsletter",
      "page": "web-push",
      "handler": "includes/dmm/modules/class-aieo-dmm-web-push.php:239",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-web-push.php:1982"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_webpush_save_newsletter\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Save provider settings",
      "description": "Stores which newsletter service the shop posts sign-ups to and the credentials it needs, which is where new subscribers end up.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "overwrites live newsletter credentials; wrong ones silently lose sign-ups"
    },
    {
      "id": "web-push.webpush_save_template",
      "ajax": "aieo_dmm_webpush_save_template",
      "page": "web-push",
      "handler": "includes/dmm/modules/class-aieo-dmm-web-push.php:240",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-web-push.php:1451"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-tpl-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save template field",
      "description": "Stores one field of one notification template as you leave it, which changes the wording of every future send using that template.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what future notifications say"
    },
    {
      "id": "web-push.webpush_send_test",
      "ajax": "aieo_dmm_webpush_send_test",
      "page": "web-push",
      "handler": "includes/dmm/modules/class-aieo-dmm-web-push.php:237",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-web-push.php:3793"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-webpush-send-test-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Send test push",
      "description": "Pushes one notification to your own browser only, so you can see what it looks like, and needs the engine live to work.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "sends a real notification, to you rather than to a customer"
    },
    {
      "id": "web-push.webpush_sync_cohort",
      "ajax": "aieo_dmm_webpush_sync_cohort",
      "page": "web-push",
      "handler": "includes/dmm/modules/class-aieo-dmm-web-push.php:242",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Sync cohort",
      "description": "Recomputes which subscribers belong to a campaign's audience, so a send uses today's customers rather than the ones who matched last week.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "rewrites audience membership rows; nothing is sent"
    },
    {
      "id": "web-push.webpush_test_newsletter",
      "ajax": "aieo_dmm_webpush_test_newsletter",
      "page": "web-push",
      "handler": "includes/dmm/modules/class-aieo-dmm-web-push.php:241",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-web-push.php:2019"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Test provider",
      "description": "Calls the configured newsletter service with the credentials as saved and reports whether it answers, without subscribing anybody.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "one authentication call to the provider; nobody is subscribed"
    },
    {
      "id": "welcome.reset_layout",
      "ajax": "aieo_welcome_reset_layout",
      "page": "welcome",
      "handler": "includes/dmm/modules/class-aieo-dmm-welcome.php:107",
      "callers": [
        "assets/pages/dmm/welcome.php:772"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-welcome-modal__go",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Reset layout",
      "description": "Puts your home screen back to how it arrives out of the box, losing your pins and arrangement.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "your own arrangement is lost; nobody else is affected"
    },
    {
      "id": "welcome.save_pin_order",
      "ajax": "aieo_welcome_save_pin_order",
      "page": "welcome",
      "handler": "includes/dmm/modules/class-aieo-dmm-welcome.php:106",
      "callers": [
        "assets/pages/dmm/_utility-bar.php:125",
        "assets/pages/dmm/_utility-bar.php:363"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Save pinned order",
      "description": "Saves the order you dragged your pinned shortcuts into.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "affects your own account only"
    },
    {
      "id": "welcome.save_prefs",
      "ajax": "aieo_welcome_save_prefs",
      "page": "welcome",
      "handler": "includes/dmm/modules/class-aieo-dmm-welcome.php:105",
      "callers": [
        "assets/pages/dmm/welcome.php:518",
        "assets/pages/dmm/welcome.php:534"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-welcome-card",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save preferences",
      "description": "Stores how your home screen is set up, for your account only.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "affects your own account only"
    },
    {
      "id": "wishlist.save_display",
      "ajax": "aieo_dmm_wishlist_save_display",
      "page": "wishlist",
      "handler": "includes/dmm/modules/class-aieo-dmm-wishlist.php:30",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-wishlist-display.php:8",
        "includes/dmm/modules/class-aieo-dmm-wishlist.php:251"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_wishlist_save_display\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Sets where the wishlist heart appears and what it says, on both product pages and listings.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes what shoppers see on the storefront",
      "context": "wishlist"
    },
    {
      "id": "withdrawal.create_page",
      "ajax": "aieo_dmm_withdrawal_create_page",
      "page": "withdrawal",
      "handler": "includes/dmm/modules/class-aieo-dmm-withdrawal.php:43",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-withdrawal.php:552"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "includes/dmm/modules/class-aieo-dmm-withdrawal.php:300",
      "selector": "[data-aieo-action=\"withdrawal.create_page\"]",
      "selector_source": "markup",
      "variants": [],
      "confirm": "",
      "label": "Create the page for me",
      "description": "Publishes a page holding the guest withdrawal form shortcode and selects it as the one customers without an account are sent to.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "publishes one new WordPress page, which is visible to the public and has to be deleted by hand afterwards",
      "tab": "settings"
    },
    {
      "id": "withdrawal.save",
      "ajax": "aieo_dmm_withdrawal_save",
      "page": "withdrawal",
      "handler": "includes/dmm/modules/class-aieo-dmm-withdrawal.php:41",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-withdrawal.php:539"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "includes/dmm/modules/class-aieo-dmm-withdrawal.php:351",
      "selector": "[data-aieo-action=\"withdrawal.save\"]",
      "selector_source": "markup",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Overwrites the live withdrawal policy, meaning the window, who pays return postage, the refusal grounds, the guest page and the instant-cancel order statuses.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "overwrites the live withdrawal settings a demo depends on",
      "tab": "settings"
    },
    {
      "id": "withdrawal.return",
      "ajax": "aieo_dmm_withdrawal_return",
      "page": "withdrawal",
      "handler": "includes/dmm/modules/class-aieo-dmm-withdrawal.php:44",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-withdrawal.php:1354"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "includes/dmm/modules/class-aieo-dmm-withdrawal.php:957",
      "selector": "[data-aieo-action=\"withdrawal.return\"]",
      "selector_source": "markup",
      "variants": [
        "approve",
        "clear",
        "issue",
        "record",
        "upload"
      ],
      "confirm": "Send this label to the customer? Check it first — they will use whatever you send.",
      "label": "Issue / Save / Upload / Change / Approve",
      "description": "Books a collection through the courier API, records a voucher you booked by hand, attaches a label file, detaches one, or approves the return, and only approving emails the customer.",
      "informs_customer": true,
      "safe_to_demo": false,
      "side_effects": "issuing books a real courier collection and costs money; approving releases the label to the customer"
    },
    {
      "id": "withdrawal.process",
      "ajax": "aieo_dmm_withdrawal_process",
      "page": "withdrawal",
      "handler": "includes/dmm/modules/class-aieo-dmm-withdrawal.php:42",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-withdrawal.php:1321"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "includes/dmm/modules/class-aieo-dmm-withdrawal.php:975",
      "selector": "[data-aieo-action=\"withdrawal.process\"]",
      "selector_source": "markup",
      "variants": [
        "received",
        "refunded"
      ],
      "confirm": "",
      "label": "Goods received / Mark refunded",
      "description": "Moves a declaration on once the parcel is back, then records the amount and method when you settle it, and refuses to mark a refund before the goods are marked received.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "advances the declaration and writes a refund amount against the order; not reversible from this screen"
    },
    {
      "id": "withdrawal.reject",
      "ajax": "aieo_dmm_withdrawal_reject",
      "page": "withdrawal",
      "handler": "includes/dmm/modules/class-aieo-dmm-withdrawal.php:49",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-withdrawal.php:1424"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "includes/dmm/modules/class-aieo-dmm-withdrawal.php:1943",
      "selector": "[data-aieo-action=\"withdrawal.reject\"]",
      "selector_source": "markup",
      "variants": [],
      "confirm": "Refuse this request and email the customer?",
      "label": "Refuse and tell the customer",
      "description": "Refuses a declaration on the grounds you ticked and emails the customer immediately, quoting those grounds verbatim, after asking you to confirm.",
      "informs_customer": true,
      "safe_to_demo": false,
      "side_effects": "emails the customer immediately; irreversible"
    },
    {
      "id": "workflows.wf_status",
      "ajax": "aieo_dmm_wf_status",
      "page": "workflows",
      "handler": "includes/dmm/modules/class-aieo-dmm-workflows.php:39",
      "callers": [
        "assets/pages/dmm/workflows.php:269",
        "assets/pages/dmm/workflows.php:270"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-wf-activate",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Activate / Pause",
      "description": "Switches a campaign between active and paused, which is the difference between it sending on its trigger and sitting still.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "activating puts a campaign live, and it will start emailing customers when its trigger fires"
    },
    {
      "id": "workflows.wf_search_terms",
      "ajax": "aieo_wf_search_terms",
      "page": "workflows",
      "handler": "includes/dmm/modules/class-aieo-dmm-workflows.php:45",
      "callers": [
        "assets/pages/dmm/workflows.php:389"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Category and brand search",
      "description": "Finds categories, brands or tags while you are building a rule, so a condition can name one without typing its id.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "workflows.wf_delete",
      "ajax": "aieo_dmm_wf_delete",
      "page": "workflows",
      "handler": "includes/dmm/modules/class-aieo-dmm-workflows.php:38",
      "callers": [
        "assets/pages/dmm/workflows.php:274"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-wf-del",
      "selector_source": "derived",
      "variants": [],
      "confirm": "Delete workflow?",
      "label": "Delete",
      "description": "Removes a campaign and its schedule permanently, leaving the messages it has already sent alone.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "irreversible; the campaign definition and its steps are gone",
      "context": "campaign"
    },
    {
      "id": "workflows.wf_get",
      "ajax": "aieo_dmm_wf_get",
      "page": "workflows",
      "handler": "includes/dmm/modules/class-aieo-dmm-workflows.php:36",
      "callers": [
        "assets/pages/dmm/workflows.php:326"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Edit",
      "description": "Opens one campaign in the composer with its trigger, audience and steps as saved, ready to change.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "workflows.wf_preview",
      "ajax": "aieo_dmm_wf_preview",
      "page": "workflows",
      "handler": "includes/dmm/modules/class-aieo-dmm-workflows.php:41",
      "callers": [
        "assets/pages/dmm/workflows.php:280"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-wf-del",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Preview",
      "description": "Renders the campaign's subject and body with sample data so you can read what a customer would get, without sending anything.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "renders only; nothing is sent and nothing is stored"
    },
    {
      "id": "workflows.wf_search_products",
      "ajax": "aieo_wf_search_products",
      "page": "workflows",
      "handler": "includes/dmm/modules/class-aieo-dmm-workflows.php:44",
      "callers": [
        "assets/pages/dmm/workflows.php:389"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Product search",
      "description": "Finds products by name or id while you are building a rule, so a condition can name a specific item.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only"
    },
    {
      "id": "workflows.wf_list",
      "ajax": "aieo_dmm_wf_list",
      "page": "workflows",
      "handler": "includes/dmm/modules/class-aieo-dmm-workflows.php:35",
      "callers": [
        "assets/pages/dmm/workflows.php:209"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Refresh list",
      "description": "Reloads the campaign list with each one's current status and its send and open figures, refreshing those stats if they have gone stale.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "reads only, apart from refreshing a stats cache"
    },
    {
      "id": "workflows.wf_run",
      "ajax": "aieo_dmm_wf_run",
      "page": "workflows",
      "handler": "includes/dmm/modules/class-aieo-dmm-workflows.php:40",
      "callers": [
        "assets/pages/dmm/workflows.php:271"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-wf-run",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Run now",
      "description": "Queues this campaign against everyone in its audience at once instead of waiting for its trigger, and emails every one of them as soon as the engine runs.",
      "informs_customer": true,
      "safe_to_demo": false,
      "side_effects": "enqueues real messages to real customers; the only thing between them and an inbox is whether the engine is paused"
    },
    {
      "id": "workflows.wf_save",
      "ajax": "aieo_dmm_wf_save",
      "page": "workflows",
      "handler": "includes/dmm/modules/class-aieo-dmm-workflows.php:37",
      "callers": [
        "assets/pages/dmm/workflows.php:522"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-wf-addstep",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save campaign",
      "description": "Stores the campaign's name, trigger, audience and every step, creating it if it is new, and refuses to save one without a name.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "overwrites a live campaign definition, which changes what it will send next time it fires"
    },
    {
      "id": "workflows.wf_test",
      "ajax": "aieo_dmm_wf_test",
      "page": "workflows",
      "handler": "includes/dmm/modules/class-aieo-dmm-workflows.php:42",
      "callers": [
        "assets/pages/dmm/workflows.php:288"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Send test",
      "description": "Sends one rendered copy to an address you type and nowhere else, bypassing the paused engine and the opt-out list, and issuing no coupon.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "sends a real email, to the address you type rather than to a customer"
    }
  ]
}