array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets the buy-again control on past orders, which is the quickest route to a repeat sale.', 'ai-eshop-optimizer'), 'context' => __('repeat orders', 'ai-eshop-optimizer'), ), 'account_handling.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets how customer accounts behave, such as whether guests may order and what happens after signing up.', 'ai-eshop-optimizer'), ), 'ad_connectors.adc_save' => array( 'label' => __('Save connection', 'ai-eshop-optimizer'), 'description' => __('Stores the login for an advertising account so the shop can read what you spent there.', 'ai-eshop-optimizer'), ), 'ad_connectors.adc_sync' => array( 'label' => __('Fetch spend', 'ai-eshop-optimizer'), 'description' => __('Pulls what you spent on advertising into the shop, which is the cost side of every return calculation.', 'ai-eshop-optimizer'), ), 'ad_connectors.adc_test' => array( 'label' => __('Test connection', 'ai-eshop-optimizer'), 'description' => __('Signs in with the details as saved and reports whether they work, without pulling any figures.', 'ai-eshop-optimizer'), ), 'performance.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets how the performance engine of the Rooster Zero theme builds each page, then works the used CSS out again and purges the page caches.', 'ai-eshop-optimizer'), 'context' => __('performance', 'ai-eshop-optimizer'), ), 'add_to_cart_text.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets the wording on the buy button, so it can say what suits your shop rather than the default.', 'ai-eshop-optimizer'), 'context' => __('add-to-cart text', 'ai-eshop-optimizer'), ), 'address_autocomplete.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets the address suggestions at checkout, including which service supplies them.', 'ai-eshop-optimizer'), ), 'ads.activate' => array( 'label' => __('Mark as live', 'ai-eshop-optimizer'), 'description' => __('Records that you have switched these ads on at Google, so the reports here line up with what is actually running.', 'ai-eshop-optimizer'), ), 'ads.archive' => array( 'label' => __('Archive', 'ai-eshop-optimizer'), 'description' => __('Files a draft away here to keep the list tidy. Anything already in Google Ads is left exactly as it is.', 'ai-eshop-optimizer'), 'context' => __('ad draft', 'ai-eshop-optimizer'), ), 'ads.compose' => array( 'label' => __('Draft the ads', 'ai-eshop-optimizer'), 'description' => __('Writes ad headlines and descriptions for the products you picked, so you have a starting point to edit.', 'ai-eshop-optimizer'), ), 'ads.push' => array( 'label' => __('Send to Google Ads', 'ai-eshop-optimizer'), 'description' => __('Sends the drafted ads to your Google Ads account, where they are created paused so nothing spends until you say so.', 'ai-eshop-optimizer'), ), 'ai_chat_analytics.chat_analytics_refresh_stats' => array( 'label' => __('Refresh now', 'ai-eshop-optimizer'), 'description' => __('Rebuilds the chat analytics aggregates from the raw conversation log, which is what the six report tabs read from.', 'ai-eshop-optimizer'), ), 'ai_chat_analytics.chat_analytics_save_retention' => array( 'label' => __('Save', 'ai-eshop-optimizer'), 'description' => __('Sets how many days of chat transcripts are kept, after which older conversations are deleted permanently and cannot be read back.', 'ai-eshop-optimizer'), ), 'ai_chat_analytics.chat_analytics_stats_cadence' => array( 'label' => __('Rebuild cadence', 'ai-eshop-optimizer'), 'description' => __('Sets how often the chat analytics aggregates rebuild themselves, trading freshness of the reports against the cost of recomputing them.', 'ai-eshop-optimizer'), ), 'attribution.rows' => array( 'label' => __('Attribution detail', 'ai-eshop-optimizer'), 'description' => __('Opens the orders behind a figure, so a surprising number can be traced to the orders that caused it.', 'ai-eshop-optimizer'), ), 'audience_builder.audience_count' => array( 'label' => __('How many people', 'ai-eshop-optimizer'), 'description' => __('Counts how many customers match the rules as they stand, so you can see the size before saving or sending anything.', 'ai-eshop-optimizer'), ), 'audience_builder.audience_delete' => array( 'label' => __('Delete audience', 'ai-eshop-optimizer'), 'description' => __('Removes a saved group of customers. Anything still pointing at it is left with nobody to send to.', 'ai-eshop-optimizer'), ), 'audience_builder.audience_generate' => array( 'label' => __('Build from a description', 'ai-eshop-optimizer'), 'description' => __('Turns a plain description of who you want to reach into a working set of rules you can check and adjust.', 'ai-eshop-optimizer'), ), 'audience_builder.audience_list' => array( 'label' => __('Audience list', 'ai-eshop-optimizer'), 'description' => __('Loads your saved groups so you can pick one instead of building the same rules again.', 'ai-eshop-optimizer'), ), 'audience_builder.audience_save' => array( 'label' => __('Save audience', 'ai-eshop-optimizer'), 'description' => __('Stores a group of customers defined by the rules you built, ready to aim a campaign or an offer at.', 'ai-eshop-optimizer'), ), 'audience_builder.audience_suggest' => array( 'label' => __('Suggest audiences', 'ai-eshop-optimizer'), 'description' => __('Offers ready-made groups worth targeting, such as lapsed buyers or your best customers, based on what your orders show.', 'ai-eshop-optimizer'), ), 'badges.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets the badges that sit over product pictures, such as new or on sale, and when each one shows.', 'ai-eshop-optimizer'), 'context' => __('badges', 'ai-eshop-optimizer'), ), 'birthday.aw_migrate' => array( 'label' => __('Bring across the old birthdays', 'ai-eshop-optimizer'), 'description' => __('Copies birthday data over from the previous automation plugin so the dates are not lost.', 'ai-eshop-optimizer'), ), 'birthday.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets the birthday field at checkout and the gift message that goes with it.', 'ai-eshop-optimizer'), 'context' => __('birthday', 'ai-eshop-optimizer'), ), 'branch_scanner.branch_delete' => array( 'label' => __('Delete branch', 'ai-eshop-optimizer'), 'description' => __('Removes a physical shop. Staff attached to it lose their branch and its stock counts stop being kept.', 'ai-eshop-optimizer'), ), 'branch_scanner.branch_save' => array( 'label' => __('Save branch', 'ai-eshop-optimizer'), 'description' => __('Stores one physical shop, which is what lets its staff scan stock and lets orders be assigned to it.', 'ai-eshop-optimizer'), ), 'branch_scanner.scanner_customer_lookup' => array( 'label' => __('Find customer', 'ai-eshop-optimizer'), 'description' => __('Looks up a customer at the counter by phone or email, so an in-shop sale can be put against their account.', 'ai-eshop-optimizer'), ), 'branch_scanner.scanner_staff_lookup' => array( 'label' => __('Find staff member', 'ai-eshop-optimizer'), 'description' => __('Looks up a member of staff by their code so the scanner knows who is doing the counting.', 'ai-eshop-optimizer'), ), 'brand_discounts.brand_discount_delete' => array( 'label' => __('Delete', 'ai-eshop-optimizer'), 'description' => __('Removes a brand discount rule, after which that brand\'s products go back to their normal prices immediately.', 'ai-eshop-optimizer'), 'context' => __('brand discount', 'ai-eshop-optimizer'), ), 'brand_discounts.brand_discount_save' => array( 'label' => __('Save discount', 'ai-eshop-optimizer'), 'description' => __('Stores one brand-wide discount rule, which starts changing what shoppers pay for that brand as soon as it is saved.', 'ai-eshop-optimizer'), ), 'brand_discounts.csv_clear' => array( 'label' => __('Clear CSV prices', 'ai-eshop-optimizer'), 'description' => __('Strips the prices this feature set from every product it touched, putting them back to whatever they were priced at before.', 'ai-eshop-optimizer'), ), 'brand_discounts.csv_process_batch' => array( 'label' => __('Process batch', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'brand_discounts.csv_upload' => array( 'label' => __('Upload CSV', 'ai-eshop-optimizer'), 'description' => __('Accepts a spreadsheet of per-product prices and prepares it for processing, without applying anything until you run the batches.', 'ai-eshop-optimizer'), ), 'brand_discounts.save_badge_settings' => array( 'label' => __('Save badge settings', 'ai-eshop-optimizer'), 'description' => __('Sets how long a product counts as new and what the badges over product images say, which shoppers see on every listing.', 'ai-eshop-optimizer'), ), 'brand_discounts.save_lowest_price_message' => array( 'label' => __('Save lowest-price message', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'brand_discounts.save_price_appearance' => array( 'label' => __('Save price appearance', 'ai-eshop-optimizer'), 'description' => __('Chooses how the old and new price sit together on product pages and listings, which changes how a discount reads to a shopper.', 'ai-eshop-optimizer'), ), 'brand_discounts.search_brand_terms' => array( 'label' => __('Brand search', 'ai-eshop-optimizer'), 'description' => __('Finds brands by name while you are writing a rule, so you pick one from a list instead of typing its id.', 'ai-eshop-optimizer'), ), 'brand_display.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets where the brand name and logo appear on product pages and listings.', 'ai-eshop-optimizer'), 'context' => __('brand display', 'ai-eshop-optimizer'), ), 'brand_extras.brand_pods_migrate_run' => array( 'label' => __('Migrate brands', 'ai-eshop-optimizer'), 'description' => __('Copies brand details over from the old Pods setup so nothing is lost when you move off it.', 'ai-eshop-optimizer'), ), 'brand_gifts.brand_gift_delete' => array( 'label' => __('Delete gift rule', 'ai-eshop-optimizer'), 'description' => __('Removes a gift rule, so qualifying orders stop having the free item added.', 'ai-eshop-optimizer'), ), 'brand_gifts.brand_gift_pick' => array( 'label' => __('Choose a gift', 'ai-eshop-optimizer'), 'description' => __('The shopper own control: picks which free gift they want when the rule offers them a choice.', 'ai-eshop-optimizer'), ), 'brand_gifts.brand_gift_save' => array( 'label' => __('Save gift rule', 'ai-eshop-optimizer'), 'description' => __('Stores a rule that adds a free gift to the basket when an order qualifies for it.', 'ai-eshop-optimizer'), ), 'brand_gifts.brand_gift_variations' => array( 'label' => __('Show variations', 'ai-eshop-optimizer'), 'description' => __('Lists a product sizes and colours so a gift rule can offer one specific version rather than the whole product.', 'ai-eshop-optimizer'), 'context' => __('gift picker', 'ai-eshop-optimizer'), ), 'brand_gifts.search_need_terms' => array( 'label' => __('Needs search', 'ai-eshop-optimizer'), 'description' => __('Finds shopper needs by name while you are building a rule, so you pick from a list rather than typing codes.', 'ai-eshop-optimizer'), ), 'brand_gifts.search_products' => array( 'label' => __('Product search', 'ai-eshop-optimizer'), 'description' => __('Finds products by name while you are choosing which one to give away or which ones qualify.', 'ai-eshop-optimizer'), 'context' => __('gift rule', 'ai-eshop-optimizer'), ), 'brand_margins.tools_apply_cogs' => array( 'label' => __('Apply cost prices', 'ai-eshop-optimizer'), 'description' => __('Writes the imported cost prices onto the products themselves, so profit is calculated per item.', 'ai-eshop-optimizer'), ), 'brand_margins.tools_export_brand_margins' => array( 'label' => __('Export costs', 'ai-eshop-optimizer'), 'description' => __('Downloads your recorded cost prices as a spreadsheet, for checking or for editing and sending back.', 'ai-eshop-optimizer'), ), 'brand_margins.tools_import_brand_margins' => array( 'label' => __('Import costs', 'ai-eshop-optimizer'), 'description' => __('Reads what your products cost you from a spreadsheet, which is what every profit figure is worked out from.', 'ai-eshop-optimizer'), ), 'button_styles.save_button_styles' => array( 'label' => __('Save button styles', 'ai-eshop-optimizer'), 'description' => __('Sets the colours, corners and sizing every button in the shop uses, so they match your branding.', 'ai-eshop-optimizer'), ), 'campaigns.campaign_save' => array( 'label' => __('Save campaign', 'ai-eshop-optimizer'), 'description' => __('Stores what you spent on a campaign and over what dates, so its return can be worked out.', 'ai-eshop-optimizer'), ), 'cancellations.cancel_reason_disable' => array( 'label' => __('Disable', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'cancellations.cancel_reason_save' => array( 'label' => __('Save / Add', 'ai-eshop-optimizer'), 'description' => __('Stores one cancellation reason\'s label, sort order, enabled state and whether customers see it, adding the reason if the slug is new.', 'ai-eshop-optimizer'), ), 'cancellations.metrics_backfill_step' => array( 'label' => __('Backfill metrics', 'ai-eshop-optimizer'), 'description' => __('Walks historical cancelled, refunded and failed orders in chunks and rebuilds the product and customer behaviour metrics from them.', 'ai-eshop-optimizer'), ), 'cancellations.metrics_recompute_stale' => array( 'label' => __('Run daily sweep now', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'cancellations.outbound_cost_step' => array( 'label' => __('Backfill outbound cost', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'cancellations.risk_gating_toggle' => array( 'label' => __('Risk gating switches', 'ai-eshop-optimizer'), 'description' => __('Turns on the checkout warning for serial returners, or the block that stops them paying cash on delivery, one switch at a time.', 'ai-eshop-optimizer'), ), 'captcha.sso_captcha_save_settings' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets the bot protection on your sign-in and registration forms, including its keys and how strict it is.', 'ai-eshop-optimizer'), 'context' => __('bot protection', 'ai-eshop-optimizer'), ), 'catalog_importer.catalog_feed_vocab_backfill' => array( 'label' => __('Learn vocabulary', 'ai-eshop-optimizer'), 'description' => __('Reads the whole live feed and stores the supplier\'s own product wording for invoice matching. Imports nothing and touches no product.', 'ai-eshop-optimizer'), ), 'catalog_importer.catalog_feed_vocab_flagged' => array( 'label' => __('List vocabulary contradictions', 'ai-eshop-optimizer'), 'description' => __('Lists supplier vocabulary rows that a confirmed invoice line has contradicted, for review. Reads only.', 'ai-eshop-optimizer'), ), 'catalog_importer.catalog_feed_vocab_rule' => array( 'label' => __('Rule on a vocabulary row', 'ai-eshop-optimizer'), 'description' => __('Keeps, suppresses or restores one supplier vocabulary row. A suppressed row stops matching invoice lines until it is restored.', 'ai-eshop-optimizer'), ), 'catalog_importer.catalog_import_process' => array( 'label' => __('Keep importing', 'ai-eshop-optimizer'), 'description' => __('Carries the import on from where it stopped, a chunk at a time, until the whole catalogue is through.', 'ai-eshop-optimizer'), ), 'catalog_importer.catalog_import_save_conn' => array( 'label' => __('Save connection', 'ai-eshop-optimizer'), 'description' => __('Stores the login for the supplier or marketplace you are importing from, so future imports can sign in.', 'ai-eshop-optimizer'), ), 'catalog_importer.catalog_import_start' => array( 'label' => __('Start import', 'ai-eshop-optimizer'), 'description' => __('Begins pulling in the catalogue, creating the products as drafts so nothing appears in the shop before you have looked at it.', 'ai-eshop-optimizer'), ), 'catalog_importer.catalog_import_test' => array( 'label' => __('Test connection', 'ai-eshop-optimizer'), 'description' => __('Signs in with the details as saved and reports whether they work, without importing anything.', 'ai-eshop-optimizer'), ), 'category_extras.h3_migrate' => array( 'label' => __('Tidy old headings', 'ai-eshop-optimizer'), 'description' => __('Rewrites headings left over from older category text so they sit at the right level for search engines.', 'ai-eshop-optimizer'), ), 'category_extras.marketplace_tax_browse' => array( 'label' => __('Browse marketplace categories', 'ai-eshop-optimizer'), 'description' => __('Walks the marketplace category tree level by level, for when you would rather look than search.', 'ai-eshop-optimizer'), ), 'category_extras.marketplace_tax_search' => array( 'label' => __('Search marketplace categories', 'ai-eshop-optimizer'), 'description' => __('Finds the matching category on Skroutz or another marketplace by name, so your products are filed correctly there.', 'ai-eshop-optimizer'), ), 'category_extras.migrate' => array( 'label' => __('Bring across the old data', 'ai-eshop-optimizer'), 'description' => __('Copies category banners and text over from the previous plugin, so you keep what you had without retyping it.', 'ai-eshop-optimizer'), ), 'category_extras.save_settings' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets how category pages behave across the shop, which every category then follows unless it overrides it.', 'ai-eshop-optimizer'), 'context' => __('category extras', 'ai-eshop-optimizer'), ), 'category_extras.search' => array( 'label' => __('Search categories', 'ai-eshop-optimizer'), 'description' => __('Finds a category by name while you are linking one to another, so you pick from a list rather than typing codes.', 'ai-eshop-optimizer'), ), 'checkout_invoicing.om_checkout_aade_lookup' => array( 'label' => __('Look up the company', 'ai-eshop-optimizer'), 'description' => __('Looks a tax number up with the tax authority register and fills in the company name and address for the shopper.', 'ai-eshop-optimizer'), ), 'checkout_invoicing.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets the invoice fields at checkout, including the tax number and activity boxes businesses fill in.', 'ai-eshop-optimizer'), 'context' => __('invoicing', 'ai-eshop-optimizer'), ), 'checkout_layout.reset_ab' => array( 'label' => __('Reset the test', 'ai-eshop-optimizer'), 'description' => __('Clears the results of the checkout layout test so a fresh comparison can start.', 'ai-eshop-optimizer'), ), 'checkout_layout.save' => array( 'label' => __('Save layout', 'ai-eshop-optimizer'), 'description' => __('Sets the order and grouping of the checkout fields shoppers fill in.', 'ai-eshop-optimizer'), ), 'checkout_modal.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets how checkout errors are announced, so a shopper who cannot pay is told why in a way they will notice.', 'ai-eshop-optimizer'), ), 'checkout_product_images.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Chooses whether product pictures appear in the checkout summary.', 'ai-eshop-optimizer'), ), 'competitions.competition_draw_winners' => array( 'label' => __('Draw winners', 'ai-eshop-optimizer'), 'description' => __('Picks the number of winners you asked for at random from everyone who entered, and records who they are.', 'ai-eshop-optimizer'), ), 'competitions.competition_toggle_winner' => array( 'label' => __('Winner', 'ai-eshop-optimizer'), 'description' => __('Adds or removes one entrant from the winners list by hand, for when a draw needs correcting.', 'ai-eshop-optimizer'), ), 'competitions.refresh_stats' => array( 'label' => __('Refresh figures', 'ai-eshop-optimizer'), 'description' => __('Recounts entries and shares for your competitions so the figures on screen match what has actually happened.', 'ai-eshop-optimizer'), 'context' => __('competitions', 'ai-eshop-optimizer'), ), 'competitions.save' => array( 'label' => __('Save', 'ai-eshop-optimizer'), 'description' => __('Stores a competition with its dates, prize and entry rules, and it starts accepting entries once it is running.', 'ai-eshop-optimizer'), 'context' => __('competition', 'ai-eshop-optimizer'), ), 'competitions.settings_save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets the shop-wide rules every competition follows, such as who may enter and what they have to agree to.', 'ai-eshop-optimizer'), 'context' => __('competitions', 'ai-eshop-optimizer'), ), 'competitions.stats_cadence' => array( 'label' => __('How often to recount', 'ai-eshop-optimizer'), 'description' => __('Sets how often competition figures recount themselves, trading freshness against the work it costs the shop.', 'ai-eshop-optimizer'), ), 'complementary.add' => array( 'label' => __('Add these too', 'ai-eshop-optimizer'), 'description' => __('The shopper\'s own button: puts every suggested extra into their basket in one go, rather than one at a time.', 'ai-eshop-optimizer'), ), 'complementary.delete' => array( 'label' => __('Delete', 'ai-eshop-optimizer'), 'description' => __('Removes a cross-sell rule, so those extra products stop being suggested with anything.', 'ai-eshop-optimizer'), 'context' => __('cross-sell rule', 'ai-eshop-optimizer'), ), 'complementary.export' => array( 'label' => __('Export', 'ai-eshop-optimizer'), 'description' => __('Downloads all your cross-sell rules as a spreadsheet, so you can check them over or copy them to another shop.', 'ai-eshop-optimizer'), 'context' => __('cross-sell rules', 'ai-eshop-optimizer'), ), 'complementary.import' => array( 'label' => __('Import', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), 'context' => __('cross-sell rules', 'ai-eshop-optimizer'), ), 'complementary.migrate' => array( 'label' => __('Bring across the old rules', 'ai-eshop-optimizer'), 'description' => __('Copies cross-sell rules over from the old Pods promo campaigns, so you do not have to type them in again.', 'ai-eshop-optimizer'), ), 'complementary.save' => array( 'label' => __('Save', 'ai-eshop-optimizer'), 'description' => __('Stores one cross-sell rule, so the products you picked start appearing alongside the ones that trigger them.', 'ai-eshop-optimizer'), 'context' => __('cross-sell rule', 'ai-eshop-optimizer'), ), 'complementary.save_appearance' => array( 'label' => __('Save appearance', 'ai-eshop-optimizer'), 'description' => __('Sets how the suggestion box looks, meaning its text sizes, borders and corners, wherever it appears in the shop.', 'ai-eshop-optimizer'), ), 'connections.usage_sharing_optin' => array( 'label' => __('I agree, record which controls we use', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), 'context' => __('staff usage sharing', 'ai-eshop-optimizer'), ), 'consent.classify' => array( 'label' => __('Sort the cookies', 'ai-eshop-optimizer'), 'description' => __('Files the cookies found on your site into categories, so refusing a category actually stops the right ones.', 'ai-eshop-optimizer'), ), 'consent.clear' => array( 'label' => __('Clear the cookie list', 'ai-eshop-optimizer'), 'description' => __('Empties the record of cookies found, so the next scan starts from nothing.', 'ai-eshop-optimizer'), ), 'consent.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets what the cookie banner says, which categories shoppers can refuse, and how it looks.', 'ai-eshop-optimizer'), 'context' => __('cookie banner', 'ai-eshop-optimizer'), ), 'contact_discovery.contacts_cancel' => array( 'label' => __('Stop', 'ai-eshop-optimizer'), 'description' => __('Halts the account creation part-way through, leaving every account already made in place.', 'ai-eshop-optimizer'), ), 'contact_discovery.contacts_preview' => array( 'label' => __('Preview', 'ai-eshop-optimizer'), 'description' => __('Shows twenty-five examples of the accounts that would be created, so you can check the result before committing to it.', 'ai-eshop-optimizer'), ), 'contact_discovery.contacts_progress' => array( 'label' => __('Progress', 'ai-eshop-optimizer'), 'description' => __('Reports how far the account creation has got, so a long run can be watched without reloading the page.', 'ai-eshop-optimizer'), ), 'contact_discovery.contacts_scan' => array( 'label' => __('Scan', 'ai-eshop-optimizer'), 'description' => __('Looks through the places people have left their details and counts how many could be turned into customer accounts.', 'ai-eshop-optimizer'), ), 'contact_discovery.contacts_settings' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Chooses which sources are searched for contacts and whether people are told when an account is made for them.', 'ai-eshop-optimizer'), 'context' => __('contacts', 'ai-eshop-optimizer'), ), 'contact_discovery.contacts_start' => array( 'label' => __('Create the accounts', 'ai-eshop-optimizer'), 'description' => __('Creates a real customer account for every contact found in the sources you ticked, and emails each person when notify is switched on.', 'ai-eshop-optimizer'), ), 'contact_form.delete' => array( 'label' => __('Delete', 'ai-eshop-optimizer'), 'description' => __('Permanently removes one or more contact messages, including everything the visitor typed into the form.', 'ai-eshop-optimizer'), ), 'contact_form.save' => array( 'label' => __('Save', 'ai-eshop-optimizer'), 'description' => __('Sets which fields the contact form asks for, who is emailed about new messages, and the wording of the thank-you the visitor receives.', 'ai-eshop-optimizer'), 'context' => __('contact form', 'ai-eshop-optimizer'), ), 'contact_form.status' => array( 'label' => __('Save status', 'ai-eshop-optimizer'), 'description' => __('Marks one or more contact messages as new, read, replied or spam, so the list shows what still needs an answer.', 'ai-eshop-optimizer'), ), 'contact_optin.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets the wording of the marketing permission box at checkout, which is what shoppers agree to.', 'ai-eshop-optimizer'), 'context' => __('checkout opt-in', 'ai-eshop-optimizer'), ), 'contributors.contributor_delete' => array( 'label' => __('Delete contributor', 'ai-eshop-optimizer'), 'description' => __('Removes an author. Articles credited to them lose their byline.', 'ai-eshop-optimizer'), ), 'contributors.contributor_save' => array( 'label' => __('Save contributor', 'ai-eshop-optimizer'), 'description' => __('Stores an author with their details, so articles can be credited to a real named person.', 'ai-eshop-optimizer'), ), 'conversion_goals.goal_analyze' => array( 'label' => __('Analyse goal', 'ai-eshop-optimizer'), 'description' => __('Looks at what is helping or hurting one goal and explains the pattern in plain words.', 'ai-eshop-optimizer'), ), 'conversion_goals.goals_form_insights' => array( 'label' => __('Form results', 'ai-eshop-optimizer'), 'description' => __('Shows how people are getting on with a form, including where they give up.', 'ai-eshop-optimizer'), ), 'conversion_goals.goals_save' => array( 'label' => __('Save goals', 'ai-eshop-optimizer'), 'description' => __('Stores the targets you are measuring against, such as revenue or sign-ups.', 'ai-eshop-optimizer'), ), 'conversions.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets what counts as a conversion, which is what the success figures across the reports are counted against.', 'ai-eshop-optimizer'), 'context' => __('conversions', 'ai-eshop-optimizer'), ), 'custom_slots.add' => array( 'label' => __('Add slot', 'ai-eshop-optimizer'), 'description' => __('Creates a new place in the shop layout where you can put your own content.', 'ai-eshop-optimizer'), ), 'custom_slots.delete' => array( 'label' => __('Delete slot', 'ai-eshop-optimizer'), 'description' => __('Removes one of your own content areas, and whatever was in it stops being shown.', 'ai-eshop-optimizer'), ), 'custom_slots.save' => array( 'label' => __('Save slot', 'ai-eshop-optimizer'), 'description' => __('Stores what goes in one of your own content areas and where it appears.', 'ai-eshop-optimizer'), ), 'custom_tabs.migrate' => array( 'label' => __('Bring across the old tabs', 'ai-eshop-optimizer'), 'description' => __('Copies product tabs over from the previous plugin so the content is not lost.', 'ai-eshop-optimizer'), ), 'custom_tabs.save' => array( 'label' => __('Save tabs', 'ai-eshop-optimizer'), 'description' => __('Stores your own tabs on the product page, such as care instructions or sizing.', 'ai-eshop-optimizer'), 'context' => __('product tabs', 'ai-eshop-optimizer'), ), 'customer_profile.describe' => array( 'label' => __('Describe this customer', 'ai-eshop-optimizer'), 'description' => __('Sums up one customer buying history in plain words, so you know who you are talking to before you call.', 'ai-eshop-optimizer'), ), 'customer_profile.narrate' => array( 'label' => __('Explain the figures', 'ai-eshop-optimizer'), 'description' => __('Explains what a customer numbers actually mean, rather than leaving you to read a table.', 'ai-eshop-optimizer'), ), 'data_prep_scheduler.data_prep_full_substrate' => array( 'label' => __('Rebuild everything', 'ai-eshop-optimizer'), 'description' => __('Rebuilds the whole set of prepared figures from scratch, which is the last resort when the reports look wrong.', 'ai-eshop-optimizer'), ), 'data_prep_scheduler.data_prep_run_now' => array( 'label' => __('Run now', 'ai-eshop-optimizer'), 'description' => __('Runs the data preparation immediately rather than waiting for tonight, which is what to press after a big import.', 'ai-eshop-optimizer'), ), 'data_prep_scheduler.data_prep_save' => array( 'label' => __('Save schedule', 'ai-eshop-optimizer'), 'description' => __('Sets how often and at what time the nightly data preparation runs, so it lands when the shop is quiet.', 'ai-eshop-optimizer'), ), 'data_prep_scheduler.identity_backfill' => array( 'label' => __('Match up returning customers', 'ai-eshop-optimizer'), 'description' => __('Goes back over past orders and links the ones placed by the same person, so a guest who later signs up is recognised.', 'ai-eshop-optimizer'), ), 'events.save' => array( 'label' => __('Save event', 'ai-eshop-optimizer'), 'description' => __('Stores an event with its dates and details, which shoppers can then see and sign up to.', 'ai-eshop-optimizer'), ), 'events.settings_save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets the shop-wide rules events follow, such as who may sign up and what they are asked.', 'ai-eshop-optimizer'), 'context' => __('events', 'ai-eshop-optimizer'), ), 'faq.add_group' => array( 'label' => __('Add group', 'ai-eshop-optimizer'), 'description' => __('Creates a new FAQ group, which is how one set of questions is shown on a product page and another in the footer.', 'ai-eshop-optimizer'), ), 'faq.create' => array( 'label' => __('Add FAQ', 'ai-eshop-optimizer'), 'description' => __('Publishes a new question and answer in the group you chose, which then appears wherever that group is displayed.', 'ai-eshop-optimizer'), ), 'faq.delete' => array( 'label' => __('Delete', 'ai-eshop-optimizer'), 'description' => __('Sends one question and answer to the trash, so it stops appearing on the storefront but can still be restored from there.', 'ai-eshop-optimizer'), 'context' => __('FAQ', 'ai-eshop-optimizer'), ), 'faq.delete_group' => array( 'label' => __('Delete group', 'ai-eshop-optimizer'), 'description' => __('Removes a group entirely, leaving the questions that were in it without one and out of wherever the group was shown.', 'ai-eshop-optimizer'), ), 'faq.rename_group' => array( 'label' => __('Rename group', 'ai-eshop-optimizer'), 'description' => __('Changes a group\'s name, which is the heading shoppers see above the questions it holds.', 'ai-eshop-optimizer'), ), 'faq.reorder' => array( 'label' => __('Reorder', 'ai-eshop-optimizer'), 'description' => __('Saves the order you dragged the questions into, which is the order shoppers meet them in.', 'ai-eshop-optimizer'), 'context' => __('FAQs', 'ai-eshop-optimizer'), ), 'faq.update_q' => array( 'label' => __('Edit question', 'ai-eshop-optimizer'), 'description' => __('Renames one question in place, changing what shoppers read and what the AI chat matches their wording against.', 'ai-eshop-optimizer'), ), 'food_beverages.food_save_settings' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets the extra details food and drink products need by law, such as ingredients and allergens.', 'ai-eshop-optimizer'), 'context' => __('food and drink', 'ai-eshop-optimizer'), ), 'form_insights.form_respondents' => array( 'label' => __('Who answered', 'ai-eshop-optimizer'), 'description' => __('Lists the people behind the form answers, so you can follow one up.', 'ai-eshop-optimizer'), ), 'free_shipping.delete_rule' => array( 'label' => __('Delete rule', 'ai-eshop-optimizer'), 'description' => __('Removes a free delivery rule, so those orders start paying postage again.', 'ai-eshop-optimizer'), 'context' => __('free shipping', 'ai-eshop-optimizer'), ), 'free_shipping.remove_exclusion' => array( 'label' => __('Remove exclusion', 'ai-eshop-optimizer'), 'description' => __('Lets a product qualify for free delivery again after it had been left out.', 'ai-eshop-optimizer'), ), 'free_shipping.save_rule' => array( 'label' => __('Save rule', 'ai-eshop-optimizer'), 'description' => __('Stores a free delivery rule, such as over a certain basket value, which shoppers get straight away.', 'ai-eshop-optimizer'), ), 'free_shipping_display.free_shipping_save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Chooses which countries may pay cash on delivery.', 'ai-eshop-optimizer'), 'context' => __('cash on delivery', 'ai-eshop-optimizer'), ), 'fulfillment.ff_backfill_costs' => array( 'label' => __('Backfill carrier costs', 'ai-eshop-optimizer'), 'description' => __('Pulls what a carrier charged for past shipments, batch by batch, so the shipping reports stop guessing at cost.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_backfill_customer_paid' => array( 'label' => __('Backfill customer-paid shipping', 'ai-eshop-optimizer'), 'description' => __('Copies what the customer paid for shipping from each WooCommerce order onto its voucher, which is the other half of the margin calculation.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_backfill_delivered' => array( 'label' => __('Backfill delivery dates', 'ai-eshop-optimizer'), 'description' => __('Asks a carrier for the final status of past shipments in small batches and records when each was actually delivered.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_backfill_detailed' => array( 'label' => __('Backfill detailed charges', 'ai-eshop-optimizer'), 'description' => __('Fetches the itemised charge breakdown for past shipments from a carrier, which is what separates fuel and area surcharges from the base rate.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_bulk_merge' => array( 'label' => __('Merge to one PDF', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_bulk_zip' => array( 'label' => __('Download as ZIP', 'ai-eshop-optimizer'), 'description' => __('Same selection as the merge, delivered as one file per order inside a ZIP, for when each document has to be filed separately.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_bulk_zip_labels' => array( 'label' => __('Download labels ZIP', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_cancel_voucher' => array( 'label' => __('Cancel voucher', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_close_and_print' => array( 'label' => __('Close and print manifest', 'ai-eshop-optimizer'), 'description' => __('Closes the round and immediately returns the manifest the driver signs, which is the paper record that the parcels left your premises.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_close_pending_by_date' => array( 'label' => __('Close by date', 'ai-eshop-optimizer'), 'description' => __('Closes the pending shipments that fall inside a date range you type, for catching up after a day when nobody closed the round.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_close_pending_now' => array( 'label' => __('Close pending now', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_create_document' => array( 'label' => __('Create document', 'ai-eshop-optimizer'), 'description' => __('Generates an invoice, packing slip, proforma or credit note for one order and files it against that order permanently.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_create_voucher' => array( 'label' => __('Create voucher', 'ai-eshop-optimizer'), 'description' => __('Books a real shipment with the chosen carrier for this order and stores the voucher number it returns, without telling the customer anything.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_delete_custom_carrier' => array( 'label' => __('Delete custom carrier', 'ai-eshop-optimizer'), 'description' => __('Removes a hand-made carrier, which leaves any order already filed under it pointing at a carrier that no longer exists.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_delete_document' => array( 'label' => __('Delete document', 'ai-eshop-optimizer'), 'description' => __('Removes a generated document and its PDF from the order, leaving a gap in the numbering that will not be filled again.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_delete_voucher' => array( 'label' => __('Delete voucher', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_download_manifest' => array( 'label' => __('Download manifest', 'ai-eshop-optimizer'), 'description' => __('Downloads the stored manifest file for one past closing, identified by its closing id in the run log.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_get_document_pdf' => array( 'label' => __('View PDF', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_get_label' => array( 'label' => __('Print label', 'ai-eshop-optimizer'), 'description' => __('Fetches the printable A4 label from the carrier and keeps a copy, so you can reprint it later without asking them again.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_import_carrier_csv' => array( 'label' => __('Import carrier CSV', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_import_geniki_csv' => array( 'label' => __('Import Geniki CSV', 'ai-eshop-optimizer'), 'description' => __('Reads the billing CSV Geniki sends you and files what each shipment actually cost against the order it belongs to.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_merge_couriers' => array( 'label' => __('Merge carriers', 'ai-eshop-optimizer'), 'description' => __('Rewrites every order and voucher filed under one carrier code to another, for cleaning up after a rename or a duplicate carrier.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_metrics_drill' => array( 'label' => __('Drill into a postcode', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_metrics_export' => array( 'label' => __('Export shipments', 'ai-eshop-optimizer'), 'description' => __('Writes one spreadsheet row per shipment for the chosen carrier, with cost, what the customer paid and the destination area.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_metrics_export_aggregate' => array( 'label' => __('Export by area', 'ai-eshop-optimizer'), 'description' => __('Writes the same figures totalled by postcode prefix instead of by shipment, which is the version to take to a carrier negotiation.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_migrate_audit' => array( 'label' => __('Audit legacy data', 'ai-eshop-optimizer'), 'description' => __('Counts what a migration from the old shipment-tracking data would move, without moving any of it, so the work is visible first.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_migrate_batch' => array( 'label' => __('Run migration step', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_migrate_reset' => array( 'label' => __('Reset migration progress', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_print_doc_for_order' => array( 'label' => __('Print', 'ai-eshop-optimizer'), 'description' => __('Produces the chosen document type for one order and returns it ready to print, creating it first if that order has none yet.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_reprint_last_closing' => array( 'label' => __('Reprint last manifest', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_save_carrier_map' => array( 'label' => __('Link shipping method', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_save_courier' => array( 'label' => __('Save carrier', 'ai-eshop-optimizer'), 'description' => __('Stores one carrier driver\'s credentials and options, which is what decides whether booking, printing, tracking and closing work at all for it.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_save_custom_carrier' => array( 'label' => __('Save custom carrier', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_save_general' => array( 'label' => __('Save general settings', 'ai-eshop-optimizer'), 'description' => __('Stores the shop-wide fulfilment defaults, including which carrier a voucher uses when nobody picks one.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_save_manual_voucher' => array( 'label' => __('Save voucher number', 'ai-eshop-optimizer'), 'description' => __('Files a voucher number you booked yourself against the order, and emails the customer a tracking link if you tick the notify box.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_test_courier' => array( 'label' => __('Test connection', 'ai-eshop-optimizer'), 'description' => __('Calls the carrier with the credentials as saved and reports whether they authenticate, without booking or changing anything.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_toggle_auto_close' => array( 'label' => __('Automatic daily close', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'fulfillment.ff_track_now' => array( 'label' => __('Track now', 'ai-eshop-optimizer'), 'description' => __('Asks the carrier where this parcel is right now, instead of waiting for the overnight update.', 'ai-eshop-optimizer'), ), 'google_reviews.grv_delete_location' => array( 'label' => __('Delete', 'ai-eshop-optimizer'), 'description' => __('Removes a location from the sync list while leaving every review already pulled for it in the history table.', 'ai-eshop-optimizer'), ), 'google_reviews.grv_fetch_all' => array( 'label' => __('Fetch all', 'ai-eshop-optimizer'), 'description' => __('Pulls reviews for every switched-on shop in one go, which Google charges you for once per shop and can take several minutes.', 'ai-eshop-optimizer'), ), 'google_reviews.grv_fetch_now' => array( 'label' => __('Fetch now', 'ai-eshop-optimizer'), 'description' => __('Pulls the latest reviews for this one location straight away and appends anything not seen before to the permanent history.', 'ai-eshop-optimizer'), ), 'google_reviews.grv_lookup_place' => array( 'label' => __('Look up', 'ai-eshop-optimizer'), 'description' => __('Finds your shop on Google by name or Maps link and fills in its id for you. Google charges you for each attempt.', 'ai-eshop-optimizer'), ), 'google_reviews.grv_reorder_location' => array( 'label' => __('Move up / Move down', 'ai-eshop-optimizer'), 'description' => __('Changes where a location sits in the list, which is the order the storefront review block shows branches in.', 'ai-eshop-optimizer'), ), 'google_reviews.grv_save_location' => array( 'label' => __('Save location', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'google_reviews.grv_save_settings' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Stores the Google API key, how often reviews sync and where the review block is allowed to appear on the storefront.', 'ai-eshop-optimizer'), ), 'header_actions.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Chooses which icons sit in the shop header, such as search, account, wishlist and basket.', 'ai-eshop-optimizer'), 'context' => __('header', 'ai-eshop-optimizer'), ), 'invoice_scanner.docscan_apply' => array( 'label' => __('Apply to the shop', 'ai-eshop-optimizer'), 'description' => __('Writes weighted average cost of goods, increases stock and closes matching supplier pre-orders for every confirmed line of the document.', 'ai-eshop-optimizer'), ), 'invoice_scanner.docscan_bulk_accept' => array( 'label' => __('Accept confident matches', 'ai-eshop-optimizer'), 'description' => __('Confirms every line whose match score clears the threshold, teaching the supplier match memory for each one.', 'ai-eshop-optimizer'), ), 'invoice_scanner.docscan_connect' => array( 'label' => __('Connect document scanning', 'ai-eshop-optimizer'), 'description' => __('Asks the Rooster portal for this site\'s scanning credentials and stores them, turning the scanner from not connected to ready.', 'ai-eshop-optimizer'), ), 'invoice_scanner.docscan_crop' => array( 'label' => __('Show a line photo', 'ai-eshop-optimizer'), 'description' => __('Serves the cached photo crop of one invoice line so the reviewer can see exactly what the document printed.', 'ai-eshop-optimizer'), ), 'invoice_scanner.docscan_delete' => array( 'label' => __('Remove a document', 'ai-eshop-optimizer'), 'description' => __('Deletes one scanned document, its lines and its stored original file from this site. The scanning service copy is already purged.', 'ai-eshop-optimizer'), ), 'invoice_scanner.docscan_line_rule' => array( 'label' => __('Rule on a line', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'invoice_scanner.docscan_list' => array( 'label' => __('List scanned documents', 'ai-eshop-optimizer'), 'description' => __('Reloads the list of scanned documents with their current status. Reads stored rows only and changes nothing.', 'ai-eshop-optimizer'), ), 'invoice_scanner.docscan_match_assist' => array( 'label' => __('Ask Rooster for suggestions', 'ai-eshop-optimizer'), 'description' => __('Sends still unmatched lines with candidate products to the scanning service and stores what comes back as suggestions, never as automatic matches.', 'ai-eshop-optimizer'), ), 'invoice_scanner.docscan_original' => array( 'label' => __('Open the original', 'ai-eshop-optimizer'), 'description' => __('Serves the stored original document file for viewing in a new tab.', 'ai-eshop-optimizer'), ), 'invoice_scanner.docscan_poll' => array( 'label' => __('Check scan progress', 'ai-eshop-optimizer'), 'description' => __('Asks the scanning service how far a batch has come and stores finished results locally, moving documents from reading to ready for review.', 'ai-eshop-optimizer'), ), 'invoice_scanner.docscan_reprocess' => array( 'label' => __('Re-scan a document', 'ai-eshop-optimizer'), 'description' => __('Uploads the stored original again for a fresh read. Replaces every line and confirmation on the document and is charged again.', 'ai-eshop-optimizer'), ), 'invoice_scanner.docscan_review' => array( 'label' => __('Load the review screen', 'ai-eshop-optimizer'), 'description' => __('Runs matching over unresolved lines and returns the document for review. Lines the operator already ruled on are never touched.', 'ai-eshop-optimizer'), ), 'invoice_scanner.docscan_supplier_pick' => array( 'label' => __('Set the supplier', 'ai-eshop-optimizer'), 'description' => __('Assigns a supplier to the document, creating the supplier term first when asked, then runs matching for the first time.', 'ai-eshop-optimizer'), ), 'invoice_scanner.docscan_supplier_search' => array( 'label' => __('Find the supplier', 'ai-eshop-optimizer'), 'description' => __('Looks up supplier candidates for a document by VAT number and by name similarity so the reviewer can pick one. Reads only.', 'ai-eshop-optimizer'), ), 'invoice_scanner.docscan_upload' => array( 'label' => __('Upload a document', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'invoice_scanner.docscan_vocab_uplink' => array( 'label' => __('Toggle shared vocabulary', 'ai-eshop-optimizer'), 'description' => __('Turns contribution of supplier feed vocabulary to the shared lexicon on or off for this site.', 'ai-eshop-optimizer'), ), 'local_pickup.apply_orders' => array( 'label' => __('Apply to past orders', 'ai-eshop-optimizer'), 'description' => __('Works through orders already placed and files each against the collection point it belongs to, a hundred at a time.', 'ai-eshop-optimizer'), ), 'local_pickup.import_legacy' => array( 'label' => __('Bring across the old points', 'ai-eshop-optimizer'), 'description' => __('Creates collection points from the names the previous setup used, so you do not have to add them all by hand.', 'ai-eshop-optimizer'), ), 'local_pickup.legacy_map_save' => array( 'label' => __('Match up the old names', 'ai-eshop-optimizer'), 'description' => __('Says which old collection name means which new point, so past orders are read as belonging to the right shop.', 'ai-eshop-optimizer'), ), 'local_pickup.rename' => array( 'label' => __('Rename pickup point', 'ai-eshop-optimizer'), 'description' => __('Changes the name a collection point is shown under at checkout, without disturbing orders already placed against it.', 'ai-eshop-optimizer'), ), 'local_pickup.save' => array( 'label' => __('Save pickup point', 'ai-eshop-optimizer'), 'description' => __('Stores a shop or locker customers can collect from, which then appears as a delivery choice at checkout.', 'ai-eshop-optimizer'), ), 'login_security.2fa_begin' => array( 'label' => __('Set up two-factor authentication', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), 'context' => __('user profile', 'ai-eshop-optimizer'), ), 'login_security.2fa_confirm' => array( 'label' => __('Confirm', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), 'context' => __('user profile', 'ai-eshop-optimizer'), ), 'login_security.2fa_disable' => array( 'label' => __('Switch off', 'ai-eshop-optimizer'), 'description' => __('Turns two-factor authentication off for an account and destroys its secret and recovery codes, leaving it protected by its password alone.', 'ai-eshop-optimizer'), 'context' => __('user profile', 'ai-eshop-optimizer'), ), 'login_security.2fa_recovery' => array( 'label' => __('Issue new recovery codes', 'ai-eshop-optimizer'), 'description' => __('Replaces your recovery codes with a fresh set and shows them once, after which the codes you saved before stop working.', 'ai-eshop-optimizer'), 'context' => __('user profile', 'ai-eshop-optimizer'), ), 'login_security.release' => array( 'label' => __('Lift every pause now', 'ai-eshop-optimizer'), 'description' => __('Unblocks every address currently paused for repeated failures, so anyone who was being stopped can try passwords again immediately.', 'ai-eshop-optimizer'), 'context' => __('2FA and sign-in security', 'ai-eshop-optimizer'), ), 'login_security.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), 'context' => __('2FA and sign-in security', 'ai-eshop-optimizer'), ), 'loyalty_classes.loyalty_assign_user' => array( 'label' => __('Assign', 'ai-eshop-optimizer'), 'description' => __('Puts one customer into a loyalty class by hand, giving them its benefits straight away regardless of whether they have earned it.', 'ai-eshop-optimizer'), ), 'loyalty_classes.loyalty_bulk_process' => array( 'label' => __('Process batch', 'ai-eshop-optimizer'), 'description' => __('Works through the uploaded file a batch at a time, moving each listed customer into the class named against them.', 'ai-eshop-optimizer'), 'context' => __('loyalty', 'ai-eshop-optimizer'), ), 'loyalty_classes.loyalty_bulk_upload' => array( 'label' => __('Upload CSV', 'ai-eshop-optimizer'), 'description' => __('Accepts a spreadsheet of customers and the class each should be in, and prepares it without assigning anybody yet.', 'ai-eshop-optimizer'), 'context' => __('loyalty', 'ai-eshop-optimizer'), ), 'loyalty_classes.loyalty_class_delete' => array( 'label' => __('Delete', 'ai-eshop-optimizer'), 'description' => __('Removes a loyalty class, which takes its benefits away from everyone who was in it.', 'ai-eshop-optimizer'), 'context' => __('loyalty class', 'ai-eshop-optimizer'), ), 'loyalty_classes.loyalty_class_save' => array( 'label' => __('Save class', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'loyalty_classes.loyalty_points_adjust' => array( 'label' => __('Adjust points', 'ai-eshop-optimizer'), 'description' => __('Adds or removes loyalty points from one customer\'s balance with a note saying why, which is the record of a manual correction.', 'ai-eshop-optimizer'), ), 'loyalty_classes.loyalty_search_users' => array( 'label' => __('Customer search', 'ai-eshop-optimizer'), 'description' => __('Finds customers by name, login or address while you are assigning somebody to a class.', 'ai-eshop-optimizer'), 'context' => __('loyalty', 'ai-eshop-optimizer'), ), 'loyalty_classes.loyalty_unassign_user' => array( 'label' => __('Remove', 'ai-eshop-optimizer'), 'description' => __('Takes one customer out of a loyalty class, so they lose its benefits on their next visit.', 'ai-eshop-optimizer'), 'context' => __('from loyalty class', 'ai-eshop-optimizer'), ), 'marketplace_feeds.feed_delete' => array( 'label' => __('Delete', 'ai-eshop-optimizer'), 'description' => __('Removes a feed and cancels its schedule, so the marketplace stops receiving updates and keeps whatever it last read.', 'ai-eshop-optimizer'), 'context' => __('marketplace feed', 'ai-eshop-optimizer'), ), 'marketplace_feeds.feed_get' => array( 'label' => __('Edit', 'ai-eshop-optimizer'), 'description' => __('Loads one feed\'s saved configuration into the form so you can change its filters, mapping or schedule.', 'ai-eshop-optimizer'), 'context' => __('marketplace feed', 'ai-eshop-optimizer'), ), 'marketplace_feeds.feed_get_variations' => array( 'label' => __('Show variations', 'ai-eshop-optimizer'), 'description' => __('Lists a variable product\'s variations so a feed rule can name one size or colour rather than the whole product.', 'ai-eshop-optimizer'), ), 'marketplace_feeds.feed_run_now' => array( 'label' => __('Run now', 'ai-eshop-optimizer'), 'description' => __('Regenerates one feed file immediately rather than waiting for its schedule, which is how you check a change before the marketplace sees it.', 'ai-eshop-optimizer'), ), 'marketplace_feeds.feed_save' => array( 'label' => __('Save feed', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'marketplace_feeds.feed_save_availability' => array( 'label' => __('Save availability wording', 'ai-eshop-optimizer'), 'description' => __('Sets the exact words written into the availability column for in-stock and out-of-stock items, which some marketplaces match literally.', 'ai-eshop-optimizer'), ), 'marketplace_feeds.feed_search_products' => array( 'label' => __('Product search', 'ai-eshop-optimizer'), 'description' => __('Finds products by name or SKU while you are picking which ones a feed includes or excludes.', 'ai-eshop-optimizer'), 'context' => __('feed filter', 'ai-eshop-optimizer'), ), 'marketplace_feeds.search_categories' => array( 'label' => __('Category search', 'ai-eshop-optimizer'), 'description' => __('Finds product categories by name while you are choosing what a feed covers, so you pick from a list rather than typing ids.', 'ai-eshop-optimizer'), 'context' => __('feed filter', 'ai-eshop-optimizer'), ), 'media_cleanup.media_purge' => array( 'label' => __('Delete for good', 'ai-eshop-optimizer'), 'description' => __('Permanently deletes the quarantined pictures. There is no way back once this is done.', 'ai-eshop-optimizer'), ), 'media_cleanup.media_quarantine' => array( 'label' => __('Move to quarantine', 'ai-eshop-optimizer'), 'description' => __('Moves the pictures found to a holding area so you can check the shop still looks right before anything is lost.', 'ai-eshop-optimizer'), ), 'media_cleanup.media_scan_start' => array( 'label' => __('Start the scan', 'ai-eshop-optimizer'), 'description' => __('Begins looking through your media library for pictures nothing in the shop uses any more.', 'ai-eshop-optimizer'), ), 'media_cleanup.media_scan_step' => array( 'label' => __('Keep scanning', 'ai-eshop-optimizer'), 'description' => __('Carries the scan on from where it stopped, so a large library can be checked without timing out.', 'ai-eshop-optimizer'), ), 'min_order.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets the smallest order you will accept and the message shown when a basket is under it.', 'ai-eshop-optimizer'), 'context' => __('minimum order', 'ai-eshop-optimizer'), ), 'my_settings.save_my_settings' => array( 'label' => __('Save my settings', 'ai-eshop-optimizer'), 'description' => __('Stores your own preferences, such as the screen you land on. It affects nobody else.', 'ai-eshop-optimizer'), ), 'navigator.regenerate' => array( 'label' => __('Rebuild the index', 'ai-eshop-optimizer'), 'description' => __('Rebuilds the list the quick navigator searches, which is the fix when a new screen cannot be found.', 'ai-eshop-optimizer'), ), 'navigator.save_settings' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets how the quick navigator behaves, including its keyboard shortcut.', 'ai-eshop-optimizer'), 'context' => __('quick navigator', 'ai-eshop-optimizer'), ), 'newsletter_signup.newsletter_subscribe' => array( 'label' => __('Subscribe', 'ai-eshop-optimizer'), 'description' => __('The shopper own control: adds their address to your newsletter list.', 'ai-eshop-optimizer'), ), 'newsletter_signup.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets the newsletter sign-up box wording and where it appears in the shop.', 'ai-eshop-optimizer'), 'context' => __('newsletter box', 'ai-eshop-optimizer'), ), 'offer_effectiveness.export' => array( 'label' => __('Export', 'ai-eshop-optimizer'), 'description' => __('Downloads what each offer earned or cost you as a spreadsheet, so the figures can go into a report or a meeting.', 'ai-eshop-optimizer'), 'context' => __('offer results', 'ai-eshop-optimizer'), ), 'offer_effectiveness.offer_effectiveness' => array( 'label' => __('Offer results', 'ai-eshop-optimizer'), 'description' => __('Shows what each offer actually earned or cost you, rather than only how many were used.', 'ai-eshop-optimizer'), ), 'option_groups.og_delete' => array( 'label' => __('Delete', 'ai-eshop-optimizer'), 'description' => __('Removes a group or one of its choices. Products relying on it lose that selection.', 'ai-eshop-optimizer'), 'context' => __('option group', 'ai-eshop-optimizer'), ), 'option_groups.og_get_group' => array( 'label' => __('Open group', 'ai-eshop-optimizer'), 'description' => __('Loads one set of choices so you can change its options or its name.', 'ai-eshop-optimizer'), ), 'option_groups.og_get_rules' => array( 'label' => __('Rule list', 'ai-eshop-optimizer'), 'description' => __('Loads the rules saying where each set of choices appears, so you can see what is attached to what.', 'ai-eshop-optimizer'), ), 'option_groups.og_save_group' => array( 'label' => __('Save group', 'ai-eshop-optimizer'), 'description' => __('Stores a set of choices shoppers pick from, such as sizes or extras, ready to attach to products.', 'ai-eshop-optimizer'), ), 'option_groups.og_save_option' => array( 'label' => __('Save option', 'ai-eshop-optimizer'), 'description' => __('Stores one individual choice inside a group, including anything it adds to the price.', 'ai-eshop-optimizer'), ), 'option_groups.og_save_rule' => array( 'label' => __('Save rule', 'ai-eshop-optimizer'), 'description' => __('Decides which products a set of choices appears on, so you attach it once rather than product by product.', 'ai-eshop-optimizer'), ), 'orders_export.process' => array( 'label' => __('Keep exporting', 'ai-eshop-optimizer'), 'description' => __('Carries the order export on from where it stopped until the whole range is written out.', 'ai-eshop-optimizer'), ), 'orders_export.save_fields' => array( 'label' => __('Save columns', 'ai-eshop-optimizer'), 'description' => __('Chooses which columns the order export includes, so you send on only what is needed.', 'ai-eshop-optimizer'), ), 'orders_export.start' => array( 'label' => __('Start export', 'ai-eshop-optimizer'), 'description' => __('Begins building an order export with the columns you chose, so a large date range does not time out.', 'ai-eshop-optimizer'), ), 'payment_country_block.payment_country_save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Chooses which payment methods are offered in which countries.', 'ai-eshop-optimizer'), 'context' => __('payment by country', 'ai-eshop-optimizer'), ), 'payment_gating.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets the rules that hide a payment method, such as by basket value or customer group.', 'ai-eshop-optimizer'), 'context' => __('payment rules', 'ai-eshop-optimizer'), ), 'payment_logos.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Chooses which card and payment logos are shown, so shoppers can see you take what they use.', 'ai-eshop-optimizer'), 'context' => __('payment logos', 'ai-eshop-optimizer'), ), 'phone_orders.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets how orders taken over the phone are handled, including who may place them.', 'ai-eshop-optimizer'), ), 'pnl_settings.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets the fixed monthly running costs, which are shared across the period when profit is worked out.', 'ai-eshop-optimizer'), 'context' => __('profit and loss', 'ai-eshop-optimizer'), ), 'price_export.process' => array( 'label' => __('Keep exporting', 'ai-eshop-optimizer'), 'description' => __('Carries the price list on from where it stopped until every product is written out.', 'ai-eshop-optimizer'), ), 'price_export.start' => array( 'label' => __('Start export', 'ai-eshop-optimizer'), 'description' => __('Begins building a price list of your catalogue.', 'ai-eshop-optimizer'), ), 'price_history.backfill' => array( 'label' => __('Fill in past prices', 'ai-eshop-optimizer'), 'description' => __('Reconstructs what each product used to cost from the records already held, so the lowest-price line has something to say.', 'ai-eshop-optimizer'), ), 'price_history.ordersave' => array( 'label' => __('Correct from orders', 'ai-eshop-optimizer'), 'description' => __('Rewrites the recorded price history to match what customers were actually charged, which the check above found.', 'ai-eshop-optimizer'), ), 'price_history.orderscan' => array( 'label' => __('Check against orders', 'ai-eshop-optimizer'), 'description' => __('Reads past orders to see what customers were actually charged, and reports where that disagrees with the recorded history.', 'ai-eshop-optimizer'), ), 'price_history.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets how price history is kept, which is what the thirty-day lowest-price line is calculated from.', 'ai-eshop-optimizer'), 'context' => __('price history', 'ai-eshop-optimizer'), ), 'problematic_variations.mav_save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets what counts as a problem variation, such as one with no price or no stock, so the list shows what matters.', 'ai-eshop-optimizer'), 'context' => __('problem variations', 'ai-eshop-optimizer'), ), 'product_archive_card.archive_card_save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets how product tiles look on category and search pages specifically, where the layout can differ from elsewhere.', 'ai-eshop-optimizer'), 'context' => __('archive cards', 'ai-eshop-optimizer'), ), 'product_card.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets what appears on a product tile in listings, such as the price, rating and buy button.', 'ai-eshop-optimizer'), 'context' => __('product cards', 'ai-eshop-optimizer'), ), 'product_categories.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets how the category list is shown to shoppers, including how deep it goes and what it displays.', 'ai-eshop-optimizer'), 'context' => __('category display', 'ai-eshop-optimizer'), ), 'product_display.recommendations_save_order' => array( 'label' => __('Save recommendation order', 'ai-eshop-optimizer'), 'description' => __('Saves which recommendation strips appear on a product page and in what order.', 'ai-eshop-optimizer'), ), 'product_display.save_order' => array( 'label' => __('Save layout order', 'ai-eshop-optimizer'), 'description' => __('Saves the order you dragged the product page sections into, which is the order shoppers meet them in.', 'ai-eshop-optimizer'), ), 'product_display.save_tab_order' => array( 'label' => __('Save tab order', 'ai-eshop-optimizer'), 'description' => __('Saves the order of the tabs under a product, such as description and delivery, as shoppers will see them.', 'ai-eshop-optimizer'), ), 'product_display.toggle' => array( 'label' => __('Show or hide a section', 'ai-eshop-optimizer'), 'description' => __('Turns one part of the product page on or off for every product at once.', 'ai-eshop-optimizer'), ), 'product_exchanger.exch_build_feed' => array( 'label' => __('Build now', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'product_exchanger.exch_delete_feed' => array( 'label' => __('Delete', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), 'context' => __('feed', 'ai-eshop-optimizer'), ), 'product_exchanger.exch_delete_import' => array( 'label' => __('Delete', 'ai-eshop-optimizer'), 'description' => __('Removes an inbound import job and its schedule, leaving behind any products it has already created in this shop.', 'ai-eshop-optimizer'), 'context' => __('import job', 'ai-eshop-optimizer'), ), 'product_exchanger.exch_notify_targets' => array( 'label' => __('Notify targets', 'ai-eshop-optimizer'), 'description' => __('Pings the sister sites paired to this feed so they pull the newest build now rather than at their own next scheduled run.', 'ai-eshop-optimizer'), ), 'product_exchanger.exch_rotate_token' => array( 'label' => __('Rotate token', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'product_exchanger.exch_run_import' => array( 'label' => __('Run now', 'ai-eshop-optimizer'), 'description' => __('Pulls the whole source feed immediately and creates or updates products in this shop according to the job\'s matching key and mode.', 'ai-eshop-optimizer'), ), 'product_exchanger.exch_save_feed' => array( 'label' => __('Save feed', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'product_exchanger.exch_save_import' => array( 'label' => __('Save import', 'ai-eshop-optimizer'), 'description' => __('Stores an inbound job\'s source URL, token, matching key, create-or-update mode and schedule, creating the job if it is new.', 'ai-eshop-optimizer'), ), 'product_labels.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets the wording of the little labels around a product, such as stock status and delivery time.', 'ai-eshop-optimizer'), 'context' => __('product labels', 'ai-eshop-optimizer'), ), 'product_meta.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Chooses which product details are shown under the price, such as code, brand and category.', 'ai-eshop-optimizer'), 'context' => __('product details', 'ai-eshop-optimizer'), ), 'product_needs.needs_create_term' => array( 'label' => __('Add a need', 'ai-eshop-optimizer'), 'description' => __('Creates a new shopper need, so products can be filed under it and shoppers can browse by it.', 'ai-eshop-optimizer'), ), 'product_needs.needs_load_product' => array( 'label' => __('Open product', 'ai-eshop-optimizer'), 'description' => __('Loads one product needs so you can see what it is already filed under before changing anything.', 'ai-eshop-optimizer'), ), 'product_needs.needs_save' => array( 'label' => __('Save needs', 'ai-eshop-optimizer'), 'description' => __('Records which shopper needs a product answers, which is what puts it in front of people browsing by need.', 'ai-eshop-optimizer'), ), 'product_needs.needs_save_display' => array( 'label' => __('Save display settings', 'ai-eshop-optimizer'), 'description' => __('Sets where and how the need pills appear on the storefront, which changes what every shopper sees.', 'ai-eshop-optimizer'), ), 'product_needs.needs_search_products' => array( 'label' => __('Product search', 'ai-eshop-optimizer'), 'description' => __('Finds products by name while you are assigning needs, so you pick from a list rather than typing codes.', 'ai-eshop-optimizer'), 'context' => __('needs', 'ai-eshop-optimizer'), ), 'product_orders_analytics.analytics_predictor_step' => array( 'label' => __('Rebuild the sales forecast', 'ai-eshop-optimizer'), 'description' => __('Works through the sales forecast a piece at a time, so a shop with years of orders can rebuild it without timing out.', 'ai-eshop-optimizer'), ), 'product_orders_analytics.analytics_reinstall' => array( 'label' => __('Reinstall report engine', 'ai-eshop-optimizer'), 'description' => __('Rebuilds the routines the reports are calculated with, which is the fix when a report starts failing after an upgrade.', 'ai-eshop-optimizer'), ), 'product_orders_analytics.analytics_run_all' => array( 'label' => __('Run all', 'ai-eshop-optimizer'), 'description' => __('Rebuilds every report in turn and reports how many succeeded, which is the thing to press after a big data change.', 'ai-eshop-optimizer'), ), 'product_orders_analytics.analytics_run_now' => array( 'label' => __('Run now', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), 'context' => __('one report', 'ai-eshop-optimizer'), ), 'product_orders_analytics.analytics_save_pages' => array( 'label' => __('Save pages', 'ai-eshop-optimizer'), 'description' => __('Lists the pages that get the enhanced report tables, so the heavier layout is only loaded where you actually want it.', 'ai-eshop-optimizer'), ), 'product_orders_analytics.analytics_save_schedule' => array( 'label' => __('Save schedule', 'ai-eshop-optimizer'), 'description' => __('Sets how often each report rebuilds itself overnight, so you trade how fresh the figures are against how hard the shop works.', 'ai-eshop-optimizer'), ), 'product_video.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets how product videos are shown in the gallery and whether they play on their own.', 'ai-eshop-optimizer'), 'context' => __('product video', 'ai-eshop-optimizer'), ), 'promo_surfaces.promo_delete_slot' => array( 'label' => __('Delete promo', 'ai-eshop-optimizer'), 'description' => __('Removes a promotion, so it stops appearing wherever it was placed.', 'ai-eshop-optimizer'), ), 'promo_surfaces.promo_reorder' => array( 'label' => __('Reorder promos', 'ai-eshop-optimizer'), 'description' => __('Saves the order you dragged the promotions into, which is the order shoppers see them in.', 'ai-eshop-optimizer'), ), 'promo_surfaces.promo_save_slot' => array( 'label' => __('Save promo', 'ai-eshop-optimizer'), 'description' => __('Stores one promotion with its picture, link and dates. It appears in its area for as long as it is running.', 'ai-eshop-optimizer'), ), 'promo_surfaces.promo_save_surface' => array( 'label' => __('Save promo area', 'ai-eshop-optimizer'), 'description' => __('Stores a place in the shop where promotions can appear, such as a banner strip or a spot on the home page.', 'ai-eshop-optimizer'), ), 'proposals.accept' => array( 'label' => __('Accept', 'ai-eshop-optimizer'), 'description' => __('Turns a suggested offer into a real one, which starts changing what shoppers pay as soon as it runs.', 'ai-eshop-optimizer'), 'context' => __('proposal', 'ai-eshop-optimizer'), ), 'proposals.dismiss' => array( 'label' => __('Dismiss', 'ai-eshop-optimizer'), 'description' => __('Sets a suggestion aside so it stops being offered, without ruling out the same idea appearing again later.', 'ai-eshop-optimizer'), 'context' => __('proposal', 'ai-eshop-optimizer'), ), 'proposals.narrate_toggle' => array( 'label' => __('Explain in words', 'ai-eshop-optimizer'), 'description' => __('Turns the plain-English explanation of each suggestion on or off, for when the numbers alone are enough.', 'ai-eshop-optimizer'), ), 'proposals.scan' => array( 'label' => __('Look for proposals', 'ai-eshop-optimizer'), 'description' => __('Reviews your sales and suggests offers worth running, with the expected effect of each one.', 'ai-eshop-optimizer'), ), 'ratings.save_appearance' => array( 'label' => __('Save appearance', 'ai-eshop-optimizer'), 'description' => __('Sets the size and colours of the rating stars wherever they appear.', 'ai-eshop-optimizer'), 'context' => __('ratings', 'ai-eshop-optimizer'), ), 'ratings.save_settings' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets how star ratings work, including whether shoppers must sign in and where the stars appear.', 'ai-eshop-optimizer'), 'context' => __('ratings', 'ai-eshop-optimizer'), ), 'related_tab.related_search' => array( 'label' => __('Search products', 'ai-eshop-optimizer'), 'description' => __('Finds products by name while you are choosing which ones to show as related.', 'ai-eshop-optimizer'), ), 'roi_wizard.roi_compute' => array( 'label' => __('Calculate', 'ai-eshop-optimizer'), 'description' => __('Works out revenue, cost and return for the dimensions and date range you chose, charging a prorated share of fixed operating cost.', 'ai-eshop-optimizer'), ), 'roi_wizard.roi_cost_delete' => array( 'label' => __('Delete', 'ai-eshop-optimizer'), 'description' => __('Removes one recorded cost, after which the returns for that period are calculated as though the money was never spent.', 'ai-eshop-optimizer'), 'context' => __('cost row', 'ai-eshop-optimizer'), ), 'roi_wizard.roi_cost_export' => array( 'label' => __('Export costs', 'ai-eshop-optimizer'), 'description' => __('Downloads the recorded costs for the dimension and window on screen, for checking against an invoice.', 'ai-eshop-optimizer'), ), 'roi_wizard.roi_cost_import' => array( 'label' => __('Import costs', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'roi_wizard.roi_cost_list' => array( 'label' => __('List costs', 'ai-eshop-optimizer'), 'description' => __('Shows the costs already recorded for the dimension and window you picked, so you can check before adding another.', 'ai-eshop-optimizer'), ), 'roi_wizard.roi_cost_save' => array( 'label' => __('Save cost', 'ai-eshop-optimizer'), 'description' => __('Records what one channel, campaign or brand cost you over a date range, which is the figure every return calculation divides by.', 'ai-eshop-optimizer'), ), 'roi_wizard.roi_type_search' => array( 'label' => __('Dimension search', 'ai-eshop-optimizer'), 'description' => __('Finds which kinds of thing you can measure a return on, such as channel, campaign or brand, as you type.', 'ai-eshop-optimizer'), ), 'roi_wizard.roi_value_search' => array( 'label' => __('Value search', 'ai-eshop-optimizer'), 'description' => __('Finds the actual values inside a dimension, such as the individual campaign names, so a report can be narrowed to one of them.', 'ai-eshop-optimizer'), ), 'role_pricing.download_template' => array( 'label' => __('Download template', 'ai-eshop-optimizer'), 'description' => __('Gives you an empty spreadsheet with the right columns, so an upload is not rejected for having the wrong shape.', 'ai-eshop-optimizer'), ), 'role_pricing.export' => array( 'label' => __('Export prices', 'ai-eshop-optimizer'), 'description' => __('Downloads every special price you have set as a spreadsheet, for checking or for editing and sending back.', 'ai-eshop-optimizer'), ), 'role_pricing.gf_export' => array( 'label' => __('Export for the price form', 'ai-eshop-optimizer'), 'description' => __('Downloads the special prices in the layout the quote form expects, so the two stay in step.', 'ai-eshop-optimizer'), ), 'role_pricing.process_batch' => array( 'label' => __('Apply price list', 'ai-eshop-optimizer'), 'description' => __('Works through the uploaded spreadsheet a chunk at a time, writing each special price onto the product it belongs to.', 'ai-eshop-optimizer'), ), 'role_pricing.save_settings' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Chooses which customer groups get their own prices, which is what switches special pricing on for them.', 'ai-eshop-optimizer'), 'context' => __('role pricing', 'ai-eshop-optimizer'), ), 'role_pricing.upload' => array( 'label' => __('Upload price list', 'ai-eshop-optimizer'), 'description' => __('Accepts a spreadsheet of special prices per customer group and prepares it, without changing any price yet.', 'ai-eshop-optimizer'), ), 'saved_abandoned_carts.carts_capture_now' => array( 'label' => __('Capture now', 'ai-eshop-optimizer'), 'description' => __('Records the baskets that are currently abandoned, rather than waiting for the hourly check.', 'ai-eshop-optimizer'), ), 'saved_abandoned_carts.carts_export' => array( 'label' => __('Export', 'ai-eshop-optimizer'), 'description' => __('Downloads the saved and abandoned baskets as a spreadsheet, with what was in each one.', 'ai-eshop-optimizer'), 'context' => __('carts', 'ai-eshop-optimizer'), ), 'saved_abandoned_carts.carts_save_settings' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets how long saved baskets are kept and when a basket counts as abandoned.', 'ai-eshop-optimizer'), 'context' => __('carts', 'ai-eshop-optimizer'), ), 'seo_backlinks.refresh' => array( 'label' => __('Refresh backlinks', 'ai-eshop-optimizer'), 'description' => __('Pulls the latest list of sites linking to you.', 'ai-eshop-optimizer'), ), 'seo_backlinks.seo_disavow_action' => array( 'label' => __('Disavow', 'ai-eshop-optimizer'), 'description' => __('Tells Google to ignore links from the domains you ticked, which is the remedy for spam links pointing at you.', 'ai-eshop-optimizer'), ), 'seo_general.dfs_connect' => array( 'label' => __('Connect DataForSEO', 'ai-eshop-optimizer'), 'description' => __('Saves your DataForSEO login so the shop can look up where it ranks. That service charges for what it uses.', 'ai-eshop-optimizer'), ), 'seo_general.dfs_disconnect' => array( 'label' => __('Disconnect DataForSEO', 'ai-eshop-optimizer'), 'description' => __('Forgets the DataForSEO login, so no further ranking lookups are made or charged for.', 'ai-eshop-optimizer'), ), 'seo_general.dfs_pull' => array( 'label' => __('Fetch rankings', 'ai-eshop-optimizer'), 'description' => __('Asks DataForSEO where your pages currently rank, within the spending limit you set, and records what comes back.', 'ai-eshop-optimizer'), ), 'seo_general.save_seo' => array( 'label' => __('Save SEO settings', 'ai-eshop-optimizer'), 'description' => __('Sets the shop-wide title separator and the other general rules every page inherits.', 'ai-eshop-optimizer'), ), 'seo_general.seo_backfill_canonical' => array( 'label' => __('Fill in missing addresses', 'ai-eshop-optimizer'), 'description' => __('Works through the whole shop filling in the preferred address for pages that have none, which stops search engines treating them as duplicates.', 'ai-eshop-optimizer'), ), 'seo_general.seo_rebuild_head_cache' => array( 'label' => __('Rebuild SEO output', 'ai-eshop-optimizer'), 'description' => __('Regenerates the stored titles and descriptions so pages serve today rules, and refuses to run if another SEO plugin is in charge.', 'ai-eshop-optimizer'), ), 'seo_health.recompute' => array( 'label' => __('Recheck the shop', 'ai-eshop-optimizer'), 'description' => __('Goes back over your pages and works out where the SEO problems are now.', 'ai-eshop-optimizer'), ), 'seo_health.seo_sugg_action' => array( 'label' => __('Apply suggestions', 'ai-eshop-optimizer'), 'description' => __('Puts the drafted titles and descriptions live, which is what search engines will show from then on.', 'ai-eshop-optimizer'), ), 'seo_health.seo_sugg_generate' => array( 'label' => __('Write suggestions', 'ai-eshop-optimizer'), 'description' => __('Drafts titles and descriptions for the pages that need them, so you have something to edit.', 'ai-eshop-optimizer'), ), 'seo_import.run' => array( 'label' => __('Import from another SEO plugin', 'ai-eshop-optimizer'), 'description' => __('Copies titles, descriptions and settings across from your previous SEO plugin.', 'ai-eshop-optimizer'), ), 'seo_import.seo_verify_parity' => array( 'label' => __('Compare with the old plugin', 'ai-eshop-optimizer'), 'description' => __('Checks page by page whether this engine would output the same as your previous SEO plugin, and lists the differences.', 'ai-eshop-optimizer'), ), 'seo_opportunities.seo_opp_apply' => array( 'label' => __('Apply', 'ai-eshop-optimizer'), 'description' => __('Puts the suggested title or description live on the page, which is what search engines will show from then on.', 'ai-eshop-optimizer'), ), 'seo_opportunities.seo_opp_pin' => array( 'label' => __('Pin', 'ai-eshop-optimizer'), 'description' => __('Marks an opportunity as one you are working on, so it stays at the top instead of sinking as new ones appear.', 'ai-eshop-optimizer'), ), 'seo_opportunities.seo_opp_recompute' => array( 'label' => __('Find opportunities', 'ai-eshop-optimizer'), 'description' => __('Looks over your pages and rankings again and lists the changes most likely to win traffic.', 'ai-eshop-optimizer'), ), 'seo_opportunities.seo_opp_save' => array( 'label' => __('Save suggestion', 'ai-eshop-optimizer'), 'description' => __('Keeps a draft against its page so you can come back to it, without changing what search engines currently see.', 'ai-eshop-optimizer'), ), 'seo_opportunities.seo_opp_suggest' => array( 'label' => __('Write a suggestion', 'ai-eshop-optimizer'), 'description' => __('Drafts wording for one page title or description so you have something to react to rather than a blank box.', 'ai-eshop-optimizer'), ), 'seo_redirects.seo_404_dismiss' => array( 'label' => __('Dismiss', 'ai-eshop-optimizer'), 'description' => __('Clears one row out of the not-found log, for a URL you have decided needs no redirect.', 'ai-eshop-optimizer'), 'context' => __('404 log', 'ai-eshop-optimizer'), ), 'seo_redirects.seo_index_rebuild' => array( 'label' => __('Rebuild SEO index', 'ai-eshop-optimizer'), 'description' => __('Regenerates the stored title, description and schema for the content types you tick, in batches, so the pages serve today\'s rules.', 'ai-eshop-optimizer'), ), 'seo_redirects.seo_redirect_delete' => array( 'label' => __('Delete', 'ai-eshop-optimizer'), 'description' => __('Removes a redirect permanently, after which its old URL goes back to answering however the site would answer it anyway.', 'ai-eshop-optimizer'), 'context' => __('redirect', 'ai-eshop-optimizer'), ), 'seo_redirects.seo_redirect_export' => array( 'label' => __('Export', 'ai-eshop-optimizer'), 'description' => __('Downloads every redirect as a spreadsheet, with its source, target, code and whether it is a regular expression.', 'ai-eshop-optimizer'), 'context' => __('redirects', 'ai-eshop-optimizer'), ), 'seo_redirects.seo_redirect_import' => array( 'label' => __('Import from All in One SEO', 'ai-eshop-optimizer'), 'description' => __('Copies the redirects out of an existing All in One SEO installation so you do not retype them.', 'ai-eshop-optimizer'), ), 'seo_redirects.seo_redirect_import_xlsx' => array( 'label' => __('Import spreadsheet', 'ai-eshop-optimizer'), 'description' => __('Loads redirects from an uploaded spreadsheet, and with full sync ticked it also deletes every rule that is not in the file.', 'ai-eshop-optimizer'), ), 'seo_redirects.seo_redirect_rebuild_edge' => array( 'label' => __('Rebuild edge map', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'seo_redirects.seo_redirect_save' => array( 'label' => __('Add redirect', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'seo_redirects.seo_redirect_toggle' => array( 'label' => __('Enabled', 'ai-eshop-optimizer'), 'description' => __('Turns one redirect on or off without deleting it, and refuses to enable a rule that would send visitors round in a loop.', 'ai-eshop-optimizer'), ), 'seo_redirects.seo_save_robots' => array( 'label' => __('Save robots.txt', 'ai-eshop-optimizer'), 'description' => __('Stores the extra lines appended to the generated robots file, which is what tells crawlers where they may not go.', 'ai-eshop-optimizer'), ), 'seo_schema.seo_save_schema' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets the structured details sent to search engines, which is what produces rich results.', 'ai-eshop-optimizer'), 'context' => __('schema', 'ai-eshop-optimizer'), ), 'seo_search_queries.gsc_disconnect' => array( 'label' => __('Disconnect', 'ai-eshop-optimizer'), 'description' => __('Forgets the Search Console connection, after which the search reports stop updating.', 'ai-eshop-optimizer'), 'context' => __('Search Console', 'ai-eshop-optimizer'), ), 'seo_search_queries.gsc_refresh' => array( 'label' => __('Refresh now', 'ai-eshop-optimizer'), 'description' => __('Pulls the latest search terms and positions from Google rather than waiting for the usual update.', 'ai-eshop-optimizer'), ), 'seo_search_queries.gsc_save_settings' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Stores how often Search Console figures are pulled in and how far back to look.', 'ai-eshop-optimizer'), 'context' => __('Search Console', 'ai-eshop-optimizer'), ), 'seo_search_queries.gsc_set_property' => array( 'label' => __('Choose the site', 'ai-eshop-optimizer'), 'description' => __('Picks which verified site in your Search Console account this shop figures come from.', 'ai-eshop-optimizer'), ), 'seo_social.seo_save_social' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets the picture and wording used when a page is shared on social media.', 'ai-eshop-optimizer'), 'context' => __('social sharing', 'ai-eshop-optimizer'), ), 'shipment_cost_reports.fs_cost_step' => array( 'label' => __('Work out delivery costs', 'ai-eshop-optimizer'), 'description' => __('Goes through past orders working out what each delivery actually cost you, a batch at a time.', 'ai-eshop-optimizer'), ), 'shipment_cost_reports.shipping_pnl' => array( 'label' => __('Delivery profit and loss', 'ai-eshop-optimizer'), 'description' => __('Compares what you charged for delivery against what it cost, so you can see where you are losing money.', 'ai-eshop-optimizer'), ), 'shipment_cost_reports.shipping_pnl_export' => array( 'label' => __('Export', 'ai-eshop-optimizer'), 'description' => __('Downloads the delivery profit and loss figures as a spreadsheet.', 'ai-eshop-optimizer'), 'context' => __('delivery costs', 'ai-eshop-optimizer'), ), 'side_cart.apply_coupon' => array( 'label' => __('Apply coupon', 'ai-eshop-optimizer'), 'description' => __('The shopper own control: puts a discount code on their basket and shows what it takes off.', 'ai-eshop-optimizer'), ), 'side_cart.get' => array( 'label' => __('Open the basket', 'ai-eshop-optimizer'), 'description' => __('The shopper own control: loads the current contents of their slide-out basket.', 'ai-eshop-optimizer'), ), 'side_cart.quick_view_add' => array( 'label' => __('Add from quick view', 'ai-eshop-optimizer'), 'description' => __('The shopper own control: adds a product to the basket from the quick preview without leaving the page they are on.', 'ai-eshop-optimizer'), ), 'side_cart.remove' => array( 'label' => __('Remove item', 'ai-eshop-optimizer'), 'description' => __('The shopper own control: takes one line out of their basket.', 'ai-eshop-optimizer'), ), 'side_cart.save_settings' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets how the slide-out basket looks and what it offers, which every shopper sees the next time they open it.', 'ai-eshop-optimizer'), 'context' => __('side cart', 'ai-eshop-optimizer'), ), 'side_cart.update_qty' => array( 'label' => __('Change quantity', 'ai-eshop-optimizer'), 'description' => __('The shopper own control: changes how many of an item they are buying, and the total updates with it.', 'ai-eshop-optimizer'), ), 'smart_shipping_label.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets the delivery message shown on product pages, such as how soon it would arrive.', 'ai-eshop-optimizer'), 'context' => __('delivery message', 'ai-eshop-optimizer'), ), 'social_login.sso_migrate_audit' => array( 'label' => __('Re-audit', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'social_login.sso_migrate_settings' => array( 'label' => __('Migrate settings', 'ai-eshop-optimizer'), 'description' => __('Copies provider keys and toggles across from the old social-login plugin into these settings, overwriting whatever is here now.', 'ai-eshop-optimizer'), ), 'social_login.sso_migrate_users' => array( 'label' => __('Migrate user links (batched)', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'social_login.sso_save_settings' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Stores which social providers are enabled and their client ids and secrets, which is what makes the sign-in buttons appear or disappear.', 'ai-eshop-optimizer'), ), 'sticky_atc.om_sticky_atc_check_cart' => array( 'label' => __('Check the basket', 'ai-eshop-optimizer'), 'description' => __('The shopper own control: checks whether the item is already in their basket so the bar shows the right thing.', 'ai-eshop-optimizer'), ), 'sticky_atc.om_sticky_atc_get_product' => array( 'label' => __('Load product', 'ai-eshop-optimizer'), 'description' => __('The shopper own control: fetches the details the floating buy bar needs as they scroll.', 'ai-eshop-optimizer'), ), 'sticky_atc.save_settings' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets the bar that follows the shopper down a product page with the price and buy button on it.', 'ai-eshop-optimizer'), 'context' => __('sticky buy bar', 'ai-eshop-optimizer'), ), 'stock_import.download_sample' => array( 'label' => __('Download example', 'ai-eshop-optimizer'), 'description' => __('Gives you an example file with the right columns, so an upload is not rejected for having the wrong shape.', 'ai-eshop-optimizer'), ), 'stock_import.process' => array( 'label' => __('Apply stock file', 'ai-eshop-optimizer'), 'description' => __('Works through the uploaded file writing each stock figure onto its product, a chunk at a time.', 'ai-eshop-optimizer'), ), 'stock_import.upload' => array( 'label' => __('Upload stock file', 'ai-eshop-optimizer'), 'description' => __('Accepts a supplier stock file and prepares it, without changing any stock yet.', 'ai-eshop-optimizer'), ), 'stock_recovery.pr_apply_bulk' => array( 'label' => __('Restock all', 'ai-eshop-optimizer'), 'description' => __('Restocks every candidate that meets your thresholds, fifty products per request, until none is left waiting.', 'ai-eshop-optimizer'), ), 'stock_recovery.pr_apply_one' => array( 'label' => __('Restock', 'ai-eshop-optimizer'), 'description' => __('Puts one product back in stock online at the quantity in the row, which makes it buyable on the storefront again immediately.', 'ai-eshop-optimizer'), ), 'stock_recovery.pr_blocklist' => array( 'label' => __('Never suggest', 'ai-eshop-optimizer'), 'description' => __('Blocks a product from the recovery queue permanently, for lines you deliberately do not sell online however well they sell in store.', 'ai-eshop-optimizer'), ), 'stock_recovery.pr_dismiss' => array( 'label' => __('Dismiss', 'ai-eshop-optimizer'), 'description' => __('Takes one product out of the recovery queue for now without blocking it, so it can come back the next time detection runs.', 'ai-eshop-optimizer'), ), 'stock_recovery.pr_export_gaps' => array( 'label' => __('Export', 'ai-eshop-optimizer'), 'description' => __('Downloads the full missing-hot-sellers list as a spreadsheet, not just the five hundred rows shown on screen.', 'ai-eshop-optimizer'), 'context' => __('missing hot sellers', 'ai-eshop-optimizer'), ), 'stock_recovery.pr_export_recovery' => array( 'label' => __('Export', 'ai-eshop-optimizer'), 'description' => __('Downloads every candidate that is out of stock online and still selling in store, with its turnover and confidence figures.', 'ai-eshop-optimizer'), 'context' => __('recovery queue', 'ai-eshop-optimizer'), ), 'stock_recovery.pr_export_restocks' => array( 'label' => __('Export', 'ai-eshop-optimizer'), 'description' => __('Downloads the history of restocks this feature has made, so you can check what it put back on sale and when.', 'ai-eshop-optimizer'), 'context' => __('restock history', 'ai-eshop-optimizer'), ), 'stock_recovery.pr_gap_dismiss' => array( 'label' => __('Dismiss', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), 'context' => __('catalogue gap', 'ai-eshop-optimizer'), ), 'stock_recovery.pr_gap_restore' => array( 'label' => __('Undo dismiss', 'ai-eshop-optimizer'), 'description' => __('Puts a SKU back on the missing-hot-sellers list after it had been set aside.', 'ai-eshop-optimizer'), ), 'stock_recovery.pr_revert' => array( 'label' => __('Revert', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'stock_recovery.pr_run_detection' => array( 'label' => __('Run now', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'stock_recovery.pr_save_gap_settings' => array( 'label' => __('Save', 'ai-eshop-optimizer'), 'description' => __('Sets how many units and how recent a sale a SKU needs before it counts as a missing hot seller worth listing online.', 'ai-eshop-optimizer'), 'context' => __('gap thresholds', 'ai-eshop-optimizer'), ), 'stock_recovery.pr_save_settings' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets the thresholds that decide which products qualify for restocking, including minimum units, days on sale and the quantity cap.', 'ai-eshop-optimizer'), ), 'store_pages.store_config_save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets which of your pages are the shop, basket and account pages, which is how the shop knows where to send people.', 'ai-eshop-optimizer'), 'context' => __('store pages', 'ai-eshop-optimizer'), ), 'supplier_extras.supplier_pods_migrate_run' => array( 'label' => __('Migrate suppliers', 'ai-eshop-optimizer'), 'description' => __('Copies supplier details over from the old Pods setup so nothing is lost when you move off it.', 'ai-eshop-optimizer'), ), 'surveys.bootstrap_ci' => array( 'label' => __('Create the customer table', 'ai-eshop-optimizer'), 'description' => __('Sets up the place customer figures are kept, which is the first step on a shop that has never used them.', 'ai-eshop-optimizer'), ), 'surveys.fix_prices' => array( 'label' => __('Correct the prices', 'ai-eshop-optimizer'), 'description' => __('Rewrites the recorded prices and discounts to match what the shop actually charges, which is what the checking step found.', 'ai-eshop-optimizer'), ), 'surveys.ingest' => array( 'label' => __('Read in the answers', 'ai-eshop-optimizer'), 'description' => __('Starts reading survey answers into the customer records in the background, and refuses if a run is already going.', 'ai-eshop-optimizer'), ), 'surveys.recompute' => array( 'label' => __('Recalculate customer figures', 'ai-eshop-optimizer'), 'description' => __('Rebuilds what the shop knows about each customer from their orders and answers. Administrators only, because it is heavy.', 'ai-eshop-optimizer'), ), 'surveys.status' => array( 'label' => __('Progress', 'ai-eshop-optimizer'), 'description' => __('Reports how far the customer figures have got, so a long rebuild can be watched without reloading the page.', 'ai-eshop-optimizer'), ), 'surveys.verify_prices' => array( 'label' => __('Check the prices', 'ai-eshop-optimizer'), 'description' => __('Compares the prices recorded against your products against what the shop actually charges, and lists any that disagree.', 'ai-eshop-optimizer'), ), 'swatches.clear' => array( 'label' => __('Clear cache', 'ai-eshop-optimizer'), 'description' => __('Empties the swatch cache tables, after which each product rebuilds its own the first time a shopper opens it.', 'ai-eshop-optimizer'), 'context' => __('swatches', 'ai-eshop-optimizer'), ), 'swatches.colour_flags' => array( 'label' => __('Flag colour attributes', 'ai-eshop-optimizer'), 'description' => __('Marks image-type attributes as carrying colour, so the catalogue knows which swatches are colours and can group them.', 'ai-eshop-optimizer'), ), 'swatches.get_categories' => array( 'label' => __('Category list', 'ai-eshop-optimizer'), 'description' => __('Loads the product categories into the pickers so a swatch rule can be limited to part of the catalogue.', 'ai-eshop-optimizer'), 'context' => __('swatches', 'ai-eshop-optimizer'), ), 'swatches.migrate' => array( 'label' => __('Migrate from legacy', 'ai-eshop-optimizer'), 'description' => __('Brings settings across from the old om-product-swatches plugin and queues a rebuild of every variable product from its data.', 'ai-eshop-optimizer'), 'context' => __('swatches', 'ai-eshop-optimizer'), ), 'swatches.rebuild' => array( 'label' => __('Rebuild all', 'ai-eshop-optimizer'), 'description' => __('Queues a fresh swatch cache for every variable product, which is the fix after changing an attribute or importing a catalogue.', 'ai-eshop-optimizer'), ), 'swatches.save' => array( 'label' => __('Save', 'ai-eshop-optimizer'), 'description' => __('Stores how swatches look and behave across the storefront, including their shape, size and which attributes get them.', 'ai-eshop-optimizer'), 'context' => __('swatch settings', 'ai-eshop-optimizer'), ), 'swatches.stats' => array( 'label' => __('Refresh stats', 'ai-eshop-optimizer'), 'description' => __('Counts how much of the swatch cache is built, so you can see whether a rebuild has finished before trusting the storefront.', 'ai-eshop-optimizer'), ), 'tools.save' => array( 'label' => __('Save tools', 'ai-eshop-optimizer'), 'description' => __('Switches the optional admin conveniences on or off. Each is independent and costs nothing while it is off.', 'ai-eshop-optimizer'), ), 'tools.save_branding' => array( 'label' => __('Save branding', 'ai-eshop-optimizer'), 'description' => __('Renames the plugin menu for this shop, so staff see your own wording rather than ours.', 'ai-eshop-optimizer'), ), 'tools.save_caps' => array( 'label' => __('Save list lengths', 'ai-eshop-optimizer'), 'description' => __('Sets how many rows the admin lists show at once, which is the trade between scrolling and page speed.', 'ai-eshop-optimizer'), ), 'tools.save_quiet' => array( 'label' => __('Save quiet hours', 'ai-eshop-optimizer'), 'description' => __('Sets the hours when the shop will not send marketing messages, so customers are not contacted overnight.', 'ai-eshop-optimizer'), ), 'tools.save_stock_hold' => array( 'label' => __('Save reservation window', 'ai-eshop-optimizer'), 'description' => __('Sets how long a checkout in progress may hold stock, without changing when unpaid orders are cancelled.', 'ai-eshop-optimizer'), ), 'trust_badges.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets the reassurance icons near the buy button, such as secure payment and easy returns.', 'ai-eshop-optimizer'), 'context' => __('trust badges', 'ai-eshop-optimizer'), ), 'user_vitals.migrate' => array( 'label' => __('Bring across the old figures', 'ai-eshop-optimizer'), 'description' => __('Copies customer figures over from the previous setup so history is not lost when you move to this one.', 'ai-eshop-optimizer'), ), 'user_vitals.save_gf' => array( 'label' => __('Save form mapping', 'ai-eshop-optimizer'), 'description' => __('Says which form fields hold which customer details, so answers land on the right part of the record.', 'ai-eshop-optimizer'), ), 'user_vitals.save_loyalty' => array( 'label' => __('Save loyalty settings', 'ai-eshop-optimizer'), 'description' => __('Sets the thresholds that decide when a customer counts as loyal, which is what the reports and audiences use.', 'ai-eshop-optimizer'), ), 'user_vitals.scan' => array( 'label' => __('Scan customers', 'ai-eshop-optimizer'), 'description' => __('Goes through your customers and works out what is known about each one, such as how often they buy.', 'ai-eshop-optimizer'), ), 'utm_explorer.utm_explore' => array( 'label' => __('Explore campaign tags', 'ai-eshop-optimizer'), 'description' => __('Breaks your traffic down by campaign tag, so you can see which links are actually bringing people in.', 'ai-eshop-optimizer'), ), 'utm_explorer.utm_search' => array( 'label' => __('Search campaign tags', 'ai-eshop-optimizer'), 'description' => __('Finds a campaign tag by name while you are narrowing the report down.', 'ai-eshop-optimizer'), ), 'variations_gallery.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets how the picture gallery behaves when a shopper picks a size or colour, across every variable product.', 'ai-eshop-optimizer'), 'context' => __('variations gallery', 'ai-eshop-optimizer'), ), 'variations_gallery.vg_migration_clear_as' => array( 'label' => __('Clear the queue', 'ai-eshop-optimizer'), 'description' => __('Empties the waiting list of gallery conversions, which is the way out when a run has jammed.', 'ai-eshop-optimizer'), ), 'variations_gallery.vg_migration_reset' => array( 'label' => __('Start the conversion again', 'ai-eshop-optimizer'), 'description' => __('Forgets how far the conversion has got so it begins from the first product again. It does not undo what is already converted.', 'ai-eshop-optimizer'), ), 'variations_gallery.vg_migration_run_batch' => array( 'label' => __('Convert galleries', 'ai-eshop-optimizer'), 'description' => __('Converts product galleries from the old plugin format a batch at a time, so a large catalogue does not time out.', 'ai-eshop-optimizer'), ), 'variations_gallery.vg_migration_status' => array( 'label' => __('Progress', 'ai-eshop-optimizer'), 'description' => __('Reports how far the gallery conversion has got, so a long run can be watched without reloading the page.', 'ai-eshop-optimizer'), ), 'waitlist.delete' => array( 'label' => __('Remove from the list', 'ai-eshop-optimizer'), 'description' => __('Takes one person off the waiting list for a product, so they will not be told when it comes back.', 'ai-eshop-optimizer'), ), 'waitlist.om_ppe_waitlist_subscribe' => array( 'label' => __('Tell me when it is back', 'ai-eshop-optimizer'), 'description' => __('The older version of the same shopper control, kept so links and pages from the previous plugin still work.', 'ai-eshop-optimizer'), 'context' => __('legacy form', 'ai-eshop-optimizer'), ), 'waitlist.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets the wording and rules for the back-in-stock list, including what the email says when stock returns.', 'ai-eshop-optimizer'), 'context' => __('waitlist', 'ai-eshop-optimizer'), ), 'waitlist.subscribe' => array( 'label' => __('Tell me when it is back', 'ai-eshop-optimizer'), 'description' => __('The shopper own control: joins the waiting list for an out-of-stock product so they hear when it returns.', 'ai-eshop-optimizer'), ), 'web-push.webpush_create_campaign' => array( 'label' => __('Create campaign (draft)', 'ai-eshop-optimizer'), 'description' => __('Stores a new push campaign as a draft with its audience rules, and sends nothing until you launch it separately.', 'ai-eshop-optimizer'), ), 'web-push.webpush_launch_campaign' => array( 'label' => __('Launch', 'ai-eshop-optimizer'), 'description' => __('Notifies every customer its audience rules match, on their own devices, and refuses to run at all while the engine is paused.', 'ai-eshop-optimizer'), ), 'web-push.webpush_recompute' => array( 'label' => __('Recalculate audiences', 'ai-eshop-optimizer'), 'description' => __('Works out again which subscribers belong to which group, so a send reaches the right people.', 'ai-eshop-optimizer'), ), 'web-push.webpush_save_banner' => array( 'label' => __('Save banner settings', 'ai-eshop-optimizer'), 'description' => __('Sets whether the opt-in banner appears on the storefront, where it sits and what it says, which is what recruits subscribers.', 'ai-eshop-optimizer'), ), 'web-push.webpush_save_newsletter' => array( 'label' => __('Save provider settings', 'ai-eshop-optimizer'), 'description' => __('Stores which newsletter service the shop posts sign-ups to and the credentials it needs, which is where new subscribers end up.', 'ai-eshop-optimizer'), ), 'web-push.webpush_save_template' => array( 'label' => __('Save template field', 'ai-eshop-optimizer'), 'description' => __('Stores one field of one notification template as you leave it, which changes the wording of every future send using that template.', 'ai-eshop-optimizer'), ), 'web-push.webpush_send_test' => array( 'label' => __('Send test push', 'ai-eshop-optimizer'), 'description' => __('Pushes one notification to your own browser only, so you can see what it looks like, and needs the engine live to work.', 'ai-eshop-optimizer'), ), 'web-push.webpush_sync_cohort' => array( 'label' => __('Sync cohort', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'web-push.webpush_test_newsletter' => array( 'label' => __('Test provider', 'ai-eshop-optimizer'), 'description' => __('Calls the configured newsletter service with the credentials as saved and reports whether it answers, without subscribing anybody.', 'ai-eshop-optimizer'), ), 'web-push.webpush_toggle_engine' => array( 'label' => __('Engine live / paused', 'ai-eshop-optimizer'), 'description' => __('Switches the push engine between live and paused, and going live is what lets every campaign here start to notify the customer.', 'ai-eshop-optimizer'), ), 'wishlist.save_display' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), 'description' => __('Sets where the wishlist heart appears and what it says, on both product pages and listings.', 'ai-eshop-optimizer'), 'context' => __('wishlist', 'ai-eshop-optimizer'), ), 'withdrawal.create_page' => array( 'label' => __('Create the page for me', 'ai-eshop-optimizer'), 'description' => __('Publishes a page holding the guest withdrawal form shortcode and selects it as the one customers without an account are sent to.', 'ai-eshop-optimizer'), ), 'withdrawal.process' => array( 'label' => __('Goods received / Mark refunded', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'withdrawal.reject' => array( 'label' => __('Refuse and tell the customer', 'ai-eshop-optimizer'), 'description' => __('Refuses a declaration on the grounds you ticked and emails the customer immediately, quoting those grounds verbatim, after asking you to confirm.', 'ai-eshop-optimizer'), ), 'withdrawal.return' => array( 'label' => __('Issue / Save / Upload / Change / Approve', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'withdrawal.save' => array( 'label' => __('Save settings', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'workflows.wf_delete' => array( 'label' => __('Delete', 'ai-eshop-optimizer'), 'description' => __('Removes a campaign and its schedule permanently, leaving the messages it has already sent alone.', 'ai-eshop-optimizer'), 'context' => __('campaign', 'ai-eshop-optimizer'), ), 'workflows.wf_get' => array( 'label' => __('Edit', 'ai-eshop-optimizer'), 'description' => __('Opens one campaign in the composer with its trigger, audience and steps as saved, ready to change.', 'ai-eshop-optimizer'), ), 'workflows.wf_list' => array( 'label' => __('Refresh list', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'workflows.wf_preview' => array( 'label' => __('Preview', 'ai-eshop-optimizer'), 'description' => __('Renders the campaign\'s subject and body with sample data so you can read what a customer would get, without sending anything.', 'ai-eshop-optimizer'), ), 'workflows.wf_run' => array( 'label' => __('Run now', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'workflows.wf_save' => array( 'label' => __('Save campaign', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), 'workflows.wf_search_products' => array( 'label' => __('Product search', 'ai-eshop-optimizer'), 'description' => __('Finds products by name or id while you are building a rule, so a condition can name a specific item.', 'ai-eshop-optimizer'), ), 'workflows.wf_search_terms' => array( 'label' => __('Category and brand search', 'ai-eshop-optimizer'), 'description' => __('Finds categories, brands or tags while you are building a rule, so a condition can name one without typing its id.', 'ai-eshop-optimizer'), ), 'workflows.wf_status' => array( 'label' => __('Activate / Pause', 'ai-eshop-optimizer'), 'description' => __('Switches a campaign between active and paused, which is the difference between it sending on its trigger and sitting still.', 'ai-eshop-optimizer'), ), 'workflows.wf_test' => array( 'label' => __('Send test', 'ai-eshop-optimizer'), '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.', 'ai-eshop-optimizer'), ), );