cokit-cli 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +103 -0
- package/README.FLOW.md +237 -0
- package/README.md +153 -94
- package/agents/brainstormer.agent.md +71 -0
- package/agents/code-reviewer.agent.md +128 -0
- package/agents/database-admin.agent.md +91 -0
- package/agents/debugger.agent.md +128 -0
- package/agents/docs-manager.agent.md +121 -0
- package/agents/fullstack-developer.agent.md +96 -0
- package/agents/git-manager.agent.md +392 -0
- package/agents/mcp-manager.agent.md +93 -0
- package/agents/planner.agent.md +94 -0
- package/agents/project-manager.agent.md +124 -0
- package/agents/researcher.agent.md +32 -0
- package/agents/scout-external.agent.md +141 -0
- package/agents/scout.agent.md +107 -0
- package/agents/tester.agent.md +106 -0
- package/agents/ui-ux-designer.agent.md +225 -0
- package/collections/ck-core.collection.yml +30 -0
- package/collections/ck-development-rules.collection.yml +18 -0
- package/collections/ck-documentation.collection.yml +18 -0
- package/collections/ck-git-workflow.collection.yml +18 -0
- package/collections/ck-orchestration.collection.yml +22 -0
- package/collections/ck-ui-design.collection.yml +18 -0
- package/docs/README.md +85 -0
- package/docs/copilot-processing-flow.md +128 -0
- package/instructions/ck-backend.instructions.md +48 -0
- package/instructions/ck-development.instructions.md +40 -0
- package/instructions/ck-frontend-design-pro.instructions.md +58 -0
- package/instructions/ck-frontend.instructions.md +44 -0
- package/instructions/ck-google-adk-python.instructions.md +242 -0
- package/instructions/ck-research.instructions.md +167 -0
- package/instructions/ck-testing.instructions.md +36 -0
- package/package.json +9 -2
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-01-restructure-folders.md +183 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-02-convert-agents.md +206 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-03-convert-commands-to-prompts.md +284 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-04-convert-skills-to-instructions.md +349 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-05-create-collections.md +320 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-06-update-cli-build-scripts.md +450 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-07-update-documentation.md +407 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/plan.md +136 -0
- package/prompts/ck-ask.prompt.md +57 -0
- package/prompts/ck-bootstrap-auto-fast.prompt.md +108 -0
- package/prompts/ck-bootstrap-auto-parallel.prompt.md +66 -0
- package/prompts/ck-bootstrap-auto.prompt.md +114 -0
- package/prompts/ck-bootstrap.prompt.md +136 -0
- package/prompts/ck-brainstorm.prompt.md +68 -0
- package/prompts/ck-ck-help.prompt.md +114 -0
- package/prompts/ck-code-auto.prompt.md +171 -0
- package/prompts/ck-code-no-test.prompt.md +159 -0
- package/prompts/ck-code-parallel.prompt.md +56 -0
- package/prompts/ck-code.prompt.md +177 -0
- package/prompts/ck-coding-level.prompt.md +54 -0
- package/prompts/ck-cook-auto-fast.prompt.md +26 -0
- package/prompts/ck-cook-auto-parallel.prompt.md +49 -0
- package/prompts/ck-cook-auto.prompt.md +15 -0
- package/prompts/ck-cook.prompt.md +96 -0
- package/prompts/ck-debug.prompt.md +14 -0
- package/prompts/ck-design-3d.prompt.md +84 -0
- package/prompts/ck-design-describe.prompt.md +24 -0
- package/prompts/ck-design-fast.prompt.md +32 -0
- package/prompts/ck-design-good.prompt.md +36 -0
- package/prompts/ck-design-screenshot.prompt.md +35 -0
- package/prompts/ck-design-video.prompt.md +35 -0
- package/prompts/ck-docs-init.prompt.md +27 -0
- package/prompts/ck-docs-summarize.prompt.md +23 -0
- package/prompts/ck-docs-update.prompt.md +36 -0
- package/prompts/ck-fix-ci.prompt.md +18 -0
- package/prompts/ck-fix-fast.prompt.md +18 -0
- package/prompts/ck-fix-hard.prompt.md +36 -0
- package/prompts/ck-fix-logs.prompt.md +27 -0
- package/prompts/ck-fix-parallel.prompt.md +54 -0
- package/prompts/ck-fix-test.prompt.md +19 -0
- package/prompts/ck-fix-types.prompt.md +11 -0
- package/prompts/ck-fix-ui.prompt.md +49 -0
- package/prompts/ck-fix.prompt.md +44 -0
- package/prompts/ck-git-cm.prompt.md +8 -0
- package/prompts/ck-git-cp.prompt.md +7 -0
- package/prompts/ck-git-merge.prompt.md +41 -0
- package/prompts/ck-git-pr.prompt.md +49 -0
- package/prompts/ck-kanban.prompt.md +77 -0
- package/prompts/ck-plan-archive.prompt.md +58 -0
- package/prompts/ck-plan-ci.prompt.md +34 -0
- package/prompts/ck-plan-cro.prompt.md +66 -0
- package/prompts/ck-plan-fast.prompt.md +67 -0
- package/prompts/ck-plan-hard.prompt.md +89 -0
- package/prompts/ck-plan-parallel.prompt.md +126 -0
- package/prompts/ck-plan-two.prompt.md +43 -0
- package/prompts/ck-plan-validate.prompt.md +118 -0
- package/prompts/ck-plan.prompt.md +29 -1
- package/prompts/ck-preview.prompt.md +65 -0
- package/prompts/ck-review-codebase.prompt.md +44 -0
- package/prompts/ck-scout-ext.prompt.md +35 -0
- package/prompts/ck-scout.prompt.md +25 -0
- package/prompts/ck-skill-add.prompt.md +36 -0
- package/prompts/ck-skill-create.prompt.md +29 -0
- package/prompts/ck-skill-fix-logs.prompt.md +22 -0
- package/prompts/ck-skill-optimize-auto.prompt.md +25 -0
- package/prompts/ck-skill-optimize.prompt.md +34 -0
- package/prompts/ck-skill-plan.prompt.md +46 -0
- package/prompts/ck-test-ui.prompt.md +92 -0
- package/prompts/ck-test.prompt.md +10 -0
- package/prompts/ck-use-mcp.prompt.md +27 -0
- package/prompts/ck-watzup.prompt.md +11 -0
- package/prompts/ck-worktree.prompt.md +127 -0
- package/rules/README.agents.md +55 -0
- package/rules/README.collections.md +78 -0
- package/rules/README.copilot-instructions.md +66 -0
- package/rules/README.instructions.md +73 -0
- package/rules/README.md +39 -0
- package/rules/README.prompts.md +76 -0
- package/rules/README.skills.md +71 -0
- package/skills/ck-ai-artist/SKILL.md +73 -0
- package/skills/ck-ai-artist/references/advanced-techniques.md +184 -0
- package/skills/ck-ai-artist/references/domain-code.md +66 -0
- package/skills/ck-ai-artist/references/domain-data.md +72 -0
- package/skills/ck-ai-artist/references/domain-marketing.md +66 -0
- package/skills/ck-ai-artist/references/domain-patterns.md +33 -0
- package/skills/ck-ai-artist/references/domain-writing.md +68 -0
- package/skills/ck-ai-artist/references/image-prompting.md +141 -0
- package/skills/ck-ai-artist/references/llm-prompting.md +165 -0
- package/skills/ck-ai-artist/references/nano-banana.md +59 -0
- package/skills/ck-ai-artist/references/reasoning-techniques.md +201 -0
- package/skills/ck-backend-development/SKILL.md +93 -0
- package/skills/ck-backend-development/references/backend-api-design.md +495 -0
- package/skills/ck-backend-development/references/backend-architecture.md +454 -0
- package/skills/ck-backend-development/references/backend-authentication.md +338 -0
- package/skills/ck-backend-development/references/backend-code-quality.md +659 -0
- package/skills/ck-backend-development/references/backend-debugging.md +904 -0
- package/skills/ck-backend-development/references/backend-devops.md +494 -0
- package/skills/ck-backend-development/references/backend-mindset.md +387 -0
- package/skills/ck-backend-development/references/backend-performance.md +397 -0
- package/skills/ck-backend-development/references/backend-security.md +290 -0
- package/skills/ck-backend-development/references/backend-technologies.md +256 -0
- package/skills/ck-backend-development/references/backend-testing.md +429 -0
- package/skills/ck-better-auth/SKILL.md +202 -0
- package/skills/ck-better-auth/references/advanced-features.md +553 -0
- package/skills/ck-better-auth/references/database-integration.md +577 -0
- package/skills/ck-better-auth/references/email-password-auth.md +416 -0
- package/skills/ck-better-auth/references/oauth-providers.md +430 -0
- package/skills/ck-better-auth/scripts/.coverage +0 -0
- package/skills/ck-better-auth/scripts/better_auth_init.py +521 -0
- package/skills/ck-better-auth/scripts/requirements.txt +15 -0
- package/skills/ck-better-auth/scripts/tests/.coverage +0 -0
- package/skills/ck-better-auth/scripts/tests/test_better_auth_init.py +421 -0
- package/skills/ck-chrome-devtools/SKILL.md +470 -0
- package/skills/ck-chrome-devtools/references/cdp-domains.md +694 -0
- package/skills/ck-chrome-devtools/references/performance-guide.md +940 -0
- package/skills/ck-chrome-devtools/references/puppeteer-reference.md +953 -0
- package/skills/ck-chrome-devtools/scripts/README.md +272 -0
- package/skills/ck-chrome-devtools/scripts/__tests__/selector.test.js +210 -0
- package/skills/ck-chrome-devtools/scripts/aria-snapshot.js +362 -0
- package/skills/ck-chrome-devtools/scripts/click.js +83 -0
- package/skills/ck-chrome-devtools/scripts/console.js +79 -0
- package/skills/ck-chrome-devtools/scripts/evaluate.js +53 -0
- package/skills/ck-chrome-devtools/scripts/fill.js +76 -0
- package/skills/ck-chrome-devtools/scripts/inject-auth.js +229 -0
- package/skills/ck-chrome-devtools/scripts/install-deps.sh +181 -0
- package/skills/ck-chrome-devtools/scripts/install.sh +83 -0
- package/skills/ck-chrome-devtools/scripts/lib/browser.js +318 -0
- package/skills/ck-chrome-devtools/scripts/lib/selector.js +178 -0
- package/skills/ck-chrome-devtools/scripts/navigate.js +54 -0
- package/skills/ck-chrome-devtools/scripts/network.js +106 -0
- package/skills/ck-chrome-devtools/scripts/package-lock.json +1589 -0
- package/skills/ck-chrome-devtools/scripts/package.json +16 -0
- package/skills/ck-chrome-devtools/scripts/performance.js +149 -0
- package/skills/ck-chrome-devtools/scripts/screenshot.js +198 -0
- package/skills/ck-chrome-devtools/scripts/select-ref.js +131 -0
- package/skills/ck-chrome-devtools/scripts/snapshot.js +135 -0
- package/skills/ck-code-review/SKILL.md +110 -53
- package/skills/ck-code-review/references/code-review-reception.md +182 -49
- package/skills/ck-code-review/references/requesting-code-review.md +105 -0
- package/skills/ck-code-review/references/verification-before-completion.md +111 -58
- package/skills/ck-databases/SKILL.md +231 -0
- package/skills/ck-databases/references/mongodb-aggregation.md +447 -0
- package/skills/ck-databases/references/mongodb-atlas.md +465 -0
- package/skills/ck-databases/references/mongodb-crud.md +408 -0
- package/skills/ck-databases/references/mongodb-indexing.md +442 -0
- package/skills/ck-databases/references/postgresql-administration.md +594 -0
- package/skills/ck-databases/references/postgresql-performance.md +527 -0
- package/skills/ck-databases/references/postgresql-psql-cli.md +467 -0
- package/skills/ck-databases/references/postgresql-queries.md +475 -0
- package/skills/ck-databases/scripts/.coverage +0 -0
- package/skills/ck-databases/scripts/db_backup.py +502 -0
- package/skills/ck-databases/scripts/db_migrate.py +425 -0
- package/skills/ck-databases/scripts/db_performance_check.py +456 -0
- package/skills/ck-databases/scripts/requirements.txt +20 -0
- package/skills/ck-databases/scripts/tests/coverage-db.json +1 -0
- package/skills/ck-databases/scripts/tests/requirements.txt +4 -0
- package/skills/ck-databases/scripts/tests/test_db_backup.py +340 -0
- package/skills/ck-databases/scripts/tests/test_db_migrate.py +277 -0
- package/skills/ck-databases/scripts/tests/test_db_performance_check.py +370 -0
- package/skills/ck-debugging/SKILL.md +55 -43
- package/skills/ck-debugging/references/defense-in-depth.md +124 -0
- package/skills/ck-debugging/references/root-cause-tracing.md +100 -43
- package/skills/ck-debugging/references/systematic-debugging.md +80 -52
- package/skills/ck-debugging/references/verification.md +101 -52
- package/skills/ck-debugging/scripts/find-polluter.sh +63 -0
- package/skills/ck-debugging/scripts/find-polluter.test.md +102 -0
- package/skills/ck-devops/.env.example +76 -0
- package/skills/ck-devops/SKILL.md +283 -0
- package/skills/ck-devops/references/browser-rendering.md +305 -0
- package/skills/ck-devops/references/cloudflare-d1-kv.md +123 -0
- package/skills/ck-devops/references/cloudflare-platform.md +271 -0
- package/skills/ck-devops/references/cloudflare-r2-storage.md +280 -0
- package/skills/ck-devops/references/cloudflare-workers-advanced.md +312 -0
- package/skills/ck-devops/references/cloudflare-workers-apis.md +309 -0
- package/skills/ck-devops/references/cloudflare-workers-basics.md +418 -0
- package/skills/ck-devops/references/docker-basics.md +297 -0
- package/skills/ck-devops/references/docker-compose.md +292 -0
- package/skills/ck-devops/references/gcloud-platform.md +297 -0
- package/skills/ck-devops/references/gcloud-services.md +304 -0
- package/skills/ck-devops/scripts/cloudflare_deploy.py +269 -0
- package/skills/ck-devops/scripts/docker_optimize.py +331 -0
- package/skills/ck-devops/scripts/requirements.txt +20 -0
- package/skills/ck-devops/scripts/tests/requirements.txt +3 -0
- package/skills/ck-devops/scripts/tests/test_cloudflare_deploy.py +285 -0
- package/skills/ck-devops/scripts/tests/test_docker_optimize.py +436 -0
- package/skills/ck-docs-seeker/.env.example +15 -0
- package/skills/ck-docs-seeker/SKILL.md +70 -65
- package/skills/ck-docs-seeker/package.json +25 -0
- package/skills/ck-docs-seeker/references/advanced.md +79 -0
- package/skills/ck-docs-seeker/references/context7-patterns.md +68 -0
- package/skills/ck-docs-seeker/references/errors.md +68 -0
- package/skills/ck-docs-seeker/scripts/analyze-llms-txt.js +211 -0
- package/skills/ck-docs-seeker/scripts/detect-topic.js +172 -0
- package/skills/ck-docs-seeker/scripts/fetch-docs.js +213 -0
- package/skills/ck-docs-seeker/scripts/tests/run-tests.js +72 -0
- package/skills/ck-docs-seeker/scripts/tests/test-analyze-llms.js +119 -0
- package/skills/ck-docs-seeker/scripts/tests/test-detect-topic.js +112 -0
- package/skills/ck-docs-seeker/scripts/tests/test-fetch-docs.js +84 -0
- package/skills/ck-docs-seeker/scripts/utils/env-loader.js +94 -0
- package/skills/ck-docs-seeker/workflows/library-search.md +87 -0
- package/skills/ck-docs-seeker/workflows/repo-analysis.md +91 -0
- package/skills/ck-docs-seeker/workflows/topic-search.md +77 -0
- package/skills/ck-frontend-design/SKILL.md +79 -0
- package/skills/ck-frontend-design/references/analysis-best-practices.md +80 -0
- package/skills/ck-frontend-design/references/analysis-prompts.md +141 -0
- package/skills/ck-frontend-design/references/analysis-techniques.md +118 -0
- package/skills/ck-frontend-design/references/animejs.md +396 -0
- package/skills/ck-frontend-design/references/design-extraction-overview.md +71 -0
- package/skills/ck-frontend-design/references/extraction-best-practices.md +141 -0
- package/skills/ck-frontend-design/references/extraction-output-templates.md +162 -0
- package/skills/ck-frontend-design/references/extraction-prompts.md +127 -0
- package/skills/ck-frontend-design/references/technical-accessibility.md +119 -0
- package/skills/ck-frontend-design/references/technical-best-practices.md +97 -0
- package/skills/ck-frontend-design/references/technical-optimization.md +44 -0
- package/skills/ck-frontend-design/references/technical-overview.md +90 -0
- package/skills/ck-frontend-design/references/technical-workflows.md +150 -0
- package/skills/ck-frontend-design/references/visual-analysis-overview.md +95 -0
- package/skills/ck-frontend-development/SKILL.md +399 -0
- package/skills/ck-frontend-development/resources/common-patterns.md +331 -0
- package/skills/ck-frontend-development/resources/complete-examples.md +872 -0
- package/skills/ck-frontend-development/resources/component-patterns.md +502 -0
- package/skills/ck-frontend-development/resources/data-fetching.md +767 -0
- package/skills/ck-frontend-development/resources/file-organization.md +502 -0
- package/skills/ck-frontend-development/resources/loading-and-error-states.md +501 -0
- package/skills/ck-frontend-development/resources/performance.md +406 -0
- package/skills/ck-frontend-development/resources/routing-guide.md +364 -0
- package/skills/ck-frontend-development/resources/styling-guide.md +428 -0
- package/skills/ck-frontend-development/resources/typescript-standards.md +418 -0
- package/skills/ck-markdown-novel-viewer/SKILL.md +190 -0
- package/skills/ck-markdown-novel-viewer/assets/directory-browser.css +215 -0
- package/skills/ck-markdown-novel-viewer/assets/favicon.png +0 -0
- package/skills/ck-markdown-novel-viewer/assets/novel-theme.css +818 -0
- package/skills/ck-markdown-novel-viewer/assets/reader.js +262 -0
- package/skills/ck-markdown-novel-viewer/assets/template.html +80 -0
- package/skills/ck-markdown-novel-viewer/package.json +15 -0
- package/skills/ck-markdown-novel-viewer/scripts/lib/http-server.cjs +434 -0
- package/skills/ck-markdown-novel-viewer/scripts/lib/markdown-renderer.cjs +272 -0
- package/skills/ck-markdown-novel-viewer/scripts/lib/plan-navigator.cjs +509 -0
- package/skills/ck-markdown-novel-viewer/scripts/lib/port-finder.cjs +48 -0
- package/skills/ck-markdown-novel-viewer/scripts/lib/process-mgr.cjs +150 -0
- package/skills/ck-markdown-novel-viewer/scripts/server.cjs +411 -0
- package/skills/ck-markdown-novel-viewer/scripts/tests/server.test.cjs +283 -0
- package/skills/ck-markdown-novel-viewer/tests/dashboard-assets.test.cjs +340 -0
- package/skills/ck-markdown-novel-viewer/tests/dashboard-renderer.test.cjs +404 -0
- package/skills/ck-markdown-novel-viewer/tests/http-server.test.cjs +271 -0
- package/skills/ck-markdown-novel-viewer/tests/run-tests.cjs +51 -0
- package/skills/ck-markdown-novel-viewer/tests/test-framework.cjs +154 -0
- package/skills/ck-markdown-novel-viewer/tests/verify-xss.cjs +90 -0
- package/skills/ck-mcp-builder/LICENSE.txt +202 -0
- package/skills/ck-mcp-builder/SKILL.md +327 -0
- package/skills/ck-mcp-builder/reference/evaluation.md +602 -0
- package/skills/ck-mcp-builder/reference/mcp_best_practices.md +915 -0
- package/skills/ck-mcp-builder/reference/node_mcp_server.md +916 -0
- package/skills/ck-mcp-builder/reference/python_mcp_server.md +752 -0
- package/skills/ck-mcp-builder/scripts/connections.py +151 -0
- package/skills/ck-mcp-builder/scripts/evaluation.py +373 -0
- package/skills/ck-mcp-builder/scripts/example_evaluation.xml +22 -0
- package/skills/ck-mcp-builder/scripts/requirements.txt +2 -0
- package/skills/ck-mcp-management/README.md +219 -0
- package/skills/ck-mcp-management/SKILL.md +209 -0
- package/skills/ck-mcp-management/assets/tools.json +3146 -0
- package/skills/ck-mcp-management/references/configuration.md +114 -0
- package/skills/ck-mcp-management/references/gemini-cli-integration.md +215 -0
- package/skills/ck-mcp-management/references/mcp-protocol.md +116 -0
- package/skills/ck-mcp-management/scripts/.env.example +10 -0
- package/skills/ck-mcp-management/scripts/cli.ts +195 -0
- package/skills/ck-mcp-management/scripts/dist/analyze-tools.js +70 -0
- package/skills/ck-mcp-management/scripts/dist/cli.js +160 -0
- package/skills/ck-mcp-management/scripts/dist/mcp-client.js +183 -0
- package/skills/ck-mcp-management/scripts/mcp-client.ts +230 -0
- package/skills/ck-mcp-management/scripts/package.json +20 -0
- package/skills/ck-mcp-management/scripts/tsconfig.json +15 -0
- package/skills/ck-media-processing/SKILL.md +90 -0
- package/skills/ck-media-processing/references/common-workflows.md +132 -0
- package/skills/ck-media-processing/references/ffmpeg-encoding.md +358 -0
- package/skills/ck-media-processing/references/ffmpeg-filters.md +503 -0
- package/skills/ck-media-processing/references/ffmpeg-streaming.md +403 -0
- package/skills/ck-media-processing/references/format-compatibility.md +375 -0
- package/skills/ck-media-processing/references/imagemagick-batch.md +612 -0
- package/skills/ck-media-processing/references/imagemagick-editing.md +623 -0
- package/skills/ck-media-processing/references/rmbg-background-removal.md +66 -0
- package/skills/ck-media-processing/references/troubleshooting.md +109 -0
- package/skills/ck-media-processing/scripts/README.md +111 -0
- package/skills/ck-media-processing/scripts/batch-remove-background.sh +124 -0
- package/skills/ck-media-processing/scripts/batch_resize.py +342 -0
- package/skills/ck-media-processing/scripts/media_convert.py +311 -0
- package/skills/ck-media-processing/scripts/remove-background.sh +96 -0
- package/skills/ck-media-processing/scripts/remove-bg-node.js +158 -0
- package/skills/ck-media-processing/scripts/requirements.txt +24 -0
- package/skills/ck-media-processing/scripts/tests/.coverage +0 -0
- package/skills/ck-media-processing/scripts/tests/requirements.txt +2 -0
- package/skills/ck-media-processing/scripts/tests/test_batch_resize.py +372 -0
- package/skills/ck-media-processing/scripts/tests/test_media_convert.py +259 -0
- package/skills/ck-media-processing/scripts/tests/test_video_optimize.py +397 -0
- package/skills/ck-media-processing/scripts/video_optimize.py +414 -0
- package/skills/ck-mobile-development/SKILL.md +210 -0
- package/skills/ck-mobile-development/references/mobile-android.md +604 -0
- package/skills/ck-mobile-development/references/mobile-best-practices.md +545 -0
- package/skills/ck-mobile-development/references/mobile-debugging.md +1089 -0
- package/skills/ck-mobile-development/references/mobile-frameworks.md +465 -0
- package/skills/ck-mobile-development/references/mobile-ios.md +496 -0
- package/skills/ck-mobile-development/references/mobile-mindset.md +544 -0
- package/skills/ck-payment-integration/README.md +185 -0
- package/skills/ck-payment-integration/SKILL.md +116 -0
- package/skills/ck-payment-integration/references/polar/benefits.md +396 -0
- package/skills/ck-payment-integration/references/polar/best-practices.md +482 -0
- package/skills/ck-payment-integration/references/polar/checkouts.md +266 -0
- package/skills/ck-payment-integration/references/polar/overview.md +184 -0
- package/skills/ck-payment-integration/references/polar/products.md +244 -0
- package/skills/ck-payment-integration/references/polar/sdk.md +436 -0
- package/skills/ck-payment-integration/references/polar/subscriptions.md +340 -0
- package/skills/ck-payment-integration/references/polar/webhooks.md +405 -0
- package/skills/ck-payment-integration/references/sepay/api.md +140 -0
- package/skills/ck-payment-integration/references/sepay/best-practices.md +337 -0
- package/skills/ck-payment-integration/references/sepay/overview.md +138 -0
- package/skills/ck-payment-integration/references/sepay/qr-codes.md +228 -0
- package/skills/ck-payment-integration/references/sepay/sdk.md +213 -0
- package/skills/ck-payment-integration/references/sepay/webhooks.md +208 -0
- package/skills/ck-payment-integration/scripts/.env.example +20 -0
- package/skills/ck-payment-integration/scripts/checkout-helper.js +244 -0
- package/skills/ck-payment-integration/scripts/package.json +17 -0
- package/skills/ck-payment-integration/scripts/polar-webhook-verify.js +202 -0
- package/skills/ck-payment-integration/scripts/sepay-webhook-verify.js +193 -0
- package/skills/ck-payment-integration/scripts/test-scripts.js +237 -0
- package/skills/ck-planning/SKILL.md +79 -49
- package/skills/ck-planning/references/codebase-understanding.md +62 -0
- package/skills/ck-planning/references/output-standards.md +127 -0
- package/skills/ck-planning/references/plan-organization.md +122 -60
- package/skills/ck-planning/references/research-phase.md +49 -56
- package/skills/ck-planning/references/solution-design.md +61 -63
- package/skills/ck-problem-solving/SKILL.md +95 -0
- package/skills/ck-problem-solving/references/attribution.md +69 -0
- package/skills/ck-problem-solving/references/collision-zone-thinking.md +79 -0
- package/skills/ck-problem-solving/references/inversion-exercise.md +91 -0
- package/skills/ck-problem-solving/references/meta-pattern-recognition.md +87 -0
- package/skills/ck-problem-solving/references/scale-game.md +95 -0
- package/skills/ck-problem-solving/references/simplification-cascades.md +80 -0
- package/skills/ck-problem-solving/references/when-stuck.md +72 -0
- package/skills/ck-repomix/SKILL.md +247 -0
- package/skills/ck-repomix/references/configuration.md +211 -0
- package/skills/ck-repomix/references/usage-patterns.md +232 -0
- package/skills/ck-repomix/scripts/.coverage +0 -0
- package/skills/ck-repomix/scripts/README.md +179 -0
- package/skills/ck-repomix/scripts/repomix_batch.py +455 -0
- package/skills/ck-repomix/scripts/repos.example.json +15 -0
- package/skills/ck-repomix/scripts/requirements.txt +15 -0
- package/skills/ck-repomix/scripts/tests/test_repomix_batch.py +531 -0
- package/skills/ck-sequential-thinking/.env.example +8 -0
- package/skills/ck-sequential-thinking/README.md +183 -0
- package/skills/ck-sequential-thinking/SKILL.md +14 -2
- package/skills/ck-sequential-thinking/package.json +31 -0
- package/skills/ck-sequential-thinking/references/advanced-strategies.md +79 -0
- package/skills/ck-sequential-thinking/references/advanced-techniques.md +2 -14
- package/skills/ck-sequential-thinking/references/core-patterns.md +8 -0
- package/skills/ck-sequential-thinking/references/examples-api.md +88 -0
- package/skills/ck-sequential-thinking/references/examples-architecture.md +94 -0
- package/skills/ck-sequential-thinking/references/examples-debug.md +90 -0
- package/skills/ck-sequential-thinking/scripts/format-thought.js +159 -0
- package/skills/ck-sequential-thinking/scripts/process-thought.js +236 -0
- package/skills/ck-sequential-thinking/tests/format-thought.test.js +133 -0
- package/skills/ck-sequential-thinking/tests/process-thought.test.js +215 -0
- package/skills/ck-shopify/README.md +66 -0
- package/skills/ck-shopify/SKILL.md +319 -0
- package/skills/ck-shopify/references/app-development.md +470 -0
- package/skills/ck-shopify/references/extensions.md +493 -0
- package/skills/ck-shopify/references/themes.md +498 -0
- package/skills/ck-shopify/scripts/.coverage +0 -0
- package/skills/ck-shopify/scripts/requirements.txt +19 -0
- package/skills/ck-shopify/scripts/shopify_init.py +423 -0
- package/skills/ck-shopify/scripts/tests/.coverage +0 -0
- package/skills/ck-shopify/scripts/tests/test_shopify_init.py +385 -0
- package/skills/ck-skill-creator/LICENSE.txt +202 -0
- package/skills/ck-skill-creator/SKILL.md +265 -0
- package/skills/ck-skill-creator/scripts/init_skill.py +303 -0
- package/skills/ck-skill-creator/scripts/package_skill.py +110 -0
- package/skills/ck-skill-creator/scripts/quick_validate.py +65 -0
- package/skills/ck-threejs/SKILL.md +87 -0
- package/skills/ck-threejs/references/01-getting-started.md +177 -0
- package/skills/ck-threejs/references/02-loaders.md +169 -0
- package/skills/ck-threejs/references/03-textures.md +170 -0
- package/skills/ck-threejs/references/04-cameras.md +195 -0
- package/skills/ck-threejs/references/05-lights.md +183 -0
- package/skills/ck-threejs/references/06-animations.md +214 -0
- package/skills/ck-threejs/references/07-math.md +260 -0
- package/skills/ck-threejs/references/08-interaction.md +267 -0
- package/skills/ck-threejs/references/09-postprocessing.md +240 -0
- package/skills/ck-threejs/references/10-controls.md +259 -0
- package/skills/ck-threejs/references/11-materials-advanced.md +270 -0
- package/skills/ck-threejs/references/12-performance.md +269 -0
- package/skills/ck-threejs/references/13-node-materials.md +298 -0
- package/skills/ck-threejs/references/14-physics-vr.md +304 -0
- package/skills/ck-threejs/references/15-specialized-loaders.md +333 -0
- package/skills/ck-threejs/references/16-webgpu.md +302 -0
- package/skills/ck-ui-styling/LICENSE.txt +202 -0
- package/skills/ck-ui-styling/SKILL.md +319 -0
- package/skills/ck-ui-styling/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/DMMono-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/skills/ck-ui-styling/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Gloock-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Italiana-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Jura-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Lora-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Outfit-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Tektur-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills/ck-ui-styling/references/canvas-design-system.md +320 -0
- package/skills/ck-ui-styling/references/shadcn-accessibility.md +471 -0
- package/skills/ck-ui-styling/references/shadcn-components.md +424 -0
- package/skills/ck-ui-styling/references/shadcn-theming.md +373 -0
- package/skills/ck-ui-styling/references/tailwind-customization.md +483 -0
- package/skills/ck-ui-styling/references/tailwind-responsive.md +382 -0
- package/skills/ck-ui-styling/references/tailwind-utilities.md +455 -0
- package/skills/ck-ui-styling/scripts/.coverage +0 -0
- package/skills/ck-ui-styling/scripts/requirements.txt +17 -0
- package/skills/ck-ui-styling/scripts/shadcn_add.py +292 -0
- package/skills/ck-ui-styling/scripts/tailwind_config_gen.py +456 -0
- package/skills/ck-ui-styling/scripts/tests/coverage-ui.json +1 -0
- package/skills/ck-ui-styling/scripts/tests/requirements.txt +3 -0
- package/skills/ck-ui-styling/scripts/tests/test_shadcn_add.py +266 -0
- package/skills/ck-ui-styling/scripts/tests/test_tailwind_config_gen.py +336 -0
- package/skills/ck-ui-ux-pro-max/SKILL.md +227 -0
- package/skills/ck-ui-ux-pro-max/data/charts.csv +26 -0
- package/skills/ck-ui-ux-pro-max/data/colors.csv +97 -0
- package/skills/ck-ui-ux-pro-max/data/landing.csv +31 -0
- package/skills/ck-ui-ux-pro-max/data/products.csv +97 -0
- package/skills/ck-ui-ux-pro-max/data/prompts.csv +24 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/html-tailwind.csv +51 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills/ck-ui-ux-pro-max/data/styles.csv +59 -0
- package/skills/ck-ui-ux-pro-max/data/typography.csv +58 -0
- package/skills/ck-ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills/ck-ui-ux-pro-max/scripts/core.py +236 -0
- package/skills/ck-ui-ux-pro-max/scripts/search.py +76 -0
- package/skills/ck-web-frameworks/SKILL.md +322 -0
- package/skills/ck-web-frameworks/references/nextjs-app-router.md +465 -0
- package/skills/ck-web-frameworks/references/nextjs-data-fetching.md +459 -0
- package/skills/ck-web-frameworks/references/nextjs-optimization.md +511 -0
- package/skills/ck-web-frameworks/references/nextjs-server-components.md +495 -0
- package/skills/ck-web-frameworks/references/remix-icon-integration.md +603 -0
- package/skills/ck-web-frameworks/references/turborepo-caching.md +551 -0
- package/skills/ck-web-frameworks/references/turborepo-pipelines.md +517 -0
- package/skills/ck-web-frameworks/references/turborepo-setup.md +542 -0
- package/skills/ck-web-frameworks/scripts/.coverage +0 -0
- package/skills/ck-web-frameworks/scripts/__init__.py +0 -0
- package/skills/ck-web-frameworks/scripts/nextjs_init.py +547 -0
- package/skills/ck-web-frameworks/scripts/requirements.txt +16 -0
- package/skills/ck-web-frameworks/scripts/tests/coverage-web.json +1 -0
- package/skills/ck-web-frameworks/scripts/tests/requirements.txt +3 -0
- package/skills/ck-web-frameworks/scripts/tests/test_nextjs_init.py +319 -0
- package/skills/ck-web-frameworks/scripts/tests/test_turborepo_migrate.py +374 -0
- package/skills/ck-web-frameworks/scripts/turborepo_migrate.py +394 -0
- package/src/commands/init.js +61 -30
- package/src/utils/paths.js +35 -4
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
# Polar Checkouts
|
|
2
|
+
|
|
3
|
+
Checkout flows, embedded checkout, and session management.
|
|
4
|
+
|
|
5
|
+
## Checkout Approaches
|
|
6
|
+
|
|
7
|
+
### 1. Checkout Links
|
|
8
|
+
- Pre-configured shareable links
|
|
9
|
+
- Created via dashboard or API
|
|
10
|
+
- For marketing campaigns
|
|
11
|
+
- Can pre-apply discounts
|
|
12
|
+
|
|
13
|
+
**Create via API:**
|
|
14
|
+
```typescript
|
|
15
|
+
const link = await polar.checkoutLinks.create({
|
|
16
|
+
product_price_id: "price_xxx",
|
|
17
|
+
success_url: "https://example.com/success"
|
|
18
|
+
});
|
|
19
|
+
// Returns: link.url
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### 2. Checkout Sessions (API)
|
|
23
|
+
- Programmatically created
|
|
24
|
+
- Server-side API call
|
|
25
|
+
- Dynamic workflows
|
|
26
|
+
- Custom logic
|
|
27
|
+
|
|
28
|
+
**Create Session:**
|
|
29
|
+
```typescript
|
|
30
|
+
const session = await polar.checkouts.create({
|
|
31
|
+
product_price_id: "price_xxx",
|
|
32
|
+
success_url: "https://example.com/success?checkout_id={CHECKOUT_ID}",
|
|
33
|
+
customer_email: "user@example.com",
|
|
34
|
+
external_customer_id: "user_123",
|
|
35
|
+
metadata: {
|
|
36
|
+
user_id: "123",
|
|
37
|
+
source: "web"
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// Redirect to: session.url
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**Response:**
|
|
45
|
+
```json
|
|
46
|
+
{
|
|
47
|
+
"id": "checkout_xxx",
|
|
48
|
+
"url": "https://polar.sh/checkout/...",
|
|
49
|
+
"client_secret": "cs_xxx",
|
|
50
|
+
"status": "open",
|
|
51
|
+
"expires_at": "2025-01-15T10:00:00Z"
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### 3. Embedded Checkout
|
|
56
|
+
- Inline checkout within your site
|
|
57
|
+
- Seamless purchase experience
|
|
58
|
+
- Theme customization
|
|
59
|
+
|
|
60
|
+
**Implementation:**
|
|
61
|
+
```html
|
|
62
|
+
<script src="https://polar.sh/embed.js"></script>
|
|
63
|
+
|
|
64
|
+
<div id="polar-checkout"></div>
|
|
65
|
+
|
|
66
|
+
<script>
|
|
67
|
+
const checkout = await fetch('/api/create-checkout', {
|
|
68
|
+
method: 'POST',
|
|
69
|
+
body: JSON.stringify({ productPriceId: 'price_xxx' })
|
|
70
|
+
}).then(r => r.json());
|
|
71
|
+
|
|
72
|
+
Polar('checkout', {
|
|
73
|
+
checkoutId: checkout.id,
|
|
74
|
+
clientSecret: checkout.client_secret,
|
|
75
|
+
onSuccess: () => {
|
|
76
|
+
window.location.href = '/success';
|
|
77
|
+
},
|
|
78
|
+
theme: 'dark' // or 'light'
|
|
79
|
+
});
|
|
80
|
+
</script>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**Server-side (create session):**
|
|
84
|
+
```typescript
|
|
85
|
+
app.post('/api/create-checkout', async (req, res) => {
|
|
86
|
+
const session = await polar.checkouts.create({
|
|
87
|
+
product_price_id: req.body.productPriceId,
|
|
88
|
+
embed_origin: "https://example.com",
|
|
89
|
+
external_customer_id: req.user.id
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
res.json({
|
|
93
|
+
id: session.id,
|
|
94
|
+
client_secret: session.client_secret
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Configuration Parameters
|
|
100
|
+
|
|
101
|
+
### Required
|
|
102
|
+
- `product_price_id` - Product to checkout (or `products` array for multiple)
|
|
103
|
+
- `success_url` - Post-payment redirect (absolute URL)
|
|
104
|
+
|
|
105
|
+
### Optional
|
|
106
|
+
- `external_customer_id` - Your user ID mapping
|
|
107
|
+
- `embed_origin` - For embedded checkouts
|
|
108
|
+
- `customer_email` - Pre-fill email
|
|
109
|
+
- `customer_name` - Pre-fill name
|
|
110
|
+
- `discount_id` - Pre-apply discount code
|
|
111
|
+
- `allow_discount_codes` - Allow customer to enter codes (default: true)
|
|
112
|
+
- `metadata` - Custom data (key-value)
|
|
113
|
+
- `custom_field_data` - Pre-fill custom fields
|
|
114
|
+
- `customer_billing_address` - Pre-fill billing address
|
|
115
|
+
|
|
116
|
+
### Success URL Placeholder
|
|
117
|
+
```typescript
|
|
118
|
+
{
|
|
119
|
+
success_url: "https://example.com/success?checkout_id={CHECKOUT_ID}"
|
|
120
|
+
}
|
|
121
|
+
// Polar replaces {CHECKOUT_ID} with actual checkout ID
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Multi-Product Checkout
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
const session = await polar.checkouts.create({
|
|
128
|
+
products: [
|
|
129
|
+
{ product_price_id: "price_1", quantity: 1 },
|
|
130
|
+
{ product_price_id: "price_2", quantity: 2 }
|
|
131
|
+
],
|
|
132
|
+
success_url: "https://example.com/success"
|
|
133
|
+
});
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Discount Application
|
|
137
|
+
|
|
138
|
+
### Pre-apply Discount
|
|
139
|
+
```typescript
|
|
140
|
+
const session = await polar.checkouts.create({
|
|
141
|
+
product_price_id: "price_xxx",
|
|
142
|
+
discount_id: "discount_xxx",
|
|
143
|
+
success_url: "https://example.com/success"
|
|
144
|
+
});
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Allow Customer Codes
|
|
148
|
+
```typescript
|
|
149
|
+
{
|
|
150
|
+
allow_discount_codes: true // default
|
|
151
|
+
// Set to false to disable code entry
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Checkout States
|
|
156
|
+
|
|
157
|
+
- `open` - Ready for payment
|
|
158
|
+
- `confirmed` - Payment successful
|
|
159
|
+
- `expired` - Session expired (typically 24 hours)
|
|
160
|
+
|
|
161
|
+
## Events
|
|
162
|
+
|
|
163
|
+
**Webhook Events:**
|
|
164
|
+
- `checkout.created` - Session created
|
|
165
|
+
- `checkout.updated` - Session updated
|
|
166
|
+
- `order.created` - Order created after successful payment
|
|
167
|
+
- `order.paid` - Payment confirmed
|
|
168
|
+
|
|
169
|
+
**Handle Success:**
|
|
170
|
+
```typescript
|
|
171
|
+
// Listen to order.paid webhook
|
|
172
|
+
app.post('/webhook/polar', async (req, res) => {
|
|
173
|
+
const event = validateEvent(req.body, req.headers, secret);
|
|
174
|
+
|
|
175
|
+
if (event.type === 'order.paid') {
|
|
176
|
+
const order = event.data;
|
|
177
|
+
await fulfillOrder(order);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
res.json({ received: true });
|
|
181
|
+
});
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
## Best Practices
|
|
185
|
+
|
|
186
|
+
1. **Success URL:**
|
|
187
|
+
- Must be absolute URL: `https://example.com/success`
|
|
188
|
+
- Use `{CHECKOUT_ID}` placeholder to retrieve checkout details
|
|
189
|
+
- Verify payment via webhook, not just success redirect
|
|
190
|
+
|
|
191
|
+
2. **External Customer ID:**
|
|
192
|
+
- Set on first checkout
|
|
193
|
+
- Never change once set
|
|
194
|
+
- Use for all customer operations
|
|
195
|
+
- Enables customer lookup without storing Polar IDs
|
|
196
|
+
|
|
197
|
+
3. **Pre-filling Data:**
|
|
198
|
+
- Pre-fill customer info when available
|
|
199
|
+
- Reduces friction in checkout
|
|
200
|
+
- Improves conversion rates
|
|
201
|
+
|
|
202
|
+
4. **Embedded Checkout:**
|
|
203
|
+
- Provide seamless experience
|
|
204
|
+
- Match your site's theme
|
|
205
|
+
- Handle errors gracefully
|
|
206
|
+
- Show loading states
|
|
207
|
+
|
|
208
|
+
5. **Metadata:**
|
|
209
|
+
- Store tracking info (source, campaign, etc.)
|
|
210
|
+
- Link to your internal systems
|
|
211
|
+
- Use for analytics and reporting
|
|
212
|
+
|
|
213
|
+
6. **Error Handling:**
|
|
214
|
+
- Handle expired sessions
|
|
215
|
+
- Provide clear error messages
|
|
216
|
+
- Offer to create new session
|
|
217
|
+
- Log failures for debugging
|
|
218
|
+
|
|
219
|
+
7. **Mobile Optimization:**
|
|
220
|
+
- Test on mobile devices
|
|
221
|
+
- Ensure responsive design
|
|
222
|
+
- Consider mobile payment methods
|
|
223
|
+
- Test embedded checkout on mobile
|
|
224
|
+
|
|
225
|
+
## Framework Examples
|
|
226
|
+
|
|
227
|
+
### Next.js
|
|
228
|
+
```typescript
|
|
229
|
+
// app/actions/checkout.ts
|
|
230
|
+
'use server'
|
|
231
|
+
|
|
232
|
+
export async function createCheckout(productPriceId: string) {
|
|
233
|
+
const session = await polar.checkouts.create({
|
|
234
|
+
product_price_id: productPriceId,
|
|
235
|
+
success_url: `${process.env.NEXT_PUBLIC_URL}/success?checkout_id={CHECKOUT_ID}`,
|
|
236
|
+
external_customer_id: await getCurrentUserId()
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
return session.url;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// app/product/page.tsx
|
|
243
|
+
export default function ProductPage() {
|
|
244
|
+
async function handleCheckout() {
|
|
245
|
+
const url = await createCheckout(productPriceId);
|
|
246
|
+
window.location.href = url;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
return <button onClick={handleCheckout}>Buy Now</button>;
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### Laravel
|
|
254
|
+
```php
|
|
255
|
+
Route::post('/checkout', function (Request $request) {
|
|
256
|
+
$polar = new Polar(config('polar.access_token'));
|
|
257
|
+
|
|
258
|
+
$session = $polar->checkouts->create([
|
|
259
|
+
'product_price_id' => $request->input('product_price_id'),
|
|
260
|
+
'success_url' => route('checkout.success'),
|
|
261
|
+
'external_customer_id' => auth()->id(),
|
|
262
|
+
]);
|
|
263
|
+
|
|
264
|
+
return redirect($session['url']);
|
|
265
|
+
});
|
|
266
|
+
```
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# Polar Overview
|
|
2
|
+
|
|
3
|
+
Comprehensive payment & billing platform for software monetization with Merchant of Record services.
|
|
4
|
+
|
|
5
|
+
## Core Capabilities
|
|
6
|
+
|
|
7
|
+
**Platform Features:**
|
|
8
|
+
- Digital product sales (one-time, recurring, usage-based)
|
|
9
|
+
- Merchant of Record - handles global tax compliance
|
|
10
|
+
- Subscription lifecycle management
|
|
11
|
+
- Automated benefit distribution
|
|
12
|
+
- Customer self-service portal
|
|
13
|
+
- Real-time webhook system
|
|
14
|
+
- Analytics dashboard
|
|
15
|
+
- Multi-language SDKs
|
|
16
|
+
|
|
17
|
+
**Merchant of Record Benefits:**
|
|
18
|
+
- Global tax compliance (VAT, GST, sales tax)
|
|
19
|
+
- Tax calculations for all jurisdictions
|
|
20
|
+
- B2B reverse charge, B2C tax collection
|
|
21
|
+
- Invoicing from Polar to customers
|
|
22
|
+
- Payout invoicing to merchants
|
|
23
|
+
- Transparent fees (20% discount vs other MoRs)
|
|
24
|
+
|
|
25
|
+
## Authentication
|
|
26
|
+
|
|
27
|
+
### Organization Access Tokens (OAT)
|
|
28
|
+
|
|
29
|
+
**For:** Server-side API access
|
|
30
|
+
|
|
31
|
+
**Create:**
|
|
32
|
+
1. Org Settings → Developers
|
|
33
|
+
2. Create new access token
|
|
34
|
+
3. Copy and store securely
|
|
35
|
+
|
|
36
|
+
**Usage:**
|
|
37
|
+
```bash
|
|
38
|
+
Authorization: Bearer polar_xxxxxxxxxxxxxxxx
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**Security:** Never expose client-side (auto-revoked if leaked)
|
|
42
|
+
|
|
43
|
+
### OAuth 2.0
|
|
44
|
+
|
|
45
|
+
**For:** Third-party app integration
|
|
46
|
+
|
|
47
|
+
**Authorization URL:** `https://polar.sh/oauth2/authorize`
|
|
48
|
+
**Token URL:** `https://api.polar.sh/v1/oauth2/token`
|
|
49
|
+
|
|
50
|
+
**Flow:**
|
|
51
|
+
```
|
|
52
|
+
1. Redirect to authorize URL with scopes
|
|
53
|
+
2. User approves permissions
|
|
54
|
+
3. Receive authorization code
|
|
55
|
+
4. Exchange code for access_token + refresh_token
|
|
56
|
+
5. Use access_token for API calls
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Scopes:**
|
|
60
|
+
- `products:read/write` - Product management
|
|
61
|
+
- `checkouts:read/write` - Checkout operations
|
|
62
|
+
- `orders:read` - View orders
|
|
63
|
+
- `subscriptions:read/write` - Subscription management
|
|
64
|
+
- `benefits:read/write` - Benefit configuration
|
|
65
|
+
- `customers:read/write` - Customer management
|
|
66
|
+
- `discounts:read/write` - Discount codes
|
|
67
|
+
- `refunds:read/write` - Refund processing
|
|
68
|
+
|
|
69
|
+
### Customer Sessions
|
|
70
|
+
|
|
71
|
+
**For:** Customer-facing portal operations
|
|
72
|
+
|
|
73
|
+
**Create:** Server-side API call returns customer access token
|
|
74
|
+
**Usage:** Pre-authenticated customer portal links
|
|
75
|
+
**Scope:** Restricted to customer-specific operations
|
|
76
|
+
|
|
77
|
+
## Base URLs
|
|
78
|
+
|
|
79
|
+
**Production:**
|
|
80
|
+
- Dashboard: `https://polar.sh`
|
|
81
|
+
- API: `https://api.polar.sh/v1/`
|
|
82
|
+
|
|
83
|
+
**Sandbox:**
|
|
84
|
+
- Dashboard: `https://sandbox.polar.sh`
|
|
85
|
+
- API: `https://sandbox-api.polar.sh/v1/`
|
|
86
|
+
|
|
87
|
+
**SDK Configuration:**
|
|
88
|
+
```typescript
|
|
89
|
+
const polar = new Polar({
|
|
90
|
+
accessToken: process.env.POLAR_ACCESS_TOKEN,
|
|
91
|
+
server: "production" // or "sandbox"
|
|
92
|
+
});
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Rate Limits
|
|
96
|
+
|
|
97
|
+
**Limits:**
|
|
98
|
+
- 300 requests/minute per org/customer/OAuth2 client
|
|
99
|
+
- 3 requests/second for unauthenticated license validation
|
|
100
|
+
|
|
101
|
+
**Response:** HTTP 429 with `Retry-After` header
|
|
102
|
+
|
|
103
|
+
**Handling:**
|
|
104
|
+
```javascript
|
|
105
|
+
if (response.status === 429) {
|
|
106
|
+
const retryAfter = response.headers.get('Retry-After');
|
|
107
|
+
await sleep(retryAfter * 1000);
|
|
108
|
+
return retry();
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Key Concepts
|
|
113
|
+
|
|
114
|
+
### External Customer ID
|
|
115
|
+
- Map your user IDs to Polar customers
|
|
116
|
+
- Set at checkout: `external_customer_id`
|
|
117
|
+
- Query API by external_id
|
|
118
|
+
- Immutable once set
|
|
119
|
+
- Use for all customer operations
|
|
120
|
+
|
|
121
|
+
### Metadata
|
|
122
|
+
- Custom key-value storage
|
|
123
|
+
- Available on products, customers, subscriptions, orders
|
|
124
|
+
- For reporting and filtering
|
|
125
|
+
- Not indexed, use for supplementary data
|
|
126
|
+
|
|
127
|
+
### Billing Reasons
|
|
128
|
+
Track order types via `billing_reason`:
|
|
129
|
+
- `purchase` - One-time product
|
|
130
|
+
- `subscription_create` - New subscription
|
|
131
|
+
- `subscription_cycle` - Renewal invoice
|
|
132
|
+
- `subscription_update` - Plan change
|
|
133
|
+
|
|
134
|
+
## Environments
|
|
135
|
+
|
|
136
|
+
**Sandbox:**
|
|
137
|
+
- Separate account required
|
|
138
|
+
- Separate organization
|
|
139
|
+
- Separate access tokens (production tokens don't work)
|
|
140
|
+
- Test with Stripe test cards
|
|
141
|
+
|
|
142
|
+
**Test Cards (Stripe):**
|
|
143
|
+
- Success: `4242 4242 4242 4242`
|
|
144
|
+
- Decline: `4000 0000 0000 0002`
|
|
145
|
+
- Auth Required: `4000 0025 0000 3155`
|
|
146
|
+
- Expiry: Any future date
|
|
147
|
+
- CVC: Any 3 digits
|
|
148
|
+
|
|
149
|
+
## SDKs
|
|
150
|
+
|
|
151
|
+
**Official SDKs:**
|
|
152
|
+
- TypeScript/JavaScript: `@polar-sh/sdk`
|
|
153
|
+
- Python: `polar-sdk`
|
|
154
|
+
- PHP: `polar-sh/sdk`
|
|
155
|
+
- Go: Official SDK
|
|
156
|
+
|
|
157
|
+
**Framework Adapters:**
|
|
158
|
+
- Next.js: `@polar-sh/nextjs` (quickstart: `npx polar-init`)
|
|
159
|
+
- Laravel: `polar-sh/laravel`
|
|
160
|
+
- Remix, Astro, Express, TanStack Start
|
|
161
|
+
- Elysia, Fastify, Hono, SvelteKit
|
|
162
|
+
|
|
163
|
+
**BetterAuth Integration:**
|
|
164
|
+
- Package: `@polar-sh/better-auth`
|
|
165
|
+
- Auto-create customers on signup
|
|
166
|
+
- External ID mapping
|
|
167
|
+
- User-customer sync
|
|
168
|
+
|
|
169
|
+
## Support & Resources
|
|
170
|
+
|
|
171
|
+
- Docs: https://polar.sh/docs
|
|
172
|
+
- API Reference: https://polar.sh/docs/api-reference
|
|
173
|
+
- LLMs.txt: https://polar.sh/docs/llms.txt
|
|
174
|
+
- GitHub: https://github.com/polarsource/polar
|
|
175
|
+
- Discussions: https://github.com/orgs/polarsource/discussions
|
|
176
|
+
|
|
177
|
+
## Next Steps
|
|
178
|
+
|
|
179
|
+
- **For products:** Load `products.md`
|
|
180
|
+
- **For checkout:** Load `checkouts.md`
|
|
181
|
+
- **For subscriptions:** Load `subscriptions.md`
|
|
182
|
+
- **For webhooks:** Load `webhooks.md`
|
|
183
|
+
- **For benefits:** Load `benefits.md`
|
|
184
|
+
- **For SDK usage:** Load `sdk.md`
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
# Polar Products & Pricing
|
|
2
|
+
|
|
3
|
+
Product management, pricing models, and usage-based billing.
|
|
4
|
+
|
|
5
|
+
## Billing Cycles
|
|
6
|
+
|
|
7
|
+
**Options:**
|
|
8
|
+
- One-time: Charged once, forever access
|
|
9
|
+
- Monthly: Charged every month
|
|
10
|
+
- Yearly: Charged every year
|
|
11
|
+
|
|
12
|
+
**Important:** Cannot change after product creation
|
|
13
|
+
|
|
14
|
+
## Pricing Types
|
|
15
|
+
|
|
16
|
+
**Fixed Price:** Set amount
|
|
17
|
+
**Pay What You Want:** Customer decides (optional minimum)
|
|
18
|
+
**Free:** No charge
|
|
19
|
+
|
|
20
|
+
**Important:** Cannot change after product creation
|
|
21
|
+
|
|
22
|
+
## Advanced Pricing Models
|
|
23
|
+
|
|
24
|
+
### Seat-Based Pricing
|
|
25
|
+
- Team access with assignable seats
|
|
26
|
+
- Works for recurring or one-time
|
|
27
|
+
- Tiered pricing structures
|
|
28
|
+
- Customer manages seat assignments
|
|
29
|
+
|
|
30
|
+
**Configuration:**
|
|
31
|
+
```typescript
|
|
32
|
+
const product = await polar.products.create({
|
|
33
|
+
name: "Team Plan",
|
|
34
|
+
prices: [{
|
|
35
|
+
type: "recurring",
|
|
36
|
+
recurring_interval: "month",
|
|
37
|
+
price_amount: 5000, // per seat
|
|
38
|
+
pricing_type: "fixed"
|
|
39
|
+
}],
|
|
40
|
+
is_seat_based: true,
|
|
41
|
+
max_seats: 100
|
|
42
|
+
});
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Usage-Based Billing
|
|
46
|
+
|
|
47
|
+
**Architecture:** Events → Meters → Metered Prices
|
|
48
|
+
|
|
49
|
+
**1. Events:** Usage data from your application
|
|
50
|
+
```typescript
|
|
51
|
+
await polar.events.create({
|
|
52
|
+
external_customer_id: "user_123",
|
|
53
|
+
event_name: "api_call",
|
|
54
|
+
properties: {
|
|
55
|
+
tokens: 1000,
|
|
56
|
+
model: "gpt-4"
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**2. Meters:** Filter & aggregate events
|
|
62
|
+
```typescript
|
|
63
|
+
const meter = await polar.meters.create({
|
|
64
|
+
name: "API Tokens",
|
|
65
|
+
slug: "api_tokens",
|
|
66
|
+
event_name: "api_call",
|
|
67
|
+
aggregation: {
|
|
68
|
+
type: "sum",
|
|
69
|
+
property: "tokens"
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**3. Metered Prices:** Billing based on usage
|
|
75
|
+
```typescript
|
|
76
|
+
const price = await polar.products.createPrice(productId, {
|
|
77
|
+
type: "metered",
|
|
78
|
+
meter_id: meter.id,
|
|
79
|
+
price_per_unit: 10, // 10 cents per 1000 tokens
|
|
80
|
+
billing_interval: "month"
|
|
81
|
+
});
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**Credits System:**
|
|
85
|
+
- Pre-purchased usage credits
|
|
86
|
+
- Credit customer's meter balance
|
|
87
|
+
- Use as subscription benefit
|
|
88
|
+
- Balance tracking API
|
|
89
|
+
|
|
90
|
+
**Ingestion Strategies:**
|
|
91
|
+
- LLM Strategy: AI/ML tracking
|
|
92
|
+
- S3 Strategy: Bulk import
|
|
93
|
+
- Stream Strategy: Real-time
|
|
94
|
+
- Delta Time Strategy: Time-based
|
|
95
|
+
|
|
96
|
+
## Product Features
|
|
97
|
+
|
|
98
|
+
### Metadata
|
|
99
|
+
```typescript
|
|
100
|
+
const product = await polar.products.create({
|
|
101
|
+
name: "Pro Plan",
|
|
102
|
+
metadata: {
|
|
103
|
+
feature_x: "enabled",
|
|
104
|
+
tier: "pro",
|
|
105
|
+
custom_field: "value"
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Custom Fields
|
|
111
|
+
```typescript
|
|
112
|
+
const product = await polar.products.create({
|
|
113
|
+
name: "Enterprise Plan",
|
|
114
|
+
custom_fields: [
|
|
115
|
+
{
|
|
116
|
+
slug: "company_name",
|
|
117
|
+
label: "Company Name",
|
|
118
|
+
type: "text",
|
|
119
|
+
required: true
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
slug: "employees",
|
|
123
|
+
label: "Number of Employees",
|
|
124
|
+
type: "number"
|
|
125
|
+
}
|
|
126
|
+
]
|
|
127
|
+
});
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Data collected at checkout, accessible via Orders/Subscriptions API in `custom_field_data`.
|
|
131
|
+
|
|
132
|
+
### Trials
|
|
133
|
+
- Set on recurring products
|
|
134
|
+
- Customer not charged during trial
|
|
135
|
+
- Benefits granted immediately
|
|
136
|
+
- Configure at product or checkout level
|
|
137
|
+
|
|
138
|
+
```typescript
|
|
139
|
+
const product = await polar.products.create({
|
|
140
|
+
name: "Pro Plan",
|
|
141
|
+
prices: [{
|
|
142
|
+
type: "recurring",
|
|
143
|
+
recurring_interval: "month",
|
|
144
|
+
price_amount: 2000,
|
|
145
|
+
trial_period_days: 14
|
|
146
|
+
}]
|
|
147
|
+
});
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Product Operations
|
|
151
|
+
|
|
152
|
+
### Create Product
|
|
153
|
+
```typescript
|
|
154
|
+
const product = await polar.products.create({
|
|
155
|
+
organization_id: "org_xxx",
|
|
156
|
+
name: "Pro Plan",
|
|
157
|
+
description: "Professional features",
|
|
158
|
+
prices: [{
|
|
159
|
+
type: "recurring",
|
|
160
|
+
recurring_interval: "month",
|
|
161
|
+
price_amount: 2000,
|
|
162
|
+
pricing_type: "fixed"
|
|
163
|
+
}]
|
|
164
|
+
});
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### List Products
|
|
168
|
+
```typescript
|
|
169
|
+
const products = await polar.products.list({
|
|
170
|
+
organization_id: "org_xxx",
|
|
171
|
+
is_archived: false
|
|
172
|
+
});
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Update Product
|
|
176
|
+
```typescript
|
|
177
|
+
const product = await polar.products.update(productId, {
|
|
178
|
+
name: "Pro Plan Updated",
|
|
179
|
+
description: "New description"
|
|
180
|
+
});
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### Archive Product
|
|
184
|
+
```typescript
|
|
185
|
+
await polar.products.archive(productId);
|
|
186
|
+
// Products can be unarchived later
|
|
187
|
+
// Cannot be deleted (maintains order history)
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Update Benefits
|
|
191
|
+
```typescript
|
|
192
|
+
await polar.products.updateBenefits(productId, {
|
|
193
|
+
benefits: [benefitId1, benefitId2]
|
|
194
|
+
});
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Important Constraints
|
|
198
|
+
|
|
199
|
+
1. **Cannot change after creation:**
|
|
200
|
+
- Billing cycle (one-time, monthly, yearly)
|
|
201
|
+
- Pricing type (fixed, pay-what-you-want, free)
|
|
202
|
+
|
|
203
|
+
2. **Price changes don't affect existing subscribers:**
|
|
204
|
+
- Current subscribers keep their original price
|
|
205
|
+
- New subscribers get new price
|
|
206
|
+
- Use separate products for significant changes
|
|
207
|
+
|
|
208
|
+
3. **Products cannot be deleted:**
|
|
209
|
+
- Archive instead
|
|
210
|
+
- Maintains order history integrity
|
|
211
|
+
- Archived products not shown to new customers
|
|
212
|
+
|
|
213
|
+
4. **Metadata vs Custom Fields:**
|
|
214
|
+
- Metadata: For internal use, not shown to customers
|
|
215
|
+
- Custom Fields: Collected from customers at checkout
|
|
216
|
+
|
|
217
|
+
## Best Practices
|
|
218
|
+
|
|
219
|
+
1. **Product Strategy:**
|
|
220
|
+
- Plan billing cycle carefully before creation
|
|
221
|
+
- Use separate products for different tiers
|
|
222
|
+
- Archive unused products rather than delete
|
|
223
|
+
|
|
224
|
+
2. **Pricing Changes:**
|
|
225
|
+
- Create new product for major changes
|
|
226
|
+
- Grandfather existing customers
|
|
227
|
+
- Communicate changes clearly
|
|
228
|
+
|
|
229
|
+
3. **Usage-Based:**
|
|
230
|
+
- Define clear meter aggregations
|
|
231
|
+
- Set appropriate billing intervals
|
|
232
|
+
- Monitor usage patterns
|
|
233
|
+
- Provide usage dashboards to customers
|
|
234
|
+
|
|
235
|
+
4. **Custom Fields:**
|
|
236
|
+
- Collect only necessary information
|
|
237
|
+
- Validate on frontend before checkout
|
|
238
|
+
- Use for personalization and support
|
|
239
|
+
|
|
240
|
+
5. **Trials:**
|
|
241
|
+
- Set appropriate trial duration
|
|
242
|
+
- Communicate trial end clearly
|
|
243
|
+
- Notify before trial expires
|
|
244
|
+
- Easy cancellation during trial
|