diff --git a/public/sitemap-index.xml b/public/sitemap-index.xml index c33a47e..0ea9638 100644 --- a/public/sitemap-index.xml +++ b/public/sitemap-index.xml @@ -5,7 +5,7 @@ - 2026-07-01T00:26:36.973Z + 2026-07-05T02:02:21.093Z weekly 1.0 @@ -14,7 +14,7 @@ - 2026-07-01T00:26:36.973Z + 2026-07-05T02:02:21.093Z weekly 1.0 @@ -23,7 +23,7 @@ - 2026-07-01T00:27:59.948Z + 2026-07-05T02:01:56.695Z weekly 0.8 @@ -32,7 +32,7 @@ - 2026-07-01T00:27:59.948Z + 2026-07-05T02:01:56.695Z weekly 0.8 @@ -41,7 +41,7 @@ - 2026-07-04T02:12:40.164Z + 2026-07-05T02:04:40.689Z weekly 1.0 @@ -50,7 +50,7 @@ - 2026-07-04T02:12:40.164Z + 2026-07-05T02:04:40.689Z weekly 1.0 @@ -59,7 +59,7 @@ - 2026-07-04T02:14:44.289Z + 2026-07-05T02:07:23.389Z weekly 1.0 diff --git a/public/sitemap.xml b/public/sitemap.xml index c33a47e..0ea9638 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -5,7 +5,7 @@ - 2026-07-01T00:26:36.973Z + 2026-07-05T02:02:21.093Z weekly 1.0 @@ -14,7 +14,7 @@ - 2026-07-01T00:26:36.973Z + 2026-07-05T02:02:21.093Z weekly 1.0 @@ -23,7 +23,7 @@ - 2026-07-01T00:27:59.948Z + 2026-07-05T02:01:56.695Z weekly 0.8 @@ -32,7 +32,7 @@ - 2026-07-01T00:27:59.948Z + 2026-07-05T02:01:56.695Z weekly 0.8 @@ -41,7 +41,7 @@ - 2026-07-04T02:12:40.164Z + 2026-07-05T02:04:40.689Z weekly 1.0 @@ -50,7 +50,7 @@ - 2026-07-04T02:12:40.164Z + 2026-07-05T02:04:40.689Z weekly 1.0 @@ -59,7 +59,7 @@ - 2026-07-04T02:14:44.289Z + 2026-07-05T02:07:23.389Z weekly 1.0 diff --git a/scripts/postbuild-seo.mjs b/scripts/postbuild-seo.mjs index 7544375..cc81830 100644 --- a/scripts/postbuild-seo.mjs +++ b/scripts/postbuild-seo.mjs @@ -56,6 +56,9 @@ function buildSitemapXml() { 'src/app/page.tsx', 'src/app/zh/page.tsx', 'src/components/HomePage.tsx', + 'src/components/Hero.tsx', + 'src/components/ResourcesSection.tsx', + 'src/components/Footer.tsx', 'src/lib/seo.ts', ]); diff --git a/src/app/openclaw-tutorial/page.tsx b/src/app/openclaw-tutorial/page.tsx index 49c5f28..e5474ee 100644 --- a/src/app/openclaw-tutorial/page.tsx +++ b/src/app/openclaw-tutorial/page.tsx @@ -1,6 +1,7 @@ import type { Metadata } from 'next'; import Link from 'next/link'; import TutorialTrackedLink from '@/components/TutorialTrackedLink'; +import TrackedOutboundLink from '@/components/TrackedOutboundLink'; import { SITE_NAME, SITE_URL, buildPageMetadata, getStructuredDataLanguage } from '@/lib/seo'; export const metadata: Metadata = buildPageMetadata({ @@ -156,6 +157,30 @@ const nextStepCards = [ }, ]; +const leadProxyCards = [ + { + title: 'Guided course path', + body: 'For readers who want a complete first-assistant build with fewer dead ends.', + href: 'https://xiaomo.dev/course/openclaw-ai-assistant/?utm_source=openclaw101&utm_medium=openclaw_tutorial&utm_campaign=lead_proxy', + label: 'View course', + eventName: 'course_click' as const, + }, + { + title: 'Community troubleshooting', + body: 'Best after the reader has a first-run screenshot, token state, or terminal log.', + href: 'https://discord.com/invite/clawd?utm_source=openclaw101&utm_medium=openclaw_tutorial&utm_campaign=lead_proxy', + label: 'Open community', + eventName: 'community_click' as const, + }, + { + title: 'Skill and workflow catalog', + body: 'For readers who already got a first reply and now need reusable skills or workflows.', + href: 'https://www.skill-cn.com?utm_source=openclaw101&utm_medium=openclaw_tutorial&utm_campaign=product_referral', + label: 'Browse Skill Hub CN', + eventName: 'product_referral' as const, + }, +]; + const jsonLd = { '@context': 'https://schema.org', '@graph': [ @@ -197,7 +222,7 @@ const jsonLd = { headline: 'OpenClaw Tutorial: Beginner Setup Guide', description: 'Install OpenClaw, connect Telegram, verify the first assistant reply, and continue through the 7-day learning path.', datePublished: '2026-06-30', - dateModified: '2026-07-04', + dateModified: '2026-07-05', inLanguage: getStructuredDataLanguage('en'), author: { '@type': 'Organization', name: SITE_NAME, url: SITE_URL }, publisher: { '@type': 'Organization', name: SITE_NAME, url: SITE_URL }, @@ -359,6 +384,29 @@ export default function OpenClawTutorialPage() { +
+
+
+
Lead proxy, no paid action
+

If the OpenClaw tutorial worked, route the next intent

+

+ These links do not trigger payment or public posting. They turn course interest, community help, and product-referral intent into measurable lead proxies for the next site review. +

+
+
+ {leadProxyCards.map((card) => ( +
+

{card.title}

+

{card.body}

+ + {card.label} → + +
+ ))} +
+
+
+

OpenClaw tutorial FAQ

diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index ff8863b..d0411e2 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -20,10 +20,10 @@ export default function Footer({ locale, dict }: FooterProps) { {isZh ? '官方' : 'Official'}
@@ -34,7 +34,7 @@ export default function Footer({ locale, dict }: FooterProps) {
  • {isZh ? 'OpenClaw 初学者教程' : 'OpenClaw tutorial for beginners'}
  • {isZh ? '7天学习路径' : '7-Day Path'}
  • {isZh ? '全部资源' : 'All Resources'}
  • -
  • {isZh ? '飞书知识库' : 'Feishu Wiki'}
  • +
  • {isZh ? '飞书知识库' : 'Feishu Wiki'}
  • {isZh ? '技能推荐' : 'Featured Skills'}
  • {isZh && (
  • @@ -52,9 +52,9 @@ export default function Footer({ locale, dict }: FooterProps) {
  • diff --git a/src/components/ResourcesPage.tsx b/src/components/ResourcesPage.tsx index cb7f491..5d35ea9 100644 --- a/src/components/ResourcesPage.tsx +++ b/src/components/ResourcesPage.tsx @@ -9,6 +9,7 @@ import { type ResourceCategory, } from '@/data/resources'; import ConsultButton from './ConsultButton'; +import { trackEvent } from '@/lib/analytics'; /* ── i18n texts ── */ const texts = { @@ -173,13 +174,21 @@ interface ResourcesPageProps { } /* ── card ── */ -function Card({ r, color, t }: { r: Resource; color: string; t: typeof texts.en }) { +function Card({ r, color, t, locale }: { r: Resource; color: string; t: typeof texts.en; locale: 'en' | 'zh' }) { const dotColor = sourceDots[r.source] || '#9ca3af'; return ( trackEvent('resource_click', { + locale, + page: locale === 'zh' ? '/zh/resources' : '/resources', + source: 'resource_hub_card', + target: r.url, + resource_source: r.source, + resource_category: r.category, + })} className="group relative block rounded-xl p-5 border border-gray-100 hover:border-gray-200 hover:shadow-lg transition-all duration-300 hover:-translate-y-0.5 overflow-hidden" style={{ background: r.featured ? 'linear-gradient(135deg, #fffbeb 0%, #ffffff 40%)' : '#fff', @@ -273,7 +282,7 @@ function CategorySection({ {/* cards grid */}
    {items.map((r) => ( - + ))}
    @@ -368,6 +377,12 @@ export default function ResourcesPage({ locale }: ResourcesPageProps) { placeholder={t.searchPlaceholder} value={search} onChange={(e) => setSearch(e.target.value)} + onFocus={() => trackEvent('resource_click', { + locale, + page: locale === 'zh' ? '/zh/resources' : '/resources', + source: 'resource_search_focus', + target: 'search', + })} className="w-full pl-12 pr-4 py-3 rounded-xl text-sm text-white placeholder-white/30 focus:outline-none focus:ring-2 focus:ring-blue-400/40 transition-all" style={{ background: 'rgba(255,255,255,0.08)', border: '1px solid rgba(255,255,255,0.12)' }} /> @@ -454,7 +469,7 @@ export default function ResourcesPage({ locale }: ResourcesPageProps) { ) : (
    - {searchResults.map((r) => )} + {searchResults.map((r) => )}
    )} diff --git a/src/components/ResourcesSection.tsx b/src/components/ResourcesSection.tsx index 40732fc..73307e3 100644 --- a/src/components/ResourcesSection.tsx +++ b/src/components/ResourcesSection.tsx @@ -3,6 +3,7 @@ import { useEffect, useRef } from 'react'; import { getFeaturedResources, categoryMeta, stats, type Resource } from '@/data/resources'; import { Dictionary } from '@/lib/i18n'; +import { trackEvent } from '@/lib/analytics'; interface ResourcesSectionProps { locale: 'en' | 'zh'; @@ -27,6 +28,14 @@ function ResourceCard({ r, i, isZh }: { r: Resource; i: number; isZh: boolean }) href={r.url} target="_blank" rel="noopener noreferrer" + onClick={() => trackEvent('resource_click', { + locale: isZh ? 'zh' : 'en', + page: isZh ? '/zh' : '/', + source: 'featured_resource_card', + target: r.url, + resource_source: r.source, + resource_category: r.category, + })} className="reveal card-hover group block bg-white rounded-xl sm:rounded-2xl p-4 sm:p-5 md:p-6 border border-gray-100 hover:border-gray-200 relative" style={{ transitionDelay: `${i * 60}ms` }} > @@ -159,6 +168,12 @@ export default function ResourcesSection({ locale, dict }: ResourcesSectionProps
    trackEvent('resource_click', { + locale, + page: isZh ? '/zh' : '/', + source: 'resources_section_view_all', + target: `${prefix}/resources`, + })} className="group inline-flex items-center gap-2 px-8 py-4 bg-gray-900 hover:bg-gray-800 text-white font-semibold rounded-xl transition-all duration-300 hover:shadow-lg hover:-translate-y-0.5" > {isZh ? `查看全部 ${stats.totalResources}+ 篇资源` : `View All ${stats.totalResources}+ Resources`} diff --git a/src/components/StartSetupPage.tsx b/src/components/StartSetupPage.tsx index d54cd9d..aaa5e3f 100644 --- a/src/components/StartSetupPage.tsx +++ b/src/components/StartSetupPage.tsx @@ -99,6 +99,55 @@ const copy = { }, } as const; +const leadOptions = { + en: [ + { + title: 'Want a guided setup?', + body: 'Use the course path when you want a structured first assistant build instead of debugging alone.', + label: 'View the OpenClaw course', + href: 'https://xiaomo.dev/course/openclaw-ai-assistant/?utm_source=openclaw101&utm_medium=start_page&utm_campaign=first_run_rescue', + eventName: 'course_click', + }, + { + title: 'Need community help?', + body: 'Join the community after you have a screenshot or log from your first-run attempt.', + label: 'Open community', + href: 'https://discord.com/invite/clawd?utm_source=openclaw101&utm_medium=start_page&utm_campaign=first_run_rescue', + eventName: 'community_click', + }, + { + title: 'Compare nearby tools', + body: 'Browse Skill Hub CN when your next step is prompt packs, agent skills, or workflow templates.', + label: 'Browse Skill Hub CN', + href: 'https://www.skill-cn.com?utm_source=openclaw101&utm_medium=start_page&utm_campaign=product_referral', + eventName: 'product_referral', + }, + ], + zh: [ + { + title: '想有人带着跑通?', + body: '如果不想独自排错,用训练营路径完成第一个 AI 助手闭环。', + label: '查看 OpenClaw 实战训练营', + href: 'https://xiaomo.dev/course/openclaw-ai-assistant/?utm_source=openclaw101&utm_medium=zh_start_page&utm_campaign=first_run_rescue', + eventName: 'course_click', + }, + { + title: '需要社区协助?', + body: '先准备首次运行截图或终端日志,再到社区提问,排错效率更高。', + label: '打开社区', + href: 'https://discord.com/invite/clawd?utm_source=openclaw101&utm_medium=zh_start_page&utm_campaign=first_run_rescue', + eventName: 'community_click', + }, + { + title: '继续找技能/工作流?', + body: '去 Skill Hub 中国浏览 Prompt、Agent Skills 和工作流模板。', + label: '浏览 Skill Hub 中国', + href: 'https://www.skill-cn.com?utm_source=openclaw101&utm_medium=zh_start_page&utm_campaign=product_referral', + eventName: 'product_referral', + }, + ], +} as const; + export default function StartSetupPage({ locale }: StartSetupPageProps) { const t = copy[locale]; const [copied, setCopied] = useState(false); @@ -362,6 +411,46 @@ export default function StartSetupPage({ locale }: StartSetupPageProps) {
    + +
    +
    +
    +
    + {locale === 'zh' ? '低风险下一步' : 'Low-risk next step'} +
    +

    + {locale === 'zh' ? '首次回复之后,选择一个可追踪动作' : 'After the first reply, choose one trackable action'} +

    +

    + {locale === 'zh' + ? '这里不做付款或公开发布,只把课程、社区和产品引用点击记为 lead proxy,方便后续判断 OpenClaw101 的真实承接能力。' + : 'No payment or public posting here. These course, community, and product-referral clicks are lead proxies so the next review can judge whether OpenClaw101 has real business handoff.'} +

    +
    +
    +
    +
    ); } diff --git a/src/lib/analytics.ts b/src/lib/analytics.ts index 91ff1e7..c82683e 100644 --- a/src/lib/analytics.ts +++ b/src/lib/analytics.ts @@ -24,7 +24,9 @@ export type AnalyticsEventName = | 'first_reply_verified_click' | 'first_run_verified' | 'day2_guide_click' - | 'start_setup_completed'; + | 'start_setup_completed' + | 'resource_click' + | 'utm_copy_click'; interface AnalyticsEventProperties { [key: string]: string | number | boolean | undefined;