원클릭으로
cocos-conversion-optimizer
Use when working on improving install rates and user acquisition metrics.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Use when working on improving install rates and user acquisition metrics.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Use this skill when the user asks to release the iOS app, upload a build, submit to App Store Connect review, or "在 App Store 上架/提交审核" for WordMagicGame.
Seed a lesson-import draft on a deployed Happyword API (Preview or prod) and optionally run the extract-pending cron so it reaches `pending` (待复核). Uses tools starting with `hw_`. Invoke when the user wants to upload a textbook photo for review against a specific Vercel URL, mirror E2E `test_lesson_import_cron_e2e`, or smoke-test lesson import + cron on a branch deployment.
Investigate why a Vercel preview / production deployment of the FastAPI server is broken (404 on every path, 500 on every path, e2e CI red, etc.). Pulls the right log surface for the symptom and maps HTTP error headers to root causes. Use whenever the deployed server returns wrong responses, the server-ci e2e job fails, or autofix loops keep retrying without converging.
Health-check every active Vercel Preview deployment listed in the live manifest at `https://happyword.cool/api/v1/public/preview-urls.json`. Probes `GET /api/v1/public/health` through Vercel Deployment Protection (`x-vercel-protection-bypass` header), prints a one-line status per preview, and exits non-zero if any are sick. Use when the user asks to "test preview health", "check previews", "are PR previews alive?", before merging anything that touches `server/`, after a fleet-wide redeploy or env-var rotation, or after rotating `VERCEL_AUTOMATION_BYPASS_SECRET` — do NOT loop ad-hoc `curl` calls or use `tools/vercel/smoke-prod.sh` (production-only) for this.
Drives a per-feature visual + spec-anchored gap scout across HarmonyOS / iOS / Android using tools/parity_scout/. Use when asked to "find iOS / Android gaps vs HarmonyOS main", "check parity for <feature>", or "screenshot the three platforms and tell me what's different".
Drives a per-feature visual + spec-anchored gap scout across HarmonyOS / iOS / Android using tools/parity_scout/. Use when asked to "find iOS / Android gaps vs HarmonyOS main", "check parity for <feature>", or "screenshot the three platforms and tell me what's different".
| name | cocos-conversion-optimizer |
| description | Use when working on improving install rates and user acquisition metrics. |
This Codex skill adapts the upstream Cocos Creator Claude agent guidance for use in Codex.
Expert in maximizing conversion rates for Cocos Creator playable ads through data-driven optimization, psychological triggers, and engagement mechanics. Use this skill for improving install rates and user acquisition metrics.
Context: Playable has 2% conversion rate
User: "Improve conversion rate to industry standard"
Assistant: "I will use $cocos-conversion-optimizer"
Commentary: Implements psychological triggers and optimizes CTA placement
Context: Users not clicking install button
User: "Make the CTA more compelling"
Assistant: "I will use $cocos-conversion-optimizer"
Commentary: Redesigns CTA with urgency and visual appeal
Context: Need to understand user behavior
User: "Add comprehensive analytics to track user actions"
Assistant: "I will use $cocos-conversion-optimizer"
Commentary: Sets up detailed funnel analytics
@ccclass('ConversionHooks')
export class ConversionHooks extends Component {
// 1. Curiosity Gap
showTeaser() {
// Show advanced gameplay preview
const preview = this.node.getChildByName('GameplayPreview');
preview.active = true;
// Hide after 2 seconds to create curiosity
this.scheduleOnce(() => {
preview.active = false;
this.showMessage("Unlock more levels in the full game!");
}, 2);
}
// 2. Loss Aversion
showLimitedOffer() {
const offer = {
type: 'LIMITED_TIME',
message: 'Special offer expires in 24h!',
visual: 'countdown_timer'
};
this.displayOffer(offer);
}
// 3. Social Proof
showSocialProof() {
const messages = [
"Join 10 million players!",
"Rated 4.8★ by players like you",
"#1 Puzzle Game this week"
];
this.rotateMessages(messages);
}
// 4. Progress Investment
trackProgress() {
const progress = {
level: 3,
score: 1250,
unlocks: ['PowerUp1', 'Skin2']
};
this.showProgressLoss("Don't lose your progress! Continue in the app");
}
}
@ccclass('CTAOptimizer')
export class CTAOptimizer extends Component {
@property(Button)
ctaButton: Button = null;
@property(Label)
ctaText: Label = null;
private _ctaVariants = {
soft: [
"Play Now",
"Continue",
"Try More Levels"
],
medium: [
"Play FREE",
"Get the Full Game",
"Unlock Everything"
],
strong: [
"Install NOW - FREE",
"Download & Keep Playing",
"Get it FREE - Limited Time"
]
};
private _ctaShownCount: number = 0;
showCTA(strength: 'soft' | 'medium' | 'strong') {
this._ctaShownCount++;
// Choose variant based on A/B test
const variants = this._ctaVariants[strength];
const text = variants[Math.floor(Math.random() * variants.length)];
this.ctaText.string = text;
this.animateCTA(strength);
// Track impression
this.trackCTAImpression(strength, text);
}
animateCTA(strength: string) {
const button = this.ctaButton.node;
if (strength === 'strong') {
// Aggressive animation
tween(button)
.to(0.3, { scale: v3(1.3, 1.3, 1) })
.to(0.3, { scale: v3(1, 1, 1) })
.union()
.repeatForever()
.start();
// Add glow effect
this.addGlowEffect(button);
// Add particle effects
this.addCTAParticles(button);
} else {
// Subtle pulse
tween(button)
.to(1, { scale: v3(1.1, 1.1, 1) })
.to(1, { scale: v3(1, 1, 1) })
.union()
.repeatForever()
.start();
}
}
}
@ccclass('EngagementTracker')
export class EngagementTracker extends Component {
private _metrics = {
sessionStart: 0,
firstInteraction: 0,
interactions: [],
ctaImpressions: [],
ctaClicks: [],
gameEvents: []
};
onLoad() {
this._metrics.sessionStart = Date.now();
this.setupTracking();
}
trackInteraction(type: string, data?: any) {
const event = {
type,
timestamp: Date.now() - this._metrics.sessionStart,
data
};
this._metrics.interactions.push(event);
if (this._metrics.interactions.length === 1) {
this._metrics.firstInteraction = event.timestamp;
this.checkEngagementMilestone();
}
// Send to analytics
this.sendAnalytics(event);
}
checkEngagementMilestone() {
const engagementTime = Date.now() - this._metrics.sessionStart;
if (engagementTime > 5000 && this._metrics.interactions.length > 3) {
// High engagement - show stronger CTA
this.node.emit('high-engagement');
}
}
generateFunnelReport() {
return {
startToFirstInteraction: this._metrics.firstInteraction,
totalInteractions: this._metrics.interactions.length,
ctaConversion: this._metrics.ctaClicks.length / this._metrics.ctaImpressions.length,
dropOffPoints: this.calculateDropOffPoints()
};
}
}
interface ConversionFunnel {
stages: {
load: number; // 100%
firstInteraction: number; // 80%
tutorialComplete: number; // 60%
firstCTAShown: number; // 55%
gameplayLoop: number; // 40%
strongCTAShown: number; // 35%
ctaClicked: number; // 5-15% target
};
}
@ccclass('FunnelOptimizer')
export class FunnelOptimizer extends Component {
optimizeFunnel(currentMetrics: ConversionFunnel) {
const bottlenecks = this.identifyBottlenecks(currentMetrics);
bottlenecks.forEach(bottleneck => {
switch (bottleneck.stage) {
case 'firstInteraction':
// Make first interaction more obvious
this.enhanceTutorialVisibility();
break;
case 'tutorialComplete':
// Simplify tutorial
this.reduceTutorialSteps();
break;
case 'ctaClicked':
// Enhance CTA appeal
this.upgradeCTAStrategy();
break;
}
});
}
}
@ccclass('ABTestManager')
export class ABTestManager extends Component {
private _tests = {
ctaColor: {
variants: ['green', 'blue', 'orange'],
metric: 'cta_click_rate'
},
ctaTiming: {
variants: [5, 8, 12], // seconds
metric: 'conversion_rate'
},
tutorialLength: {
variants: ['short', 'medium', 'long'],
metric: 'tutorial_completion'
}
};
assignVariant(testName: string): any {
const test = this._tests[testName];
const variantIndex = this.hashUserId() % test.variants.length;
return test.variants[variantIndex];
}
trackResult(testName: string, variant: any, success: boolean) {
// Send to analytics backend
const data = {
test: testName,
variant: variant,
success: success,
timestamp: Date.now()
};
this.sendToAnalytics(data);
}
}
@ccclass('EndCardOptimizer')
export class EndCardOptimizer extends Component {
@property(Node)
endCard: Node = null;
showOptimizedEndCard(playerPerformance: any) {
// Personalize based on performance
if (playerPerformance.won) {
this.showVictoryEndCard();
} else if (playerPerformance.closeToWin) {
this.showAlmostThereEndCard();
} else {
this.showEncouragementEndCard();
}
// Always show compelling reasons to install
this.addValuePropositions();
}
addValuePropositions() {
const benefits = [
"🎮 100+ Unique Levels",
"🏆 Daily Tournaments",
"🎁 Free Daily Rewards",
"👥 Play with Friends",
"🌟 No Ads in Full Game"
];
// Animate benefits appearing
benefits.forEach((benefit, index) => {
this.scheduleOnce(() => {
this.showBenefit(benefit);
}, index * 0.5);
});
}
}
Trigger: Tutorial optimization needed Handoff: "Conversion analysis done. Tutorial refinement needed for: [metrics]"
Trigger: Structural changes needed Handoff: "Conversion strategy defined. Architecture changes needed for: [features]"
Trigger: CTA visual enhancement Handoff: "CTA strategy ready. Visual implementation needed for: [variants]"
Read references/playable-ad-development.md when the task needs the full workflow.