{
  "generated_by": "bin/harvest-actions.py",
  "count": 652,
  "actions": [
    {
      "id": "login_security.2fa_begin",
      "ajax": "aieo_2fa_begin",
      "page": "login_security",
      "handler": "includes/login-security/class-aieo-two-factor.php:82",
      "callers": [
        "includes/login-security/class-aieo-two-factor.php:714"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-2fa-begin",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Set up two-factor authentication",
      "description": "Creates a new secret for your own account and shows the QR code to scan, but changes nothing until you confirm a code from the app.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "discards any half-finished setup already in progress for this account",
      "context": "user profile"
    },
    {
      "id": "login_security.2fa_confirm",
      "ajax": "aieo_2fa_confirm",
      "page": "login_security",
      "handler": "includes/login-security/class-aieo-two-factor.php:83",
      "callers": [
        "includes/login-security/class-aieo-two-factor.php:721"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-2fa-code",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Confirm",
      "description": "Switches two-factor authentication on for your own account once the code proves your app is working, and shows your recovery codes for the only time.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "emails the account holder; a code from your phone is required at every sign-in afterwards",
      "context": "user profile"
    },
    {
      "id": "login_security.2fa_disable",
      "ajax": "aieo_2fa_disable",
      "page": "login_security",
      "handler": "includes/login-security/class-aieo-two-factor.php:84",
      "callers": [
        "includes/login-security/class-aieo-two-factor.php:733"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-2fa-disable",
      "selector_source": "derived",
      "variants": [],
      "confirm": "Switch off two-factor authentication for this account? It will be protected by its password alone.",
      "label": "Switch off",
      "description": "Turns two-factor authentication off for an account and destroys its secret and recovery codes, leaving it protected by its password alone.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "emails the account holder; the account must set it up again from scratch",
      "context": "user profile"
    },
    {
      "id": "login_security.2fa_recovery",
      "ajax": "aieo_2fa_recovery",
      "page": "login_security",
      "handler": "includes/login-security/class-aieo-two-factor.php:85",
      "callers": [
        "includes/login-security/class-aieo-totp.php:61",
        "includes/login-security/class-aieo-two-factor.php:739"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-2fa-recovery",
      "selector_source": "derived",
      "variants": [],
      "confirm": "Issue a new set of recovery codes? Any codes you already saved stop working.",
      "label": "Issue new recovery codes",
      "description": "Replaces your recovery codes with a fresh set and shows them once, after which the codes you saved before stop working.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "emails the account holder; previously saved codes are invalidated immediately",
      "context": "user profile"
    },
    {
      "id": "action_help",
      "ajax": "aieo_action_help",
      "page": "",
      "handler": "includes/dmm/class-aieo-action-telemetry.php:58",
      "callers": [
        "assets/js/aieo-admin-actions.js:237",
        "assets/js/aieo-admin-actions.min.js:1",
        "includes/dmm/class-aieo-action-telemetry.php:102",
        "includes/dmm/class-aieo-action-telemetry.php:214"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-action-help",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "action_telemetry",
      "ajax": "aieo_action_telemetry",
      "page": "",
      "handler": "includes/dmm/class-aieo-action-telemetry.php:57",
      "callers": [
        "assets/js/aieo-admin-actions.js:206",
        "assets/js/aieo-admin-actions.min.js:1",
        "includes/dmm/class-aieo-action-telemetry.php:210",
        "includes/dmm/class-aieo-action-telemetry.php:232"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-action-help",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:1015"
      ],
      "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_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:1017"
      ],
      "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_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:1016"
      ],
      "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": "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:731"
      ],
      "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.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:732"
      ],
      "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:704"
      ],
      "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.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:730"
      ],
      "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": "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:169",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-orders-analytics.php:1368",
        "includes/dmm/modules/class-aieo-dmm-product-orders-analytics.php:1373",
        "includes/dmm/modules/class-aieo-dmm-product-orders-analytics.php:1380"
      ],
      "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:172",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-orders-analytics.php:1415"
      ],
      "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:170",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-orders-analytics.php:1406"
      ],
      "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:168",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-orders-analytics.php:1395"
      ],
      "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:171",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-tools.php:587",
        "includes/dmm/modules/class-aieo-dmm-tools.php:685"
      ],
      "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:167",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-orders-analytics.php:1356"
      ],
      "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": "attribution_log",
      "ajax": "aieo_attribution_log",
      "page": "",
      "handler": "includes/class-aieo-attribution.php:171",
      "callers": [
        "assets/js/aieo-attribution-client.js:329",
        "assets/js/aieo-attribution-client.js:6",
        "assets/js/aieo-attribution-client.min.js:1",
        "assets/js/aieo-swatches.js:2996",
        "assets/js/aieo-swatches.js:3160",
        "assets/js/aieo-swatches.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": true,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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": "brand_pods_migrator.brand_pods_migrate_audit",
      "ajax": "aieo_brand_pods_migrate_audit",
      "page": "brand_pods_migrator",
      "handler": "includes/dmm/migrators/class-aieo-dmm-brand-pods-migrator.php:41",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:485"
      ],
      "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_slider_bundle",
      "ajax": "aieo_brand_slider_bundle",
      "page": "",
      "handler": "includes/class-aieo-core-brand-vitals.php:59",
      "callers": [],
      "caller_kinds": [],
      "public": true,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "cache_clear_all",
      "ajax": "aieo_cache_clear_all",
      "page": "",
      "handler": "includes/class-recommendations-cache.php:242",
      "callers": [
        "includes/class-recommendations-cache.php:373"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-cache-clear-all",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "cache_clear_expired",
      "ajax": "aieo_cache_clear_expired",
      "page": "",
      "handler": "includes/class-recommendations-cache.php:243",
      "callers": [
        "includes/class-recommendations-cache.php:353"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-cache-clear-expired",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "cache_get_stats",
      "ajax": "aieo_cache_get_stats",
      "page": "",
      "handler": "includes/class-recommendations-cache.php:241",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "captcha.test_keys",
      "ajax": "aieo_captcha_test_keys",
      "page": "captcha",
      "handler": "includes/dmm/modules/class-aieo-dmm-captcha.php:101",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-captcha.php:769"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:325"
      ],
      "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:235"
      ],
      "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:345"
      ],
      "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": "catalog_importer.catalog_feed_analyze",
      "ajax": "aieo_catalog_feed_analyze",
      "page": "catalog_importer",
      "handler": "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:145",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:2544"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-cati-feed-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "catalog_importer.catalog_feed_catmap_accept",
      "ajax": "aieo_catalog_feed_catmap_accept",
      "page": "catalog_importer",
      "handler": "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:160",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:3138"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-cati-catmap-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "catalog_importer.catalog_feed_catmap_list",
      "ajax": "aieo_catalog_feed_catmap_list",
      "page": "catalog_importer",
      "handler": "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:157",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:3119"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-cati-catmap-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "catalog_importer.catalog_feed_catmap_save",
      "ajax": "aieo_catalog_feed_catmap_save",
      "page": "catalog_importer",
      "handler": "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:159",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:3147"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-cati-catmap-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "catalog_importer.catalog_feed_catmap_suggest",
      "ajax": "aieo_catalog_feed_catmap_suggest",
      "page": "catalog_importer",
      "handler": "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:158",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:3127"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-cati-catmap-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "catalog_importer.catalog_feed_delete",
      "ajax": "aieo_catalog_feed_delete",
      "page": "catalog_importer",
      "handler": "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:148",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:2705"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-cati-feed-delete",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "catalog_importer.catalog_feed_dryrun",
      "ajax": "aieo_catalog_feed_dryrun",
      "page": "catalog_importer",
      "handler": "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:146",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:2594"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-cati-feed-preview",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "catalog_importer.catalog_feed_link_brands",
      "ajax": "aieo_catalog_feed_link_brands",
      "page": "catalog_importer",
      "handler": "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:151",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:3066"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-cati-linkbrands-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "catalog_importer.catalog_feed_load",
      "ajax": "aieo_catalog_feed_load",
      "page": "catalog_importer",
      "handler": "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:150",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:2721"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-cati-feed-save-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "catalog_importer.catalog_feed_run_now",
      "ajax": "aieo_catalog_feed_run_now",
      "page": "catalog_importer",
      "handler": "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:149",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:2681",
        "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:2695"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-cati-feed-run",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "catalog_importer.catalog_feed_save",
      "ajax": "aieo_catalog_feed_save",
      "page": "catalog_importer",
      "handler": "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:147",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:2652"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-cati-feed-name",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "catalog_importer.catalog_feed_search_terms",
      "ajax": "aieo_catalog_feed_search_terms",
      "page": "catalog_importer",
      "handler": "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:156",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:3675"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_catalog_feed_search_terms\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "catalog_importer.catalog_feed_vocab_backfill",
      "ajax": "aieo_catalog_feed_vocab_backfill",
      "page": "catalog_importer",
      "handler": "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:164",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:3173"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-cati-feed-vocab",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Learn vocabulary",
      "description": "Reads the whole live feed and stores the supplier's own product wording for invoice matching. Imports nothing and touches no product.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "stores supplier vocabulary rows"
    },
    {
      "id": "catalog_importer.catalog_feed_vocab_flagged",
      "ajax": "aieo_catalog_feed_vocab_flagged",
      "page": "catalog_importer",
      "handler": "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:165",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:3219"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-cati-vocab-table",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "List vocabulary contradictions",
      "description": "Lists supplier vocabulary rows that a confirmed invoice line has contradicted, for review. Reads only.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "none"
    },
    {
      "id": "catalog_importer.catalog_feed_vocab_rule",
      "ajax": "aieo_catalog_feed_vocab_rule",
      "page": "catalog_importer",
      "handler": "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:166",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:3225"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-cati-vocab-table",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Rule on a vocabulary row",
      "description": "Keeps, suppresses or restores one supplier vocabulary row. A suppressed row stops matching invoice lines until it is restored.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "changes whether the vocabulary row matches"
    },
    {
      "id": "catalog_importer.catalog_import_process",
      "ajax": "aieo_catalog_import_process",
      "page": "catalog_importer",
      "handler": "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:141",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:2214"
      ],
      "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:138",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:2169"
      ],
      "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:140",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:2229"
      ],
      "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:139",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-catalog-importer.php:2176"
      ],
      "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": "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": "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": "chat_clear_failed_embeddings",
      "ajax": "aieo_chat_clear_failed_embeddings",
      "page": "",
      "handler": "includes/chat/class-embedding-failure-tracker.php:81",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "chat_delete_embeddings",
      "ajax": "aieo_chat_delete_embeddings",
      "page": "",
      "handler": "includes/chat/class-embedding-manager.php:43",
      "callers": [
        "assets/pages/ai-eshop-chat.php:4645",
        "assets/pages/ai-eshop-chat.php:4700"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "chat_generate_embeddings",
      "ajax": "aieo_chat_generate_embeddings",
      "page": "",
      "handler": "includes/chat/class-embedding-manager.php:40",
      "callers": [
        "assets/pages/ai-eshop-chat.php:4244"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "chat_generate_taxonomy_embeddings",
      "ajax": "aieo_chat_generate_taxonomy_embeddings",
      "page": "",
      "handler": "includes/chat/class-embedding-manager.php:41",
      "callers": [
        "assets/pages/ai-eshop-chat.php:4244"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "chat_get_available_engines",
      "ajax": "aieo_chat_get_available_engines",
      "page": "",
      "handler": "includes/chat/class-embedding-manager.php:47",
      "callers": [
        "assets/pages/ai-eshop-chat.php:3832"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-chat-deduplication-mode",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "chat_get_delete_counts",
      "ajax": "aieo_chat_get_delete_counts",
      "page": "",
      "handler": "includes/chat/class-embedding-manager.php:46",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "chat_get_delete_stats",
      "ajax": "aieo_chat_get_delete_stats",
      "page": "",
      "handler": "includes/chat/class-embedding-manager.php:48",
      "callers": [
        "assets/pages/ai-eshop-chat.php:4488"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-chat-delete-selected",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "chat_get_engine_stats",
      "ajax": "aieo_chat_get_engine_stats",
      "page": "",
      "handler": "includes/chat/class-embedding-manager.php:44",
      "callers": [
        "assets/pages/ai-eshop-chat.php:3695"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-chat-engine-stats",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "chat_get_failed_embeddings",
      "ajax": "aieo_chat_get_failed_embeddings",
      "page": "",
      "handler": "includes/chat/class-embedding-failure-tracker.php:79",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "chat_message",
      "ajax": "aieo_chat_message",
      "page": "",
      "handler": "includes/chat/class-chat-api.php:53",
      "callers": [],
      "caller_kinds": [],
      "public": true,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "chat_model_detect",
      "ajax": "aieo_chat_model_detect",
      "page": "",
      "handler": "includes/chat/class-model-registry.php:69",
      "callers": [
        "assets/pages/ai-eshop-chat.php:3366"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-tester-model",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "chat_model_test",
      "ajax": "aieo_chat_model_test",
      "page": "",
      "handler": "includes/chat/class-model-registry.php:68",
      "callers": [
        "assets/pages/ai-eshop-chat.php:3335"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-tester-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "chat_regenerate_embedding",
      "ajax": "aieo_chat_regenerate_embedding",
      "page": "",
      "handler": "includes/chat/class-embedding-manager.php:42",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "chat_retry_failed_embeddings",
      "ajax": "aieo_chat_retry_failed_embeddings",
      "page": "",
      "handler": "includes/chat/class-embedding-failure-tracker.php:80",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "chat_save_content_selection",
      "ajax": "aieo_chat_save_content_selection",
      "page": "",
      "handler": "includes/chat/loaders/admin-loader.php:26",
      "callers": [
        "assets/pages/ai-eshop-chat.php:3675"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "chat_save_last_trained_engine",
      "ajax": "aieo_chat_save_last_trained_engine",
      "page": "",
      "handler": "includes/chat/class-embedding-manager.php:49",
      "callers": [
        "assets/pages/ai-eshop-chat.php:4176"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "chat_save_quick_settings",
      "ajax": "aieo_chat_save_quick_settings",
      "page": "",
      "handler": "assets/pages/ai-eshop-chat.php:307",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "chat_save_settings",
      "ajax": "aieo_chat_save_settings",
      "page": "",
      "handler": "includes/chat/loaders/admin-loader.php:27",
      "callers": [
        "assets/pages/ai-eshop-chat.php:20",
        "assets/pages/ai-eshop-chat.php:2902",
        "assets/pages/ai-eshop-chat.php:3803"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "chat_update_embedding_model",
      "ajax": "aieo_chat_update_embedding_model",
      "page": "",
      "handler": "includes/chat/class-embedding-manager.php:45",
      "callers": [
        "assets/pages/ai-eshop-chat.php:3765"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-chat-deduplication-mode",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "check_migration_status",
      "ajax": "aieo_check_migration_status",
      "page": "",
      "handler": "includes/class-session-schema-migrator.php:40",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "check_rooster_credits",
      "ajax": "aieo_check_rooster_credits",
      "page": "",
      "handler": "includes/class-eshop-optimizer.php:65",
      "callers": [
        "assets/pages/ai-eshop-chat.php:3482",
        "assets/pages/ai-eshop-chat.php:3483",
        "includes/class-eshop-optimizer.php:6174",
        "includes/class-eshop-optimizer.php:6178"
      ],
      "caller_kinds": [
        "php",
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-api-validation-results",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "check_vitals_data",
      "ajax": "aieo_check_vitals_data",
      "page": "",
      "handler": "includes/class-eshop-optimizer.php:87",
      "callers": [
        "assets/js/export-progress.js:657",
        "assets/js/export-progress.min.js:1",
        "includes/class-eshop-optimizer.php:3387"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-export-log",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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.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": "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.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": "consent_log",
      "ajax": "aieo_consent_log",
      "page": "",
      "handler": "includes/consent/class-aieo-consent.php:381",
      "callers": [
        "includes/class-aieo-signal-registry.php:3226",
        "includes/class-aieo-signal-registry.php:3227",
        "includes/consent/class-aieo-consent.php:1611",
        "includes/consent/class-aieo-consent.php:526",
        "includes/dmm/data/table-defects.php:72"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": true,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "consent_scan",
      "ajax": "aieo_consent_scan",
      "page": "",
      "handler": "includes/consent/class-aieo-consent.php:383",
      "callers": [
        "includes/consent/class-aieo-consent.php:1694",
        "includes/consent/class-aieo-consent.php:60"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": true,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:367"
      ],
      "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_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:310"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-cd-tablebox",
      "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:371"
      ],
      "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_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:264"
      ],
      "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_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:287"
      ],
      "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_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:355"
      ],
      "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": "delete_business_info",
      "ajax": "aieo_delete_business_info",
      "page": "",
      "handler": "includes/chat/class-business-info-manager.php:58",
      "callers": [
        "assets/pages/ai-eshop-chat.php:4950"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-business-info-entry",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:401"
      ],
      "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:417"
      ],
      "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:429"
      ],
      "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": "dismiss_banner",
      "ajax": "aieo_dismiss_banner",
      "page": "",
      "handler": "ai-eshop-optimizer.php:3741",
      "callers": [
        "ai-eshop-optimizer.php:3726",
        "assets/pages/rotating-banner-wordpress.php:606",
        "assets/pages/rotating-banner-wordpress.php:607"
      ],
      "caller_kinds": [
        "php",
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:349"
      ],
      "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": "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:431"
      ],
      "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:286"
      ],
      "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": "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:675"
      ],
      "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": "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:168"
      ],
      "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_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:211"
      ],
      "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_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:158"
      ],
      "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_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:195"
      ],
      "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_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:222"
      ],
      "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:175"
      ],
      "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": "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:204"
      ],
      "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": "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:1067"
      ],
      "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.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:184"
      ],
      "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:135",
      "callers": [
        "assets/pages/dmm/branch-scanner.php:97"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "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.branch_save",
      "ajax": "aieo_dmm_branch_save",
      "page": "branch_scanner",
      "handler": "includes/dmm/modules/class-aieo-dmm-branch-scanner.php:134",
      "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.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/pages/dmm/brand-discounts.php:221"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "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.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:162"
      ],
      "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_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:664"
      ],
      "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.save",
      "ajax": "aieo_dmm_brand_extras_save",
      "page": "brand_extras",
      "handler": "includes/dmm/modules/class-aieo-dmm-brand-extras.php:60",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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": [
        "assets/pages/dmm/brand-gifts.php:282"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "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.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:714"
      ],
      "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_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:222"
      ],
      "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:720",
        "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": "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:325"
      ],
      "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.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:1448"
      ],
      "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.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:1431",
        "includes/dmm/modules/class-aieo-dmm-cancellations.php:1455"
      ],
      "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": "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": "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.save",
      "ajax": "aieo_dmm_category_extras_save",
      "page": "category_extras",
      "handler": "includes/dmm/modules/class-aieo-dmm-category-extras.php:106",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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": "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:551"
      ],
      "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:727"
      ],
      "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:642"
      ],
      "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:35",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-checkout-modal.php:140"
      ],
      "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:228"
      ],
      "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": "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:719",
        "includes/dmm/modules/class-aieo-dmm-complementary.php:931"
      ],
      "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.delete",
      "ajax": "aieo_dmm_complementary_delete",
      "page": "complementary",
      "handler": "includes/dmm/modules/class-aieo-dmm-complementary.php:87",
      "callers": [
        "assets/pages/dmm/complementary.php:152"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "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:247"
      ],
      "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:266"
      ],
      "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.migrate",
      "ajax": "aieo_dmm_complementary_migrate",
      "page": "complementary",
      "handler": "includes/dmm/modules/class-aieo-dmm-complementary.php:90",
      "callers": [
        "assets/pages/dmm/complementary.php:292"
      ],
      "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.save",
      "ajax": "aieo_dmm_complementary_save",
      "page": "complementary",
      "handler": "includes/dmm/modules/class-aieo-dmm-complementary.php:85",
      "callers": [
        "assets/pages/dmm/complementary.php:223",
        "assets/pages/dmm/complementary.php:66"
      ],
      "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:80",
        "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": "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:536"
      ],
      "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": "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:555"
      ],
      "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:514"
      ],
      "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": "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:166"
      ],
      "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:234"
      ],
      "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:219"
      ],
      "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": "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:364"
      ],
      "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": "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.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.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": "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:529"
      ],
      "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:540"
      ],
      "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:515"
      ],
      "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:167",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-custom-tabs.php:361"
      ],
      "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:166",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-custom-tabs.php:353"
      ],
      "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:275"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-cp-dossier",
      "selector_source": "derived",
      "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:262"
      ],
      "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.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:1541"
      ],
      "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:1522"
      ],
      "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:1507"
      ],
      "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": "delete_export_job",
      "ajax": "aieo_dmm_delete_export_job",
      "page": "",
      "handler": "includes/dmm/class-aieo-dmm.php:171",
      "callers": [
        "assets/js/dmm.js:489",
        "assets/js/dmm.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-dmm-delete-export-job",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "demo_previews_toggle",
      "ajax": "aieo_dmm_demo_previews_toggle",
      "page": "",
      "handler": "includes/dmm/reports/class-aieo-report-demo.php:346",
      "callers": [
        "includes/dmm/reports/class-aieo-report-demo.php:250"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "duplicate_simples.dupsimple_attrs",
      "ajax": "aieo_dmm_dupsimple_attrs",
      "page": "duplicate_simples",
      "handler": "includes/dmm/modules/class-aieo-dmm-duplicate-simples.php:145",
      "callers": [
        "assets/pages/dmm/duplicate-simples-attributes.php:202"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ds-attr-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "duplicate_simples.dupsimple_bulk_merge",
      "ajax": "aieo_dmm_dupsimple_bulk_merge",
      "page": "duplicate_simples",
      "handler": "includes/dmm/modules/class-aieo-dmm-duplicate-simples.php:144",
      "callers": [
        "assets/pages/dmm/duplicate-simples.php:684"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ds-bulk-go",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "duplicate_simples.dupsimple_bulk_preview",
      "ajax": "aieo_dmm_dupsimple_bulk_preview",
      "page": "duplicate_simples",
      "handler": "includes/dmm/modules/class-aieo-dmm-duplicate-simples.php:143",
      "callers": [
        "assets/pages/dmm/duplicate-simples.php:655"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ds-bulk-slot",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "duplicate_simples.dupsimple_create_attr",
      "ajax": "aieo_dmm_dupsimple_create_attr",
      "page": "duplicate_simples",
      "handler": "includes/dmm/modules/class-aieo-dmm-duplicate-simples.php:147",
      "callers": [
        "assets/pages/dmm/duplicate-simples.php:606"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-ds-attr-name",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "duplicate_simples.dupsimple_merge",
      "ajax": "aieo_dmm_dupsimple_merge",
      "page": "duplicate_simples",
      "handler": "includes/dmm/modules/class-aieo-dmm-duplicate-simples.php:139",
      "callers": [
        "assets/pages/dmm/duplicate-simples-manual.php:182",
        "assets/pages/dmm/duplicate-simples.php:563"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-ds-preview",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "duplicate_simples.dupsimple_preview",
      "ajax": "aieo_dmm_dupsimple_preview",
      "page": "duplicate_simples",
      "handler": "includes/dmm/modules/class-aieo-dmm-duplicate-simples.php:138",
      "callers": [
        "assets/pages/dmm/duplicate-simples-manual.php:168",
        "assets/pages/dmm/duplicate-simples.php:546"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ds-manual-preview",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "duplicate_simples.dupsimple_propose",
      "ajax": "aieo_dmm_dupsimple_propose",
      "page": "duplicate_simples",
      "handler": "includes/dmm/modules/class-aieo-dmm-duplicate-simples.php:146",
      "callers": [
        "assets/pages/dmm/duplicate-simples.php:586"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-ds-propose-slot",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "duplicate_simples.dupsimple_purge",
      "ajax": "aieo_dmm_dupsimple_purge",
      "page": "duplicate_simples",
      "handler": "includes/dmm/modules/class-aieo-dmm-duplicate-simples.php:141",
      "callers": [
        "assets/pages/dmm/duplicate-simples-log.php:128",
        "assets/pages/dmm/duplicate-simples-log.php:136"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-ds-purge",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "duplicate_simples.dupsimple_save",
      "ajax": "aieo_dmm_dupsimple_save",
      "page": "duplicate_simples",
      "handler": "includes/dmm/modules/class-aieo-dmm-duplicate-simples.php:137",
      "callers": [
        "assets/pages/dmm/duplicate-simples.php:702"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ds-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "duplicate_simples.dupsimple_search",
      "ajax": "aieo_dmm_dupsimple_search",
      "page": "duplicate_simples",
      "handler": "includes/dmm/modules/class-aieo-dmm-duplicate-simples.php:142",
      "callers": [
        "assets/pages/dmm/duplicate-simples-manual.php:112"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ds-results",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "duplicate_simples.dupsimple_undo",
      "ajax": "aieo_dmm_dupsimple_undo",
      "page": "duplicate_simples",
      "handler": "includes/dmm/modules/class-aieo-dmm-duplicate-simples.php:140",
      "callers": [
        "assets/pages/dmm/duplicate-simples-log.php:113"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-ds-undo",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "duplicate_simples.dupsimple_wcfeature",
      "ajax": "aieo_dmm_dupsimple_wcfeature",
      "page": "duplicate_simples",
      "handler": "includes/dmm/modules/class-aieo-dmm-duplicate-simples.php:148",
      "callers": [
        "assets/pages/dmm/duplicate-simples-attributes.php:183"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-ds-wcfeature-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:156",
        "assets/pages/dmm/marketplace-feeds.php:678"
      ],
      "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:1103"
      ],
      "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_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:992"
      ],
      "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": "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:370",
        "assets/js/dmm.js:376",
        "assets/js/dmm.min.js:1",
        "assets/pages/dmm/_marketplace-feeds-table.php:153"
      ],
      "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",
      "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:1092",
        "assets/pages/dmm/marketplace-feeds.php:442"
      ],
      "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_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_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:947"
      ],
      "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": "free_shipping.add_exclusions",
      "ajax": "aieo_dmm_free_shipping_add_exclusions",
      "page": "free_shipping",
      "handler": "includes/dmm/modules/class-aieo-dmm-free-shipping.php:35",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:597"
      ],
      "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.export_exclusions",
      "ajax": "aieo_dmm_free_shipping_export_exclusions",
      "page": "free_shipping",
      "handler": "includes/dmm/modules/class-aieo-dmm-free-shipping.php:37",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:391",
        "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_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:236",
        "includes/dmm/modules/class-aieo-dmm-free-shipping.php:263",
        "includes/dmm/modules/class-aieo-dmm-free-shipping.php:391"
      ],
      "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": "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:555"
      ],
      "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": "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:118",
        "includes/dmm/modules/class-aieo-dmm-shipment-cost-reports.php:76"
      ],
      "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": "gallery_layout.save",
      "ajax": "aieo_dmm_gallery_layout_save",
      "page": "gallery_layout",
      "handler": "includes/dmm/modules/class-aieo-dmm-gallery-layout.php:37",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-gallery-layout.php:305",
        "includes/dmm/modules/class-aieo-dmm-gallery-layout.php:307",
        "includes/dmm/modules/class-aieo-dmm-gallery-layout.php:309"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-dmm-ao-form",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:128"
      ],
      "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": "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:1772"
      ],
      "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": "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:599"
      ],
      "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:493"
      ],
      "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:617"
      ],
      "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:767"
      ],
      "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:510"
      ],
      "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_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:245"
      ],
      "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_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:305",
        "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_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:305",
        "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": "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:225"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "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_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_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:327"
      ],
      "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_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_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:400",
        "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": "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.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": "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:104"
      ],
      "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": "seo_meta_batch.metab_ai_draft",
      "ajax": "aieo_dmm_metab_ai_draft",
      "page": "seo_meta_batch",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-meta-batch.php:75",
      "callers": [
        "assets/pages/dmm/seo/meta-batch.php:148"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "seo_meta_batch.metab_bulk",
      "ajax": "aieo_dmm_metab_bulk",
      "page": "seo_meta_batch",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-meta-batch.php:77",
      "callers": [
        "assets/pages/dmm/seo/meta-batch.php:167"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "seo_meta_batch.metab_decide",
      "ajax": "aieo_dmm_metab_decide",
      "page": "seo_meta_batch",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-meta-batch.php:76",
      "callers": [
        "assets/pages/dmm/seo/meta-batch.php:142"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "seo_meta_batch.metab_use_ours",
      "ajax": "aieo_dmm_metab_use_ours",
      "page": "seo_meta_batch",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-meta-batch.php:74",
      "callers": [
        "assets/pages/dmm/seo/meta-batch.php:145"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "cancellations.metrics_backfill",
      "ajax": "aieo_dmm_metrics_backfill",
      "page": "cancellations",
      "handler": "includes/dmm/modules/class-aieo-dmm-cancellations.php:50",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:793",
        "includes/dmm/modules/class-aieo-dmm-cancellations.php:820",
        "includes/dmm/modules/class-aieo-dmm-cancellations.php:851"
      ],
      "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.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:874"
      ],
      "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": "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:209"
      ],
      "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": "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:3083"
      ],
      "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:2984",
        "includes/dmm/modules/class-aieo-dmm-navigator.php:2995",
        "includes/dmm/modules/class-aieo-dmm-navigator.php:3018"
      ],
      "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": "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:324"
      ],
      "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:570",
        "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_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:596",
        "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_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:208"
      ],
      "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_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": "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:210"
      ],
      "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": "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:301"
      ],
      "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": "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:306",
        "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:274"
      ],
      "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:306",
        "assets/js/dmm.min.js:1",
        "assets/pages/dmm/orders-export.php:147"
      ],
      "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": "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:890"
      ],
      "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": "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:276"
      ],
      "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:154"
      ],
      "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:90"
      ],
      "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": "supplier_orders.preorder_batch_email",
      "ajax": "aieo_dmm_preorder_batch_email",
      "page": "supplier_orders",
      "handler": "includes/dmm/modules/class-aieo-dmm-supplier-orders.php:64",
      "callers": [
        "assets/pages/dmm/supplier-orders.php:214"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "branch_scanner.preorder_set_status",
      "ajax": "aieo_dmm_preorder_set_status",
      "page": "branch_scanner",
      "handler": "includes/dmm/modules/class-aieo-dmm-branch-scanner.php:137",
      "callers": [
        "assets/pages/dmm/supplier-orders.php:179",
        "includes/dmm/reports/definitions/supplier-preorders-queue.php:17"
      ],
      "caller_kinds": [
        "php",
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:308",
        "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:308",
        "assets/js/dmm.min.js:1",
        "assets/pages/dmm/price-export.php:53"
      ],
      "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": "product_card.save",
      "ajax": "aieo_dmm_product_card_save",
      "page": "product_card",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-card.php:36",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-card.php:633"
      ],
      "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:293",
        "includes/dmm/modules/class-aieo-dmm-product-categories.php:304"
      ],
      "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:102",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-display.php:1525",
        "includes/dmm/modules/class-aieo-dmm-product-display.php:1800",
        "includes/dmm/modules/class-aieo-dmm-product-display.php:1849"
      ],
      "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.toggle",
      "ajax": "aieo_dmm_product_display_toggle",
      "page": "product_display",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-display.php:101",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-display.php:1776"
      ],
      "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_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:377"
      ],
      "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:444"
      ],
      "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_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:292"
      ],
      "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": "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:371"
      ],
      "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": "product_display.recommendations_save_order",
      "ajax": "aieo_dmm_recommendations_save_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:1921"
      ],
      "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": "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": "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:355",
        "includes/dmm/modules/class-aieo-dmm-account-handling.php:396"
      ],
      "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": "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:1547"
      ],
      "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": "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:405",
        "assets/js/dmm.min.js:1",
        "assets/pages/dmm/role-pricing.php:433"
      ],
      "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.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:429",
        "assets/js/dmm.min.js:1",
        "assets/pages/dmm/role-pricing.php:436"
      ],
      "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.fetch_rows",
      "ajax": "aieo_dmm_role_pricing_fetch_rows",
      "page": "role_pricing",
      "handler": "includes/dmm/modules/class-aieo-dmm-role-pricing.php:39",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:443",
        "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.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:304",
        "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.save_cell",
      "ajax": "aieo_dmm_role_pricing_save_cell",
      "page": "role_pricing",
      "handler": "includes/dmm/modules/class-aieo-dmm-role-pricing.php:40",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:406"
      ],
      "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:304",
        "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_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": "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:616",
        "includes/dmm/modules/class-aieo-dmm-badges.php:627"
      ],
      "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": "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:351"
      ],
      "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": "save_enabled_modules",
      "ajax": "aieo_dmm_save_enabled_modules",
      "page": "",
      "handler": "includes/dmm/class-aieo-dmm.php:170",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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": "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:150"
      ],
      "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": "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": "save_recipe",
      "ajax": "aieo_dmm_save_recipe",
      "page": "",
      "handler": "includes/dmm/class-aieo-dmm.php:169",
      "callers": [
        "assets/pages/dmm/loyalty-classes.php:147"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-action=\"aieo_dmm_save_recipe\"]",
      "selector_source": "data-action",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:325"
      ],
      "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": "product_display.save_tab_order",
      "ajax": "aieo_dmm_save_tab_order",
      "page": "product_display",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-display.php:115",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-display.php:1618"
      ],
      "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": "branch_scanner.scanner_customer_lookup",
      "ajax": "aieo_dmm_scanner_customer_lookup",
      "page": "branch_scanner",
      "handler": "includes/dmm/modules/class-aieo-dmm-branch-scanner.php:145",
      "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_log_missing",
      "ajax": "aieo_dmm_scanner_log_missing",
      "page": "branch_scanner",
      "handler": "includes/dmm/modules/class-aieo-dmm-branch-scanner.php:142",
      "callers": [
        "assets/js/aieo-branch-scanner.js:249",
        "assets/js/aieo-branch-scanner.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-dmm-staff-scanner-full",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:140",
      "callers": [
        "assets/js/aieo-branch-scanner.js:269",
        "assets/js/aieo-branch-scanner.min.js:1",
        "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-staff-scanner-full",
      "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.scanner_staff_update",
      "ajax": "aieo_dmm_scanner_staff_update",
      "page": "branch_scanner",
      "handler": "includes/dmm/modules/class-aieo-dmm-branch-scanner.php:141",
      "callers": [
        "assets/js/aieo-branch-scanner.js:310",
        "assets/js/aieo-branch-scanner.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-dmm-staff-scanner-full",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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": "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": "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": "seo_linking.semantic_audience_scan",
      "ajax": "aieo_dmm_semantic_audience_scan",
      "page": "seo_linking",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-linking.php:87",
      "callers": [
        "assets/pages/dmm/seo-linking/settings.php:1100"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-sem-aud-scan-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "seo_linking.semantic_backfill_start",
      "ajax": "aieo_dmm_semantic_backfill_start",
      "page": "seo_linking",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-linking.php:92",
      "callers": [
        "assets/pages/dmm/seo-linking/settings.php:1427"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "seo_linking.semantic_backfill_status",
      "ajax": "aieo_dmm_semantic_backfill_status",
      "page": "seo_linking",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-linking.php:94",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "seo_linking.semantic_backfill_step",
      "ajax": "aieo_dmm_semantic_backfill_step",
      "page": "seo_linking",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-linking.php:93",
      "callers": [
        "assets/pages/dmm/seo-linking/settings.php:1380"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "seo_linking.semantic_bulk_decide",
      "ajax": "aieo_dmm_semantic_bulk_decide",
      "page": "seo_linking",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-linking.php:90",
      "callers": [
        "assets/pages/dmm/seo-linking/suggestions.php:426"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-semlink-decide",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "seo_linking.semantic_cluster_graph",
      "ajax": "aieo_dmm_semantic_cluster_graph",
      "page": "seo_linking",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-linking.php:101",
      "callers": [
        "assets/pages/dmm/seo-linking/clusters.php:195"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-cluster-graph-row",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "seo_linking.semantic_decide",
      "ajax": "aieo_dmm_semantic_decide",
      "page": "seo_linking",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-linking.php:89",
      "callers": [
        "assets/pages/dmm/seo-linking/suggestions.php:437",
        "assets/pages/dmm/seo-linking/suggestions.php:456",
        "assets/pages/dmm/seo-linking/suggestions.php:482",
        "assets/pages/dmm/seo-linking/suggestions.php:541",
        "assets/pages/dmm/seo-linking/suggestions.php:568"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-semlink-present",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "seo_linking.semantic_diag_analyze",
      "ajax": "aieo_dmm_semantic_diag_analyze",
      "page": "seo_linking",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-linking.php:84",
      "callers": [
        "assets/pages/dmm/seo-linking/diagnostics.php:663"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-semlink-diag-word",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "seo_linking.semantic_experiment",
      "ajax": "aieo_dmm_semantic_experiment",
      "page": "seo_linking",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-linking.php:99",
      "callers": [
        "assets/pages/dmm/seo-linking/diagnostics.php:609"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-sem-exp-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "seo_linking.semantic_graph_search",
      "ajax": "aieo_dmm_semantic_graph_search",
      "page": "seo_linking",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-linking.php:95",
      "callers": [
        "assets/pages/dmm/seo-linking/graph.php:91"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-sem-graph-hint",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "seo_linking.semantic_group_rows",
      "ajax": "aieo_dmm_semantic_group_rows",
      "page": "seo_linking",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-linking.php:96",
      "callers": [
        "assets/pages/dmm/seo-linking/related.php:378",
        "assets/pages/dmm/seo-linking/suggestions.php:661"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "seo_linking.semantic_ilj_import",
      "ajax": "aieo_dmm_semantic_ilj_import",
      "page": "seo_linking",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-linking.php:116",
      "callers": [
        "assets/pages/dmm/seo-linking/anchors.php:613"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ilj-apply",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "seo_linking.semantic_ilj_scan",
      "ajax": "aieo_dmm_semantic_ilj_scan",
      "page": "seo_linking",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-linking.php:115",
      "callers": [
        "assets/pages/dmm/seo-linking/anchors.php:588"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ilj-scan",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "seo_linking.semantic_model_save",
      "ajax": "aieo_dmm_semantic_model_save",
      "page": "seo_linking",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-linking.php:88",
      "callers": [
        "assets/pages/dmm/seo-linking/settings.php:1082"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-sem-model-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "seo_linking.semantic_mwe_decide",
      "ajax": "aieo_dmm_semantic_mwe_decide",
      "page": "seo_linking",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-linking.php:102",
      "callers": [
        "assets/pages/dmm/seo-linking/diagnostics.php:638"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-mwe-decide",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "seo_linking.semantic_object_search",
      "ajax": "aieo_dmm_semantic_object_search",
      "page": "seo_linking",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-linking.php:100",
      "callers": [
        "assets/pages/dmm/partials/table-controls.php:158"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "seo_linking.semantic_pair_scan",
      "ajax": "aieo_dmm_semantic_pair_scan",
      "page": "seo_linking",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-linking.php:103",
      "callers": [
        "assets/pages/dmm/seo-linking/diagnostics.php:722"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-sem-pairs-tablebox",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "seo_linking.semantic_reindex",
      "ajax": "aieo_dmm_semantic_reindex",
      "page": "seo_linking",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-linking.php:86",
      "callers": [
        "assets/pages/dmm/seo-linking/settings.php:1253",
        "assets/pages/dmm/seo-linking/settings.php:7"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-semlink-reindex-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "seo_linking.semantic_related_curate",
      "ajax": "aieo_dmm_semantic_related_curate",
      "page": "seo_linking",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-linking.php:91",
      "callers": [
        "assets/pages/dmm/seo-linking/related.php:397"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-semlink-related-table",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "seo_linking.semantic_rule_delete",
      "ajax": "aieo_dmm_semantic_rule_delete",
      "page": "seo_linking",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-linking.php:112",
      "callers": [
        "assets/pages/dmm/seo-linking/anchors.php:479"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-rule-delete",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "seo_linking.semantic_rule_map",
      "ajax": "aieo_dmm_semantic_rule_map",
      "page": "seo_linking",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-linking.php:118",
      "callers": [
        "assets/pages/dmm/seo-linking/anchors.php:551"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-rule-map-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "seo_linking.semantic_rule_save",
      "ajax": "aieo_dmm_semantic_rule_save",
      "page": "seo_linking",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-linking.php:111",
      "callers": [
        "assets/pages/dmm/seo-linking/anchors.php:438"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "seo_linking.semantic_rule_toggle",
      "ajax": "aieo_dmm_semantic_rule_toggle",
      "page": "seo_linking",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-linking.php:113",
      "callers": [
        "assets/pages/dmm/seo-linking/anchors.php:489"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-rule-toggle",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "seo_linking.semantic_rule_usage",
      "ajax": "aieo_dmm_semantic_rule_usage",
      "page": "seo_linking",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-linking.php:117",
      "callers": [
        "assets/pages/dmm/seo-linking/anchors.php:512"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-rule-usage",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "seo_linking.semantic_save_settings",
      "ajax": "aieo_dmm_semantic_save_settings",
      "page": "seo_linking",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-linking.php:85",
      "callers": [
        "assets/pages/dmm/seo-linking/settings.php:1182",
        "assets/pages/dmm/seo-linking/settings.php:6"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-semlink-settings-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "seo_linking.semantic_target_search",
      "ajax": "aieo_dmm_semantic_target_search",
      "page": "seo_linking",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-linking.php:114",
      "callers": [
        "assets/pages/dmm/seo-linking/anchors.php:408",
        "assets/pages/dmm/seo-linking/suggestions.php:494",
        "assets/pages/dmm/seo-linking/suggestions.php:507",
        "assets/pages/dmm/seo-linking/suggestions.php:600"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-semlink-retarget",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:342"
      ],
      "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:433"
      ],
      "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": "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:698"
      ],
      "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": "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:306"
      ],
      "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.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:414",
        "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.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:307",
        "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.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:307",
        "assets/js/dmm.min.js:1",
        "assets/pages/dmm/stock-import.php:53"
      ],
      "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": "supplier_orders.supplier_email_items",
      "ajax": "aieo_dmm_supplier_email_items",
      "page": "supplier_orders",
      "handler": "includes/dmm/modules/class-aieo-dmm-supplier-orders.php:56",
      "callers": [
        "assets/pages/dmm/supplier-orders.php:367"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-so-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "suppliers.supplier_get",
      "ajax": "aieo_dmm_supplier_get",
      "page": "suppliers",
      "handler": "includes/dmm/modules/class-aieo-dmm-suppliers.php:34",
      "callers": [
        "assets/pages/dmm/suppliers.php:140"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-sup-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "supplier_orders.supplier_order_items",
      "ajax": "aieo_dmm_supplier_order_items",
      "page": "supplier_orders",
      "handler": "includes/dmm/modules/class-aieo-dmm-supplier-orders.php:53",
      "callers": [
        "assets/pages/dmm/supplier-orders.php:313"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-so-results",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "supplier_orders.supplier_order_picker",
      "ajax": "aieo_dmm_supplier_order_picker",
      "page": "supplier_orders",
      "handler": "includes/dmm/modules/class-aieo-dmm-supplier-orders.php:55",
      "callers": [
        "assets/pages/dmm/supplier-orders.php:50"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "supplier_orders.supplier_order_suppliers",
      "ajax": "aieo_dmm_supplier_order_suppliers",
      "page": "supplier_orders",
      "handler": "includes/dmm/modules/class-aieo-dmm-supplier-orders.php:54",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "suppliers.supplier_save",
      "ajax": "aieo_dmm_supplier_save",
      "page": "suppliers",
      "handler": "includes/dmm/modules/class-aieo-dmm-suppliers.php:35",
      "callers": [
        "assets/pages/dmm/suppliers.php:162"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-sup-id",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:3402"
      ],
      "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.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:5047"
      ],
      "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.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:5992"
      ],
      "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:5993"
      ],
      "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": "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:5908"
      ],
      "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.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:5101"
      ],
      "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": "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:853"
      ],
      "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:874",
        "assets/pages/dmm/swatches.php:881"
      ],
      "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.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:929"
      ],
      "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.migrate",
      "ajax": "aieo_dmm_swatches_migrate",
      "page": "swatches",
      "handler": "includes/dmm/modules/class-aieo-dmm-swatches.php:82",
      "callers": [
        "assets/pages/dmm/swatches.php:861"
      ],
      "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:845"
      ],
      "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.save",
      "ajax": "aieo_dmm_swatches_save",
      "page": "swatches",
      "handler": "includes/dmm/modules/class-aieo-dmm-swatches.php:78",
      "callers": [
        "assets/pages/dmm/swatches.php:921"
      ],
      "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.stats",
      "ajax": "aieo_dmm_swatches_stats",
      "page": "swatches",
      "handler": "includes/dmm/modules/class-aieo-dmm-swatches.php:79",
      "callers": [
        "assets/pages/dmm/swatches.php:827"
      ],
      "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.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:889"
      ],
      "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": "theme_compat.detect",
      "ajax": "aieo_dmm_theme_compat_detect",
      "page": "theme_compat",
      "handler": "includes/dmm/modules/class-aieo-dmm-theme-compat.php:33",
      "callers": [
        "assets/pages/dmm/theme-compat.php:394"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-theme-compat-detect-feedback",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "theme_compat.save",
      "ajax": "aieo_dmm_theme_compat_save",
      "page": "theme_compat",
      "handler": "includes/dmm/modules/class-aieo-dmm-theme-compat.php:32",
      "callers": [
        "assets/pages/dmm/theme-compat.php:376"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-theme-compat-feedback",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:154"
      ],
      "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": "tools.barcode_lookup",
      "ajax": "aieo_dmm_tools_barcode_lookup",
      "page": "tools",
      "handler": "includes/dmm/modules/class-aieo-dmm-tools.php:82",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:142"
      ],
      "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": "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:550"
      ],
      "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": "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:739"
      ],
      "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:931"
      ],
      "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:423"
      ],
      "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_stock_hold",
      "ajax": "aieo_dmm_tools_save_stock_hold",
      "page": "tools",
      "handler": "includes/dmm/modules/class-aieo-dmm-tools.php:67",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-tools.php:390"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-stock-hold-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Save reservation window",
      "description": "Sets how long a checkout in progress may hold stock, without changing when unpaid orders are cancelled.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "changes how long stock is held for shoppers who are still at checkout"
    },
    {
      "id": "tools.sku_lookup",
      "ajax": "aieo_dmm_tools_sku_lookup",
      "page": "tools",
      "handler": "includes/dmm/modules/class-aieo-dmm-tools.php:81",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:388"
      ],
      "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": "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:476"
      ],
      "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_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:703"
      ],
      "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_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:685"
      ],
      "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": "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:628",
        "includes/dmm/modules/class-aieo-dmm-variations-gallery.php:651"
      ],
      "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:609"
      ],
      "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": "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:109"
      ],
      "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": "web-push.webpush_create_campaign",
      "ajax": "aieo_dmm_webpush_create_campaign",
      "page": "web-push",
      "handler": "includes/dmm/modules/class-aieo-dmm-web-push.php:350",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-web-push.php:2359"
      ],
      "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_launch_campaign",
      "ajax": "aieo_dmm_webpush_launch_campaign",
      "page": "web-push",
      "handler": "includes/dmm/modules/class-aieo-dmm-web-push.php:351",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-web-push.php:2433"
      ],
      "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:343",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-surveys.php:3355",
        "includes/dmm/modules/class-aieo-dmm-web-push.php:4555"
      ],
      "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:345",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-web-push-display.php:11",
        "includes/dmm/modules/class-aieo-dmm-web-push.php:3759"
      ],
      "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:346",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-web-push.php:2190"
      ],
      "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:347",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-web-push.php:1558",
        "includes/dmm/modules/class-aieo-dmm-web-push.php:1662"
      ],
      "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:344",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-web-push.php:4026"
      ],
      "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:349",
      "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:348",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-web-push.php:2227"
      ],
      "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": "web-push.webpush_toggle_engine",
      "ajax": "aieo_dmm_webpush_toggle_engine",
      "page": "web-push",
      "handler": "includes/dmm/modules/class-aieo-dmm-web-push.php:352",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-web-push.php:3906"
      ],
      "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": "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:336"
      ],
      "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:388"
      ],
      "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_list",
      "ajax": "aieo_dmm_wf_list",
      "page": "workflows",
      "handler": "includes/dmm/modules/class-aieo-dmm-workflows.php:35",
      "callers": [
        "assets/pages/dmm/workflows.php:267"
      ],
      "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_preview",
      "ajax": "aieo_dmm_wf_preview",
      "page": "workflows",
      "handler": "includes/dmm/modules/class-aieo-dmm-workflows.php:41",
      "callers": [
        "assets/pages/dmm/workflows.php:342"
      ],
      "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_run",
      "ajax": "aieo_dmm_wf_run",
      "page": "workflows",
      "handler": "includes/dmm/modules/class-aieo-dmm-workflows.php:40",
      "callers": [
        "assets/pages/dmm/workflows.php:333"
      ],
      "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:584"
      ],
      "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_status",
      "ajax": "aieo_dmm_wf_status",
      "page": "workflows",
      "handler": "includes/dmm/modules/class-aieo-dmm-workflows.php:39",
      "callers": [
        "assets/pages/dmm/workflows.php:331",
        "assets/pages/dmm/workflows.php:332"
      ],
      "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_test",
      "ajax": "aieo_dmm_wf_test",
      "page": "workflows",
      "handler": "includes/dmm/modules/class-aieo-dmm-workflows.php:42",
      "callers": [
        "assets/pages/dmm/workflows.php:350"
      ],
      "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"
    },
    {
      "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:267"
      ],
      "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.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:1399"
      ],
      "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:1502"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "includes/dmm/modules/class-aieo-dmm-withdrawal.php:2037",
      "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": "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:1432"
      ],
      "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.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": "invoice_scanner.docscan_apply",
      "ajax": "aieo_docscan_apply",
      "page": "invoice_scanner",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-docscan-review.php:36",
      "callers": [
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:964",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-docscan-apply-result",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Apply to the shop",
      "description": "Writes weighted average cost of goods, increases stock and closes matching supplier pre-orders for every confirmed line of the document.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "moves cost, stock and receiving records"
    },
    {
      "id": "invoice_scanner.docscan_bulk_accept",
      "ajax": "aieo_docscan_bulk_accept",
      "page": "invoice_scanner",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-docscan-review.php:28",
      "callers": [
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:943",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-docscan-bulk-accept",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Accept confident matches",
      "description": "Confirms every line whose match score clears the threshold, teaching the supplier match memory for each one.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "confirms lines in bulk and teaches the register"
    },
    {
      "id": "invoice_scanner.docscan_connect",
      "ajax": "aieo_docscan_connect",
      "page": "invoice_scanner",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-docscan-engine.php:66",
      "callers": [
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:343",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-docscan-connect-msg",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Connect document scanning",
      "description": "Asks the Rooster portal for this site's scanning credentials and stores them, turning the scanner from not connected to ready.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "stores service credentials for this site"
    },
    {
      "id": "invoice_scanner.docscan_crop",
      "ajax": "aieo_docscan_crop",
      "page": "invoice_scanner",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-docscan-engine.php:64",
      "callers": [
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:480",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-docscan-batch",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Show a line photo",
      "description": "Serves the cached photo crop of one invoice line so the reviewer can see exactly what the document printed.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "none"
    },
    {
      "id": "invoice_scanner.docscan_delete",
      "ajax": "aieo_docscan_delete",
      "page": "invoice_scanner",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-docscan-engine.php:63",
      "callers": [
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:438",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-docscan-documents",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Remove a document",
      "description": "Deletes one scanned document, its lines and its stored original file from this site. The scanning service copy is already purged.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "deletes the document, its lines and the stored file"
    },
    {
      "id": "docscan_erp_download",
      "ajax": "aieo_docscan_erp_download",
      "page": "",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-docscan-erp.php:41",
      "callers": [
        "../ai-eshop-optimizer-pro/includes/invoice-scanner/views/screen.php:277"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "docscan_erp_forget",
      "ajax": "aieo_docscan_erp_forget",
      "page": "",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-docscan-erp.php:40",
      "callers": [
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:1419",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-docscan-erp-card",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "docscan_erp_push",
      "ajax": "aieo_docscan_erp_push",
      "page": "",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-docscan-erp.php:37",
      "callers": [
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:1438",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-docscan-erp-cell",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "docscan_erp_schedule",
      "ajax": "aieo_docscan_erp_schedule",
      "page": "",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-docscan-erp.php:44",
      "callers": [
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:1281",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-erp-sweep-msg",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "docscan_erp_settings",
      "ajax": "aieo_docscan_erp_settings",
      "page": "",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-docscan-erp.php:38",
      "callers": [
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:1206",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:1305",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-docscan-erp-card",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "docscan_erp_sweep",
      "ajax": "aieo_docscan_erp_sweep",
      "page": "",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-docscan-erp.php:43",
      "callers": [
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:1243",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.min.js:1",
        "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-docscan-erp.php:304"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-erp-backlog-row",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "docscan_erp_test",
      "ajax": "aieo_docscan_erp_test",
      "page": "",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-docscan-erp.php:39",
      "callers": [
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:1338",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-docscan-erp-card",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "invoice_scanner.docscan_line_rule",
      "ajax": "aieo_docscan_line_rule",
      "page": "invoice_scanner",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-docscan-review.php:27",
      "callers": [
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:856",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:870",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-docscan-mult",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Rule on a line",
      "description": "Applies one reviewer ruling to an invoice line: confirm, reject, skip, set the pack size or pick a product. Confirming teaches the supplier match memory.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "updates the line and teaches the match register"
    },
    {
      "id": "invoice_scanner.docscan_list",
      "ajax": "aieo_docscan_list",
      "page": "invoice_scanner",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-docscan-engine.php:62",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "List scanned documents",
      "description": "Reloads the list of scanned documents with their current status. Reads stored rows only and changes nothing.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "none"
    },
    {
      "id": "invoice_scanner.docscan_match_assist",
      "ajax": "aieo_docscan_match_assist",
      "page": "invoice_scanner",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-docscan-review.php:35",
      "callers": [
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:950",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-docscan-assist",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Ask Rooster for suggestions",
      "description": "Sends still unmatched lines with candidate products to the scanning service and stores what comes back as suggestions, never as automatic matches.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "writes suggested matches onto unresolved lines"
    },
    {
      "id": "invoice_scanner.docscan_original",
      "ajax": "aieo_docscan_original",
      "page": "invoice_scanner",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-docscan-engine.php:65",
      "callers": [
        "../ai-eshop-optimizer-pro/includes/invoice-scanner/views/screen.php:312"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "Open the original",
      "description": "Serves the stored original document file for viewing in a new tab.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "none"
    },
    {
      "id": "invoice_scanner.docscan_poll",
      "ajax": "aieo_docscan_poll",
      "page": "invoice_scanner",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-docscan-engine.php:61",
      "callers": [
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:1031",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:190",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-docscan-batch",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Check scan progress",
      "description": "Asks the scanning service how far a batch has come and stores finished results locally, moving documents from reading to ready for review.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "stores results locally and purges the service copy"
    },
    {
      "id": "invoice_scanner.docscan_reprocess",
      "ajax": "aieo_docscan_reprocess",
      "page": "invoice_scanner",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-docscan-engine.php:67",
      "callers": [
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:403",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:994",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-docscan-documents",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Re-scan a document",
      "description": "Uploads the stored original again for a fresh read. Replaces every line and confirmation on the document and is charged again.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "replaces lines and confirmations; charged again"
    },
    {
      "id": "invoice_scanner.docscan_review",
      "ajax": "aieo_docscan_review",
      "page": "invoice_scanner",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-docscan-review.php:26",
      "callers": [
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:1022",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:840",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.min.js:1",
        "../ai-eshop-optimizer-pro/includes/invoice-scanner/views/review.php:9"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-docscan-apply",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Load the review screen",
      "description": "Runs matching over unresolved lines and returns the document for review. Lines the operator already ruled on are never touched.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "writes fresh match suggestions onto unresolved lines"
    },
    {
      "id": "invoice_scanner.docscan_supplier_pick",
      "ajax": "aieo_docscan_supplier_pick",
      "page": "invoice_scanner",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-docscan-review.php:30",
      "callers": [
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:931",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:935",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-docscan-sup-pick",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Set the supplier",
      "description": "Assigns a supplier to the document, creating the supplier term first when asked, then runs matching for the first time.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "assigns or creates a supplier and writes match suggestions"
    },
    {
      "id": "invoice_scanner.docscan_supplier_search",
      "ajax": "aieo_docscan_supplier_search",
      "page": "invoice_scanner",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-docscan-review.php:29",
      "callers": [
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:669",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-docscan-supplier-options",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Find the supplier",
      "description": "Looks up supplier candidates for a document by VAT number and by name similarity so the reviewer can pick one. Reads only.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "none"
    },
    {
      "id": "docscan_template_pool",
      "ajax": "aieo_docscan_template_pool",
      "page": "",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-docscan-engine.php:69",
      "callers": [
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:381",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.min.js:1",
        "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-docscan-engine.php:1063"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-docscan-template-pool-msg",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "invoice_scanner.docscan_upload",
      "ajax": "aieo_docscan_upload",
      "page": "invoice_scanner",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-docscan-engine.php:60",
      "callers": [
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:145",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-docscan-batch",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Upload a document",
      "description": "Sends one invoice or delivery note to the scanning service and creates its local document row. Charged per document once it is read successfully.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "starts a billable scan"
    },
    {
      "id": "invoice_scanner.docscan_vocab_uplink",
      "ajax": "aieo_docscan_vocab_uplink",
      "page": "invoice_scanner",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-docscan-engine.php:68",
      "callers": [
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:364",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.min.js:1",
        "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-docscan-vocab-uplink.php:15",
        "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-docscan-vocab-uplink.php:32"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-docscan-vocab-uplink-msg",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Toggle shared vocabulary",
      "description": "Turns contribution of supplier feed vocabulary to the shared lexicon on or off for this site.",
      "informs_customer": false,
      "safe_to_demo": true,
      "side_effects": "changes the uplink consent setting"
    },
    {
      "id": "embeddings_backfill_start",
      "ajax": "aieo_embeddings_backfill_start",
      "page": "",
      "handler": "includes/chat/class-aieo-embedding-backfill.php:47",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "embeddings_backfill_status",
      "ajax": "aieo_embeddings_backfill_status",
      "page": "",
      "handler": "includes/chat/class-aieo-embedding-backfill.php:48",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "embeddings_estimate",
      "ajax": "aieo_embeddings_estimate",
      "page": "",
      "handler": "includes/chat/class-aieo-embedding-backfill.php:46",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "erp_delete_connection",
      "ajax": "aieo_erp_delete_connection",
      "page": "",
      "handler": "includes/erp/class-aieo-erp.php:58",
      "callers": [
        "assets/pages/dmm/erp-database.php:334"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "erp_save_connection",
      "ajax": "aieo_erp_save_connection",
      "page": "",
      "handler": "includes/erp/class-aieo-erp.php:57",
      "callers": [
        "assets/pages/dmm/erp-database.php:256"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "erp_test_connection",
      "ajax": "aieo_erp_test_connection",
      "page": "",
      "handler": "includes/erp/class-aieo-erp.php:59",
      "callers": [
        "assets/pages/dmm/erp-database.php:269",
        "assets/pages/dmm/erp-database.php:294"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-erp-test-form",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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": "product_exchanger.exch_build_feed",
      "ajax": "aieo_exch_build_feed",
      "page": "product_exchanger",
      "handler": "includes/dmm/modules/class-aieo-dmm-product-exchanger.php:97",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-exchanger.php:664"
      ],
      "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:96",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-exchanger.php:718"
      ],
      "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:101",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-exchanger.php:791"
      ],
      "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:99",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-exchanger.php:705"
      ],
      "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:98",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-exchanger.php:680"
      ],
      "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:102",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-exchanger.php:777"
      ],
      "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:95",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-exchanger.php:646"
      ],
      "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:100",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-product-exchanger.php:759"
      ],
      "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": "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.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.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.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": "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": "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:8871"
      ],
      "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:8751"
      ],
      "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:8452"
      ],
      "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:8642"
      ],
      "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_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:6728"
      ],
      "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_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:6742"
      ],
      "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:6990",
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:7001"
      ],
      "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_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:6941"
      ],
      "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:6979"
      ],
      "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:6909"
      ],
      "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:6436"
      ],
      "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_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:5099"
      ],
      "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_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": "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_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:9049"
      ],
      "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:9185"
      ],
      "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_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:6060"
      ],
      "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_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:7843",
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:7891"
      ],
      "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",
      "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:7749"
      ],
      "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_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:7293"
      ],
      "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_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:9503"
      ],
      "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_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:9535"
      ],
      "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_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:9520"
      ],
      "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_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:3741",
        "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_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:6958"
      ],
      "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_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:5932",
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:5941"
      ],
      "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_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:5918"
      ],
      "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:6405",
        "includes/dmm/modules/class-aieo-dmm-fulfillment.php:6512"
      ],
      "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:8323"
      ],
      "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",
      "ajax": "aieo_ff_save_manual",
      "page": "fulfillment",
      "handler": "includes/dmm/modules/class-aieo-dmm-fulfillment.php:286",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:5918"
      ],
      "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_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:6923"
      ],
      "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_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": "fix_collations",
      "ajax": "aieo_fix_collations",
      "page": "",
      "handler": "includes/class-eshop-optimizer.php:92",
      "callers": [
        "assets/pages/ai-eshop-optimizer.php:1422",
        "includes/class-eshop-optimizer.php:6033"
      ],
      "caller_kinds": [
        "php",
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:167"
      ],
      "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:404"
      ],
      "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": "fs_pdp_state",
      "ajax": "aieo_fs_pdp_state",
      "page": "",
      "handler": "includes/dmm/blocks/class-aieo-blocks-loader.php:70",
      "callers": [
        "includes/dmm/blocks/free-shipping-pdp/view.js:15",
        "includes/dmm/blocks/free-shipping-pdp/view.js:34",
        "includes/dmm/blocks/free-shipping-pdp/view.js:36"
      ],
      "caller_kinds": [
        "js"
      ],
      "public": true,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "get_business_info_entries",
      "ajax": "aieo_get_business_info_entries",
      "page": "",
      "handler": "includes/chat/class-business-info-manager.php:56",
      "callers": [
        "assets/pages/ai-eshop-chat.php:4818"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "get_download_section",
      "ajax": "aieo_get_download_section",
      "page": "",
      "handler": "includes/class-eshop-optimizer.php:76",
      "callers": [
        "assets/js/export-progress.js:720",
        "assets/js/export-progress.min.js:1",
        "includes/class-eshop-optimizer.php:3300"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#recommendationsUploadForm",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "get_followed_brands",
      "ajax": "aieo_get_followed_brands",
      "page": "",
      "handler": "includes/class-aieo-wishlist.php:72",
      "callers": [],
      "caller_kinds": [],
      "public": true,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "get_followed_items",
      "ajax": "aieo_get_followed_items",
      "page": "",
      "handler": "includes/class-aieo-wishlist.php:70",
      "callers": [
        "assets/js/aieo-side-cart.js:1761",
        "assets/js/aieo-side-cart.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": true,
      "declared_at": "",
      "selector": "#aieo-side-cart-contents-css",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "get_index_stats",
      "ajax": "aieo_get_index_stats",
      "page": "",
      "handler": "includes/class-eshop-optimizer.php:91",
      "callers": [
        "assets/pages/ai-eshop-optimizer.php:1376",
        "includes/class-eshop-optimizer.php:6010"
      ],
      "caller_kinds": [
        "php",
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-indexes-list",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "get_product_bundle",
      "ajax": "aieo_get_product_bundle",
      "page": "",
      "handler": "includes/class-eshop-optimizer.php:6779",
      "callers": [
        "assets/js/aieo-side-cart.js:1423",
        "assets/js/aieo-side-cart.js:1878",
        "assets/js/aieo-side-cart.js:81",
        "assets/js/aieo-side-cart.min.js:1",
        "assets/js/lazy-recommendations-v7.js:128",
        "assets/js/lazy-recommendations-v7.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": true,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "get_products_dtos",
      "ajax": "aieo_get_products_dtos",
      "page": "",
      "handler": "includes/class-eshop-optimizer.php:6783",
      "callers": [
        "assets/js/aieo-side-cart.js:1751",
        "assets/js/aieo-side-cart.min.js:1",
        "includes/class-aieo-side-cart-display.php:1004"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": true,
      "declared_at": "",
      "selector": "#aieo-side-cart-contents-css",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "get_recently_viewed_html",
      "ajax": "aieo_get_recently_viewed_html",
      "page": "",
      "handler": "includes/class-eshop-optimizer.php:6781",
      "callers": [
        "assets/js/aieo-side-cart.js:1564",
        "assets/js/aieo-side-cart.min.js:1",
        "assets/js/lazy-recommendations-v7.js:521",
        "assets/js/lazy-recommendations-v7.min.js:1",
        "includes/class-eshop-optimizer.php:6975"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": true,
      "declared_at": "",
      "selector": "[data-aieo-sc-rv-count]",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "get_recommendations",
      "ajax": "aieo_get_recommendations",
      "page": "",
      "handler": "includes/class-eshop-optimizer.php:6772",
      "callers": [
        "assets/js/lazy-recommendations-v7.js:568",
        "assets/js/lazy-recommendations-v7.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": true,
      "declared_at": "",
      "selector": ".aieo-card-role-badge",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "get_semantic_recos",
      "ajax": "aieo_get_semantic_recos",
      "page": "",
      "handler": "includes/class-eshop-optimizer.php:6796",
      "callers": [
        "assets/js/lazy-recommendations-v7.js:480",
        "assets/js/lazy-recommendations-v7.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": true,
      "declared_at": "",
      "selector": ".aieo-card-role-badge",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "get_statistics_section",
      "ajax": "aieo_get_statistics_section",
      "page": "",
      "handler": "includes/class-eshop-optimizer.php:77",
      "callers": [
        "assets/js/export-progress.js:786",
        "assets/js/export-progress.min.js:1",
        "includes/class-eshop-optimizer.php:3414"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#recommendationsUploadForm",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:193",
        "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:256",
        "assets/pages/dmm/form-insights.php:370"
      ],
      "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:183",
        "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": "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:494"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-card-google-reviews-add-a-location",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "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:621"
      ],
      "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:504"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "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:593"
      ],
      "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:471"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-grv-locations",
      "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:571"
      ],
      "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:750"
      ],
      "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": "seo_search_queries.gsc_disconnect",
      "ajax": "aieo_gsc_disconnect",
      "page": "seo_search_queries",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-search-queries.php:73",
      "callers": [
        "assets/pages/dmm/seo/search-queries.php:432"
      ],
      "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:74",
      "callers": [
        "assets/pages/dmm/seo/search-queries.php:423",
        "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:71",
      "callers": [
        "assets/pages/dmm/seo/search-queries.php:399"
      ],
      "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_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:72",
      "callers": [
        "assets/pages/dmm/seo/search-queries.php:410"
      ],
      "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": "import_page_as_business_info",
      "ajax": "aieo_import_page_as_business_info",
      "page": "",
      "handler": "includes/chat/class-business-info-manager.php:60",
      "callers": [
        "assets/pages/ai-eshop-chat.php:5015"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "init_export",
      "ajax": "aieo_init_export",
      "page": "",
      "handler": "includes/class-eshop-optimizer.php:74",
      "callers": [
        "assets/js/export-progress.js:45",
        "assets/js/export-progress.min.js:1",
        "includes/class-eshop-optimizer.php:3189"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-export-start-button",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "init_upsell_export",
      "ajax": "aieo_init_upsell_export",
      "page": "",
      "handler": "includes/class-eshop-optimizer.php:78",
      "callers": [
        "assets/js/export-progress.js:248",
        "assets/js/export-progress.min.js:1",
        "includes/class-eshop-optimizer.php:1171"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-upsell-export-form",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "init_upsell_import",
      "ajax": "aieo_init_upsell_import",
      "page": "",
      "handler": "includes/class-eshop-optimizer.php:80",
      "callers": [
        "assets/js/export-progress.js:428",
        "assets/js/export-progress.min.js:1",
        "includes/class-eshop-optimizer.php:1389"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#recommendationsUploadForm",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "install_brand_page",
      "ajax": "aieo_install_brand_page",
      "page": "",
      "handler": "includes/dmm/class-aieo-brand-page-installer.php:48",
      "callers": [
        "includes/dmm/class-aieo-brand-page-installer.php:29"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "login_security.release",
      "ajax": "aieo_login_security_release",
      "page": "login_security",
      "handler": "includes/dmm/modules/class-aieo-dmm-login-security.php:104",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-login-security.php:818"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ls-release",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "Lift every pause now",
      "description": "Unblocks every address currently paused for repeated failures, so anyone who was being stopped can try passwords again immediately.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "removes the block on an attack in progress as well as on your own office",
      "tab": "Sign-in attempts",
      "context": "2FA and sign-in security"
    },
    {
      "id": "login_security.save",
      "ajax": "aieo_login_security_save",
      "page": "login_security",
      "handler": "includes/dmm/modules/class-aieo-dmm-login-security.php:103",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-login-security.php:777"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "includes/dmm/modules/class-aieo-dmm-login-security.php:229",
      "selector": "[data-aieo-action=\"login_security.save\"]",
      "selector_source": "markup",
      "variants": [],
      "confirm": "",
      "label": "Save settings",
      "description": "Applies your sign-in rules at once, so staff may be asked for a phone code and the sign-in page may move to a new address from the next attempt.",
      "informs_customer": false,
      "safe_to_demo": false,
      "side_effects": "can make the shop unreachable if the new sign-in address is not written down; recovery needs AIEO_LOGIN_SECURITY_BYPASS in wp-config.php",
      "tab": "Settings",
      "context": "2FA and sign-in security"
    },
    {
      "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_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": "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": "merchant_chat_clear",
      "ajax": "aieo_merchant_chat_clear",
      "page": "",
      "handler": "includes/chat/class-aieo-merchant-chat.php:163",
      "callers": [
        "includes/chat/class-aieo-merchant-chat.php:1543"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "merchant_chat_send",
      "ajax": "aieo_merchant_chat_send",
      "page": "",
      "handler": "includes/chat/class-aieo-merchant-chat.php:162",
      "callers": [
        "includes/chat/class-aieo-merchant-chat.php:1516"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "moi_delete_vendor",
      "ajax": "aieo_moi_delete_vendor",
      "page": "",
      "handler": "includes/dmm/marketplace-order-importer/includes/class-moi-admin.php:27",
      "callers": [
        "includes/dmm/marketplace-order-importer/includes/class-moi-admin.php:931"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-aieo-moi-delete]",
      "selector_source": "derived",
      "variants": [],
      "confirm": "Delete this vendor?",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "moi_legacy_migrate_batch",
      "ajax": "aieo_moi_legacy_migrate_batch",
      "page": "",
      "handler": "includes/dmm/marketplace-order-importer/includes/class-moi-admin.php:41",
      "callers": [
        "includes/dmm/marketplace-order-importer/includes/class-moi-admin.php:731"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "moi_legacy_scan",
      "ajax": "aieo_moi_legacy_scan",
      "page": "",
      "handler": "includes/dmm/marketplace-order-importer/includes/class-moi-admin.php:40",
      "callers": [
        "includes/dmm/marketplace-order-importer/includes/class-moi-admin.php:683"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "moi_reconcile",
      "ajax": "aieo_moi_reconcile",
      "page": "",
      "handler": "includes/dmm/marketplace-order-importer/includes/class-moi-admin.php:30",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "moi_reconcile_plan",
      "ajax": "aieo_moi_reconcile_plan",
      "page": "",
      "handler": "includes/dmm/marketplace-order-importer/includes/class-moi-admin.php:35",
      "callers": [
        "includes/dmm/marketplace-order-importer/includes/class-moi-admin.php:491"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "moi_reconcile_process",
      "ajax": "aieo_moi_reconcile_process",
      "page": "",
      "handler": "includes/dmm/marketplace-order-importer/includes/class-moi-admin.php:36",
      "callers": [
        "includes/dmm/marketplace-order-importer/includes/class-moi-admin.php:558"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "moi_rederive_token",
      "ajax": "aieo_moi_rederive_token",
      "page": "",
      "handler": "includes/dmm/marketplace-order-importer/includes/class-moi-admin.php:29",
      "callers": [
        "includes/dmm/marketplace-order-importer/includes/class-moi-admin.php:361"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-moi-setup-url-",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "moi_rotate_token",
      "ajax": "aieo_moi_rotate_token",
      "page": "",
      "handler": "includes/dmm/marketplace-order-importer/includes/class-moi-admin.php:28",
      "callers": [
        "includes/dmm/marketplace-order-importer/includes/class-moi-admin.php:957"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "[data-aieo-moi-rotate]",
      "selector_source": "derived",
      "variants": [],
      "confirm": "Rotate the webhook token? The marketplace will need the new URL.",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "moi_save_vendor",
      "ajax": "aieo_moi_save_vendor",
      "page": "",
      "handler": "includes/dmm/marketplace-order-importer/includes/class-moi-admin.php:26",
      "callers": [
        "includes/dmm/marketplace-order-importer/includes/class-moi-admin.php:911"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-moi-cred-row",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:752"
      ],
      "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:266",
        "includes/dmm/modules/class-aieo-dmm-newsletter-signup.php:596",
        "includes/dmm/modules/class-aieo-dmm-newsletter-signup.php:700"
      ],
      "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": "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": "og_resolve",
      "ajax": "aieo_og_resolve",
      "page": "",
      "handler": "includes/dmm/option-groups/class-aieo-option-groups-frontend.php:50",
      "callers": [],
      "caller_kinds": [],
      "public": true,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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": "optimize_database",
      "ajax": "aieo_optimize_database",
      "page": "",
      "handler": "includes/class-eshop-optimizer.php:90",
      "callers": [
        "assets/pages/ai-eshop-optimizer.php:1337",
        "includes/class-eshop-optimizer.php:5923"
      ],
      "caller_kinds": [
        "php",
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-optimize-db-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "oxygen_forget",
      "ajax": "aieo_oxygen_forget",
      "page": "",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-oxygen-sync.php:59",
      "callers": [
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:1573",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-oxygen-card",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "oxygen_push_costs",
      "ajax": "aieo_oxygen_push_costs",
      "page": "",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-oxygen-sync.php:61",
      "callers": [
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:1632",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-oxygen-card",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "oxygen_settings",
      "ajax": "aieo_oxygen_settings",
      "page": "",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-oxygen-sync.php:57",
      "callers": [
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:1527",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-oxygen-card",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "oxygen_sync_suppliers",
      "ajax": "aieo_oxygen_sync_suppliers",
      "page": "",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-oxygen-sync.php:60",
      "callers": [
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:1588",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-oxygen-card",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "oxygen_test",
      "ajax": "aieo_oxygen_test",
      "page": "",
      "handler": "../ai-eshop-optimizer-pro/includes/invoice-scanner/class-aieo-oxygen-sync.php:58",
      "callers": [
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.js:1554",
        "../ai-eshop-optimizer-pro/assets/js/aieo-docscan.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-oxygen-card",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "popup_audience_check",
      "ajax": "aieo_popup_audience_check",
      "page": "",
      "handler": "includes/class-aieo-popup-display.php:111",
      "callers": [
        "assets/js/aieo-popup.js:227",
        "assets/js/aieo-popup.min.js:1"
      ],
      "caller_kinds": [
        "js",
        "min-js"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-consent-banner",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:573",
        "assets/pages/dmm/physical-recovery.php:581"
      ],
      "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_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:638"
      ],
      "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_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:651",
        "assets/pages/dmm/physical-recovery.php:656"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "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_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:646"
      ],
      "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_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:225"
      ],
      "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:174"
      ],
      "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:426"
      ],
      "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_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:460",
        "assets/pages/dmm/physical-recovery.php:659"
      ],
      "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_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:464"
      ],
      "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": "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:663"
      ],
      "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:431",
        "assets/pages/dmm/physical-recovery.php:564",
        "assets/pages/dmm/physical-recovery.php:603",
        "assets/pages/dmm/physical-recovery.php:609"
      ],
      "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_run_now",
      "ajax": "aieo_pr_run_now",
      "page": "stock_recovery",
      "handler": "includes/dmm/modules/class-aieo-dmm-physical-recovery.php:494",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:442"
      ],
      "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:599",
        "assets/pages/dmm/physical-recovery.php:629"
      ],
      "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": "price_history.backfill",
      "ajax": "aieo_price_history_backfill",
      "page": "price_history",
      "handler": "includes/dmm/modules/class-aieo-dmm-price-history.php:73",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-price-history.php:665",
        "includes/dmm/modules/class-aieo-dmm-price-history.php:677"
      ],
      "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.ordersave",
      "ajax": "aieo_price_history_ordersave",
      "page": "price_history",
      "handler": "includes/dmm/modules/class-aieo-dmm-price-history.php:75",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-price-history.php:721"
      ],
      "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.orderscan",
      "ajax": "aieo_price_history_orderscan",
      "page": "price_history",
      "handler": "includes/dmm/modules/class-aieo-dmm-price-history.php:74",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-price-history.php:689"
      ],
      "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.save",
      "ajax": "aieo_price_history_save",
      "page": "price_history",
      "handler": "includes/dmm/modules/class-aieo-dmm-price-history.php:72",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-price-history.php:663",
        "includes/dmm/modules/class-aieo-dmm-price-history.php:670"
      ],
      "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": "process_export_batch",
      "ajax": "aieo_process_export_batch",
      "page": "",
      "handler": "includes/class-eshop-optimizer.php:75",
      "callers": [
        "assets/js/export-progress.js:526",
        "assets/js/export-progress.min.js:1",
        "includes/class-aieo-signal-registry.php:2523",
        "includes/class-eshop-optimizer.php:3759"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#recommendationsUploadForm",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "process_upsell_batch",
      "ajax": "aieo_process_upsell_batch",
      "page": "",
      "handler": "includes/class-eshop-optimizer.php:79",
      "callers": [
        "assets/js/export-progress.js:194",
        "assets/js/export-progress.min.js:1",
        "includes/class-eshop-optimizer.php:1257"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#recommendationsUploadForm",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "process_upsell_import_batch",
      "ajax": "aieo_process_upsell_import_batch",
      "page": "",
      "handler": "includes/class-eshop-optimizer.php:81",
      "callers": [
        "assets/js/export-progress.js:363",
        "assets/js/export-progress.min.js:1",
        "includes/class-eshop-optimizer.php:1546"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#recommendationsUploadForm",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "promo_surfaces.promo_delete_slot",
      "ajax": "aieo_promo_delete_slot",
      "page": "promo_surfaces",
      "handler": "includes/dmm/modules/class-aieo-dmm-promo-surfaces.php:93",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-promo-surfaces.php:1466"
      ],
      "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:94",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-promo-surfaces.php:1334"
      ],
      "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:92",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-promo-surfaces.php:1421"
      ],
      "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:91",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-promo-surfaces.php:1284"
      ],
      "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": "rating_get",
      "ajax": "aieo_rating_get",
      "page": "",
      "handler": "includes/class-aieo-ratings.php:123",
      "callers": [
        "includes/class-aieo-ratings.php:15",
        "includes/class-aieo-signal-registry.php:2565"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": true,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "rating_save",
      "ajax": "aieo_rating_save",
      "page": "",
      "handler": "includes/class-aieo-ratings.php:121",
      "callers": [
        "assets/js/aieo-rating-stars.js:169",
        "assets/js/aieo-rating-stars.js:7",
        "assets/js/aieo-rating-stars.min.js:1",
        "includes/class-aieo-ratings.php:14",
        "includes/class-aieo-signal-registry.php:2565"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": true,
      "declared_at": "",
      "selector": ".aieo-rating-star",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "reco_log_batch",
      "ajax": "aieo_reco_log_batch",
      "page": "",
      "handler": "includes/class-aieo-attribution.php:182",
      "callers": [
        "assets/js/aieo-popup.js:285",
        "assets/js/aieo-popup.min.js:1",
        "assets/js/aieo-reco-observer.js:411",
        "assets/js/aieo-reco-observer.min.js:1",
        "includes/dmm/modules/class-aieo-dmm-promo-surfaces.php:117",
        "includes/dmm/modules/class-aieo-dmm-promo-surfaces.php:31"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": true,
      "declared_at": "",
      "selector": "#aieo-consent-banner",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "refresh_ai_models",
      "ajax": "aieo_refresh_ai_models",
      "page": "",
      "handler": "includes/chat/class-model-registry.php:66",
      "callers": [
        "assets/pages/ai-eshop-chat.php:3399"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-refresh-icon",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "resume_cart",
      "ajax": "aieo_resume_cart",
      "page": "",
      "handler": "includes/carts/class-aieo-carts-frontend.php:53",
      "callers": [
        "assets/js/aieo-carts.js:88",
        "assets/js/aieo-carts.min.js:1",
        "includes/dmm/push/triggers/class-aieo-push-trigger-cart-abandonment.php:172"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": true,
      "declared_at": "",
      "selector": "#aieo-cart-overlay",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:1095"
      ],
      "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:1138"
      ],
      "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_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:1162"
      ],
      "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:1159"
      ],
      "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:1142"
      ],
      "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:1156"
      ],
      "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_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:850"
      ],
      "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_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:859",
        "includes/dmm/modules/class-aieo-dmm-roi-wizard.php:941"
      ],
      "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": "roi_wizard.roi_values",
      "ajax": "aieo_roi_values",
      "page": "roi_wizard",
      "handler": "includes/dmm/modules/class-aieo-dmm-roi-wizard.php:186",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "rooster_notice_dismiss",
      "ajax": "aieo_rooster_notice_dismiss",
      "page": "",
      "handler": "includes/class-aieo-rooster-signup.php:57",
      "callers": [
        "includes/class-aieo-rooster-signup.php:523",
        "includes/class-aieo-rooster-signup.php:539",
        "includes/class-aieo-rooster-signup.php:552"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-rooster-signup-notice",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "rooster_signup_poll",
      "ajax": "aieo_rooster_signup_poll",
      "page": "",
      "handler": "includes/class-aieo-rooster-signup.php:56",
      "callers": [
        "assets/pages/ai-eshop-optimizer.php:2615",
        "assets/pages/ai-eshop-optimizer.php:2656",
        "includes/class-aieo-rooster-signup.php:220"
      ],
      "caller_kinds": [
        "php",
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "rooster_transfer_batch",
      "ajax": "aieo_rooster_transfer_batch",
      "page": "",
      "handler": "includes/class-eshop-optimizer.php:64",
      "callers": [
        "assets/pages/ai-eshop-optimizer.php:3375",
        "includes/class-eshop-optimizer.php:6428"
      ],
      "caller_kinds": [
        "php",
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "rooster_transfer_init",
      "ajax": "aieo_rooster_transfer_init",
      "page": "",
      "handler": "includes/class-eshop-optimizer.php:63",
      "callers": [
        "assets/pages/ai-eshop-optimizer.php:3340",
        "includes/class-eshop-optimizer.php:6372"
      ],
      "caller_kinds": [
        "php",
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-rooster-stop",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "run_migration",
      "ajax": "aieo_run_migration",
      "page": "",
      "handler": "includes/class-session-schema-migrator.php:39",
      "callers": [
        "assets/pages/session-migration-page.php:280",
        "assets/pages/session-migration-page.php:313",
        "assets/pages/session-migration-page.php:358"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "save_business_info",
      "ajax": "aieo_save_business_info",
      "page": "",
      "handler": "includes/chat/class-business-info-manager.php:57",
      "callers": [
        "assets/pages/ai-eshop-chat.php:4908"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "save_cart",
      "ajax": "aieo_save_cart",
      "page": "",
      "handler": "includes/carts/class-aieo-carts-frontend.php:51",
      "callers": [
        "assets/js/aieo-carts.js:191",
        "assets/js/aieo-carts.min.js:1",
        "assets/pages/dmm/saved-abandoned-carts.php:154",
        "includes/carts/class-aieo-carts-frontend.php:56",
        "includes/carts/class-aieo-carts-frontend.php:6"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php",
        "template"
      ],
      "public": true,
      "declared_at": "",
      "selector": "#aieo-cart-overlay",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "save_credit_alert",
      "ajax": "aieo_save_credit_alert",
      "page": "",
      "handler": "includes/class-aieo-credit-notifier.php:31",
      "callers": [
        "assets/pages/ai-eshop-chat.php:707",
        "assets/pages/ai-eshop-chat.php:748",
        "includes/class-aieo-credit-notifier.php:307"
      ],
      "caller_kinds": [
        "php",
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-ca-save",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "save_settings",
      "ajax": "aieo_save_settings",
      "page": "",
      "handler": "includes/class-eshop-optimizer.php:84",
      "callers": [
        "assets/js/export-progress.js:928",
        "assets/js/export-progress.min.js:1",
        "includes/class-eshop-optimizer.php:3598"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-save-message",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:284"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-rd-target",
      "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_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:454"
      ],
      "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_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_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_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:332"
      ],
      "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_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:167"
      ],
      "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_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:364"
      ],
      "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_opportunities.seo_opp_apply",
      "ajax": "aieo_seo_opp_apply",
      "page": "seo_opportunities",
      "handler": "includes/dmm/modules/class-aieo-dmm-seo-opportunities.php:48",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "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_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:269"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-opp-table-wrap",
      "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_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:248"
      ],
      "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_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:239"
      ],
      "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:284"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "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_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:357"
      ],
      "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_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:251"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-rd-table-wrap",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "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_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:312"
      ],
      "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:290"
      ],
      "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:327"
      ],
      "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:343"
      ],
      "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_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:233"
      ],
      "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_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:262"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "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_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:393"
      ],
      "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_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": "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:117",
        "assets/pages/dmm/seo/health.php:126",
        "assets/pages/dmm/seo/health.php:189"
      ],
      "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.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:107"
      ],
      "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:211"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-seo-verify-rows",
      "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": "session_analytics_export",
      "ajax": "aieo_session_analytics_export",
      "page": "",
      "handler": "includes/class-session-analytics-processor.php:566",
      "callers": [
        "assets/pages/dmm/session-analytics.php:93"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "session_analytics_rebuild",
      "ajax": "aieo_session_analytics_rebuild",
      "page": "",
      "handler": "includes/class-session-analytics-processor.php:565",
      "callers": [
        "assets/pages/dmm/session-analytics.php:200"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-sa-progress",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:977",
        "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.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:1193",
        "assets/js/aieo-side-cart.js:1208",
        "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.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:2292",
        "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.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:834",
        "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.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:1097",
        "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": "social_generate",
      "ajax": "aieo_social_generate",
      "page": "",
      "handler": "includes/social/class-aieo-social-metabox.php:28",
      "callers": [
        "includes/social/class-aieo-social-metabox.php:326"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-social-gen",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "social_publish",
      "ajax": "aieo_social_publish",
      "page": "",
      "handler": "includes/social/class-aieo-social-metabox.php:29",
      "callers": [
        "includes/social/class-aieo-social-metabox.php:376"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-social-result",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "captcha.sso_captcha_save_settings",
      "ajax": "aieo_sso_captcha_save_settings",
      "page": "captcha",
      "handler": "includes/dmm/modules/class-aieo-dmm-captcha.php:100",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-captcha.php:639"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-captcha-save-settings",
      "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": "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:499"
      ],
      "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_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:506"
      ],
      "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:516"
      ],
      "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_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:638",
        "includes/dmm/modules/class-aieo-dmm-social-login.php:463"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-captcha-save-settings",
      "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": "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_pods_migrator.supplier_legacy_migrate_run",
      "ajax": "aieo_supplier_legacy_migrate_run",
      "page": "supplier_pods_migrator",
      "handler": "includes/dmm/migrators/class-aieo-dmm-supplier-pods-migrator.php:41",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-supplier-extras.php:605"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-supplier-legacy-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "supplier_pods_migrator.supplier_pods_migrate_audit",
      "ajax": "aieo_supplier_pods_migrate_audit",
      "page": "supplier_pods_migrator",
      "handler": "includes/dmm/migrators/class-aieo-dmm-supplier-pods-migrator.php:39",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:40",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-supplier-extras.php:435"
      ],
      "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": "sync_wc_table_rates",
      "ajax": "aieo_sync_wc_table_rates",
      "page": "",
      "handler": "includes/chat/class-business-info-manager.php:59",
      "callers": [
        "assets/pages/ai-eshop-chat.php:4978"
      ],
      "caller_kinds": [
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-shipping-sync-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "trs_csv_export",
      "ajax": "aieo_trs_csv_export",
      "page": "",
      "handler": "includes/shipping-rates/class-aieo-trs-zone-admin.php:28",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-shipping-rates.php:739"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "trs_csv_import",
      "ajax": "aieo_trs_csv_import",
      "page": "",
      "handler": "includes/shipping-rates/class-aieo-trs-zone-admin.php:29",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-shipping-rates.php:774"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#aieo-trs-csv-status",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "trs_delete",
      "ajax": "aieo_trs_delete",
      "page": "",
      "handler": "includes/shipping-rates/class-aieo-trs-zone-admin.php:26",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-shipping-rates.php:614"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".trs-delete",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "trs_flip_method",
      "ajax": "aieo_trs_flip_method",
      "page": "",
      "handler": "includes/shipping-rates/class-aieo-trs-zone-admin.php:30",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-shipping-rates.php:298"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-trs-flip",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "trs_list",
      "ajax": "aieo_trs_list",
      "page": "",
      "handler": "includes/shipping-rates/class-aieo-trs-zone-admin.php:24",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-shipping-rates.php:497"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#trs-tbody",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "trs_migrate_audit",
      "ajax": "aieo_trs_migrate_audit",
      "page": "",
      "handler": "includes/shipping-rates/class-aieo-trs-migrator.php:35",
      "callers": [],
      "caller_kinds": [],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "trs_migrate_run",
      "ajax": "aieo_trs_migrate_run",
      "page": "",
      "handler": "includes/shipping-rates/class-aieo-trs-migrator.php:36",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-shipping-rates.php:878"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "trs_reorder",
      "ajax": "aieo_trs_reorder",
      "page": "",
      "handler": "includes/shipping-rates/class-aieo-trs-zone-admin.php:27",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-shipping-rates.php:647"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "trs_save",
      "ajax": "aieo_trs_save",
      "page": "",
      "handler": "includes/shipping-rates/class-aieo-trs-zone-admin.php:25",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-shipping-rates.php:713"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "#trs-editor",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:690",
        "includes/dmm/modules/class-aieo-dmm-connections.php:780"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "includes/dmm/modules/class-aieo-dmm-connections.php:769",
      "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": "user_vitals.migrate",
      "ajax": "aieo_user_vitals_migrate",
      "page": "user_vitals",
      "handler": "includes/dmm/modules/class-aieo-dmm-user-vitals.php:72",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-user-vitals.php:660",
        "includes/dmm/modules/class-aieo-dmm-user-vitals.php:666"
      ],
      "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:74",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-user-vitals.php:550"
      ],
      "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:73",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-user-vitals.php:421"
      ],
      "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:71",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-user-vitals.php:650"
      ],
      "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:87",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-utm-explorer.php:452"
      ],
      "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:88",
      "callers": [
        "includes/dmm/modules/class-aieo-dmm-utm-explorer.php:362"
      ],
      "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": "validate_api_keys",
      "ajax": "aieo_validate_api_keys",
      "page": "",
      "handler": "includes/chat/class-model-registry.php:67",
      "callers": [
        "includes/chat/class-model-registry.php:771"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": false,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:2552",
        "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": "welcome.reset_layout",
      "ajax": "aieo_welcome_reset_layout",
      "page": "welcome",
      "handler": "includes/dmm/modules/class-aieo-dmm-welcome.php:132",
      "callers": [
        "assets/pages/dmm/welcome.php:821"
      ],
      "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:131",
      "callers": [
        "assets/pages/dmm/_utility-bar.php:147",
        "assets/pages/dmm/_utility-bar.php:408"
      ],
      "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:129",
      "callers": [
        "assets/pages/dmm/welcome.php:599"
      ],
      "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": "welcome.toggle_pin",
      "ajax": "aieo_welcome_toggle_pin",
      "page": "welcome",
      "handler": "includes/dmm/modules/class-aieo-dmm-welcome.php:130",
      "callers": [
        "assets/js/aieo-cardpin.js:205",
        "assets/js/aieo-cardpin.min.js:1",
        "assets/pages/dmm/welcome.php:565"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "template"
      ],
      "public": false,
      "declared_at": "",
      "selector": ".aieo-dmm-pins",
      "selector_source": "derived",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:451"
      ],
      "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_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:451"
      ],
      "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": "wishlist_get",
      "ajax": "aieo_wishlist_get",
      "page": "",
      "handler": "includes/class-aieo-wishlist.php:65",
      "callers": [
        "includes/class-aieo-signal-registry.php:2539",
        "includes/class-aieo-wishlist.php:12"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": true,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "id": "wishlist_toggle",
      "ajax": "aieo_wishlist_toggle",
      "page": "",
      "handler": "includes/class-aieo-wishlist.php:63",
      "callers": [
        "ai-eshop-optimizer.php:556",
        "assets/js/aieo-side-cart.js:2461",
        "assets/js/aieo-side-cart.js:2529",
        "assets/js/aieo-side-cart.min.js:1",
        "assets/js/aieo-wishlist-heart.js:157",
        "assets/js/aieo-wishlist-heart.js:6"
      ],
      "caller_kinds": [
        "js",
        "min-js",
        "php",
        "template"
      ],
      "public": true,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:334",
        "includes/dmm/modules/class-aieo-dmm-checkout-invoicing.php:202"
      ],
      "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 tax authority register 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": "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:2552",
        "includes/dmm/data/action-strings.php:1770",
        "includes/dmm/modules/class-aieo-dmm-waitlist.php:14",
        "includes/dmm/modules/class-aieo-dmm-waitlist.php:435"
      ],
      "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": "om_ppe_wishlist_toggle",
      "ajax": "om_ppe_wishlist_toggle",
      "page": "",
      "handler": "includes/class-aieo-wishlist-compat.php:47",
      "callers": [
        "ai-eshop-optimizer.php:1400",
        "ai-eshop-optimizer.php:555",
        "assets/js/aieo-side-cart.js:2513",
        "includes/class-aieo-wishlist-compat.php:11",
        "includes/class-aieo-wishlist-compat.php:5",
        "includes/class-aieo-wishlist-compat.php:88"
      ],
      "caller_kinds": [
        "js",
        "php"
      ],
      "public": true,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    },
    {
      "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:1545"
      ],
      "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:1549"
      ],
      "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": "wdt_save_table_frontend",
      "ajax": "wdt_save_table_frontend",
      "page": "",
      "handler": "includes/class-aieo-wpdt-enhancements.php:33",
      "callers": [
        "ai-eshop-optimizer.php:541",
        "includes/class-aieo-wpdt-enhancements.php:9"
      ],
      "caller_kinds": [
        "php"
      ],
      "public": true,
      "declared_at": "",
      "selector": "",
      "selector_source": "",
      "variants": [],
      "confirm": "",
      "label": "",
      "description": "",
      "informs_customer": null,
      "safe_to_demo": false,
      "side_effects": ""
    }
  ]
}