/** * AUTO-GENERATED — do not edit by hand. * Source: src/resources/marketing-skill.md (the single source, authored by marketing). * Regenerate: `npm run gen-marketing-guide` (runs automatically on `prebuild`). * * The marketing playbook exposed as an MCP resource + the backing CONTENT for the * `get_marketing_playbook` tool. See PRD docs/prd/implemented/mcp-marketing-skill.md. */ export declare const MARKETING_GUIDE_URI = "sealmetrics://marketing-guide"; export declare const MARKETING_GUIDE_NAME = "SealMetrics Marketing Playbook"; export declare const MARKETING_GUIDE_DESCRIPTION = "Diagnose marketing performance for a SealMetrics site and explain *why* the numbers move. Generalist marketing analysis (acquisition, channels, landing pages, conversions, traffic quality) with strong bias toward causal explanation and concrete next actions for Founders, CEOs and CMOs."; export declare const MARKETING_GUIDE_CONTENT = "# Marketing Performance Skill (SealMetrics)\n\n## Purpose\n\nHelp the user understand **how their marketing is performing and \u2014 more importantly \u2014 *why***, using real data from their SealMetrics account.\n\nThe skill is a playbook. Claude follows the steps in order, calls the listed SealMetrics MCP tools to fetch real numbers, interprets them with the decision logic in this document, and produces a structured markdown report with charts and a prioritized action plan.\n\nThis skill is built for **Founders, CEOs and CMOs** \u2014 not agencies. Optimize for:\n\n- Clarity over completeness.\n- \"What do I do on Monday morning?\" over \"here is every chart.\"\n- Causal explanation over data dumps. Every section ends in a recommendation.\n\nThe default scope is **generalist marketing**, with secondary depth in **paid / CRO** and tertiary depth in **SEO**. If the user asks for one of those focuses, weight the analysis accordingly but still surface critical findings from the other areas.\n\n## When to use it\n\nUse this skill when the user asks any of:\n\n- \"How is my marketing performing?\"\n- \"Why are sales / leads / conversions down (or up) this month?\"\n- \"What channels are working? Which are wasting budget?\"\n- \"What should I do next?\" / \"Where should I invest more?\"\n- \"Give me a marketing report for last month / quarter.\"\n- \"Compare this period to the previous one.\"\n- Open-ended SealMetrics questions where the user has not specified a tool.\n\nDo **not** use this skill for: pixel installation help, billing questions, account setup, or pure technical SEO audits (broken links, robots.txt, etc.). SealMetrics measures behavior, not crawl health.\n\n## Output contract\n\nEvery run produces a single **structured markdown report** in the user's language (Spanish, English, or whatever the user wrote in). The skill itself is in English; the report is not.\n\nThe report must include:\n\n1. **TL;DR** \u2014 3-5 bullet headlines. What's working, what's broken, what to do.\n2. **Period & comparison** \u2014 explicit dates resolved in the account timezone, plus the comparison baseline used.\n3. **Macro snapshot** \u2014 sessions, conversions, conversion rate, vs. prior period and vs. YoY (if available), with a small trend table.\n4. **Acquisition** \u2014 channels \u2192 sources \u2192 campaigns, each with a chart and a \"why\" interpretation.\n5. **Landing pages & content** \u2014 top performers, underperformers, content group performance.\n6. **Conversions & microconversions** \u2014 funnel reading.\n7. **Audience** \u2014 country / device / browser only when it explains something.\n8. **Traffic quality (beta)** \u2014 bot/agent share, suspicious sessions, with the beta caveat.\n9. **Segments & custom properties** \u2014 only if configured (see Step 7).\n10. **Why this period looks like this** \u2014 explicit causal narrative tying the sections together.\n11. **Action plan** \u2014 3-7 prioritized actions, scored by impact \u00D7 effort, with what to measure.\n\nUse markdown tables and inline ASCII bar charts (see Chart conventions). No images, no external links, no PII.\n\n## Pre-flight\n\n### Step 0 \u2014 Site selection and period resolution\n\n**What to do**\n\n1. Call `list_sites` to get the user's sites. Do **not** assume a `site_id`.\n2. If exactly one site is returned, use it and tell the user which one you picked.\n3. If multiple sites are returned, list them by name + url and ask the user to pick.\n4. Once a `site_id` is chosen, call `get_site` to capture timezone, currency, and any flags (e.g. agent analytics enabled).\n5. Resolve the analysis period:\n - Default: **`30d`** (last 30 days) in the account timezone.\n - Always request two comparison baselines when data exists, via the `compare` parameter **on the tools that support it** (see the list below):\n - **Prior period** of equal length \u2192 `compare: \"previous\"`.\n - **Year-over-year** (same window, one year earlier) \u2192 `compare: \"yoy\"`.\n - State the resolved date ranges explicitly in the report header.\n\n**How to interpret / decide**\n\n- Never resolve `period` with the server clock. SealMetrics resolves date ranges in the account timezone \u2014 pass one of the **valid preset strings** and let the backend resolve them. Valid values: `today`, `yesterday`, `7d`, `30d`, `90d`, `12m`, `this_week`, `wtd`, `last_week`, `this_month`, `mtd`, `last_month`, `this_quarter`, `qtd`, `last_quarter`, `this_year`, `ytd`, `last_year`. There is **no** `last_30_days`/`last_7_days` form \u2014 use `30d`/`7d`.\n- Get comparisons from the tool itself with `compare: \"previous\"` or `compare: \"yoy\"` rather than calling it twice. **`compare` is supported only on**: `get_overview`, `get_traffic_sources`, `get_traffic_mediums`, `get_campaigns`, `get_terms`, `get_pages`, `get_landing_pages`, `get_conversions`, `get_microconversions`, `get_countries`, `get_devices`. It is **not** supported on `get_channels`/`get_top_channels`, the `get_top_*` ranked variants, the `*_raw` tools, or the `list_*` tools. When you need a prior-period comparison from a tool that lacks `compare` (notably channel mix in Step 2a), call it twice with a **calendar-pair preset** \u2014 `this_month` vs `last_month`, or `this_quarter` vs `last_quarter` \u2014 since `30d` has no matching prior-window preset. Passing `compare` to a tool that ignores it returns single-period data silently, so don't rely on it there.\n- If the site has < 14 days of data, skip YoY and warn the user that comparisons are noisy.\n- If currency is set, format monetary figures with that currency throughout the report.\n\n**Tools**: `list_sites`, `get_site`.\n\n## Attribution model declaration\n\nBefore any channel or campaign reading, the report must include this disclaimer **once**, in the user's language:\n\n> SealMetrics uses **last non-direct click, consentless attribution** measured server-side. Numbers will *not* match GA4 (which uses data-driven attribution and depends on consent) or ad platform dashboards (which use platform-side click/view attribution). When the user compares numbers across tools, this is the most common reason they differ.\n\nThis single sentence prevents 80% of \"but my Google Ads dashboard says...\" follow-ups.\n\n## Steps\n\nRun the steps in order. Skip a step only if its data is empty or not configured (the skill explicitly says when this is OK).\n\n---\n\n### Step 1 \u2014 Macro snapshot\n\n**Goal**: establish the headline numbers and direction of travel.\n\n**Tool**: `get_overview` with `compare: \"previous\"` and, when \u2265 1 year of data exists, a second call with `compare: \"yoy\"`. One call per baseline \u2014 not three manual period calls.\n\n**Extract** (note the field names \u2014 SealMetrics calls a session an **`entrance`**; there is no `sessions` field):\n\n- Sessions \u2192 field `entrances`\n- Pageviews \u2192 field `page_views`\n- Conversions (count and value if available)\n- Conversion rate (conversions / `entrances`)\n- Bounce rate \u2192 field `bounce_rate` (already computed; do not recompute)\n- Engagement \u2014 **derived**, not a returned field: `engaged_entrances / entrances` (engagement-rate is not in the response; bounce is the canonical engagement signal in SealMetrics)\n- Revenue if e-commerce\n\nIn the report you may still write \"sessions\" (user-facing wording), but when reading tool output map it to `entrances` / `engaged_entrances`.\n\n**Render** as a comparison table:\n\n```\nMetric | Current | Prior | \u0394 | YoY | \u0394 YoY | Trend\n------------------|-----------|-----------|---------|----------|---------|------\nSessions | 12,430 | 10,820 | +14.9% | 9,950 | +24.9% | \u2191\nConversions | 262 | 265 | -1.1% | 210 | +24.8% | \u2192\nConversion rate | 2.11% | 2.45% | -13.9% | 2.11% | 0.0% | \u2193\nRevenue | \u20AC18,340 | \u20AC19,210 | -4.5% | \u20AC14,200 | +29.2% | \u2192\nBounce rate | 52.4% | 48.1% | +8.9% | 55.0% | -4.7% | \u2193\n```\n\n(Use real numbers from the tool result \u2014 the table above is a layout example.)\n\n**How to read**:\n\n- **Same direction, both baselines** (e.g. down vs. prior and down vs. YoY) \u2192 systemic issue, prioritize investigation.\n- **Diverges** (e.g. up YoY but down vs. prior period) \u2192 recent regression. Look for what changed in the last 30 days: campaigns paused, landing changes, seasonality, ad fatigue.\n- **Volume up, conversions flat** \u2192 quality of traffic dropped. Continue to Step 6 (traffic quality) and Step 2 (channel mix).\n- **Volume flat, conversion rate dropped** \u2192 something broke on-site (landing, funnel, checkout). Prioritize Step 3 and Step 4.\n- **Volume up, conversion rate up, revenue flat** \u2192 AOV or product mix shifted. Look at conversion-level breakdown in Step 4.\n\nEnd Step 1 with a one-sentence narrative: *\"Traffic grew but converted worse \u2014 investigation focuses on traffic quality and landing experience.\"*\n\n---\n\n### Step 2 \u2014 Acquisition diagnosis (channels \u2192 sources \u2192 campaigns \u2192 terms)\n\n**Goal**: identify which acquisition lanes are driving the macro pattern from Step 1.\n\nRun **top-down**. Don't jump to campaign-level until you know which channel changed.\n\n**Sub-step 2a \u2014 Channel mix**\n\nTool: `get_channels` (full list) and `get_top_channels` (ranked). Neither accepts `compare` \u2014 to read channel mix vs. the prior period, call `get_channels` twice with a calendar-pair preset (`this_month` vs `last_month`, or `this_quarter` vs `last_quarter`) and diff the results yourself.\n\nRender a stacked-share table with a bar chart:\n\n```\nChannel | Sessions | Share | Conv. | Conv. rate | Bar\n---------------|----------|--------|-------|-----------|----------------------\nOrganic Search | 5,210 | 41.9% | 142 | 2.7% | \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2591\nDirect | 3,100 | 24.9% | 66 | 2.1% | \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\nPaid Search | 1,820 | 14.6% | 24 | 1.3% | \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\nReferral | 1,150 | 9.2% | 18 | 1.6% | \u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\nSocial | 720 | 5.8% | 8 | 1.1% | \u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\nEmail | 430 | 3.5% | 4 | 0.9% | \u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n```\n\nAlways show **both volume and conversion rate per channel**. A channel can be the largest source of sessions and the worst converter \u2014 that's a finding.\n\n**How to read**:\n\n- Compare current channel mix vs. prior period. The biggest absolute mover is the prime suspect for the macro change.\n- A channel whose conversion rate dropped while its volume stayed flat is a **quality** problem (creative, audience, landing match).\n- A channel whose volume dropped is a **distribution** problem (algorithm change, budget cut, seasonality).\n- Direct is a residual bucket. A sudden spike in direct often means **broken UTM tagging on a paid campaign** \u2014 investigate Step 2c before celebrating.\n\n**Sub-step 2b \u2014 Sources & mediums**\n\nTools: `get_traffic_sources`, `get_top_sources`, `get_traffic_mediums`, `get_top_referrers`.\n\nFor the channels that moved most in 2a, drill into source/medium. Look for:\n\n- New referrers that didn't exist last period (PR hit? viral content?).\n- Source quality drift (e.g. `google / organic` sessions up but its conversion rate down \u2192 query intent shifted, possibly AI Overviews stealing high-intent clicks).\n- Referrer concentration: is one referrer carrying the channel? That's fragile.\n\n**Sub-step 2c \u2014 Campaigns**\n\nTools: `get_campaigns`, `get_top_campaigns`.\n\nFor paid users, this is the most actionable section. Render a table with **spend signals only via conversion data** (SealMetrics does not ingest ad spend by default):\n\n```\nCampaign | Sessions | Conv. | Conv. rate | Rev. | Note\n--------------------|----------|-------|-----------|----------|----------------\nbrand_search_es | 1,210 | 62 | 5.1% | \u20AC7,200 | Top performer\ngeneric_search_es | 1,840 | 18 | 1.0% | \u20AC1,950 | Underperformer\ndisplay_retargeting | 2,100 | 12 | 0.6% | \u20AC1,100 | Watch\nyoutube_awareness | 910 | 2 | 0.2% | \u20AC180 | Reconsider\n```\n\n**How to read**:\n\n- A brand campaign converting at 5%+ while generic search converts at <1% is normal \u2014 but if generic search is *most of the spend*, it's likely cannibalizing brand or buying low-intent clicks.\n- A retargeting campaign with worse conversion rate than cold traffic = audience exhaustion or creative fatigue.\n- An awareness campaign should be judged by its **assisted** effect (lift in direct + organic-brand in the following weeks), not its direct conversion rate. SealMetrics is last non-direct click \u2014 flag this caveat to the user before they kill an awareness campaign on a single-touch reading.\n\n**Sub-step 2d \u2014 Search terms (organic + paid)**\n\nTool: `get_terms`.\n\nOnly call if Step 2a or 2b suggested a search-channel change. Look for:\n\n- Top converting terms that lost share \u2192 ranking drop or platform-side bidding change.\n- Long-tail growth \u2192 topical authority building (SEO win) or query expansion (paid).\n- High-impression / zero-conversion terms (paid only) \u2192 negative keyword candidates.\n\n**End-of-step narrative**: tie 2a\u20132d together. *\"The conversion rate drop in Step 1 is concentrated in `google / cpc` \u2014 specifically the `generic_search_es` campaign \u2014 which doubled its traffic share but its converting terms have not changed. Hypothesis: broader match types are pulling lower-intent queries.\"*\n\n---\n\n### Step 3 \u2014 Landing pages & content\n\n**Goal**: separate **what the user lands on** from **what they browse**. Marketing performance lives in the landing experience.\n\n**Tools**: `get_landing_pages`, `get_top_landing_pages`, `get_landing_pages_by_content_group`, `get_pages`.\n\n**Render** two tables:\n\n**Top landing pages by entrances:**\n\n```\nLanding page | Entrances | Bounce | Conv. rate | \u0394 Conv. rate vs. prior\n-------------------------|-----------|--------|-----------|-----------------------\n/ | 3,820 | 48.2% | 1.9% | -22% \u2193\n/pricing | 1,420 | 41.0% | 4.8% | +5% \u2192\n/blog/seo-attribution | 980 | 72.1% | 0.4% | -10% \u2193\n/integrations/shopify | 640 | 35.5% | 6.1% | new\n```\n\n**How to read**:\n\n- A landing page with **high entrances + high bounce + low conversion** is the biggest leak. If its conversion rate also dropped vs. prior, it's the prime suspect for the macro change in Step 1.\n- A blog post landing with a low conversion rate is **expected** (informational intent). Don't recommend \"improve conversion\" on blog landings unless the user has a clear blog\u2192signup goal. Suggest internal linking or content upgrades instead.\n- A **new** landing page in the top 10 means something changed in routing or a campaign points there \u2014 verify intent match.\n- A landing page whose conversion rate dropped while traffic to it stayed flat \u2192 page or funnel regression (test a fix). One whose conversion rate held but traffic dropped \u2192 upstream channel issue (loop back to Step 2).\n\n**Content groups** (`get_landing_pages_by_content_group`):\n\nIf the site has content groups configured, render share-of-entrances by group:\n\n```\nContent group | Entrances | Share | Conv. rate\n----------------|-----------|-------|----------\nproduct | 4,210 | 33.8% | 4.2%\npricing | 1,420 | 11.4% | 4.8%\nblog | 3,650 | 29.3% | 0.5%\nhome | 2,150 | 17.3% | 1.9%\nother | 900 | 7.2% | 1.1%\n```\n\nThis often reveals strategic mismatches: \"60% of acquisition is into the blog but the blog converts at 0.5% \u2014 content is bringing the wrong audience, or the conversion path from blog is broken.\"\n\nIf content groups are not configured, skip this sub-step and note it as a setup opportunity in the action plan.\n\n---\n\n### Step 4 \u2014 Conversions & microconversions\n\n**Goal**: explain *what* converted and *which steps* are leaking.\n\n**Tools**: `get_conversions`, `list_microconversion_types`, `get_microconversions`. Use `get_conversions_raw` and `get_microconversions_raw` only when the user asks for an audit-level breakdown \u2014 they are heavier and **constrained**: they take `start_date`/`end_date` (not `period`), the range is **capped at 31 days**, and they return **\u2264 100 rows**. Never use them for the 30d+ macro windows \u2014 use the aggregated tools for those.\n\n**Read conversions**:\n\n- Total conversion count and value vs. prior period and YoY.\n- Top converting pages (where conversions complete).\n- Conversion mix: if multiple conversion types exist (purchase, signup, demo), is the mix shifting?\n\nA drop in conversion *count* with stable revenue \u2192 fewer but higher-value buyers. A drop in *value* with stable count \u2192 discount-heavy mix or AOV erosion.\n\n**Microconversions as the explanatory layer**:\n\nMicroconversions are **support signals**, not goals. Their job in this skill is to explain *why* a month is better or worse than another.\n\n1. Call `list_microconversion_types` to discover what is configured (e.g. `add_to_cart`, `scroll_75`, `video_play`, `pricing_view`, `cta_click`).\n2. Call `get_microconversions` for the current and prior period.\n3. Render the funnel as a step-down chart:\n\n```\nStep | Sessions | % of prev | Bar\n----------------------|----------|-----------|---------------------\nSessions | 12,430 | 100.0% | \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\npricing_view | 3,610 | 29.0% | \u2588\u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\ncta_click_demo | 820 | 22.7% | \u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\ndemo_form_view | 540 | 65.9% | \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2591\u2591\ndemo_conversion | 262 | 48.5% | \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n```\n\n**How to read**:\n\n- The step with the **largest drop in step-over-step retention vs. prior period** is the explanation for the macro change. Examples:\n - `pricing_view \u2192 cta_click_demo` retention dropped from 30% to 22% \u2192 the pricing page or its CTA changed, or visitors are arriving with lower intent.\n - `demo_form_view \u2192 demo_conversion` dropped from 60% to 48% \u2192 form friction, validation errors, or trust signal lost.\n- If macro conversions dropped but **no funnel step regressed**, the cause is upstream: it's a traffic-mix issue (Step 2) or a channel-level intent drop, not a site issue.\n- If no microconversions are configured, **say so explicitly** and add to the action plan: \"Configure microconversions (`pricing_view`, `cta_click_*`, `form_view`) so that next month's report can attribute *why* the funnel moved.\"\n\n---\n\n### Step 5 \u2014 Audience\n\n**Goal**: surface audience mix only when it **explains** a macro change. Don't dump demographics for the sake of it.\n\n**Tools**: `get_countries`, `get_devices`, `get_device_types`, `get_browsers`.\n\n**Heuristics for when to include each in the report**:\n\n- **Country mix**: include if the top-5 country share moved by > 5 percentage points vs. prior, or if a campaign targeted a new geo. Compare country-level conversion rates \u2014 entering a new geo with no localized landing tends to spike sessions and tank conversion rate.\n- **Device type** (mobile vs. desktop vs. tablet): include if device mix moved or if conversion rate gap between devices widened. A widening gap is usually a **mobile UX regression** or a campaign pushing mobile-heavy placements.\n- **Browser**: include only if there is an anomaly (e.g. Safari conversion rate collapsed \u2192 ITP / cookie regression; specific browser version concentrated in bounced sessions \u2192 rendering bug).\n\n**Important**: the `country` field in SealMetrics is currently derived from **browser timezone**, not IP geolocation. Treat country splits as directional, not precise. Do not use country data to make claims about VAT, legal jurisdiction, or compliance.\n\n---\n\n### Step 6 \u2014 Traffic quality (beta)\n\n**Goal**: estimate what share of the measured traffic is bots, scrapers, or AI agents \u2014 because that directly distorts every metric above.\n\n**Tools**: `get_bot_stats`, `get_suspicious_sessions`.\n\n**Always include this disclaimer in the report (in the user's language)**:\n\n> Traffic quality and agentic-traffic detection are currently in **beta** in SealMetrics. The numbers in this section are useful as directional signals, not as accounting truth. We are actively improving classification accuracy.\n\n**Read**:\n\n- **Bot share**: % of sessions classified as bots or suspicious. If this share moved meaningfully vs. prior (\u2265 3 percentage points either way), it is a candidate explanation for macro shifts.\n- A **rising** bot share inflates session counts and *deflates* conversion rate \u2014 if Step 1 showed sessions up but conversion rate down, check this first.\n- A **falling** bot share (e.g. because classification improved) can artificially make conversion rate look better. Note this and avoid celebrating a fake win.\n- Suspicious-session patterns (`get_suspicious_sessions`) \u2014 if a single referrer or country dominates the suspicious list, surface it. This is also where scraper / agent traffic from LLM browsers tends to show up.\n\nHandle the two non-data cases distinctly \u2014 `get_bot_stats` does **not** return a literal \"not enabled\" status:\n\n- **Empty result** (`total_hits: 0`, zero-filled distribution): there is no bot data for the period \u2014 usually because agent analytics is not enabled on the site. Do **not** present the zeros as a real 0% bot share. Skip the section and tell the user once: *\"No traffic-quality data for this period \u2014 agent analytics may not be enabled on this site. You can enable it in your account settings; it is the most reliable way to know whether a conversion-rate change is real or noise.\"*\n- **403 / \"Access denied to this account\"**: a permissions problem, not a data problem. Say so plainly and move on; do not retry.\n\n---\n\n### Step 7 \u2014 Custom segments & properties (optional)\n\n**Goal**: use custom dimensions the user has already configured to add depth. This step assumes setup exists \u2014 if it doesn't, skip and invite setup.\n\n**Tools**: `list_segments`, `get_segment`, `list_property_keys`, `get_property_values`, `get_property_breakdown`.\n\n**Flow**:\n\n1. Call `list_segments`. If empty \u2192 skip and note in the action plan: *\"No segments configured. Set up at least one segment for your highest-value audience (e.g. 'logged-in users', 'returning visitors') \u2014 it makes monthly reads 10\u00D7 more diagnostic.\"*\n2. If segments exist, for each high-priority segment call `get_segment` and report its size, share of conversions, and how its metrics compare to the site average. A segment that is 8% of sessions but 35% of conversions is a goldmine \u2014 recommend dedicated landing pages and creative for it.\n3. Call `list_property_keys`. For up to 3 of the most informative keys (typical examples: `pricing_plan`, `industry`, `signup_source`), call `get_property_breakdown` to surface **counts and revenue** by property value (these tools return distribution and revenue per value, **not** a per-value conversion rate \u2014 don't promise one).\n4. If no property keys exist \u2192 invite the user to instrument key events with custom properties so future reports can answer \"which *kind* of customer is converting.\"\n\nDo **not** dump every segment and every property. Pick the ones that change the narrative.\n\n---\n\n## The \"why\" decision trees\n\nThese are the diagnostic playbooks Claude runs when the data shows a specific symptom. Always run them \u2014 they convert the report from a data dump into an explanation.\n\n### Symptom A \u2014 Conversion rate dropped (most common request)\n\nRun in this order. Stop at the first match that fully explains the magnitude.\n\n1. **Bot share rose** (Step 6). Inflated denominator. \u2192 Adjust expectations, re-baseline once classification stabilizes.\n2. **Channel mix shifted toward lower-converting channels** (Step 2a). \u2192 Even if individual channels are stable, the weighted average dropped. Action: rebalance spend or fix the diluting channel's intent.\n3. **A specific high-volume campaign** (Step 2c) lost conversion efficiency. \u2192 Audit creatives, match types, landing assignment.\n4. **A specific landing page regressed** (Step 3). \u2192 Compare against last period and against itself a year ago. Look for recent changes \u2014 copy, hero, CTA position, page speed.\n5. **A specific funnel step regressed** (Step 4). \u2192 Inspect that step's page and any release-note around its deploy date.\n6. **Audience mix shifted to lower-converting segments** (Step 5). \u2192 New geo, new device skew, new browser anomaly.\n7. **Seasonality**. \u2192 Compare YoY; if YoY conversion rate is flat and only QoQ dropped, the cause is seasonal. Action: nothing tactical, set expectations correctly.\n\n### Symptom B \u2014 Traffic up but revenue flat (or down)\n\n1. **Bot/agent share rose** (Step 6). Phantom traffic.\n2. **A new low-intent source dominates** (Step 2b). Could be a viral blog hit bringing wrong audience.\n3. **Mobile share rose** (Step 5) with mobile converting worse than desktop. \u2192 Mobile UX investment, accelerated mobile-first redesign of top landings.\n4. **AOV dropped** (Step 4). Promo-heavy mix, product mix shift, discount campaign cannibalization.\n5. **Microconversions show intent dropped** at the pricing or cart step (Step 4). \u2192 Landing quality is fine, but the offer / pricing / trust signals weakened.\n\n### Symptom C \u2014 This month worse than last (open-ended)\n\nAlways look at **microconversions** first (Step 4). They are the leading indicators of what changed. If `add_to_cart` dropped \u2192 product page or pricing perception. If `pricing_view` dropped \u2192 top-of-funnel awareness or messaging issue. If form views are flat but submissions dropped \u2192 form / friction issue.\n\nThen walk Step 1 \u2192 Step 4 in order and stop at the first significant regression. The skill should produce a narrative sentence like:\n\n> *\"The 13% drop in conversions is mostly explained by `/pricing` losing 22% of its visitors after a redesign on 2026-06-10, while channel mix and traffic quality are stable.\"*\n\n### Symptom D \u2014 Paid CAC rising\n\n1. **Conversion rate dropped for the specific paid campaign** (Step 2c) \u2192 creative fatigue or audience exhaustion. Test new angles.\n2. **Click-to-landing match deteriorated** \u2014 campaign landing-page conversion rate fell while organic conversion rate held \u2192 landing/messaging mismatch.\n3. **Bot share rose specifically in paid sources** (Step 6) \u2192 click fraud or attribution noise. Action: enable IP exclusions in the ad platform; flag to platform support.\n\n### Symptom E \u2014 Organic search dropped\n\n1. **Top converting terms lost share** (Step 2d) \u2192 ranking drop or AI Overviews intercepting high-intent queries.\n2. **Branded organic flat, generic organic dropped** \u2192 algorithm or competition; SEO investment.\n3. **Branded organic dropped** \u2192 broader brand-demand issue (PR, awareness campaigns paused, NPS).\n\n---\n\n## Threshold philosophy\n\nBe opinionated, but mostly **relative to the site's own history**.\n\n- A metric is **moving** if it changed by \u2265 10% vs. prior period *and* by more than 1 standard deviation of its recent weekly noise.\n- A metric is **stable** if it changed by < 5% \u2014 do not over-interpret.\n- A landing page or campaign needs \u2265 200 sessions in the period before any conversion-rate comparison is statistically interesting. Below that, label readings as **directional**.\n\n**Absolute red flags** (use sparingly, only at extremes):\n\n- Bounce rate > 80% on a paid landing with > 200 entrances \u2192 broken landing or wrong audience.\n- Mobile conversion rate < 30% of desktop conversion rate \u2192 likely mobile UX failure (not just behavior).\n- Bot share > 25% \u2192 measurement is compromised; surface as the top finding.\n- Paid campaign with > 500 sessions and < 0.5% conversion rate \u2192 almost always a waste, recommend pause-and-rebuild.\n\nState thresholds plainly in the report. The CMO needs to know whether a number is \"bad\" or just \"different.\"\n\n---\n\n## Chart conventions\n\nCharts are text. Use them generously \u2014 the user reads markdown.\n\n**Horizontal bar (share / comparison)**:\n\n```\nItem | Value | Bar (20 chars wide)\n--------|-------|--------------------\nA | 41.9% | \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2591\nB | 24.9% | \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n```\n\nBar length: `round(value / max_value * 20)` filled, rest as `\u2591`. Always normalize against the **max in the chart**, not 100%, so the chart is readable when the values are small.\n\n**Trend cell**: use `\u2191` (\u2265 +10%), `\u2193` (\u2264 -10%), `\u2192` (between). Never use color (won't render).\n\n**Funnel** (step-down): show absolute count per step and step-over-step retention as a percentage. Always include the % of previous step \u2014 that's the diagnostic number.\n\n**Time comparison table**: always include \u0394% column and a trend arrow. Two baselines (prior, YoY) when data permits.\n\nKeep tables narrow (\u2264 6 columns). If you need more, split into two tables.\n\n---\n\n## Recommendations framework\n\nEvery section ends with a recommendation. The final **Action plan** consolidates them and prioritizes.\n\nFor each recommended action, state:\n\n- **What** to do \u2014 concrete, not \"improve conversion.\"\n- **Why** \u2014 which finding in the report it addresses, with a number.\n- **Impact** \u2014 High / Medium / Low, based on the size of the underlying lever (e.g. a leak on a page that gets 30% of entrances = High).\n- **Effort** \u2014 Low / Medium / High in terms of time-to-ship (Low = under a day, Medium = a sprint, High = a project).\n- **Measure** \u2014 which metric in the next report will tell us whether it worked.\n\nRender as a prioritized table sorted by impact-then-effort:\n\n```\n# | Action | Why | Impact | Effort | Measure\n--|-----------------------------------------------------|---------------------------|--------|--------|------------------\n1 | Rebuild /pricing hero: clarify offer + add trust | -22% conv. on top landing | High | Medium | Pricing landing conv. rate\n2 | Pause `generic_search_es` broad match groups | 1.0% conv. vs 5.1% brand | High | Low | Paid conv. rate (overall)\n3 | Add microconversion `pricing_cta_click` | Unblocks next month's why | Medium | Low | New event in next report\n4 | Configure mobile-first landing variant for /home | Mobile -45% vs desktop | High | High | Mobile conv. rate\n5 | Add content group `comparison` and segment it | Bottom-of-funnel intent | Medium | Low | Conv. rate of group\n```\n\nCap at 7 actions. More than that and the CMO does none of them.\n\n---\n\n## What NOT to do\n\n- **No PII, ever.** Never ask for, surface, or print emails, names, user IDs, order IDs, phone numbers, full IP addresses, or any field that could identify an individual. SealMetrics is consentless analytics \u2014 the whole architecture depends on no PII. If a tool returns a field that looks identifying, omit it.\n- **Do not invent data.** Every number must come from a tool result in this session. If a tool returns empty or errors, say so. Never fill gaps with plausible figures.\n- **Do not resolve dates in UTC or with the server clock.** Pass a valid `period` preset (`30d`, `7d`, `last_month`, `this_year`, \u2026) and let SealMetrics resolve it in the account timezone. Do **not** invent forms like `last_30_days`.\n- **Do not compare SealMetrics numbers head-to-head with GA4 or ad platforms.** Different attribution models, different consent assumptions. State this when the user mentions another tool.\n- **Do not dump every breakdown.** The CMO does not want 14 tables. Show only the breakdowns that explain the macro change or recommend an action.\n- **Do not recommend killing an awareness or top-of-funnel campaign on direct-conversion data alone.** Note the last non-direct-click attribution caveat and suggest a multi-week assisted-effect read.\n- **Do not declare causation from one period of data.** Use language like \"the most likely explanation,\" \"consistent with,\" \"candidate causes.\" Reserve \"caused\" for cases where the user already confirmed the timeline (e.g. \"we paused the campaign on the 10th\").\n- **Do not skip the bot/agent section even when it's beta.** Surface it with the disclaimer. Ignoring traffic quality is how marketers fool themselves.\n- **Do not assume segments or custom properties exist.** Probe with `list_segments` / `list_property_keys`. If empty, invite setup \u2014 don't fabricate.\n- **Do not call `*_raw` tools by default.** They return higher-cardinality data; use them only when the user asks for an audit or when a small-N section needs validation.\n- **Do not call `get_terms` or `get_landing_pages_by_content_group` first.** They are drill-downs. Start from `get_overview` \u2192 `get_channels` and only drill where Step 1 and 2 point you.\n\n---\n\n## Report template (for the final output)\n\nUse this skeleton, in the user's language. Fill it with real numbers and findings.\n\n```\n# Marketing report \u2014 {site name}\n**Period**: {dates in account timezone}\n**Comparison**: prior period {dates} \u00B7 YoY {dates if available}\n**Attribution**: SealMetrics last non-direct click, consentless (numbers may differ from GA4 or ad platforms).\n\n## TL;DR\n- 3 to 5 bullets. Headline finding, headline action, headline caveat.\n\n## Macro snapshot\n{table from Step 1}\n{one-sentence narrative}\n\n## Acquisition\n### Channel mix\n{chart + interpretation}\n### Sources & referrers\n{interpretation if anything notable}\n### Campaigns\n{table + interpretation}\n### Search terms\n{only if relevant}\n\n## Landing pages & content\n{top landings table + interpretation}\n{content group table if configured}\n\n## Conversions & microconversions\n{conversion summary}\n{funnel chart + which step explains the period}\n\n## Audience\n{only sections that explain something}\n\n## Traffic quality (beta)\n{bot share + suspicious patterns + disclaimer}\n\n## Segments & custom properties\n{only if configured}\n\n## Why this period looks like this\nA 3-5 sentence causal narrative tying the sections together. State confidence and uncertainty plainly.\n\n## Action plan\n{prioritized table, max 7}\n\n## What to set up before next report\n{instrumentation gaps surfaced during the run \u2014 content groups, microconversions, segments, properties \u2014 so next month's analysis can go deeper}\n```\n\n---\n\n## Glossary\n\n- **Session**: a visit by a single browser, bounded by inactivity timeout.\n- **Conversion**: a goal completion as configured by the site (purchase, signup, demo, etc.).\n- **Microconversion**: an in-session intent signal short of full conversion (pricing view, scroll depth, CTA click).\n- **Engaged session**: a session with more than one pageview or a meaningful interaction.\n- **Bounce rate**: `(entrances \u2212 engaged entrances) / entrances`. SealMetrics computes bounce, not engagement rate.\n- **Last non-direct click**: attribution model that credits the last channel before conversion that is not a direct visit.\n- **Consentless**: measurement done server-side without setting identifiers in the browser; no cookie banner required for this data.\n- **Content group**: a logical grouping of pages (e.g. `product`, `blog`, `pricing`) configured at the site level.\n- **Segment**: a saved cohort defined by behavior or properties (e.g. \"logged-in users\").\n- **Custom property**: a key/value attached to events (e.g. `plan=pro`) used for breakdowns."; //# sourceMappingURL=marketing-guide.d.ts.map