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'}
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;