{
  "schemaVersion": 1,
  "product": {
    "name": "EShopSet",
    "description": "Manage Shopify stores with apps for AI visibility, search performance, product data synchronization, internal linking, and blog publishing."
  },
  "platform": {
    "name": "EShopSet workspace",
    "description": "Shared navigation, store management, account access, billing, and agent connections for EShopSet.",
    "updatedAt": "2026-10-02",
    "pages": [
      {
        "id": "entry",
        "path": "/",
        "name": "Application entry",
        "description": "Open the appropriate workspace or sign-in flow. The Shopify deployment expects entry through Shopify Admin; the demo opens its sample workspace.",
        "access": "public",
        "features": [
          {
            "id": "workspace-entry",
            "name": "Workspace entry",
            "description": "Continue to an existing workspace or start setup after signing in."
          }
        ],
        "metrics": []
      },
      {
        "id": "login",
        "path": "/login",
        "name": "Sign in",
        "description": "Sign in to the standalone application. Shopify Admin and the demo use their own entry flows.",
        "access": "public",
        "features": [
          {
            "id": "google-sign-in",
            "name": "Google sign-in",
            "description": "Sign in using a Google account when Google sign-in is configured."
          },
          {
            "id": "email-code",
            "name": "Email sign-in code",
            "description": "Request a one-time email code, verify it, or resend after the waiting period."
          }
        ],
        "metrics": []
      },
      {
        "id": "setup",
        "path": "/set-up",
        "name": "Set up a workspace",
        "description": "Create the first workspace after signing in. Existing workspace members continue to their workspace.",
        "access": "authenticated",
        "features": [
          {
            "id": "initial-workspace",
            "name": "Create workspace",
            "description": "Name a workspace and choose its address to start managing stores."
          }
        ],
        "metrics": []
      },
      {
        "id": "new-workspace",
        "path": "/accounts/new",
        "name": "New workspace",
        "description": "Create another workspace from the standalone application.",
        "access": "authenticated",
        "features": [
          {
            "id": "additional-workspace",
            "name": "Create another workspace",
            "description": "Choose a name and address for an additional workspace."
          }
        ],
        "metrics": []
      },
      {
        "id": "connect-shopify",
        "path": "/connect/shopify",
        "name": "Connect Shopify",
        "description": "Finish a Shopify installation by signing in and choosing or creating a workspace. Requires a valid installation handoff.",
        "access": "authenticated",
        "features": [
          {
            "id": "claim-installation",
            "name": "Connect installed store",
            "description": "Associate the installed Shopify store with the selected workspace and continue to the connected store."
          }
        ],
        "metrics": []
      },
      {
        "id": "dashboard",
        "path": "/{accountSlug}",
        "name": "Dashboard",
        "description": "View pinned app metrics and app status for the selected store. Available widgets depend on enabled apps and their data.",
        "access": "authenticated",
        "features": [
          {
            "id": "metric-pins",
            "name": "Pinned app metrics",
            "description": "Show selected metrics from enabled apps. Their definitions match the corresponding app metrics in this catalog."
          },
          {
            "id": "customize",
            "name": "Customize dashboard",
            "description": "Reorder or remove pinned widgets and restore their default order."
          },
          {
            "id": "store-scope",
            "name": "Store selection",
            "description": "Switch the selected store in the standalone workspace; Shopify Admin stays scoped to the embedded store."
          },
          {
            "id": "app-status",
            "name": "App status",
            "description": "Review sync status, failures, and trial or plan notices, then open the relevant app."
          },
          {
            "id": "assistant-entry",
            "name": "Assistant recommendations",
            "description": "Describe a goal to get recommendations for apps that can help."
          }
        ],
        "metrics": [
          {
            "id": "platform:last_sync",
            "name": "Last sync",
            "description": "Time since the last reported app sync for the selected store.",
            "unit": "datetime"
          },
          {
            "id": "ai_presence:brand_visibility_score",
            "name": "Brand Visibility Score",
            "description": "A score from 0 to 100 combining query scores, citation rate and citation positions across measured results.",
            "unit": "score",
            "section": "Available app widgets"
          },
          {
            "id": "ai_presence:total_mentions",
            "name": "AI Mentions",
            "description": "Number of measured query-and-surface results in the current sync that report the brand as cited.",
            "unit": "count",
            "section": "Available app widgets"
          },
          {
            "id": "ai_presence:citation_rate",
            "name": "Citation Rate",
            "description": "Percentage of measured query-and-surface results that report the brand as cited; unmeasured results are excluded.",
            "unit": "percent",
            "section": "Available app widgets"
          },
          {
            "id": "ai_presence:avg_position",
            "name": "Avg. AI Position",
            "description": "Average reported citation position across cited results with a known position; lower is better.",
            "unit": "position",
            "section": "Available app widgets"
          },
          {
            "id": "seo_performance:domain_trust",
            "name": "Domain Trust",
            "description": "A domain authority score from 0 to 100 derived from the reported backlink rank.",
            "unit": "score",
            "section": "Available app widgets"
          },
          {
            "id": "seo_performance:organic_traffic",
            "name": "Organic Traffic",
            "description": "Estimated monthly clicks from organic search for the domain in the primary market; this is not first-party visitor analytics.",
            "unit": "clicks/month",
            "section": "Available app widgets"
          },
          {
            "id": "seo_performance:paid_traffic",
            "name": "Paid Traffic",
            "description": "Estimated monthly clicks from paid search for the domain in the primary market.",
            "unit": "clicks/month",
            "section": "Available app widgets"
          },
          {
            "id": "seo_performance:backlinks",
            "name": "Backlinks",
            "description": "Number of inbound links reported for the tracked domain.",
            "unit": "count",
            "section": "Available app widgets"
          },
          {
            "id": "datasync:products_in_sync",
            "name": "Products in sync",
            "description": "Number of products recorded as managed by this Data Sync installation.",
            "unit": "count",
            "section": "Available app widgets"
          },
          {
            "id": "datasync:last_sync",
            "name": "Last sheet sync",
            "description": "Completion time of the latest run when it completed an actual sync; previews are not treated as completed synchronization.",
            "unit": "date-time",
            "section": "Available app widgets"
          },
          {
            "id": "datasync:rows_with_errors",
            "name": "Rows with errors",
            "description": "Error count reported by the installation’s latest run.",
            "unit": "count",
            "section": "Available app widgets"
          },
          {
            "id": "copilot_post:posts_live",
            "name": "Posts live",
            "description": "CopilotPost posts currently live on the selected Shopify store.",
            "unit": "count",
            "section": "Available app widgets"
          },
          {
            "id": "copilot_post:clicks_28d",
            "name": "Clicks from Google",
            "description": "Google search clicks from fresh merchant-entered reports covering a common 28-day period for all currently attributable live article pages. No automatic Search Console synchronization or source verification is performed.",
            "unit": "count",
            "section": "Available app widgets"
          }
        ]
      },
      {
        "id": "apps",
        "path": "/{accountSlug}/apps",
        "name": "All apps",
        "description": "Discover and manage the apps available for the selected store.",
        "access": "authenticated",
        "features": [
          {
            "id": "app-search",
            "name": "Search and filter apps",
            "description": "Find apps by name or filter by active and inactive state."
          },
          {
            "id": "app-management",
            "name": "Enable and disable apps",
            "description": "Enable or disable an app subject to its plan, permission, and setup requirements."
          },
          {
            "id": "app-navigation",
            "name": "Open apps and settings",
            "description": "Open an app workspace or go directly to its settings."
          }
        ],
        "metrics": []
      },
      {
        "id": "assistant",
        "path": "/{accountSlug}/assistant",
        "name": "Assistant",
        "description": "Chat about the selected store’s goals and learn which EShopSet apps fit them. Recommendations do not make changes to the store.",
        "access": "authenticated",
        "features": [
          {
            "id": "recommendations",
            "name": "App recommendations",
            "description": "Describe a goal and receive relevant app suggestions, explanations, and links."
          },
          {
            "id": "follow-up",
            "name": "Follow-up questions",
            "description": "Continue a conversation using your own questions or suggested follow-ups."
          },
          {
            "id": "chat-history",
            "name": "Chat history",
            "description": "Start a new chat, reopen a previous conversation, or delete a chat for the selected store."
          }
        ],
        "metrics": []
      },
      {
        "id": "stores",
        "path": "/{accountSlug}/stores",
        "name": "Stores",
        "description": "Manage stores connected to the workspace in the standalone application. Shopify Admin limits navigation to its own store.",
        "access": "authenticated",
        "features": [
          {
            "id": "store-search",
            "name": "Store search",
            "description": "Search connected stores by name, domain, or platform."
          },
          {
            "id": "connect-store",
            "name": "Connect store",
            "description": "Begin Shopify installation to connect a store to the workspace."
          },
          {
            "id": "store-management",
            "name": "Store management",
            "description": "Review connection status, rename or remove a store, reinstall the Shopify app when needed, and open Shopify Admin, subject to workspace permissions."
          }
        ],
        "metrics": [
          {
            "id": "platform:connected_stores",
            "name": "Connected stores",
            "description": "Number of stores in the workspace, with a matching count when a search filter is applied.",
            "unit": "count"
          }
        ]
      },
      {
        "id": "billing",
        "path": "/{accountSlug}/billing",
        "name": "Billing",
        "description": "Review the selected store’s plan, trial, usage allowances, and shared Tokens. Workspace owners can manage billing; other members have read-only access.",
        "access": "authenticated",
        "features": [
          {
            "id": "plan-management",
            "name": "Choose or change plan",
            "description": "Compare available plans and approve subscription changes through Shopify billing."
          },
          {
            "id": "trial-status",
            "name": "Trial and subscription status",
            "description": "Review trial dates, renewal information, and any billing issue affecting access."
          },
          {
            "id": "tokens",
            "name": "Buy Tokens",
            "description": "Review shared Tokens and purchase additional packs through Shopify approval."
          },
          {
            "id": "cancel-subscription",
            "name": "Cancel subscription",
            "description": "Workspace owners can cancel an eligible active subscription."
          },
          {
            "id": "refresh-billing",
            "name": "Refresh billing status",
            "description": "Recheck the store’s subscription status when the page offers a refresh."
          }
        ],
        "metrics": [
          {
            "id": "billing:ai_queries",
            "name": "Tracked AI queries",
            "description": "Configured AI queries that run under the store’s plan limit, with inactive overflow identified.",
            "unit": "queries"
          },
          {
            "id": "billing:seo_keywords_allowance",
            "name": "Tracked keywords allowance",
            "description": "Maximum search keywords included per SEO sync; an allowance rather than a consumption total.",
            "unit": "keywords per sync"
          },
          {
            "id": "billing:seo_competitors_allowance",
            "name": "Competitors allowance",
            "description": "Maximum competitors included per SEO sync.",
            "unit": "competitors per sync"
          },
          {
            "id": "billing:seo_pages_allowance",
            "name": "Top organic pages allowance",
            "description": "Maximum organic pages included per SEO sync.",
            "unit": "pages per sync"
          },
          {
            "id": "billing:sheet_rows_allowance",
            "name": "Sheet rows allowance",
            "description": "Maximum spreadsheet rows included per Data Sync run.",
            "unit": "rows per sync"
          },
          {
            "id": "billing:tokens_available",
            "name": "Tokens available",
            "description": "Spendable Tokens shared by apps within the selected store.",
            "unit": "Tokens"
          },
          {
            "id": "billing:tokens_allowance",
            "name": "Included Tokens",
            "description": "Tokens included in the store’s current plan per billing period.",
            "unit": "Tokens per billing period"
          }
        ]
      },
      {
        "id": "settings",
        "path": "/{accountSlug}/settings",
        "name": "Settings",
        "description": "View account details and manage the workspace. Workspace changes and account deletion require the standalone application and appropriate permissions.",
        "access": "authenticated",
        "features": [
          {
            "id": "account-details",
            "name": "Account details",
            "description": "Review the signed-in account’s name and email."
          },
          {
            "id": "appearance",
            "name": "Appearance",
            "description": "Choose a browser-local theme in the standalone application; Shopify Admin supplies its own appearance."
          },
          {
            "id": "workspace-details",
            "name": "Workspace details",
            "description": "Review the workspace name and address; authorized users can edit them in the standalone application."
          },
          {
            "id": "deletion",
            "name": "Workspace and account deletion",
            "description": "Review consequences and resolve blockers before deleting a workspace or account in the standalone application."
          }
        ],
        "metrics": []
      },
      {
        "id": "agents",
        "path": "/{accountSlug}/settings/mcp",
        "name": "Agents",
        "description": "Connect compatible AI agents to read supported data for an authorized store. Reading store data requires an active entitlement.",
        "access": "authenticated",
        "features": [
          {
            "id": "connection-guide",
            "name": "Connection guide",
            "description": "Use the server address and setup instructions to connect a compatible agent."
          },
          {
            "id": "connections",
            "name": "Connected agents",
            "description": "Review authorized agent connections and revoke access."
          },
          {
            "id": "read-only-data",
            "name": "Read-only store access",
            "description": "Agents can read supported SEO, AI Presence, and Data Sync information for the authorized store without changing settings or starting work."
          }
        ],
        "metrics": []
      },
      {
        "id": "authorize-agent",
        "path": "/oauth/authorize",
        "name": "Authorize agent access",
        "description": "Review a valid agent connection request after signing in and choose the store it may read.",
        "access": "authenticated",
        "features": [
          {
            "id": "consent",
            "name": "Store access consent",
            "description": "Review the requesting agent and permissions, select one store, and approve or decline access. Access can later be revoked from Agents settings."
          }
        ],
        "metrics": []
      },
      {
        "id": "email-preferences",
        "path": "/email-preferences",
        "name": "Email preferences",
        "description": "Manage LinkPilot email preferences using a valid signed link from an email; no account sign-in is required.",
        "access": "signed-link",
        "features": [
          {
            "id": "suggestion-emails",
            "name": "Suggestion notifications",
            "description": "Choose whether to receive emails about internal-link suggestions awaiting review."
          },
          {
            "id": "analytics-digest",
            "name": "Analytics digest",
            "description": "Choose whether to receive the weekly analytics digest."
          },
          {
            "id": "unsubscribe",
            "name": "Unsubscribe",
            "description": "Turn off all emails about the workspace or change your preferences later."
          },
          {
            "id": "link-recovery",
            "name": "Preference link recovery",
            "description": "Request a new preference link when the existing link can no longer be used."
          }
        ],
        "metrics": []
      }
    ]
  },
  "apps": [
    {
      "id": "ai-presence",
      "name": "AI Presence",
      "description": "Track brand mentions and citations for selected shopper queries across configured AI search surfaces.",
      "updatedAt": "2026-09-30",
      "pages": [
        {
          "id": "overview",
          "path": "/{accountSlug}/apps/ai-presence",
          "name": "Overview",
          "description": "Review brand visibility, citations, tracked queries and competing domains for the selected store. An enabled app, configured tracking and an eligible store plan are required for checks.",
          "access": "authenticated",
          "features": [
            {
              "id": "visibility-summary",
              "name": "Visibility summary",
              "description": "Review headline visibility measures and changes, and pin the four headline cards to the dashboard.",
              "section": "Summary"
            },
            {
              "id": "surface-comparison",
              "name": "AI surface comparison",
              "description": "Compare coverage under the ChatGPT, Gemini, Perplexity and Google AI Overviews labels selected in Settings. Summary evidence can be shared across labels; these are not independent direct queries to each assistant.",
              "section": "AI model coverage"
            },
            {
              "id": "visibility-history",
              "name": "Visibility history",
              "description": "See per-surface citation coverage over the last 30 days.",
              "section": "Brand visibility trend"
            },
            {
              "id": "competing-domains",
              "name": "Competing domains",
              "description": "Compare the ten most frequently appearing domains and identify the tracked store domain.",
              "section": "Top competing domains"
            },
            {
              "id": "query-results",
              "name": "Tracked query results",
              "description": "Review paginated query scores, citations, recent trends and check times, with queries outside the plan allowance marked inactive.",
              "section": "Tracked queries"
            },
            {
              "id": "sync-status",
              "name": "Sync status",
              "description": "See the current tracking scope, latest refresh and progress of a check."
            }
          ],
          "metrics": [
            {
              "id": "ai_presence:brand_visibility_score",
              "name": "Brand Visibility Score",
              "description": "A score from 0 to 100 combining query scores, citation rate and citation positions across measured results.",
              "unit": "score",
              "section": "Summary"
            },
            {
              "id": "ai_presence:total_mentions",
              "name": "AI Mentions",
              "description": "Number of measured query-and-surface results in the current sync that report the brand as cited.",
              "unit": "count",
              "section": "Summary"
            },
            {
              "id": "ai_presence:citation_rate",
              "name": "Citation Rate",
              "description": "Percentage of measured query-and-surface results that report the brand as cited; unmeasured results are excluded.",
              "unit": "percent",
              "section": "Summary"
            },
            {
              "id": "ai_presence:avg_position",
              "name": "Avg. AI Position",
              "description": "Average reported citation position across cited results with a known position; lower is better.",
              "unit": "position",
              "section": "Summary"
            },
            {
              "id": "ai_presence:summary_change",
              "name": "Change since previous sync",
              "description": "Change in the summary measures since the previous available sync; citation-rate changes are percentage points.",
              "section": "Summary"
            },
            {
              "id": "ai_presence:citation_target",
              "name": "Citation target",
              "description": "The citation-rate target and remaining percentage-point gap shown beside the current citation rate.",
              "unit": "percent",
              "section": "Summary"
            },
            {
              "id": "ai_presence:best_citation",
              "name": "Best citation position",
              "description": "The best known citation position and associated AI surface in the current results.",
              "unit": "position",
              "section": "Summary"
            },
            {
              "id": "ai_presence:tracked_queries",
              "name": "Tracked queries",
              "description": "Number of queries configured for this store; queries beyond the plan allowance are retained but are not checked.",
              "unit": "count",
              "section": "Tracked queries"
            },
            {
              "id": "ai_presence:query_score",
              "name": "Query score",
              "description": "A score from 0 to 100 based on the brand citation positions reported for a tracked query.",
              "unit": "score",
              "section": "Tracked queries"
            },
            {
              "id": "ai_presence:query_citation_position",
              "name": "Citation by surface",
              "description": "Whether a tracked query reports a brand citation on each selected AI surface and its reported position when available.",
              "section": "Tracked queries"
            },
            {
              "id": "ai_presence:query_score_trend",
              "name": "Query score trend",
              "description": "Direction of the query score change and its recent score history.",
              "section": "Tracked queries"
            },
            {
              "id": "ai_presence:query_checked_at",
              "name": "Query checked",
              "description": "When evidence for a tracked query was last checked.",
              "unit": "date-time",
              "section": "Tracked queries"
            },
            {
              "id": "ai_presence:model_coverage",
              "name": "AI model coverage",
              "description": "Percentage of measured queries that report a brand citation for each selected AI surface; also shown over the last 30 days.",
              "unit": "percent",
              "section": "AI model coverage"
            },
            {
              "id": "ai_presence:model_mentions",
              "name": "Mentions by surface",
              "description": "Number of measured queries that report a brand citation for each selected AI surface.",
              "unit": "count",
              "section": "AI model coverage"
            },
            {
              "id": "ai_presence:domain_appearances",
              "name": "Domain appearances",
              "description": "Number of appearances of each domain in the collected citation evidence across the represented AI surfaces.",
              "unit": "count",
              "section": "Top competing domains"
            },
            {
              "id": "ai_presence:domain_share_of_voice",
              "name": "Share of voice",
              "description": "A domain’s percentage of all domain appearances in the collected evidence, including domains outside the displayed top ten.",
              "unit": "percent",
              "section": "Top competing domains"
            },
            {
              "id": "ai_presence:domain_avg_position",
              "name": "Domain average position",
              "description": "Average position of a domain in the collected citation evidence.",
              "unit": "position",
              "section": "Top competing domains"
            },
            {
              "id": "ai_presence:domain_surface_position",
              "name": "Domain position by surface",
              "description": "Average reported position for each competing domain on each selected AI surface.",
              "unit": "position",
              "section": "Top competing domains"
            },
            {
              "id": "ai_presence:last_sync",
              "name": "Last sync",
              "description": "When the currently displayed visibility snapshot was refreshed.",
              "unit": "date-time",
              "section": "Sync status"
            }
          ],
          "aliases": ["/{accountSlug}/apps/ai-presence/overview"]
        },
        {
          "id": "settings",
          "path": "/{accountSlug}/apps/ai-presence/settings",
          "name": "Settings",
          "description": "Configure the brand, queries, AI surfaces and locale, then start an eligible manual check.",
          "access": "authenticated",
          "features": [
            {
              "id": "brand-identity",
              "name": "Brand identity",
              "description": "Set the brand name, domain and alternate brand names used to recognize mentions and citations.",
              "section": "Brand"
            },
            {
              "id": "tracked-queries",
              "name": "Manage queries",
              "description": "Add and remove shopper queries within the store’s plan allowance. Retained queries beyond the allowance remain inactive.",
              "section": "Tracked queries"
            },
            {
              "id": "query-suggestions",
              "name": "Query suggestions",
              "description": "Review suggested shopper queries and add selected suggestions to the tracked list.",
              "section": "Tracked queries"
            },
            {
              "id": "surfaces-locale",
              "name": "Surfaces and locale",
              "description": "Select the represented AI surfaces, country and language.",
              "section": "Surfaces & locale"
            },
            {
              "id": "manual-check",
              "name": "Run now",
              "description": "Start a check when setup, permissions and plan access allow it. Manual checks are subject to a cooldown."
            },
            {
              "id": "save-settings",
              "name": "Save or discard changes",
              "description": "Save the tracking configuration or discard unsaved edits."
            }
          ],
          "metrics": [
            {
              "id": "ai_presence:tracked_queries",
              "name": "Tracked queries",
              "description": "Number of queries configured for this store; queries beyond the plan allowance are retained but are not checked.",
              "unit": "count",
              "section": "Tracked queries"
            }
          ]
        },
        {
          "id": "logs",
          "path": "/{accountSlug}/apps/ai-presence/logs",
          "name": "Logs",
          "description": "Review AI visibility check history, outcomes and failure details for the selected store.",
          "access": "authenticated",
          "features": [
            {
              "id": "run-history",
              "name": "Run history",
              "description": "Browse recent runs by status and start time, with the trigger and elapsed duration."
            },
            {
              "id": "run-details",
              "name": "Run details",
              "description": "Expand a run to read its progress messages and any reported error."
            }
          ],
          "metrics": [
            {
              "id": "ai_presence:run_duration",
              "name": "Run duration",
              "description": "Elapsed time between the start and finish of a recorded run.",
              "unit": "duration",
              "section": "Run history"
            }
          ]
        },
        {
          "id": "query-suggestions-modal",
          "path": "/modal/ai-presence/suggest-queries",
          "name": "Query suggestions picker",
          "description": "Shopify Admin presentation of the AI Presence query picker. Opened from an installed app’s settings with the required context.",
          "access": "authenticated",
          "features": [
            {
              "id": "suggestions",
              "name": "Suggested shopper queries",
              "description": "Review suggested queries, refresh suggestions, and select queries to add within the plan’s available slots."
            }
          ],
          "metrics": []
        }
      ]
    },
    {
      "id": "seo-performance-monitor",
      "name": "SEO Performance Monitor",
      "description": "Monitor estimated search traffic, keyword rankings, backlinks, competitors and top pages.",
      "updatedAt": "2026-09-30",
      "pages": [
        {
          "id": "overview",
          "path": "/{accountSlug}/apps/seo-performance-monitor",
          "name": "Overview",
          "description": "Review estimated search performance for the selected store’s domain and markets. Snapshots require an enabled, configured app and eligible store plan.",
          "access": "authenticated",
          "features": [
            {
              "id": "search-summary",
              "name": "Search performance summary",
              "description": "Review domain authority, organic and paid traffic, keyword counts and the backlink profile; pin headline cards to the dashboard.",
              "section": "Summary"
            },
            {
              "id": "performance-history",
              "name": "Performance history",
              "description": "Switch between traffic, keywords, traffic cost and backlinks over one, three, six or twelve months, or all available history. Wider ranges group observations by week; historical traffic estimates may repeat monthly source values.",
              "section": "Performance trend"
            },
            {
              "id": "country-comparison",
              "name": "Country comparison",
              "description": "Switch between organic and paid traffic distribution across configured countries.",
              "section": "Traffic distribution by country"
            },
            {
              "id": "ranking-distribution",
              "name": "Keyword ranking distribution",
              "description": "Review counts and shares by ranking range and highlights for keywords on the second results page.",
              "section": "Distribution of organic keyword rankings"
            },
            {
              "id": "keyword-explorer",
              "name": "Organic keyword explorer",
              "description": "Search the fetched keyword list, filter by ranking range, sort by position or search volume and page through results. The fetched list may be smaller than the domain’s total keyword count.",
              "section": "Organic keywords"
            },
            {
              "id": "competitor-comparison",
              "name": "Competitor comparison",
              "description": "Compare the tracked domain with competing domains by trust, estimated traffic and shared keywords.",
              "section": "Competitors"
            },
            {
              "id": "top-pages",
              "name": "Top organic pages",
              "description": "Review the strongest reported pages and open their URLs.",
              "section": "Top pages in organic search"
            },
            {
              "id": "sync-status",
              "name": "Sync status",
              "description": "See the configured market, scheduled refresh information and progress of a snapshot."
            }
          ],
          "metrics": [
            {
              "id": "seo_performance:domain_trust",
              "name": "Domain Trust",
              "description": "A domain authority score from 0 to 100 derived from the reported backlink rank.",
              "unit": "score",
              "section": "Summary"
            },
            {
              "id": "seo_performance:page_trust",
              "name": "Page Trust",
              "description": "An authority score from 0 to 100 for the top organic page, derived from its reported backlink rank.",
              "unit": "score",
              "section": "Summary"
            },
            {
              "id": "seo_performance:organic_traffic",
              "name": "Organic Traffic",
              "description": "Estimated monthly clicks from organic search for the domain in the primary market; this is not first-party visitor analytics.",
              "unit": "clicks/month",
              "section": "Summary"
            },
            {
              "id": "seo_performance:paid_traffic",
              "name": "Paid Traffic",
              "description": "Estimated monthly clicks from paid search for the domain in the primary market.",
              "unit": "clicks/month",
              "section": "Summary"
            },
            {
              "id": "seo_performance:organic_keywords",
              "name": "Organic keywords",
              "description": "Number of organic ranking keywords reported for the domain in the primary market.",
              "unit": "count",
              "section": "Summary"
            },
            {
              "id": "seo_performance:paid_keywords",
              "name": "Paid keywords",
              "description": "Number of paid search keywords reported for the domain in the primary market.",
              "unit": "count",
              "section": "Summary"
            },
            {
              "id": "seo_performance:organic_traffic_cost",
              "name": "Organic traffic cost",
              "description": "Estimated paid-search equivalent cost of the reported organic traffic, shown with the interface’s euro symbol.",
              "unit": "currency",
              "section": "Summary"
            },
            {
              "id": "seo_performance:paid_traffic_cost",
              "name": "Paid traffic cost",
              "description": "Estimated cost of the reported paid search traffic, shown with the interface’s euro symbol.",
              "unit": "currency",
              "section": "Summary"
            },
            {
              "id": "seo_performance:backlinks",
              "name": "Backlinks",
              "description": "Number of inbound links reported for the tracked domain.",
              "unit": "count",
              "section": "Summary"
            },
            {
              "id": "seo_performance:referring_domains",
              "name": "Referring domains",
              "description": "Number of distinct domains reported as linking to the tracked domain.",
              "unit": "count",
              "section": "Summary"
            },
            {
              "id": "seo_performance:organic_traffic_change",
              "name": "Organic traffic change",
              "description": "Absolute change in estimated monthly organic clicks relative to the comparison snapshot displayed by the app.",
              "unit": "clicks/month",
              "section": "Summary"
            },
            {
              "id": "seo_performance:new_backlinks",
              "name": "New backlinks",
              "description": "Newly discovered inbound links in each available dated backlink-history observation.",
              "unit": "count",
              "section": "Performance trend"
            },
            {
              "id": "seo_performance:lost_backlinks",
              "name": "Lost backlinks",
              "description": "Lost inbound links in each available dated backlink-history observation.",
              "unit": "count",
              "section": "Performance trend"
            },
            {
              "id": "seo_performance:country_traffic_share",
              "name": "Traffic share by country",
              "description": "A country’s share of estimated organic or paid traffic across the configured countries, according to the selected table mode.",
              "unit": "percent",
              "section": "Traffic distribution by country"
            },
            {
              "id": "seo_performance:country_traffic",
              "name": "Traffic by country",
              "description": "Estimated monthly organic or paid search clicks for a configured country, according to the selected table mode.",
              "unit": "clicks/month",
              "section": "Traffic distribution by country"
            },
            {
              "id": "seo_performance:country_keywords",
              "name": "Keywords by country",
              "description": "Number of organic or paid keywords reported for a configured country, according to the selected table mode.",
              "unit": "count",
              "section": "Traffic distribution by country"
            },
            {
              "id": "seo_performance:country_organic_change",
              "name": "Country organic changes",
              "description": "Absolute changes in a country’s organic traffic and keyword count relative to the comparison snapshot; paid rows do not show these changes.",
              "section": "Traffic distribution by country"
            },
            {
              "id": "seo_performance:ranking_bucket_count",
              "name": "Keywords by ranking range",
              "description": "Number of keywords in positions 1–5, 6–10, 11–20, 21–50 and 51–100. The split of reported positions 4–10 between the first two ranges is estimated.",
              "unit": "count",
              "section": "Distribution of organic keyword rankings"
            },
            {
              "id": "seo_performance:ranking_bucket_share",
              "name": "Share by ranking range",
              "description": "Percentage of the represented ranking keywords in each displayed position range.",
              "unit": "percent",
              "section": "Distribution of organic keyword rankings"
            },
            {
              "id": "seo_performance:keyword_position",
              "name": "Keyword position",
              "description": "The reported absolute search-result position for each listed organic keyword.",
              "unit": "position",
              "section": "Organic keywords"
            },
            {
              "id": "seo_performance:keyword_search_volume",
              "name": "Search volume",
              "description": "Reported monthly search volume for a listed keyword in the selected market.",
              "unit": "searches/month",
              "section": "Organic keywords"
            },
            {
              "id": "seo_performance:keyword_traffic_cost",
              "name": "Keyword traffic cost",
              "description": "The keyword’s reported cost per click multiplied by its search volume, shown with the interface’s euro symbol; this is not actual store advertising spend.",
              "unit": "currency",
              "section": "Organic keywords"
            },
            {
              "id": "seo_performance:keyword_competition",
              "name": "Competition",
              "description": "Reported advertising competition for the keyword, shown as Low, Medium or High.",
              "unit": "category",
              "section": "Organic keywords"
            },
            {
              "id": "seo_performance:keyword_trend",
              "name": "Keyword trend",
              "description": "Reported movement from a keyword’s previous rank, or an indication that it is new or lost.",
              "section": "Organic keywords"
            },
            {
              "id": "seo_performance:competitor_trust",
              "name": "Competitor trust",
              "description": "A competing domain’s authority score from 0 to 100 derived from its reported backlink rank.",
              "unit": "score",
              "section": "Competitors"
            },
            {
              "id": "seo_performance:competitor_traffic",
              "name": "Competitor traffic",
              "description": "Estimated organic search traffic shown for a competing domain.",
              "unit": "clicks/month",
              "section": "Competitors"
            },
            {
              "id": "seo_performance:shared_keywords",
              "name": "Shared keywords",
              "description": "Reported number of ranking keywords shared by a competing domain and the tracked domain.",
              "unit": "count",
              "section": "Competitors"
            },
            {
              "id": "seo_performance:page_traffic",
              "name": "Page traffic",
              "description": "Estimated organic search traffic for a listed page.",
              "unit": "clicks/month",
              "section": "Top pages in organic search"
            },
            {
              "id": "seo_performance:page_keywords",
              "name": "Page keywords",
              "description": "Number of organic ranking keywords reported for a listed page.",
              "unit": "count",
              "section": "Top pages in organic search"
            },
            {
              "id": "seo_performance:page_best_position",
              "name": "Best page position",
              "description": "An indicative best ranking position derived from the page’s reported ranking buckets, rather than an exact keyword-level rank.",
              "unit": "position",
              "section": "Top pages in organic search"
            },
            {
              "id": "seo_performance:last_sync",
              "name": "Last sync",
              "description": "When the currently displayed search-performance snapshot was refreshed.",
              "unit": "date-time",
              "section": "Sync status"
            }
          ],
          "aliases": ["/{accountSlug}/apps/seo-performance-monitor/overview"]
        },
        {
          "id": "settings",
          "path": "/{accountSlug}/apps/seo-performance-monitor/settings",
          "name": "Settings",
          "description": "Choose the tracked domain, locale and comparison countries, and start an eligible manual snapshot.",
          "access": "authenticated",
          "features": [
            {
              "id": "domain-locale",
              "name": "Domain and locale",
              "description": "Set the domain, primary country and language used for search performance reporting.",
              "section": "Domain & locale"
            },
            {
              "id": "tracked-countries",
              "name": "Tracked countries",
              "description": "Choose the countries shown in the traffic distribution table, retaining at least one.",
              "section": "Traffic distribution"
            },
            {
              "id": "manual-snapshot",
              "name": "Run now",
              "description": "Start a fresh snapshot when setup, permissions and plan access allow it. Manual snapshots are subject to a cooldown."
            },
            {
              "id": "plan-allowance",
              "name": "Plan allowance",
              "description": "Review any plan restriction affecting the number of keyword results available."
            },
            {
              "id": "save-settings",
              "name": "Save or discard changes",
              "description": "Save the monitoring configuration or discard unsaved edits."
            }
          ],
          "metrics": []
        },
        {
          "id": "logs",
          "path": "/{accountSlug}/apps/seo-performance-monitor/logs",
          "name": "Logs",
          "description": "Review search snapshot history, outcomes and failure details for the selected store.",
          "access": "authenticated",
          "features": [
            {
              "id": "run-history",
              "name": "Run history",
              "description": "Browse recent runs by status and start time, with the trigger and elapsed duration."
            },
            {
              "id": "run-details",
              "name": "Run details",
              "description": "Expand a run to read its progress messages and any reported error."
            }
          ],
          "metrics": [
            {
              "id": "seo_performance_monitor:run_duration",
              "name": "Run duration",
              "description": "Elapsed time between the start and finish of a recorded run.",
              "unit": "duration",
              "section": "Run history"
            }
          ]
        }
      ]
    },
    {
      "id": "data-sync",
      "name": "Data Sync",
      "description": "Synchronize Shopify products with Google Sheets and import or export supported product data through Google Sheets or CSV.",
      "updatedAt": "2026-10-02",
      "pages": [
        {
          "id": "overview",
          "path": "/{accountSlug}/apps/data-sync",
          "name": "Overview",
          "description": "Review the recurring Google Sheets sync, preview changes and inspect recent product updates. Data Sync setup, required Shopify permissions and eligible plan access are required.",
          "access": "authenticated",
          "features": [
            {
              "id": "sync-summary",
              "name": "Sync summary",
              "description": "Review the connected sheet, schedule, mapping coverage, latest run and managed products.",
              "section": "Sync summary"
            },
            {
              "id": "preview-changes",
              "name": "Preview changes",
              "description": "Compare the recurring sheet with Shopify before applying changes.",
              "section": "Preview"
            },
            {
              "id": "apply-discard-preview",
              "name": "Apply or discard a preview",
              "description": "Review proposed changes, apply them to Shopify or discard the preview. Applying reads the source again, so later edits can change the result.",
              "section": "Preview"
            },
            {
              "id": "recent-changes",
              "name": "Recent changes",
              "description": "Inspect affected products, changed fields and before-and-after values from the latest run.",
              "section": "Recent changes"
            }
          ],
          "metrics": [
            {
              "id": "datasync:products_in_sync",
              "name": "Products in sync",
              "description": "Number of products recorded as managed by this Data Sync installation.",
              "unit": "count",
              "section": "Sync summary"
            },
            {
              "id": "datasync:last_sync",
              "name": "Last sheet sync",
              "description": "Completion time of the latest run when it completed an actual sync; previews are not treated as completed synchronization.",
              "unit": "date-time",
              "section": "Sync summary"
            },
            {
              "id": "datasync:rows_with_errors",
              "name": "Rows with errors",
              "description": "Error count reported by the installation’s latest run.",
              "unit": "count",
              "section": "Run results"
            },
            {
              "id": "data_sync:field_mapping",
              "name": "Field mapping",
              "description": "Mapped source columns compared with the detected column count, including the count left unmapped.",
              "unit": "count",
              "section": "Sync summary"
            },
            {
              "id": "data_sync:created",
              "name": "Created",
              "description": "Products created by a run, or proposed for creation when viewing a preview.",
              "unit": "count",
              "section": "Run results"
            },
            {
              "id": "data_sync:updated",
              "name": "Updated",
              "description": "Products updated by a run, or proposed for update when viewing a preview.",
              "unit": "count",
              "section": "Run results"
            },
            {
              "id": "data_sync:skipped",
              "name": "Skipped",
              "description": "Source rows or products skipped during the selected run.",
              "unit": "count",
              "section": "Run results"
            },
            {
              "id": "data_sync:removed",
              "name": "Removed",
              "description": "Previously managed products affected by the recurring sync’s missing-row policy, or proposed to be affected in a preview. One-time imports ignore missing rows.",
              "unit": "count",
              "section": "Run results"
            },
            {
              "id": "data_sync:conflicts",
              "name": "Conflicts",
              "description": "Field changes that replace edits made in Shopify since the previous sync with values from the source.",
              "unit": "count",
              "section": "Run results"
            },
            {
              "id": "data_sync:run_errors",
              "name": "Errors",
              "description": "Errors counted for the selected run or preview.",
              "unit": "count",
              "section": "Run results"
            }
          ],
          "aliases": ["/{accountSlug}/apps/data-sync/overview"]
        },
        {
          "id": "onboarding",
          "path": "/{accountSlug}/apps/data-sync/onboarding",
          "name": "Set up",
          "description": "Complete the initial Google Sheets sync configuration before accessing Data Sync’s other screens.",
          "access": "authenticated",
          "features": [
            {
              "id": "google-connection",
              "name": "Google connection",
              "description": "Connect or select a Google account and grant access to the spreadsheet used for recurring synchronization."
            },
            {
              "id": "sheet-selection",
              "name": "Spreadsheet and worksheet",
              "description": "Select the product spreadsheet and its worksheet."
            },
            {
              "id": "column-mapping",
              "name": "Column mapping",
              "description": "Choose how to identify matching products and map sheet columns to supported Shopify product fields."
            },
            {
              "id": "sync-schedule",
              "name": "Sync schedule",
              "description": "Choose manual, hourly, daily or weekly synchronization where the store’s plan allows it."
            },
            {
              "id": "row-policies",
              "name": "Row policies",
              "description": "Choose whether to create new products, which fields to update on matched products, and whether to leave, archive or zero stock for previously managed products missing from the recurring sheet."
            },
            {
              "id": "inventory-and-safety",
              "name": "Inventory and removal controls",
              "description": "Choose the inventory location for stock updates and a safety threshold for missing-row changes."
            },
            {
              "id": "setup-progress",
              "name": "Setup progress",
              "description": "Follow the five setup steps, save partial progress, and finish once the configuration is ready."
            }
          ],
          "metrics": []
        },
        {
          "id": "import",
          "path": "/{accountSlug}/apps/data-sync/import",
          "name": "Import",
          "description": "Run a one-time product import from CSV or Google Sheets using a separate column mapping and row policy. Data Sync setup and eligible access must already be available.",
          "access": "authenticated",
          "features": [
            {
              "id": "import-source",
              "name": "CSV or Google Sheets source",
              "description": "Upload a CSV from the computer or select a Google Sheet. CSV input does not require a Google connection for that file.",
              "section": "Choose your file"
            },
            {
              "id": "import-mapping",
              "name": "Import column mapping",
              "description": "Map this source’s columns and choose the product matching field without changing the recurring sync’s saved mapping.",
              "section": "Map your columns"
            },
            {
              "id": "import-policies",
              "name": "New and matched products",
              "description": "Choose whether to create new products, update selected fields or skip matched products, and select the inventory location when writing stock. Products absent from a one-time import are left unchanged.",
              "section": "Review & import"
            },
            {
              "id": "preview-apply",
              "name": "Preview and apply",
              "description": "Preview the import, inspect proposed changes and errors, then apply to Shopify or discard the preview.",
              "section": "Review & import"
            },
            {
              "id": "import-results",
              "name": "Import progress and results",
              "description": "Follow the run, inspect its counts and affected fields, and review failures before starting another import.",
              "section": "Run results"
            }
          ],
          "metrics": [
            {
              "id": "data_sync:rows_read",
              "name": "Rows read",
              "description": "Number of source rows read during the selected import or sync.",
              "unit": "count",
              "section": "Run results"
            },
            {
              "id": "data_sync:run_progress",
              "name": "Run progress",
              "description": "Processed rows or products compared with the run’s known total, with a percentage when a total is available.",
              "unit": "percent",
              "section": "Run progress"
            },
            {
              "id": "data_sync:created",
              "name": "Created",
              "description": "Products created by a run, or proposed for creation when viewing a preview.",
              "unit": "count",
              "section": "Run results"
            },
            {
              "id": "data_sync:updated",
              "name": "Updated",
              "description": "Products updated by a run, or proposed for update when viewing a preview.",
              "unit": "count",
              "section": "Run results"
            },
            {
              "id": "data_sync:skipped",
              "name": "Skipped",
              "description": "Source rows or products skipped during the selected run.",
              "unit": "count",
              "section": "Run results"
            },
            {
              "id": "data_sync:removed",
              "name": "Removed",
              "description": "Previously managed products affected by the recurring sync’s missing-row policy, or proposed to be affected in a preview. One-time imports ignore missing rows.",
              "unit": "count",
              "section": "Run results"
            },
            {
              "id": "data_sync:conflicts",
              "name": "Conflicts",
              "description": "Field changes that replace edits made in Shopify since the previous sync with values from the source.",
              "unit": "count",
              "section": "Run results"
            },
            {
              "id": "data_sync:run_errors",
              "name": "Errors",
              "description": "Errors counted for the selected run or preview.",
              "unit": "count",
              "section": "Run results"
            }
          ]
        },
        {
          "id": "export",
          "path": "/{accountSlug}/apps/data-sync/export",
          "name": "Export",
          "description": "Export supported Shopify product data to a CSV download or a new Google Sheet. Exports create a snapshot and do not change Shopify products.",
          "access": "authenticated",
          "features": [
            {
              "id": "export-format",
              "name": "CSV or Google Sheets export",
              "description": "Download a CSV without a Google connection for that file, or create a new spreadsheet in a connected Google account.",
              "section": "Choose a format"
            },
            {
              "id": "export-fields",
              "name": "Export fields and headings",
              "description": "Select supported product fields, rename column headings and retain the chosen product matching field.",
              "section": "Choose fields to export"
            },
            {
              "id": "export-scope",
              "name": "Export scope",
              "description": "Export all active products or only products managed by this installation.",
              "section": "Scope & export"
            },
            {
              "id": "export-results",
              "name": "Export results",
              "description": "Follow export progress, open or download the result, and inspect products that could not be represented as a supported row.",
              "section": "Run results"
            },
            {
              "id": "round-trip",
              "name": "Edit and import back",
              "description": "Use the exported snapshot as a starting point for a later one-time import. A later export creates a new snapshot."
            }
          ],
          "metrics": [
            {
              "id": "datasync:products_in_sync",
              "name": "Products in sync",
              "description": "Number of products recorded as managed by this Data Sync installation.",
              "unit": "count",
              "section": "Sync summary"
            },
            {
              "id": "data_sync:run_progress",
              "name": "Run progress",
              "description": "Processed rows or products compared with the run’s known total, with a percentage when a total is available.",
              "unit": "percent",
              "section": "Run progress"
            },
            {
              "id": "data_sync:rows_written",
              "name": "Rows written",
              "description": "Number of product rows successfully written to the export destination.",
              "unit": "count",
              "section": "Run results"
            },
            {
              "id": "data_sync:skipped",
              "name": "Skipped",
              "description": "Source rows or products skipped during the selected run.",
              "unit": "count",
              "section": "Run results"
            },
            {
              "id": "data_sync:run_errors",
              "name": "Errors",
              "description": "Errors counted for the selected run or preview.",
              "unit": "count",
              "section": "Run results"
            }
          ]
        },
        {
          "id": "settings",
          "path": "/{accountSlug}/apps/data-sync/settings",
          "name": "Settings",
          "description": "Manage the recurring sheet connection, product mapping, schedule and row policies, then run an eligible sync.",
          "access": "authenticated",
          "features": [
            {
              "id": "google-connection",
              "name": "Google connection",
              "description": "Connect or select a Google account and grant access to the spreadsheet used for recurring synchronization."
            },
            {
              "id": "sheet-selection",
              "name": "Spreadsheet and worksheet",
              "description": "Select the product spreadsheet and its worksheet."
            },
            {
              "id": "column-mapping",
              "name": "Column mapping",
              "description": "Choose how to identify matching products and map sheet columns to supported Shopify product fields."
            },
            {
              "id": "sync-schedule",
              "name": "Sync schedule",
              "description": "Choose manual, hourly, daily or weekly synchronization where the store’s plan allows it."
            },
            {
              "id": "row-policies",
              "name": "Row policies",
              "description": "Choose whether to create new products, which fields to update on matched products, and whether to leave, archive or zero stock for previously managed products missing from the recurring sheet."
            },
            {
              "id": "inventory-and-safety",
              "name": "Inventory and removal controls",
              "description": "Choose the inventory location for stock updates and a safety threshold for missing-row changes."
            },
            {
              "id": "disconnect-google",
              "name": "Disconnect Google",
              "description": "Review affected sync installations before disconnecting a Google account."
            },
            {
              "id": "manual-sync",
              "name": "Run now",
              "description": "Start a sync using the saved configuration when setup, permissions, plan access and current activity permit."
            },
            {
              "id": "save-settings",
              "name": "Save or discard changes",
              "description": "Save the recurring sync configuration or discard unsaved edits."
            }
          ],
          "metrics": []
        },
        {
          "id": "logs",
          "path": "/{accountSlug}/apps/data-sync/logs",
          "name": "Logs",
          "description": "Review synchronization, import and export history, including changes, row errors and failed runs.",
          "access": "authenticated",
          "features": [
            {
              "id": "run-history",
              "name": "Run history",
              "description": "Review run type, status, start time, duration and result counts."
            },
            {
              "id": "row-errors",
              "name": "Row errors",
              "description": "Expand a run to inspect affected source rows, matching values and error explanations."
            },
            {
              "id": "change-history",
              "name": "Change history",
              "description": "Review affected products and before-and-after field changes, including overwritten Shopify edits."
            },
            {
              "id": "run-details",
              "name": "Run details",
              "description": "Read progress messages and the reason a run stopped."
            }
          ],
          "metrics": [
            {
              "id": "data_sync:created",
              "name": "Created",
              "description": "Products created by a run, or proposed for creation when viewing a preview.",
              "unit": "count",
              "section": "Run results"
            },
            {
              "id": "data_sync:updated",
              "name": "Updated",
              "description": "Products updated by a run, or proposed for update when viewing a preview.",
              "unit": "count",
              "section": "Run results"
            },
            {
              "id": "data_sync:skipped",
              "name": "Skipped",
              "description": "Source rows or products skipped during the selected run.",
              "unit": "count",
              "section": "Run results"
            },
            {
              "id": "data_sync:removed",
              "name": "Removed",
              "description": "Previously managed products affected by the recurring sync’s missing-row policy, or proposed to be affected in a preview. One-time imports ignore missing rows.",
              "unit": "count",
              "section": "Run results"
            },
            {
              "id": "data_sync:conflicts",
              "name": "Conflicts",
              "description": "Field changes that replace edits made in Shopify since the previous sync with values from the source.",
              "unit": "count",
              "section": "Run results"
            },
            {
              "id": "data_sync:run_errors",
              "name": "Errors",
              "description": "Errors counted for the selected run or preview.",
              "unit": "count",
              "section": "Run results"
            },
            {
              "id": "data_sync:run_duration",
              "name": "Run duration",
              "description": "Elapsed time for a sync, import or export, including elapsed time while a run is in progress.",
              "unit": "duration",
              "section": "Run history"
            }
          ]
        }
      ]
    },
    {
      "id": "link-pilot",
      "name": "LinkPilot",
      "description": "Find and review internal linking opportunities, add approved links to Shopify content, audit the store’s link graph, and measure consented storefront events.",
      "updatedAt": "2026-09-30",
      "pages": [
        {
          "id": "overview",
          "path": "/{accountSlug}/apps/link-pilot",
          "name": "Overview",
          "description": "Review link improvements, audit findings, suggestion queues, available credits, and the latest store scan.",
          "access": "authenticated",
          "features": [
            {
              "id": "store-scan",
              "name": "Store scan",
              "description": "Read Shopify products, collections, pages, and articles to refresh the content used for linking suggestions. The initial scan is available without an active subscription; Shopify permissions are required."
            },
            {
              "id": "link-audit",
              "name": "Link audit",
              "description": "Recalculate the linking score and find orphan content, unresolved destinations, and content with too few links."
            },
            {
              "id": "generate-suggestions",
              "name": "Generate suggestions",
              "description": "Find relevant places to link existing phrases to related store content and send suggestions for review."
            },
            {
              "id": "review-queue",
              "name": "Review queue",
              "description": "Open suggestions waiting for review, approved links ready to implement, or changes needing attention."
            },
            {
              "id": "run-status",
              "name": "Run status",
              "description": "See the latest scan or analysis outcome, scan time, and effective run cadence, with access to detailed logs."
            }
          ],
          "metrics": [
            {
              "id": "link_pilot:links_added",
              "name": "Links added by LinkPilot",
              "description": "Suggestions currently marked implemented for the selected store.",
              "unit": "count"
            },
            {
              "id": "link_pilot:indexed_resources",
              "name": "Resources indexed",
              "description": "Products, collections, pages, and articles currently indexed for the selected store.",
              "unit": "count"
            },
            {
              "id": "link_pilot:links_found",
              "name": "Links found",
              "description": "Links recorded from indexed content in the latest audit, including links added by LinkPilot and recorded external URLs.",
              "unit": "count"
            },
            {
              "id": "link_pilot:linking_score",
              "name": "Linking score",
              "description": "A 0–100 audit score based on orphan content, broken destinations, under-linked products and collections, and pages or articles with no outgoing links.",
              "unit": "percent"
            },
            {
              "id": "link_pilot:broken_links",
              "name": "Broken links",
              "description": "Recorded links whose relative destination does not match an indexed store resource. This is an indexed-content check, not a live HTTP status check.",
              "unit": "count"
            },
            {
              "id": "link_pilot:orphan_pages",
              "name": "Orphan pages",
              "description": "Indexed products, collections, pages, or articles with no recorded incoming links.",
              "unit": "count"
            },
            {
              "id": "link_pilot:underlinked_products",
              "name": "Under-linked products",
              "description": "Products and collections with fewer recorded incoming links than the audit threshold: the larger of one link or the median inbound count for products and collections.",
              "unit": "count"
            },
            {
              "id": "link_pilot:dead_end_articles",
              "name": "Dead-end articles",
              "description": "Indexed articles and pages with no recorded outgoing links.",
              "unit": "count"
            },
            {
              "id": "link_pilot:suggestions_by_status",
              "name": "Suggestions by status",
              "description": "Counts of open, approved, implementing, implemented, dismissed, expired, and issue suggestions for the selected store.",
              "unit": "count"
            },
            {
              "id": "link_pilot:credits_available",
              "name": "Credits available",
              "description": "The selected store’s available balance for implementing links.",
              "unit": "credits"
            },
            {
              "id": "link_pilot:credits_renewing",
              "name": "Credits renewing",
              "description": "Credits in the available balance that renew at the displayed plan renewal date.",
              "unit": "credits"
            }
          ],
          "aliases": ["/{accountSlug}/apps/link-pilot/overview"]
        },
        {
          "id": "onboarding",
          "path": "/{accountSlug}/apps/link-pilot/onboarding",
          "name": "Onboarding",
          "description": "Set store permissions, destination exclusions, and suggestion emails before the first scan.",
          "access": "authenticated",
          "features": [
            {
              "id": "store-permissions",
              "name": "Store permissions",
              "description": "Check that LinkPilot can read the Shopify content needed for scanning."
            },
            {
              "id": "destination-exclusions",
              "name": "Destination exclusions",
              "description": "Choose whether to exclude drafts, unavailable products, or specified content handles from link destinations."
            },
            {
              "id": "suggestion-emails",
              "name": "Suggestion emails",
              "description": "Choose the recipients and frequency of summaries about new suggestions."
            },
            {
              "id": "first-scan",
              "name": "First scan",
              "description": "Save setup choices and start the initial content scan when permitted."
            }
          ],
          "metrics": []
        },
        {
          "id": "suggestions",
          "path": "/{accountSlug}/apps/link-pilot/suggestions",
          "name": "Suggestions",
          "description": "Review suggested links and apply approved changes to Shopify content.",
          "access": "authenticated",
          "features": [
            {
              "id": "find-suggestions",
              "name": "Find suggestions",
              "description": "Filter by status, search anchor text or source and destination content, and sort by confidence or date."
            },
            {
              "id": "link-preview",
              "name": "Link preview",
              "description": "Inspect suggested anchor text, the source and destination, the explanation, and the surrounding copy."
            },
            {
              "id": "review-actions",
              "name": "Review actions",
              "description": "Approve or dismiss suggestions individually or in bulk, and remove approval before implementation."
            },
            {
              "id": "implement-approved",
              "name": "Implement approved links",
              "description": "Confirm the affected content and credit cost before writing links into source-page body copy. Credits are spent after verified writes; changed content can be skipped for review."
            },
            {
              "id": "issue-recovery",
              "name": "Resolve implementation issues",
              "description": "Retry eligible failed writes, regenerate suggestions when content changed, or dismiss suggestions that no longer fit."
            },
            {
              "id": "revert-link",
              "name": "Revert a link",
              "description": "Undo eligible links previously implemented by LinkPilot when the stored change can still be safely reverted."
            },
            {
              "id": "export-suggestions",
              "name": "Export suggestions",
              "description": "Download suggestions as CSV for review outside the app."
            }
          ],
          "metrics": [
            {
              "id": "link_pilot:suggestions_by_status",
              "name": "Suggestions by status",
              "description": "Counts of open, approved, implementing, implemented, dismissed, expired, and issue suggestions for the selected store.",
              "unit": "count"
            },
            {
              "id": "link_pilot:suggestion_confidence",
              "name": "Suggestion confidence",
              "description": "The recommendation’s confidence score displayed as a percentage; it is not a predicted click or conversion rate.",
              "unit": "percent"
            },
            {
              "id": "link_pilot:credits_available",
              "name": "Credits available",
              "description": "The selected store’s available balance for implementing links.",
              "unit": "credits"
            },
            {
              "id": "link_pilot:implementation_links",
              "name": "Links to implement",
              "description": "Approved suggestions included in the pending implementation confirmation.",
              "unit": "count"
            },
            {
              "id": "link_pilot:implementation_credits",
              "name": "Implementation credits",
              "description": "The quoted credit cost of the pending implementation, with one credit per successfully written link.",
              "unit": "credits"
            }
          ]
        },
        {
          "id": "opportunities",
          "path": "/{accountSlug}/apps/link-pilot/opportunities",
          "name": "Opportunities",
          "description": "Turn imported search keywords or manually entered phrases into reviewed linking suggestions. Available with an eligible active plan from Starter.",
          "access": "authenticated",
          "features": [
            {
              "id": "search-console-import",
              "name": "Search Console CSV import",
              "description": "Upload a Google Search Console Queries CSV export and preview up to 500 valid rows, with feedback about invalid or excess rows."
            },
            {
              "id": "manual-keywords",
              "name": "Manual keywords",
              "description": "Enter keywords with optional target URLs to check against existing store copy."
            },
            {
              "id": "opportunity-preview",
              "name": "Opportunity preview",
              "description": "Review matches, missing destinations, phrases absent from source copy, and pairs already suggested before creating anything."
            },
            {
              "id": "create-suggestions",
              "name": "Create reviewed suggestions",
              "description": "Confirm matching opportunities to add them to the normal suggestion queue; this action does not write links into Shopify."
            },
            {
              "id": "export-skipped",
              "name": "Export skipped rows",
              "description": "Download opportunities that were skipped so their reasons can be reviewed."
            }
          ],
          "metrics": [
            {
              "id": "link_pilot:opportunity_rows",
              "name": "Import row counts",
              "description": "Original, accepted, invalid, and excess rows reported for the current opportunity import.",
              "unit": "count"
            },
            {
              "id": "link_pilot:opportunities_by_outcome",
              "name": "Keywords by outcome",
              "description": "Preview counts for suggestions to create, missing destinations, missing source phrases, and already suggested pairs.",
              "unit": "count"
            },
            {
              "id": "link_pilot:opportunity_impressions",
              "name": "Imported keyword impressions",
              "description": "Impressions supplied in the imported keyword rows, shown for preview examples. These are imported values, not automatically synchronized search data.",
              "unit": "count"
            },
            {
              "id": "link_pilot:opportunity_clicks",
              "name": "Imported keyword clicks",
              "description": "Clicks supplied in the imported keyword rows, shown for preview examples. Manually entered keywords can have no imported performance evidence.",
              "unit": "count"
            }
          ]
        },
        {
          "id": "analytics",
          "path": "/{accountSlug}/apps/link-pilot/analytics",
          "name": "Analytics",
          "description": "Review consented Shopify Web Pixel activity over 7, 30, or 90 days. Collection and reporting require an eligible active plan and an installed pixel.",
          "access": "authenticated",
          "features": [
            {
              "id": "web-pixel-installation",
              "name": "Web Pixel installation",
              "description": "Install the Shopify Web Pixel with the required store permissions and view its installation status."
            },
            {
              "id": "consented-events",
              "name": "Consented event report",
              "description": "Compare storefront event counts for shoppers who accepted analytics cookies. Counts do not represent complete store traffic or unique shoppers."
            },
            {
              "id": "last-click-attribution",
              "name": "Recorded link attribution",
              "description": "Associate events with a recognized store link using the most recent recorded link association within the preceding seven days. Follow-up activity can extend the association beyond the original click. The report labels this seven-day last-click attribution; it does not prove causation."
            }
          ],
          "metrics": [
            {
              "id": "link_pilot:page_views",
              "name": "Page viewed",
              "description": "Consented page-view events recorded by the pixel in the selected 7-, 30-, or 90-day period.",
              "unit": "count"
            },
            {
              "id": "link_pilot:product_views",
              "name": "Product viewed",
              "description": "Consented product-view events recorded by the pixel in the selected period.",
              "unit": "count"
            },
            {
              "id": "link_pilot:collection_views",
              "name": "Collection viewed",
              "description": "Consented collection-view events recorded by the pixel in the selected period.",
              "unit": "count"
            },
            {
              "id": "link_pilot:click_events",
              "name": "Clicked",
              "description": "Consented click events recorded by the pixel in the selected period; the count is not a click-through rate.",
              "unit": "count"
            },
            {
              "id": "link_pilot:add_to_cart_events",
              "name": "Product added to cart",
              "description": "Consented product-added-to-cart events recorded by the pixel in the selected period.",
              "unit": "count"
            },
            {
              "id": "link_pilot:checkout_events",
              "name": "Checkout completed",
              "description": "Consented checkout-completed events recorded by the pixel in the selected period; no revenue amount is reported.",
              "unit": "count"
            },
            {
              "id": "link_pilot:attributed_events",
              "name": "Events attributed to store links",
              "description": "Recorded events in the selected period carrying a recognized store-link association. Attribution includes follow-up events inheriting a link association recorded within the preceding seven days.",
              "unit": "count"
            },
            {
              "id": "link_pilot:attributed_product_views",
              "name": "Attributed product views",
              "description": "Consented product-view events in the selected period carrying the report’s recorded store-link attribution.",
              "unit": "count"
            },
            {
              "id": "link_pilot:attributed_add_to_cart_events",
              "name": "Attributed add-to-cart events",
              "description": "Consented product-added-to-cart events in the selected period carrying the report’s recorded store-link attribution.",
              "unit": "count"
            },
            {
              "id": "link_pilot:attributed_checkout_events",
              "name": "Attributed completed checkouts",
              "description": "Consented checkout-completed events in the selected period carrying the report’s recorded store-link attribution.",
              "unit": "count"
            }
          ]
        },
        {
          "id": "settings",
          "path": "/{accountSlug}/apps/link-pilot/settings",
          "name": "Settings",
          "description": "Control linking rules, content exclusions, notifications, automatic implementation, and the analytics pixel.",
          "access": "authenticated",
          "features": [
            {
              "id": "link-limits",
              "name": "Link limits",
              "description": "Set links per page, minimum anchor length and spacing, destination inbound-link limits, and the minimum similarity between pages."
            },
            {
              "id": "destination-exclusions",
              "name": "Destination exclusions",
              "description": "Exclude draft destinations, unavailable products, or specified content handles."
            },
            {
              "id": "suggestion-emails",
              "name": "Suggestion emails",
              "description": "Choose summary frequency and recipients, and review recent or upcoming delivery status."
            },
            {
              "id": "analytics-digest",
              "name": "Weekly analytics digest",
              "description": "Enable a weekly summary of consented activity and attributed events when the active plan permits analytics."
            },
            {
              "id": "automatic-implementation",
              "name": "Automatic implementation",
              "description": "On Pro, when available for the deployment, enable future runs to implement eligible suggestions above the chosen confidence threshold without individual review. Each run is limited to 100 links and requires sufficient credits."
            },
            {
              "id": "pixel-management",
              "name": "Web Pixel management",
              "description": "Check Shopify pixel status and remove the pixel to stop new collection while retaining existing history."
            }
          ],
          "metrics": []
        },
        {
          "id": "logs",
          "path": "/{accountSlug}/apps/link-pilot/logs",
          "name": "Logs",
          "description": "Review recent scans, audits, suggestion generation, implementation, and store alerts.",
          "access": "authenticated",
          "features": [
            {
              "id": "run-history",
              "name": "Run history",
              "description": "Inspect the 20 most recent runs, their kind and status, timing, error details, and recorded progress."
            },
            {
              "id": "store-alerts",
              "name": "Store alerts",
              "description": "Read the latest store alerts, follow related actions, and mark alerts as read."
            }
          ],
          "metrics": [
            {
              "id": "link_pilot:run_duration",
              "name": "Run duration",
              "description": "Elapsed time reported for an individual LinkPilot run.",
              "unit": "duration"
            }
          ]
        }
      ]
    },
    {
      "id": "copilot-post",
      "name": "CopilotPost",
      "description": "Plan, generate, edit, schedule, and publish Shopify blog posts using store content and brand voice, then review performance figures imported from Google Search Console.",
      "updatedAt": "2026-09-30",
      "pages": [
        {
          "id": "overview",
          "path": "/{accountSlug}/apps/copilot-post",
          "name": "Overview",
          "description": "Review publishing outcomes, draft work awaiting attention, store readiness, upcoming posts, and imported search performance.",
          "access": "authenticated",
          "features": [
            {
              "id": "store-reading",
              "name": "Read the store",
              "description": "Read products, collections, blogs, articles, and pages to prepare writing context and discover topics, with progress and freshness information."
            },
            {
              "id": "writing-setup",
              "name": "Writing setup",
              "description": "Set up brand voice and a destination blog before generating or publishing content."
            },
            {
              "id": "next-actions",
              "name": "Next actions",
              "description": "Open drafts ready for review, suggested topics, posts needing refresh, or publishing outcomes that require checking."
            },
            {
              "id": "recent-posts",
              "name": "Recent posts",
              "description": "Open recent briefs, drafts, or live posts and follow writing or publication progress."
            },
            {
              "id": "publishing-agenda",
              "name": "Upcoming publishing",
              "description": "Review scheduled posts and the next publication times, with access to the calendar."
            },
            {
              "id": "search-performance",
              "name": "Imported search performance",
              "description": "Show Google search clicks from merchant-entered Search Console figures, with coverage, stale-data, and measurement-readiness explanations."
            }
          ],
          "metrics": [
            {
              "id": "copilot_post:posts_live",
              "name": "Posts live",
              "description": "CopilotPost posts currently live on the selected Shopify store.",
              "unit": "count"
            },
            {
              "id": "copilot_post:unpublished_posts",
              "name": "Unpublished posts",
              "description": "Active CopilotPost posts that are not currently live.",
              "unit": "count"
            },
            {
              "id": "copilot_post:clicks_28d",
              "name": "Clicks from Google",
              "description": "Google search clicks from fresh merchant-entered reports covering a common 28-day period for all currently attributable live article pages. No automatic Search Console synchronization or source verification is performed.",
              "unit": "count"
            },
            {
              "id": "copilot_post:measured_clicks_28d",
              "name": "Partial measured clicks",
              "description": "The subtotal of clicks from fresh, aligned imported reports when some live article pages are missing usable matching figures; shown with the number of measured pages.",
              "unit": "count"
            },
            {
              "id": "copilot_post:measured_pages_28d",
              "name": "Measured live pages",
              "description": "Live article pages with fresh usable reports for the common 28-day reporting period, compared with the total number of live article pages.",
              "unit": "count"
            },
            {
              "id": "copilot_post:resources_read",
              "name": "Store resources read",
              "description": "Products, collections, blogs, articles, and pages included in the current store reading.",
              "unit": "count"
            },
            {
              "id": "copilot_post:tokens_available",
              "name": "Tokens available",
              "description": "The selected store’s available Tokens balance for paid generation actions.",
              "unit": "Tokens"
            },
            {
              "id": "copilot_post:tokens_per_draft",
              "name": "Tokens per draft",
              "description": "The current quoted Tokens price for generating a draft.",
              "unit": "Tokens"
            },
            {
              "id": "copilot_post:drafts_for_review",
              "name": "Drafts for review",
              "description": "Draft posts currently waiting for review in the next-actions summary.",
              "unit": "count"
            },
            {
              "id": "copilot_post:pending_topics",
              "name": "New topics",
              "description": "Discovered topics waiting for an accept or dismiss decision.",
              "unit": "count"
            },
            {
              "id": "copilot_post:refresh_suggestions",
              "name": "Refresh suggestions",
              "description": "Live posts with an actionable refresh suggestion based on imported reports showing a qualifying fall in clicks.",
              "unit": "count"
            },
            {
              "id": "copilot_post:unconfirmed_publications",
              "name": "Publications needing confirmation",
              "description": "Posts whose Shopify publication outcome must be checked before editing or publishing can continue.",
              "unit": "count"
            }
          ],
          "aliases": ["/{accountSlug}/apps/copilot-post/overview"]
        },
        {
          "id": "posts",
          "path": "/{accountSlug}/apps/copilot-post/posts",
          "name": "Posts",
          "description": "Find and manage article briefs, drafts, scheduled posts, live posts, and archived content.",
          "access": "authenticated",
          "features": [
            {
              "id": "post-library",
              "name": "Post library",
              "description": "Filter by publication state or format and search post titles, with publication status and update times."
            },
            {
              "id": "new-brief",
              "name": "New post brief",
              "description": "Create a brief for an article, buying guide, or comparison from your own topic and notes; generation is a separate action with a quoted Tokens cost."
            },
            {
              "id": "archive-restore",
              "name": "Archive and restore",
              "description": "Archive or restore eligible posts individually or in bulk. Archiving removes a post from the active list without deleting its Shopify article."
            },
            {
              "id": "post-details",
              "name": "Open post details",
              "description": "Open a post to write, edit, preview, schedule, publish, or inspect its history."
            }
          ],
          "metrics": [
            {
              "id": "copilot_post:posts_by_state",
              "name": "Posts by state",
              "description": "Counts for all active posts, drafts, scheduled posts, live posts, needs-attention posts, and archived posts. Counts follow the selected format, but not the text search.",
              "unit": "count"
            }
          ]
        },
        {
          "id": "post-detail",
          "path": "/{accountSlug}/apps/copilot-post/posts/{contentId}",
          "name": "Post detail",
          "description": "Write and edit a post, inspect its sources and revisions, and manage publication to Shopify.",
          "access": "authenticated",
          "features": [
            {
              "id": "draft-generation",
              "name": "Write or rewrite a draft",
              "description": "Generate a draft from the brief, saved brand voice, and available store context after reviewing its Tokens price. Generation can be cancelled while supported."
            },
            {
              "id": "article-editor",
              "name": "Article editor",
              "description": "Edit title, summary, and body with rich text or HTML, then save a new revision."
            },
            {
              "id": "saved-preview",
              "name": "Saved preview",
              "description": "Preview the saved article as prepared for Shopify and see whether unsaved edits remain."
            },
            {
              "id": "illustration",
              "name": "Featured illustration",
              "description": "Inspect the illustration attached to a generated revision and edit its alternative text where available."
            },
            {
              "id": "source-and-brief",
              "name": "Sources and brief",
              "description": "Review the brief, topic origin, and store material used to prepare the post."
            },
            {
              "id": "publish",
              "name": "Publish to Shopify",
              "description": "Choose the target Shopify blog and publish or update the saved article when store permissions and plan conditions allow it."
            },
            {
              "id": "schedule",
              "name": "Schedule publication",
              "description": "Choose a future date, time, and time zone for a saved revision; editing the post can cancel its prior scheduled approval."
            },
            {
              "id": "revision-history",
              "name": "Revision history",
              "description": "Inspect earlier revisions and publication outcomes, restore a revision to the editor, or roll back an eligible publication."
            },
            {
              "id": "publication-check",
              "name": "Check uncertain publication",
              "description": "Resolve a Shopify write whose outcome was not confirmed before making further edits or publication changes."
            },
            {
              "id": "archive-restore",
              "name": "Archive and restore",
              "description": "Archive the post or restore it to the active library without deleting the Shopify article."
            }
          ],
          "metrics": [
            {
              "id": "copilot_post:word_count",
              "name": "Word count",
              "description": "Words in the article body currently shown in the editor.",
              "unit": "words"
            },
            {
              "id": "copilot_post:tokens_per_draft",
              "name": "Tokens per draft",
              "description": "The current quoted Tokens price for generating a draft.",
              "unit": "Tokens"
            },
            {
              "id": "copilot_post:tokens_available",
              "name": "Tokens available",
              "description": "The selected store’s available Tokens balance for paid generation actions.",
              "unit": "Tokens"
            }
          ]
        },
        {
          "id": "opportunities",
          "path": "/{accountSlug}/apps/copilot-post/opportunities",
          "name": "Opportunities",
          "description": "Review topics discovered from the latest store reading and turn useful ideas into post briefs.",
          "access": "authenticated",
          "features": [
            {
              "id": "topic-discovery",
              "name": "Store-based topic discovery",
              "description": "Find article ideas about products and buying-guide ideas about collections after reading the store."
            },
            {
              "id": "topic-review",
              "name": "Topic review",
              "description": "Inspect the reason for each topic, its proposed outline, source content, and editorial readiness."
            },
            {
              "id": "topic-filters",
              "name": "Topic filters",
              "description": "Browse new, accepted, or dismissed topics; filter by format and sort by readiness or discovery order."
            },
            {
              "id": "accept-dismiss",
              "name": "Accept or dismiss topics",
              "description": "Create briefs from eligible topics or dismiss topics individually or in bulk. Creating a brief is free and does not generate or publish an article."
            }
          ],
          "metrics": [
            {
              "id": "copilot_post:topics_by_state",
              "name": "Topics by state",
              "description": "Counts of discovered topics in the new, accepted, and dismissed queues.",
              "unit": "count"
            },
            {
              "id": "copilot_post:topic_readiness",
              "name": "Topic readiness",
              "description": "An editorial band describing how much source material a topic has: plenty, enough, or thin. It is not a search-volume or ranking estimate."
            },
            {
              "id": "copilot_post:resources_read",
              "name": "Store resources read",
              "description": "Products, collections, blogs, articles, and pages included in the current store reading.",
              "unit": "count"
            }
          ]
        },
        {
          "id": "calendar",
          "path": "/{accountSlug}/apps/copilot-post/calendar",
          "name": "Calendar",
          "description": "Plan publication dates and review scheduled or completed posts in a month or agenda view.",
          "access": "authenticated",
          "features": [
            {
              "id": "calendar-views",
              "name": "Month and agenda views",
              "description": "Browse dated publication entries by month or day and choose the time zone used for display."
            },
            {
              "id": "schedule-ready-posts",
              "name": "Schedule ready posts",
              "description": "Choose an eligible saved post from the ready list and place it on the publishing calendar."
            },
            {
              "id": "reschedule-unschedule",
              "name": "Reschedule or unschedule",
              "description": "Move an eligible publication to another time or remove its schedule so the post remains a draft."
            },
            {
              "id": "schedule-conflicts",
              "name": "Schedule conflict notices",
              "description": "Identify posts scheduled for the same minute and review entries needing attention."
            }
          ],
          "metrics": [
            {
              "id": "copilot_post:dated_posts",
              "name": "Dated posts",
              "description": "Publication entries associated with the selected day or displayed month, with scheduled and past-publication counts where shown.",
              "unit": "count"
            }
          ]
        },
        {
          "id": "insights",
          "path": "/{accountSlug}/apps/copilot-post/insights",
          "name": "Insights",
          "description": "Compare imported Google Search Console figures for live posts and review suggestions to refresh declining articles.",
          "access": "authenticated",
          "features": [
            {
              "id": "import-search-figures",
              "name": "Import Search Console figures",
              "description": "Enter a post’s page URL, reporting end date, and clicks and impressions for two adjacent 28-day periods after publication. Confirm the page and final page totals; figures are not fetched or checked against Google."
            },
            {
              "id": "measurement-readiness",
              "name": "Measurement readiness",
              "description": "See which posts have figures, which can accept them, and when new posts have enough time since publication for two full 28-day periods."
            },
            {
              "id": "post-comparison",
              "name": "Post performance comparison",
              "description": "Compare each post’s current and previous clicks on a shared chart scale, inspect impressions and percentage changes, and sort by clicks or change."
            },
            {
              "id": "report-history",
              "name": "Imported report history",
              "description": "Inspect earlier reports and their periods, including reports about earlier publications; new imports preserve the previous figures."
            },
            {
              "id": "refresh-suggestions",
              "name": "Refresh suggestions",
              "description": "Review suggestions when imported clicks fell by at least 30% from at least 10 clicks, with at least 100 impressions in both periods. Accept to create a refresh brief or dismiss that report’s suggestion."
            }
          ],
          "metrics": [
            {
              "id": "copilot_post:latest_imported_clicks",
              "name": "Clicks from latest imported figures",
              "description": "Sum of the current-period clicks from each measured live post’s latest imported report. Each period is 28 days, but periods may end on different dates and can be stale; this is not a complete store traffic total.",
              "unit": "count"
            },
            {
              "id": "copilot_post:latest_imported_clicks_change",
              "name": "Change across latest imported figures",
              "description": "Percentage change between summed current and previous clicks across those latest post reports; the posts’ reporting periods may differ.",
              "unit": "percent"
            },
            {
              "id": "copilot_post:measured_posts",
              "name": "Measured posts",
              "description": "Live posts with a report about their current publication, shown against the total number of live posts; a report can be marked stale.",
              "unit": "count"
            },
            {
              "id": "copilot_post:posts_by_measurement_readiness",
              "name": "Posts by measurement readiness",
              "description": "Counts of all live posts, measured posts, posts ready for figures, and posts still waiting to become measurable.",
              "unit": "count"
            },
            {
              "id": "copilot_post:post_clicks_28d",
              "name": "Post clicks",
              "description": "Merchant-entered Google Search Console page clicks for a post in two adjacent 28-day periods after its latest publication. Figures are not fetched or independently verified.",
              "unit": "count"
            },
            {
              "id": "copilot_post:post_impressions_28d",
              "name": "Post impressions",
              "description": "Merchant-entered Google Search Console page impressions for a post in the same two adjacent 28-day periods. Figures are not fetched or independently verified.",
              "unit": "count"
            },
            {
              "id": "copilot_post:post_clicks_change",
              "name": "Post click change",
              "description": "Percentage change in a post’s imported clicks between the previous and current 28-day periods; shown as new when the previous count is zero.",
              "unit": "percent"
            },
            {
              "id": "copilot_post:post_impressions_change",
              "name": "Post impression change",
              "description": "Percentage change in a post’s imported impressions between the previous and current 28-day periods; shown as new when the previous count is zero.",
              "unit": "percent"
            },
            {
              "id": "copilot_post:refresh_suggestions",
              "name": "Refresh suggestions",
              "description": "Live posts with an actionable refresh suggestion based on imported reports showing a qualifying fall in clicks.",
              "unit": "count"
            }
          ]
        },
        {
          "id": "settings",
          "path": "/{accountSlug}/apps/copilot-post/settings",
          "name": "Settings",
          "description": "Set the brand voice, publishing destination, and personal email preferences.",
          "access": "authenticated",
          "features": [
            {
              "id": "brand-voice",
              "name": "Brand voice",
              "description": "Set brand name, writing language, products sold, intended audience, and tone used for generated drafts."
            },
            {
              "id": "default-blog",
              "name": "Default blog",
              "description": "Choose a Shopify blog from the latest store reading as the default publication destination; an individual post can use another blog."
            },
            {
              "id": "automation-summary",
              "name": "Automation summary",
              "description": "Review the current automation state and open its schedule settings."
            },
            {
              "id": "email-preferences",
              "name": "Email preferences",
              "description": "Choose personal emails about publishing outcomes, refresh suggestions, and automation runs; delivery also depends on email availability."
            }
          ],
          "metrics": []
        },
        {
          "id": "automation",
          "path": "/{accountSlug}/apps/copilot-post/settings/automation",
          "name": "Automation",
          "description": "Schedule draft generation and optional publishing after a review window, when automation and the required plan features are available.",
          "access": "authenticated",
          "features": [
            {
              "id": "writing-schedule",
              "name": "Writing schedule",
              "description": "Choose weekdays, time, time zone, and drafts per run. Topics with stronger source material are selected before weaker ones; thin, dismissed, and manually written briefs are excluded."
            },
            {
              "id": "automatic-publishing",
              "name": "Automatic publishing",
              "description": "Optionally publish generated drafts to the default blog after the selected review window and at the chosen time. Editing or unscheduling a post keeps it as a draft."
            },
            {
              "id": "automation-controls",
              "name": "Automation controls",
              "description": "Enable or turn off automation, review reasons for an automatic pause, and resume when setup, permissions, plan, and Tokens allow it."
            },
            {
              "id": "automation-history",
              "name": "Automation history",
              "description": "Review the next writing or publishing time and recent run outcomes, with access to detailed activity logs."
            },
            {
              "id": "cost-preview",
              "name": "Cost preview",
              "description": "See the current per-draft Tokens price, maximum weekly cost, and how long the available balance could cover the configured schedule."
            }
          ],
          "metrics": [
            {
              "id": "copilot_post:tokens_per_draft",
              "name": "Tokens per draft",
              "description": "The current quoted Tokens price for generating a draft.",
              "unit": "Tokens"
            },
            {
              "id": "copilot_post:tokens_available",
              "name": "Tokens available",
              "description": "The selected store’s available Tokens balance for paid generation actions.",
              "unit": "Tokens"
            },
            {
              "id": "copilot_post:maximum_weekly_tokens",
              "name": "Maximum weekly Tokens",
              "description": "Current draft price multiplied by drafts per run and selected weekdays; this is a planning maximum, not a recorded charge.",
              "unit": "Tokens"
            },
            {
              "id": "copilot_post:balance_weeks",
              "name": "Estimated weeks covered",
              "description": "Whole weeks of the configured maximum weekly Tokens cost covered by the current available balance.",
              "unit": "weeks"
            },
            {
              "id": "copilot_post:automation_drafts_written",
              "name": "Drafts written",
              "description": "Drafts completed in an individual automation run; the This week summary compares written and planned drafts across available runs started in the last seven days.",
              "unit": "count"
            },
            {
              "id": "copilot_post:automation_drafts_planned",
              "name": "Drafts planned",
              "description": "Drafts planned in the recent automation runs included in the last-seven-days summary.",
              "unit": "count"
            }
          ]
        },
        {
          "id": "logs",
          "path": "/{accountSlug}/apps/copilot-post/logs",
          "name": "Logs",
          "description": "Inspect store readings, draft writing, publication, scheduling, and email activity for the selected store.",
          "access": "authenticated",
          "features": [
            {
              "id": "activity-filters",
              "name": "Activity filters",
              "description": "Filter recorded activity by kind, post, and time range, including events that need attention."
            },
            {
              "id": "activity-details",
              "name": "Activity details",
              "description": "Expand an event for its outcome, start and completion times, duration, writing attempts, or relevant next action."
            },
            {
              "id": "token-accounting",
              "name": "Writing charges",
              "description": "See whether Tokens for an attempted draft were held, charged after delivery, or returned when no draft was saved."
            },
            {
              "id": "reading-breakdown",
              "name": "Store-reading breakdown",
              "description": "Inspect how many products, collections, blogs, articles, and pages were read in a store-reading event."
            }
          ],
          "metrics": [
            {
              "id": "copilot_post:activity_counts",
              "name": "Activity counts",
              "description": "Counts of events by activity category or needs-attention state within the loaded activity results and selected filters.",
              "unit": "count"
            },
            {
              "id": "copilot_post:activity_duration",
              "name": "Activity duration",
              "description": "Elapsed time for a started activity; pending activities have no execution duration yet.",
              "unit": "duration"
            },
            {
              "id": "copilot_post:draft_tokens_charged",
              "name": "Tokens charged",
              "description": "Tokens consumed for a draft that was successfully saved.",
              "unit": "Tokens"
            },
            {
              "id": "copilot_post:draft_tokens_held",
              "name": "Tokens held or returned",
              "description": "Tokens reserved while generation runs, or released back to the available balance when the draft is not charged.",
              "unit": "Tokens"
            },
            {
              "id": "copilot_post:resources_read_by_type",
              "name": "Resources read by type",
              "description": "Counts from an individual store-reading event, grouped into products, collections, blogs, articles, and pages where available.",
              "unit": "count"
            }
          ]
        },
        {
          "id": "forms-modal",
          "path": "/modal/copilot-post",
          "name": "CopilotPost forms",
          "description": "Shopify Admin presentation of CopilotPost forms. The owning page supplies the selected form and its context.",
          "access": "authenticated",
          "features": [
            {
              "id": "post-forms",
              "name": "Post actions",
              "description": "Create or generate a post, request revisions, preview illustrations, publish or schedule content, enter search figures, and confirm publishing automation through the appropriate form."
            }
          ],
          "metrics": []
        }
      ]
    }
  ]
}
