[{"data":1,"prerenderedAt":1860},["ShallowReactive",2],{"navigation":3,"/integrations/general":310,"/integrations/general-surround":1654,"/types/pagination-query.type":1656,"/types/pagination-response.type":1672,"/types/features.type":1684,"T8X8wEDTTq":1740,"RlQfeeH749":1750,"R6VCIDBMAK":1760,"wYpKjgCnmI":1788,"T4B05TP7tk":1839,"yCnUmmDwpY":1850},[4,13,161,197,211,236,290,300],{"title":5,"_path":6,"children":7,"_id":12,"description":11},"Getting Started","/getting-started",[8],{"title":9,"_path":6,"_id":10,"description":11},"Overview","content:1.getting-started:1.index.md","Everything you need to know about integrating Churnkey with your product and billing stack.","content:1.getting-started:_dir.yml",{"title":14,"_path":15,"children":16,"_id":160},"Cancel Flows","/cancel-flows",[17,22,27,32,37,42,47,52,57,62,67,72,116,130],{"title":18,"_path":19,"_id":20,"description":21},"Quick Start Guide","/cancel-flows/quick-start-guide","content:2.cancel-flows:1.quick-start-guide.md","A 3-step guide on how to implement Cancel Flows in your website",{"title":23,"_path":24,"_id":25,"description":26},"Cancel Flow Structure","/cancel-flows/flow-configuration","content:2.cancel-flows:2.flow configuration.md","Learn about the available components that make up a Cancel Flow, from initial offers to cancellation confirmation, and how each step contributes to the overall flow.",{"title":28,"_path":29,"_id":30,"description":31},"Configuration Options","/cancel-flows/further-configuration","content:2.cancel-flows:3.further-configuration.md","Additional details for all of the following options are included below.",{"title":33,"_path":34,"_id":35,"description":36},"Custom Styling","/cancel-flows/custom-styling","content:2.cancel-flows:4.custom-styling.md","Brand your Churnkey Cancel Flow with your own CSS",{"title":38,"_path":39,"_id":40,"description":41},"Managed Email Flow","/cancel-flows/email-verified-cancel-flow","content:2.cancel-flows:6.email-verified-cancel-flow.md","Our managed email based setup takes care of customer verification for you with an email verification code.",{"title":43,"_path":44,"_id":45,"description":46},"A/B Testing","/cancel-flows/a-b-testing","content:2.cancel-flows:7.a-b-testing.md","Run controlled experiments to optimize your Cancel Flows and maximize customer retention.",{"title":48,"_path":49,"_id":50,"description":51},"Testing","/cancel-flows/cancel-flow-testing","content:2.cancel-flows:8.cancel-flow-testing.md","Ensure that your Cancel Flow is working as intended before going live.",{"title":53,"_path":54,"_id":55,"description":56},"Pause Wall","/cancel-flows/pause-wall","content:2.cancel-flows:9.pause-wall.md","Block access to your application during subscription pauses",{"title":58,"_path":59,"_id":60,"description":61},"Click-to-Cancel Compliance","/cancel-flows/click-to-cancel","content:2.cancel-flows:10.click-to-cancel.md","Implement automatic compliance with global subscription cancellation requirements",{"title":63,"_path":64,"_id":65,"description":66},"Structured Follow-Up Questions","/cancel-flows/structured-follow-up-questions","content:2.cancel-flows:11.structured-follow-up-questions.md","Collect deeper cancellation insights and deliver targeted retention offers with a second layer of predefined follow-up options in your cancel flow survey.",{"title":68,"_path":69,"_id":70,"description":71},"Adaptive Offers","/cancel-flows/adaptive-offers","content:2.cancel-flows:adaptive-offers.md","AI-powered discount optimization that automatically finds the perfect offer for each customer",{"title":73,"_path":74,"children":75},"Analytics","/cancel-flows/analytics",[76,81,86,91,96,101,106,111],{"title":77,"_path":78,"_id":79,"description":80},"Boosted Revenue","/cancel-flows/analytics/average-boosted-revenue","content:2.cancel-flows:analytics:1.average-boosted-revenue.md","Measure the long-term value of retained subscribers",{"title":82,"_path":83,"_id":84,"description":85},"Save Rate","/cancel-flows/analytics/save-rate","content:2.cancel-flows:analytics:2.save-rate.md","The percentage of customers that your Cancel Flows saved from cancellation",{"title":87,"_path":88,"_id":89,"description":90},"Reactivation Rate","/cancel-flows/analytics/reactivation-rate","content:2.cancel-flows:analytics:3.reactivation-rate.md","The percentage of customers who pay at least one invoice after being saved",{"title":92,"_path":93,"_id":94,"description":95},"Sessions","/cancel-flows/analytics/session-outcomes","content:2.cancel-flows:analytics:4.session-outcomes.md","Track each interaction that a customer has with your Cancel Flows",{"title":97,"_path":98,"_id":99,"description":100},"Cancellation Trends","/cancel-flows/analytics/cancellation-trends","content:2.cancel-flows:analytics:5.cancellation-trends.md","Analyze and interpret the selection rates and trends for cancellation reasons in your Cancel Flows.",{"title":102,"_path":103,"_id":104,"description":105},"Feedback AI","/cancel-flows/analytics/feedback-ai","content:2.cancel-flows:analytics:6.feedback-ai.md","Transform customer feedback into actionable insights with AI-powered categorization and analysis",{"title":107,"_path":108,"_id":109,"description":110},"Response Flow","/cancel-flows/analytics/response-flow","content:2.cancel-flows:analytics:7.response-flow.md","Visualize how customers move from primary cancellation reasons to specific follow-up selections with the Sankey diagram",{"title":112,"_path":113,"_id":114,"description":115},"Response Explorer","/cancel-flows/analytics/response-explorer","content:2.cancel-flows:analytics:8.response-explorer.md","Drill into individual follow-up responses with the Treemap visualization, search, trend analysis, and MRR impact sorting",{"title":117,"_path":118,"children":119},"Multi Language Support","/cancel-flows/multi-language-support",[120,125],{"title":121,"_path":122,"_id":123,"description":124},"Manual Translations","/cancel-flows/multi-language-support/multi-language-support","content:2.cancel-flows:multi-language-support:5.multi-language-support.md","Support multiple languages.",{"title":126,"_path":127,"_id":128,"description":129},"Automatic Translations","/cancel-flows/multi-language-support/automatic-translation","content:2.cancel-flows:multi-language-support:automatic-translation.md","Enable AI-powered multilingual support for your Cancel Flows with a single toggle.",{"title":131,"_path":132,"children":133,"_id":159},"Offers","/cancel-flows/offers",[134,139,144,149,154],{"title":135,"_path":136,"_id":137,"description":138},"Discount","/cancel-flows/offers/discounts","content:2.cancel-flows:offers:discounts.md","Offer targeted subscription discounts to reduce churn and increase customer retention",{"title":140,"_path":141,"_id":142,"description":143},"Hidden Plans","/cancel-flows/offers/hidden-plans","content:2.cancel-flows:offers:hidden-plans.md","Use the Switch Subscription Plan offer to present exclusive, non-public plans to customers during cancellation",{"title":145,"_path":146,"_id":147,"description":148},"Pause Subscription","/cancel-flows/offers/pause-subscription","content:2.cancel-flows:offers:pause-subscription.md","Temporarily suspend subscription payments without canceling the service",{"title":150,"_path":151,"_id":152,"description":153},"Switch Subscription Plan","/cancel-flows/offers/switch-subscription","content:2.cancel-flows:offers:switch-subscription.md","Allow customers to change to a different subscription plan during the cancellation flow to retain them with a more suitable option",{"title":155,"_path":156,"_id":157,"description":158},"Trial Extension","/cancel-flows/offers/trial-extension","content:2.cancel-flows:offers:trial-extension.md","Extend customer trial periods to reduce churn and increase conversion rates during the critical trial-to-paid transition","content:2.cancel-flows:offers:_dir.yml","content:2.cancel-flows:_dir.yml",{"title":162,"_path":163,"children":164,"_id":196},"Payment Recovery","/failed-payment-recovery",[165,169,174,179,184,188],{"title":5,"_path":166,"_id":167,"description":168},"/failed-payment-recovery/payment-recovery","content:3.failed-payment-recovery:1.payment-recovery.md","Recover failed payment revenue, automatically.",{"title":170,"_path":171,"_id":172,"description":173},"Customize your Campaigns","/failed-payment-recovery/campaign-customization","content:3.failed-payment-recovery:2.campaign-customization.md","Customize your Payment Recovery Campaigns to match the unique needs of your individual customers.",{"title":175,"_path":176,"_id":177,"description":178},"Failed Payment Wall","/failed-payment-recovery/failed-payment-wall","content:3.failed-payment-recovery:3.failed-payment-wall.md","Block access to your application when payments fail",{"title":180,"_path":181,"_id":182,"description":183},"Billing Contact API","/failed-payment-recovery/billing-contact-api","content:3.failed-payment-recovery:4.billing-contact-api.md","Send Payment Recovery emails to multiple billing contacts",{"title":43,"_path":185,"_id":186,"description":187},"/failed-payment-recovery/ab-testing","content:3.failed-payment-recovery:5.ab-testing.md","Optimize your payment recovery campaigns through controlled experiments that maximize revenue recovery.",{"title":73,"_path":189,"children":190},"/failed-payment-recovery/analytics",[191],{"title":192,"_path":193,"_id":194,"description":195},"Overall Performance","/failed-payment-recovery/analytics/overview","content:3.failed-payment-recovery:analytics:1.overview.md","Key performance metrics for your Payment Recovery campaigns","content:3.failed-payment-recovery:_dir.yml",{"title":198,"_path":199,"children":200,"_id":210},"Reactivations","/reactivations",[201,205],{"title":5,"_path":202,"_id":203,"description":204},"/reactivations/reactivations","content:4.reactivations:1.reactivations.md","Churnkey helps you to recover unsubscribed customers with easy, customizable Reactivation Email Campaigns.",{"title":206,"_path":207,"_id":208,"description":209},"Customization","/reactivations/campaign-customization-guide","content:4.reactivations:2.campaign-customization-guide.md","Customize your Reactivation Campaigns to match the individual needs of your customers.","content:4.reactivations:_dir.yml",{"title":212,"_path":213,"children":214,"_id":235},"Data Integrations","/data-integrations",[215,220,225,230],{"title":216,"_path":217,"_id":218,"description":219},"Data API","/data-integrations/data-api","content:6.data-integrations:1.data-api.md","Access your data through our API.",{"title":221,"_path":222,"_id":223,"description":224},"Slack notifications","/data-integrations/slack","content:6.data-integrations:2.slack.md","Connect Churnkey with your organization's Slack and to send session notifications to a specific channel.",{"title":226,"_path":227,"_id":228,"description":229},"Webhooks","/data-integrations/webhooks","content:6.data-integrations:2.webhooks.md","Churnkey can send webhooks to automatically notify your application whenever a customer completes a session.",{"title":231,"_path":232,"_id":233,"description":234},"Event Tracking","/data-integrations/event-tracking","content:6.data-integrations:3.event-tracking.md","Track your customers' key-value metrics on a per customer basis.","content:6.data-integrations:_dir.yml",{"title":237,"_path":238,"children":239,"_id":289},"Billing Providers","/billing-providers",[240,245,250,255,260,265,270,275],{"title":241,"_path":242,"_id":243,"description":244},"Payment Providers","/billing-providers/payment-provider-overview","content:7.billing-providers:1.payment-provider-overview.md","Feature support for Stripe, Chargebee, Paddle, and Braintree",{"title":246,"_path":247,"_id":248,"description":249},"Stripe","/billing-providers/stripe","content:7.billing-providers:3.stripe.md","Integrate Churnkey with your Stripe account",{"title":251,"_path":252,"_id":253,"description":254},"Chargebee","/billing-providers/chargebee","content:7.billing-providers:4.chargebee.md","Integrate Churnkey with your Chargebee account",{"title":256,"_path":257,"_id":258,"description":259},"Paddle Classic","/billing-providers/paddle-classic","content:7.billing-providers:5.paddle-classic.md","Integrate Churnkey with your Paddle Classic account",{"title":261,"_path":262,"_id":263,"description":264},"Paddle Billing","/billing-providers/paddle-billing","content:7.billing-providers:6.paddle-billing.md","Integrate Churnkey with your Paddle Billing account",{"title":266,"_path":267,"_id":268,"description":269},"Braintree","/billing-providers/braintree","content:7.billing-providers:7.braintree.md","Integrate Churnkey with your Braintree account",{"title":271,"_path":272,"_id":273,"description":274},"Maxio","/billing-providers/maxio","content:7.billing-providers:8.maxio.md","Integrate Churnkey with your Maxio (formerly Chargify) account",{"title":276,"_path":277,"children":278},"Direct Connect","/billing-providers/direct-connect",[279,284],{"title":280,"_path":281,"_id":282,"description":283},"Churnkey Direct","/billing-providers/direct-connect/direct","content:7.billing-providers:9.direct-connect:1.direct.md","Integrate Churnkey with any billing system using Direct mode",{"title":285,"_path":286,"_id":287,"description":288},"Direct Mode Examples","/billing-providers/direct-connect/direct-examples","content:7.billing-providers:9.direct-connect:2.direct-examples.md","Real-world examples for common subscription scenarios","content:7.billing-providers:_dir.yml",{"title":291,"_path":292,"children":293,"_id":299},"Account","/account",[294],{"title":295,"_path":296,"_id":297,"description":298},"Multi-Workspace Support","/account/multi-workspace-support","content:8.account:1.multi-workspace-support.md","Use one email address to access multiple Churnkey workspaces and switch between them instantly.","content:8.account:_dir.yml",{"title":301,"_path":302,"children":303,"_id":309},"Support","/support",[304],{"title":305,"_path":306,"_id":307,"description":308},"Frequently Asked Questions","/support/faqs","content:9.support:1.faqs.md","We want setting up Churnkey to be a breeze.","content:9.support:_dir.yml",{"_path":311,"_dir":312,"_draft":313,"_partial":313,"_locale":314,"title":315,"description":316,"navigation":313,"body":317,"_type":1647,"_id":1648,"_source":1649,"_file":1650,"_stem":1651,"_extension":1652,"sitemap":1653},"/integrations/general","integrations",false,"","Integration Basics","Learn the core concepts and requirements for building a Churnkey integration.",{"type":318,"children":319,"toc":1634},"root",[320,329,335,776,782,795,802,807,849,859,865,870,878,884,889,960,965,1013,1019,1032,1074,1079,1085,1098,1123,1128,1134,1147,1155,1160,1178,1184,1197,1398,1404,1409,1628],{"type":321,"tag":322,"props":323,"children":325},"element","h2",{"id":324},"project-structure",[326],{"type":327,"value":328},"text","Project Structure",{"type":321,"tag":330,"props":331,"children":332},"p",{},[333],{"type":327,"value":334},"We recommend organizing your integration code in the following structure:",{"type":321,"tag":336,"props":337,"children":341},"pre",{"className":338,"code":339,"language":340,"meta":314,"style":314},"language-bash shiki shiki-themes github-light-default github-light-default github-dark-default","churnkey/\n├── controllers/      # Data access endpoints\n│   ├── Customers.ts\n│   ├── Prices.ts\n│   ├── Subscriptions.ts\n│   ├── Coupons.ts   # optional\n│   ├── Families.ts  # optional\n|   └── Products.ts  # optional\n├── models/          # Data models\n│   ├── Customer.ts\n│   ├── Price.ts\n│   ├── Subscription.ts\n│   ├── Coupon.ts    # optional\n│   ├── Family.ts    # optional\n│   └── Product.ts   # optional\n├── actions/         # Subscription modifications\n│   ├── Cancel.ts    # optional\n│   ├── ApplyCoupon.ts  # optional\n│   ├── ExtendTrial.ts  # optional\n│   ├── ChangePrice.ts  # optional\n│   └── Pause.ts     # optional\n└── index.ts        # Integration entry point\n","bash",[342],{"type":321,"tag":343,"props":344,"children":345},"code",{"__ignoreMap":314},[346,358,379,398,415,432,454,476,500,518,535,552,569,591,612,633,651,672,693,714,735,757],{"type":321,"tag":347,"props":348,"children":351},"span",{"class":349,"line":350},"line",1,[352],{"type":321,"tag":347,"props":353,"children":355},{"style":354},"--shiki-light:#953800;--shiki-default:#953800;--shiki-dark:#FFA657",[356],{"type":327,"value":357},"churnkey/\n",{"type":321,"tag":347,"props":359,"children":361},{"class":349,"line":360},2,[362,367,373],{"type":321,"tag":347,"props":363,"children":364},{"style":354},[365],{"type":327,"value":366},"├──",{"type":321,"tag":347,"props":368,"children":370},{"style":369},"--shiki-light:#0A3069;--shiki-default:#0A3069;--shiki-dark:#A5D6FF",[371],{"type":327,"value":372}," controllers/",{"type":321,"tag":347,"props":374,"children":376},{"style":375},"--shiki-light:#6E7781;--shiki-default:#6E7781;--shiki-dark:#8B949E",[377],{"type":327,"value":378},"      # Data access endpoints\n",{"type":321,"tag":347,"props":380,"children":382},{"class":349,"line":381},3,[383,388,393],{"type":321,"tag":347,"props":384,"children":385},{"style":354},[386],{"type":327,"value":387},"│",{"type":321,"tag":347,"props":389,"children":390},{"style":369},[391],{"type":327,"value":392},"   ├──",{"type":321,"tag":347,"props":394,"children":395},{"style":369},[396],{"type":327,"value":397}," Customers.ts\n",{"type":321,"tag":347,"props":399,"children":401},{"class":349,"line":400},4,[402,406,410],{"type":321,"tag":347,"props":403,"children":404},{"style":354},[405],{"type":327,"value":387},{"type":321,"tag":347,"props":407,"children":408},{"style":369},[409],{"type":327,"value":392},{"type":321,"tag":347,"props":411,"children":412},{"style":369},[413],{"type":327,"value":414}," Prices.ts\n",{"type":321,"tag":347,"props":416,"children":418},{"class":349,"line":417},5,[419,423,427],{"type":321,"tag":347,"props":420,"children":421},{"style":354},[422],{"type":327,"value":387},{"type":321,"tag":347,"props":424,"children":425},{"style":369},[426],{"type":327,"value":392},{"type":321,"tag":347,"props":428,"children":429},{"style":369},[430],{"type":327,"value":431}," Subscriptions.ts\n",{"type":321,"tag":347,"props":433,"children":435},{"class":349,"line":434},6,[436,440,444,449],{"type":321,"tag":347,"props":437,"children":438},{"style":354},[439],{"type":327,"value":387},{"type":321,"tag":347,"props":441,"children":442},{"style":369},[443],{"type":327,"value":392},{"type":321,"tag":347,"props":445,"children":446},{"style":369},[447],{"type":327,"value":448}," Coupons.ts",{"type":321,"tag":347,"props":450,"children":451},{"style":375},[452],{"type":327,"value":453},"   # optional\n",{"type":321,"tag":347,"props":455,"children":457},{"class":349,"line":456},7,[458,462,466,471],{"type":321,"tag":347,"props":459,"children":460},{"style":354},[461],{"type":327,"value":387},{"type":321,"tag":347,"props":463,"children":464},{"style":369},[465],{"type":327,"value":392},{"type":321,"tag":347,"props":467,"children":468},{"style":369},[469],{"type":327,"value":470}," Families.ts",{"type":321,"tag":347,"props":472,"children":473},{"style":375},[474],{"type":327,"value":475},"  # optional\n",{"type":321,"tag":347,"props":477,"children":479},{"class":349,"line":478},8,[480,486,491,496],{"type":321,"tag":347,"props":481,"children":483},{"style":482},"--shiki-light:#CF222E;--shiki-default:#CF222E;--shiki-dark:#FF7B72",[484],{"type":327,"value":485},"|",{"type":321,"tag":347,"props":487,"children":488},{"style":354},[489],{"type":327,"value":490},"   └──",{"type":321,"tag":347,"props":492,"children":493},{"style":369},[494],{"type":327,"value":495}," Products.ts",{"type":321,"tag":347,"props":497,"children":498},{"style":375},[499],{"type":327,"value":475},{"type":321,"tag":347,"props":501,"children":503},{"class":349,"line":502},9,[504,508,513],{"type":321,"tag":347,"props":505,"children":506},{"style":354},[507],{"type":327,"value":366},{"type":321,"tag":347,"props":509,"children":510},{"style":369},[511],{"type":327,"value":512}," models/",{"type":321,"tag":347,"props":514,"children":515},{"style":375},[516],{"type":327,"value":517},"          # Data models\n",{"type":321,"tag":347,"props":519,"children":521},{"class":349,"line":520},10,[522,526,530],{"type":321,"tag":347,"props":523,"children":524},{"style":354},[525],{"type":327,"value":387},{"type":321,"tag":347,"props":527,"children":528},{"style":369},[529],{"type":327,"value":392},{"type":321,"tag":347,"props":531,"children":532},{"style":369},[533],{"type":327,"value":534}," Customer.ts\n",{"type":321,"tag":347,"props":536,"children":538},{"class":349,"line":537},11,[539,543,547],{"type":321,"tag":347,"props":540,"children":541},{"style":354},[542],{"type":327,"value":387},{"type":321,"tag":347,"props":544,"children":545},{"style":369},[546],{"type":327,"value":392},{"type":321,"tag":347,"props":548,"children":549},{"style":369},[550],{"type":327,"value":551}," Price.ts\n",{"type":321,"tag":347,"props":553,"children":555},{"class":349,"line":554},12,[556,560,564],{"type":321,"tag":347,"props":557,"children":558},{"style":354},[559],{"type":327,"value":387},{"type":321,"tag":347,"props":561,"children":562},{"style":369},[563],{"type":327,"value":392},{"type":321,"tag":347,"props":565,"children":566},{"style":369},[567],{"type":327,"value":568}," Subscription.ts\n",{"type":321,"tag":347,"props":570,"children":572},{"class":349,"line":571},13,[573,577,581,586],{"type":321,"tag":347,"props":574,"children":575},{"style":354},[576],{"type":327,"value":387},{"type":321,"tag":347,"props":578,"children":579},{"style":369},[580],{"type":327,"value":392},{"type":321,"tag":347,"props":582,"children":583},{"style":369},[584],{"type":327,"value":585}," Coupon.ts",{"type":321,"tag":347,"props":587,"children":588},{"style":375},[589],{"type":327,"value":590},"    # optional\n",{"type":321,"tag":347,"props":592,"children":594},{"class":349,"line":593},14,[595,599,603,608],{"type":321,"tag":347,"props":596,"children":597},{"style":354},[598],{"type":327,"value":387},{"type":321,"tag":347,"props":600,"children":601},{"style":369},[602],{"type":327,"value":392},{"type":321,"tag":347,"props":604,"children":605},{"style":369},[606],{"type":327,"value":607}," Family.ts",{"type":321,"tag":347,"props":609,"children":610},{"style":375},[611],{"type":327,"value":590},{"type":321,"tag":347,"props":613,"children":615},{"class":349,"line":614},15,[616,620,624,629],{"type":321,"tag":347,"props":617,"children":618},{"style":354},[619],{"type":327,"value":387},{"type":321,"tag":347,"props":621,"children":622},{"style":369},[623],{"type":327,"value":490},{"type":321,"tag":347,"props":625,"children":626},{"style":369},[627],{"type":327,"value":628}," Product.ts",{"type":321,"tag":347,"props":630,"children":631},{"style":375},[632],{"type":327,"value":453},{"type":321,"tag":347,"props":634,"children":636},{"class":349,"line":635},16,[637,641,646],{"type":321,"tag":347,"props":638,"children":639},{"style":354},[640],{"type":327,"value":366},{"type":321,"tag":347,"props":642,"children":643},{"style":369},[644],{"type":327,"value":645}," actions/",{"type":321,"tag":347,"props":647,"children":648},{"style":375},[649],{"type":327,"value":650},"         # Subscription modifications\n",{"type":321,"tag":347,"props":652,"children":654},{"class":349,"line":653},17,[655,659,663,668],{"type":321,"tag":347,"props":656,"children":657},{"style":354},[658],{"type":327,"value":387},{"type":321,"tag":347,"props":660,"children":661},{"style":369},[662],{"type":327,"value":392},{"type":321,"tag":347,"props":664,"children":665},{"style":369},[666],{"type":327,"value":667}," Cancel.ts",{"type":321,"tag":347,"props":669,"children":670},{"style":375},[671],{"type":327,"value":590},{"type":321,"tag":347,"props":673,"children":675},{"class":349,"line":674},18,[676,680,684,689],{"type":321,"tag":347,"props":677,"children":678},{"style":354},[679],{"type":327,"value":387},{"type":321,"tag":347,"props":681,"children":682},{"style":369},[683],{"type":327,"value":392},{"type":321,"tag":347,"props":685,"children":686},{"style":369},[687],{"type":327,"value":688}," ApplyCoupon.ts",{"type":321,"tag":347,"props":690,"children":691},{"style":375},[692],{"type":327,"value":475},{"type":321,"tag":347,"props":694,"children":696},{"class":349,"line":695},19,[697,701,705,710],{"type":321,"tag":347,"props":698,"children":699},{"style":354},[700],{"type":327,"value":387},{"type":321,"tag":347,"props":702,"children":703},{"style":369},[704],{"type":327,"value":392},{"type":321,"tag":347,"props":706,"children":707},{"style":369},[708],{"type":327,"value":709}," ExtendTrial.ts",{"type":321,"tag":347,"props":711,"children":712},{"style":375},[713],{"type":327,"value":475},{"type":321,"tag":347,"props":715,"children":717},{"class":349,"line":716},20,[718,722,726,731],{"type":321,"tag":347,"props":719,"children":720},{"style":354},[721],{"type":327,"value":387},{"type":321,"tag":347,"props":723,"children":724},{"style":369},[725],{"type":327,"value":392},{"type":321,"tag":347,"props":727,"children":728},{"style":369},[729],{"type":327,"value":730}," ChangePrice.ts",{"type":321,"tag":347,"props":732,"children":733},{"style":375},[734],{"type":327,"value":475},{"type":321,"tag":347,"props":736,"children":738},{"class":349,"line":737},21,[739,743,747,752],{"type":321,"tag":347,"props":740,"children":741},{"style":354},[742],{"type":327,"value":387},{"type":321,"tag":347,"props":744,"children":745},{"style":369},[746],{"type":327,"value":490},{"type":321,"tag":347,"props":748,"children":749},{"style":369},[750],{"type":327,"value":751}," Pause.ts",{"type":321,"tag":347,"props":753,"children":754},{"style":375},[755],{"type":327,"value":756},"     # optional\n",{"type":321,"tag":347,"props":758,"children":760},{"class":349,"line":759},22,[761,766,771],{"type":321,"tag":347,"props":762,"children":763},{"style":354},[764],{"type":327,"value":765},"└──",{"type":321,"tag":347,"props":767,"children":768},{"style":369},[769],{"type":327,"value":770}," index.ts",{"type":321,"tag":347,"props":772,"children":773},{"style":375},[774],{"type":327,"value":775},"        # Integration entry point\n",{"type":321,"tag":322,"props":777,"children":779},{"id":778},"pagination",[780],{"type":327,"value":781},"Pagination",{"type":321,"tag":330,"props":783,"children":784},{},[785,787,793],{"type":327,"value":786},"All list endpoints should support pagination to handle large datasets efficiently. Each ",{"type":321,"tag":343,"props":788,"children":790},{"className":789},[],[791],{"type":327,"value":792},"list()",{"type":327,"value":794}," method accepts pagination parameters and returns a paginated response. You can skip implementation of pagination if you are sure that the number of items will be small. However, it is strongly recommended to implement pagination just in case.",{"type":321,"tag":796,"props":797,"children":799},"h3",{"id":798},"request-parameters",[800],{"type":327,"value":801},"Request Parameters",{"type":321,"tag":330,"props":803,"children":804},{},[805],{"type":327,"value":806},"Pagination is controlled through query parameters:",{"type":321,"tag":336,"props":808,"children":810},{"className":338,"code":809,"language":340,"meta":314,"style":314},"GET /churnkey/customers?limit=10&cursor=abc123\n",[811],{"type":321,"tag":343,"props":812,"children":813},{"__ignoreMap":314},[814],{"type":321,"tag":347,"props":815,"children":816},{"class":349,"line":350},[817,822,827,833,839,844],{"type":321,"tag":347,"props":818,"children":819},{"style":354},[820],{"type":327,"value":821},"GET",{"type":321,"tag":347,"props":823,"children":824},{"style":369},[825],{"type":327,"value":826}," /churnkey/customers?limit=",{"type":321,"tag":347,"props":828,"children":830},{"style":829},"--shiki-light:#0550AE;--shiki-default:#0550AE;--shiki-dark:#79C0FF",[831],{"type":327,"value":832},"10",{"type":321,"tag":347,"props":834,"children":836},{"style":835},"--shiki-light:#1F2328;--shiki-default:#1F2328;--shiki-dark:#E6EDF3",[837],{"type":327,"value":838},"&cursor",{"type":321,"tag":347,"props":840,"children":841},{"style":482},[842],{"type":327,"value":843},"=",{"type":321,"tag":347,"props":845,"children":846},{"style":369},[847],{"type":327,"value":848},"abc123\n",{"type":321,"tag":850,"props":851,"children":853},"collapsible",{"name":852},"Query Parameters",[854],{"type":321,"tag":855,"props":856,"children":858},"field-schema",{"schema":857},"/types/pagination-query.type",[],{"type":321,"tag":796,"props":860,"children":862},{"id":861},"response-format",[863],{"type":327,"value":864},"Response Format",{"type":321,"tag":330,"props":866,"children":867},{},[868],{"type":327,"value":869},"List endpoints return paginated responses in this format:",{"type":321,"tag":850,"props":871,"children":873},{"name":872},"Response Structure",[874],{"type":321,"tag":855,"props":875,"children":877},{"schema":876},"/types/pagination-response.type",[],{"type":321,"tag":322,"props":879,"children":881},{"id":880},"error-handling",[882],{"type":327,"value":883},"Error Handling",{"type":321,"tag":330,"props":885,"children":886},{},[887],{"type":327,"value":888},"When an error occurs, return an appropriate HTTP status code along with a structured error response:",{"type":321,"tag":336,"props":890,"children":894},{"className":891,"code":892,"language":893,"meta":314,"style":314},"language-json shiki shiki-themes github-light-default github-light-default github-dark-default","{\n  \"code\": 500, // HTTP status code\n  \"message\": \"A human-readable error message\"\n}\n","json",[895],{"type":321,"tag":343,"props":896,"children":897},{"__ignoreMap":314},[898,906,935,952],{"type":321,"tag":347,"props":899,"children":900},{"class":349,"line":350},[901],{"type":321,"tag":347,"props":902,"children":903},{"style":835},[904],{"type":327,"value":905},"{\n",{"type":321,"tag":347,"props":907,"children":908},{"class":349,"line":360},[909,915,920,925,930],{"type":321,"tag":347,"props":910,"children":912},{"style":911},"--shiki-light:#116329;--shiki-default:#116329;--shiki-dark:#7EE787",[913],{"type":327,"value":914},"  \"code\"",{"type":321,"tag":347,"props":916,"children":917},{"style":835},[918],{"type":327,"value":919},": ",{"type":321,"tag":347,"props":921,"children":922},{"style":829},[923],{"type":327,"value":924},"500",{"type":321,"tag":347,"props":926,"children":927},{"style":835},[928],{"type":327,"value":929},", ",{"type":321,"tag":347,"props":931,"children":932},{"style":375},[933],{"type":327,"value":934},"// HTTP status code\n",{"type":321,"tag":347,"props":936,"children":937},{"class":349,"line":381},[938,943,947],{"type":321,"tag":347,"props":939,"children":940},{"style":911},[941],{"type":327,"value":942},"  \"message\"",{"type":321,"tag":347,"props":944,"children":945},{"style":835},[946],{"type":327,"value":919},{"type":321,"tag":347,"props":948,"children":949},{"style":369},[950],{"type":327,"value":951},"\"A human-readable error message\"\n",{"type":321,"tag":347,"props":953,"children":954},{"class":349,"line":400},[955],{"type":321,"tag":347,"props":956,"children":957},{"style":835},[958],{"type":327,"value":959},"}\n",{"type":321,"tag":330,"props":961,"children":962},{},[963],{"type":327,"value":964},"Common status codes:",{"type":321,"tag":966,"props":967,"children":968},"ul",{},[969,981,992,1003],{"type":321,"tag":970,"props":971,"children":972},"li",{},[973,979],{"type":321,"tag":343,"props":974,"children":976},{"className":975},[],[977],{"type":327,"value":978},"400",{"type":327,"value":980}," - Bad Request (invalid parameters)",{"type":321,"tag":970,"props":982,"children":983},{},[984,990],{"type":321,"tag":343,"props":985,"children":987},{"className":986},[],[988],{"type":327,"value":989},"401",{"type":327,"value":991}," - Unauthorized (invalid or missing token)",{"type":321,"tag":970,"props":993,"children":994},{},[995,1001],{"type":321,"tag":343,"props":996,"children":998},{"className":997},[],[999],{"type":327,"value":1000},"404",{"type":327,"value":1002}," - Not Found (resource doesn't exist)",{"type":321,"tag":970,"props":1004,"children":1005},{},[1006,1011],{"type":321,"tag":343,"props":1007,"children":1009},{"className":1008},[],[1010],{"type":327,"value":924},{"type":327,"value":1012}," - Internal Server Error",{"type":321,"tag":322,"props":1014,"children":1016},{"id":1015},"test-mode",[1017],{"type":327,"value":1018},"Test Mode",{"type":321,"tag":330,"props":1020,"children":1021},{},[1022,1024,1030],{"type":327,"value":1023},"Every request includes an ",{"type":321,"tag":343,"props":1025,"children":1027},{"className":1026},[],[1028],{"type":327,"value":1029},"X-Churnkey-Mode",{"type":327,"value":1031}," header indicating whether it's a test or live request:",{"type":321,"tag":336,"props":1033,"children":1035},{"className":338,"code":1034,"language":340,"meta":314,"style":314},"X-Churnkey-Mode: test   # Test mode\nX-Churnkey-Mode: live   # Live mode (default)\n",[1036],{"type":321,"tag":343,"props":1037,"children":1038},{"__ignoreMap":314},[1039,1057],{"type":321,"tag":347,"props":1040,"children":1041},{"class":349,"line":350},[1042,1047,1052],{"type":321,"tag":347,"props":1043,"children":1044},{"style":354},[1045],{"type":327,"value":1046},"X-Churnkey-Mode:",{"type":321,"tag":347,"props":1048,"children":1049},{"style":369},[1050],{"type":327,"value":1051}," test",{"type":321,"tag":347,"props":1053,"children":1054},{"style":375},[1055],{"type":327,"value":1056},"   # Test mode\n",{"type":321,"tag":347,"props":1058,"children":1059},{"class":349,"line":360},[1060,1064,1069],{"type":321,"tag":347,"props":1061,"children":1062},{"style":354},[1063],{"type":327,"value":1046},{"type":321,"tag":347,"props":1065,"children":1066},{"style":369},[1067],{"type":327,"value":1068}," live",{"type":321,"tag":347,"props":1070,"children":1071},{"style":375},[1072],{"type":327,"value":1073},"   # Live mode (default)\n",{"type":321,"tag":330,"props":1075,"children":1076},{},[1077],{"type":327,"value":1078},"Use this header to determine which environment (test or production) to use for your billing system operations. Test mode must be explicitly enabled in the Churnkey dashboard.",{"type":321,"tag":322,"props":1080,"children":1082},{"id":1081},"authentication",[1083],{"type":327,"value":1084},"Authentication",{"type":321,"tag":330,"props":1086,"children":1087},{},[1088,1090,1096],{"type":327,"value":1089},"Every request to your integration endpoints will include an ",{"type":321,"tag":343,"props":1091,"children":1093},{"className":1092},[],[1094],{"type":327,"value":1095},"Authorization",{"type":327,"value":1097}," header with your integration token:",{"type":321,"tag":336,"props":1099,"children":1101},{"className":338,"code":1100,"language":340,"meta":314,"style":314},"Authorization: Bearer your_integration_token\n",[1102],{"type":321,"tag":343,"props":1103,"children":1104},{"__ignoreMap":314},[1105],{"type":321,"tag":347,"props":1106,"children":1107},{"class":349,"line":350},[1108,1113,1118],{"type":321,"tag":347,"props":1109,"children":1110},{"style":354},[1111],{"type":327,"value":1112},"Authorization:",{"type":321,"tag":347,"props":1114,"children":1115},{"style":369},[1116],{"type":327,"value":1117}," Bearer",{"type":321,"tag":347,"props":1119,"children":1120},{"style":369},[1121],{"type":327,"value":1122}," your_integration_token\n",{"type":321,"tag":330,"props":1124,"children":1125},{},[1126],{"type":327,"value":1127},"Verify this token matches the one from your Churnkey dashboard before processing any requests.",{"type":321,"tag":322,"props":1129,"children":1131},{"id":1130},"features-manifest",[1132],{"type":327,"value":1133},"Features Manifest",{"type":321,"tag":330,"props":1135,"children":1136},{},[1137,1139,1145],{"type":327,"value":1138},"Your integration must expose a ",{"type":321,"tag":343,"props":1140,"children":1142},{"className":1141},[],[1143],{"type":327,"value":1144},"/churnkey/features",{"type":327,"value":1146}," endpoint that describes which functionality is supported. This helps Churnkey understand which Cancel Flow options to enable.",{"type":321,"tag":850,"props":1148,"children":1150},{"name":1149},"Features Schema",[1151],{"type":321,"tag":855,"props":1152,"children":1154},{"schema":1153},"/types/features.type.json",[],{"type":321,"tag":330,"props":1156,"children":1157},{},[1158],{"type":327,"value":1159},"The manifest includes:",{"type":321,"tag":966,"props":1161,"children":1162},{},[1163,1168,1173],{"type":321,"tag":970,"props":1164,"children":1165},{},[1166],{"type":327,"value":1167},"Supported controllers (required and optional)",{"type":321,"tag":970,"props":1169,"children":1170},{},[1171],{"type":327,"value":1172},"Available actions and their configurations",{"type":321,"tag":970,"props":1174,"children":1175},{},[1176],{"type":327,"value":1177},"Supported features for each action (e.g., immediate vs end-of-period cancellation)",{"type":321,"tag":322,"props":1179,"children":1181},{"id":1180},"implementing-context",[1182],{"type":327,"value":1183},"Implementing Context",{"type":321,"tag":330,"props":1185,"children":1186},{},[1187,1189,1195],{"type":327,"value":1188},"Your custom context should extend the SDK ",{"type":321,"tag":343,"props":1190,"children":1192},{"className":1191},[],[1193],{"type":327,"value":1194},"Integrator.Context",{"type":327,"value":1196}," class. You can add any properties/methods you need to the context object.",{"type":321,"tag":336,"props":1198,"children":1202},{"className":1199,"code":1200,"language":1201,"meta":314,"style":314},"language-typescript shiki shiki-themes github-light-default github-light-default github-dark-default","import { Integrator } from '@churnkey/sdk'\nexport class Context extends Integrator.Context {\n    db: DbConnection\n    constructor(mode: Integrator.Mode, db: DbConnection) {\n        super(mode)\n        this.db = db\n    }\n}\n","typescript",[1203],{"type":321,"tag":343,"props":1204,"children":1205},{"__ignoreMap":314},[1206,1229,1272,1290,1348,1361,1383,1391],{"type":321,"tag":347,"props":1207,"children":1208},{"class":349,"line":350},[1209,1214,1219,1224],{"type":321,"tag":347,"props":1210,"children":1211},{"style":482},[1212],{"type":327,"value":1213},"import",{"type":321,"tag":347,"props":1215,"children":1216},{"style":835},[1217],{"type":327,"value":1218}," { Integrator } ",{"type":321,"tag":347,"props":1220,"children":1221},{"style":482},[1222],{"type":327,"value":1223},"from",{"type":321,"tag":347,"props":1225,"children":1226},{"style":369},[1227],{"type":327,"value":1228}," '@churnkey/sdk'\n",{"type":321,"tag":347,"props":1230,"children":1231},{"class":349,"line":360},[1232,1237,1242,1247,1252,1257,1262,1267],{"type":321,"tag":347,"props":1233,"children":1234},{"style":482},[1235],{"type":327,"value":1236},"export",{"type":321,"tag":347,"props":1238,"children":1239},{"style":482},[1240],{"type":327,"value":1241}," class",{"type":321,"tag":347,"props":1243,"children":1244},{"style":354},[1245],{"type":327,"value":1246}," Context",{"type":321,"tag":347,"props":1248,"children":1249},{"style":482},[1250],{"type":327,"value":1251}," extends",{"type":321,"tag":347,"props":1253,"children":1254},{"style":354},[1255],{"type":327,"value":1256}," Integrator",{"type":321,"tag":347,"props":1258,"children":1259},{"style":835},[1260],{"type":327,"value":1261},".",{"type":321,"tag":347,"props":1263,"children":1264},{"style":829},[1265],{"type":327,"value":1266},"Context",{"type":321,"tag":347,"props":1268,"children":1269},{"style":835},[1270],{"type":327,"value":1271}," {\n",{"type":321,"tag":347,"props":1273,"children":1274},{"class":349,"line":381},[1275,1280,1285],{"type":321,"tag":347,"props":1276,"children":1277},{"style":354},[1278],{"type":327,"value":1279},"    db",{"type":321,"tag":347,"props":1281,"children":1282},{"style":482},[1283],{"type":327,"value":1284},":",{"type":321,"tag":347,"props":1286,"children":1287},{"style":354},[1288],{"type":327,"value":1289}," DbConnection\n",{"type":321,"tag":347,"props":1291,"children":1292},{"class":349,"line":400},[1293,1298,1303,1308,1312,1316,1320,1325,1329,1334,1338,1343],{"type":321,"tag":347,"props":1294,"children":1295},{"style":482},[1296],{"type":327,"value":1297},"    constructor",{"type":321,"tag":347,"props":1299,"children":1300},{"style":835},[1301],{"type":327,"value":1302},"(",{"type":321,"tag":347,"props":1304,"children":1305},{"style":354},[1306],{"type":327,"value":1307},"mode",{"type":321,"tag":347,"props":1309,"children":1310},{"style":482},[1311],{"type":327,"value":1284},{"type":321,"tag":347,"props":1313,"children":1314},{"style":354},[1315],{"type":327,"value":1256},{"type":321,"tag":347,"props":1317,"children":1318},{"style":835},[1319],{"type":327,"value":1261},{"type":321,"tag":347,"props":1321,"children":1322},{"style":354},[1323],{"type":327,"value":1324},"Mode",{"type":321,"tag":347,"props":1326,"children":1327},{"style":835},[1328],{"type":327,"value":929},{"type":321,"tag":347,"props":1330,"children":1331},{"style":354},[1332],{"type":327,"value":1333},"db",{"type":321,"tag":347,"props":1335,"children":1336},{"style":482},[1337],{"type":327,"value":1284},{"type":321,"tag":347,"props":1339,"children":1340},{"style":354},[1341],{"type":327,"value":1342}," DbConnection",{"type":321,"tag":347,"props":1344,"children":1345},{"style":835},[1346],{"type":327,"value":1347},") {\n",{"type":321,"tag":347,"props":1349,"children":1350},{"class":349,"line":417},[1351,1356],{"type":321,"tag":347,"props":1352,"children":1353},{"style":829},[1354],{"type":327,"value":1355},"        super",{"type":321,"tag":347,"props":1357,"children":1358},{"style":835},[1359],{"type":327,"value":1360},"(mode)\n",{"type":321,"tag":347,"props":1362,"children":1363},{"class":349,"line":434},[1364,1369,1374,1378],{"type":321,"tag":347,"props":1365,"children":1366},{"style":829},[1367],{"type":327,"value":1368},"        this",{"type":321,"tag":347,"props":1370,"children":1371},{"style":835},[1372],{"type":327,"value":1373},".db ",{"type":321,"tag":347,"props":1375,"children":1376},{"style":482},[1377],{"type":327,"value":843},{"type":321,"tag":347,"props":1379,"children":1380},{"style":835},[1381],{"type":327,"value":1382}," db\n",{"type":321,"tag":347,"props":1384,"children":1385},{"class":349,"line":456},[1386],{"type":321,"tag":347,"props":1387,"children":1388},{"style":835},[1389],{"type":327,"value":1390},"    }\n",{"type":321,"tag":347,"props":1392,"children":1393},{"class":349,"line":478},[1394],{"type":321,"tag":347,"props":1395,"children":1396},{"style":835},[1397],{"type":327,"value":959},{"type":321,"tag":322,"props":1399,"children":1401},{"id":1400},"instantiating-context",[1402],{"type":327,"value":1403},"Instantiating Context",{"type":321,"tag":330,"props":1405,"children":1406},{},[1407],{"type":327,"value":1408},"When you expose your integration to the internet, you should provide a function that returns a new instance of your context. This function will be called for every request.",{"type":321,"tag":336,"props":1410,"children":1412},{"className":1199,"code":1411,"language":1201,"meta":314,"style":314},"import { Integrator } from './churnkey/Integration'\n\nconst app = express()\nIntegration.expose({\n    app: app, // express app instance\n    token: process.env.CK_INTEGRATION_TOKEN, // your integration token\n    ctx(req, req) {\n        return new Context(\n            req.headers['X-Churnkey-Mode'],\n            req.db\n        )\n    } \n})\n",[1413],{"type":321,"tag":343,"props":1414,"children":1415},{"__ignoreMap":314},[1416,1436,1445,1474,1492,1505,1527,1556,1578,1596,1604,1612,1620],{"type":321,"tag":347,"props":1417,"children":1418},{"class":349,"line":350},[1419,1423,1427,1431],{"type":321,"tag":347,"props":1420,"children":1421},{"style":482},[1422],{"type":327,"value":1213},{"type":321,"tag":347,"props":1424,"children":1425},{"style":835},[1426],{"type":327,"value":1218},{"type":321,"tag":347,"props":1428,"children":1429},{"style":482},[1430],{"type":327,"value":1223},{"type":321,"tag":347,"props":1432,"children":1433},{"style":369},[1434],{"type":327,"value":1435}," './churnkey/Integration'\n",{"type":321,"tag":347,"props":1437,"children":1438},{"class":349,"line":360},[1439],{"type":321,"tag":347,"props":1440,"children":1442},{"emptyLinePlaceholder":1441},true,[1443],{"type":327,"value":1444},"\n",{"type":321,"tag":347,"props":1446,"children":1447},{"class":349,"line":381},[1448,1453,1458,1463,1469],{"type":321,"tag":347,"props":1449,"children":1450},{"style":482},[1451],{"type":327,"value":1452},"const",{"type":321,"tag":347,"props":1454,"children":1455},{"style":829},[1456],{"type":327,"value":1457}," app",{"type":321,"tag":347,"props":1459,"children":1460},{"style":482},[1461],{"type":327,"value":1462}," =",{"type":321,"tag":347,"props":1464,"children":1466},{"style":1465},"--shiki-light:#8250DF;--shiki-default:#8250DF;--shiki-dark:#D2A8FF",[1467],{"type":327,"value":1468}," express",{"type":321,"tag":347,"props":1470,"children":1471},{"style":835},[1472],{"type":327,"value":1473},"()\n",{"type":321,"tag":347,"props":1475,"children":1476},{"class":349,"line":400},[1477,1482,1487],{"type":321,"tag":347,"props":1478,"children":1479},{"style":835},[1480],{"type":327,"value":1481},"Integration.",{"type":321,"tag":347,"props":1483,"children":1484},{"style":1465},[1485],{"type":327,"value":1486},"expose",{"type":321,"tag":347,"props":1488,"children":1489},{"style":835},[1490],{"type":327,"value":1491},"({\n",{"type":321,"tag":347,"props":1493,"children":1494},{"class":349,"line":417},[1495,1500],{"type":321,"tag":347,"props":1496,"children":1497},{"style":835},[1498],{"type":327,"value":1499},"    app: app, ",{"type":321,"tag":347,"props":1501,"children":1502},{"style":375},[1503],{"type":327,"value":1504},"// express app instance\n",{"type":321,"tag":347,"props":1506,"children":1507},{"class":349,"line":434},[1508,1513,1518,1522],{"type":321,"tag":347,"props":1509,"children":1510},{"style":835},[1511],{"type":327,"value":1512},"    token: process.env.",{"type":321,"tag":347,"props":1514,"children":1515},{"style":829},[1516],{"type":327,"value":1517},"CK_INTEGRATION_TOKEN",{"type":321,"tag":347,"props":1519,"children":1520},{"style":835},[1521],{"type":327,"value":929},{"type":321,"tag":347,"props":1523,"children":1524},{"style":375},[1525],{"type":327,"value":1526},"// your integration token\n",{"type":321,"tag":347,"props":1528,"children":1529},{"class":349,"line":456},[1530,1535,1539,1544,1548,1552],{"type":321,"tag":347,"props":1531,"children":1532},{"style":1465},[1533],{"type":327,"value":1534},"    ctx",{"type":321,"tag":347,"props":1536,"children":1537},{"style":835},[1538],{"type":327,"value":1302},{"type":321,"tag":347,"props":1540,"children":1541},{"style":354},[1542],{"type":327,"value":1543},"req",{"type":321,"tag":347,"props":1545,"children":1546},{"style":835},[1547],{"type":327,"value":929},{"type":321,"tag":347,"props":1549,"children":1550},{"style":354},[1551],{"type":327,"value":1543},{"type":321,"tag":347,"props":1553,"children":1554},{"style":835},[1555],{"type":327,"value":1347},{"type":321,"tag":347,"props":1557,"children":1558},{"class":349,"line":478},[1559,1564,1569,1573],{"type":321,"tag":347,"props":1560,"children":1561},{"style":482},[1562],{"type":327,"value":1563},"        return",{"type":321,"tag":347,"props":1565,"children":1566},{"style":482},[1567],{"type":327,"value":1568}," new",{"type":321,"tag":347,"props":1570,"children":1571},{"style":1465},[1572],{"type":327,"value":1246},{"type":321,"tag":347,"props":1574,"children":1575},{"style":835},[1576],{"type":327,"value":1577},"(\n",{"type":321,"tag":347,"props":1579,"children":1580},{"class":349,"line":502},[1581,1586,1591],{"type":321,"tag":347,"props":1582,"children":1583},{"style":835},[1584],{"type":327,"value":1585},"            req.headers[",{"type":321,"tag":347,"props":1587,"children":1588},{"style":369},[1589],{"type":327,"value":1590},"'X-Churnkey-Mode'",{"type":321,"tag":347,"props":1592,"children":1593},{"style":835},[1594],{"type":327,"value":1595},"],\n",{"type":321,"tag":347,"props":1597,"children":1598},{"class":349,"line":520},[1599],{"type":321,"tag":347,"props":1600,"children":1601},{"style":835},[1602],{"type":327,"value":1603},"            req.db\n",{"type":321,"tag":347,"props":1605,"children":1606},{"class":349,"line":537},[1607],{"type":321,"tag":347,"props":1608,"children":1609},{"style":835},[1610],{"type":327,"value":1611},"        )\n",{"type":321,"tag":347,"props":1613,"children":1614},{"class":349,"line":554},[1615],{"type":321,"tag":347,"props":1616,"children":1617},{"style":835},[1618],{"type":327,"value":1619},"    } \n",{"type":321,"tag":347,"props":1621,"children":1622},{"class":349,"line":571},[1623],{"type":321,"tag":347,"props":1624,"children":1625},{"style":835},[1626],{"type":327,"value":1627},"})\n",{"type":321,"tag":1629,"props":1630,"children":1631},"style",{},[1632],{"type":327,"value":1633},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":314,"searchDepth":381,"depth":381,"links":1635},[1636,1637,1641,1642,1643,1644,1645,1646],{"id":324,"depth":360,"text":328},{"id":778,"depth":360,"text":781,"children":1638},[1639,1640],{"id":798,"depth":381,"text":801},{"id":861,"depth":381,"text":864},{"id":880,"depth":360,"text":883},{"id":1015,"depth":360,"text":1018},{"id":1081,"depth":360,"text":1084},{"id":1130,"depth":360,"text":1133},{"id":1180,"depth":360,"text":1183},{"id":1400,"depth":360,"text":1403},"markdown","content:99.integrations:0.general.md","content","99.integrations/0.general.md","99.integrations/0.general","md",{"loc":311},[1655,1655],null,{"_path":857,"_dir":1657,"_draft":313,"_partial":313,"_locale":314,"type":1658,"title":1659,"properties":1660,"_id":1669,"_type":893,"_source":1649,"_file":1670,"_stem":1671,"_extension":893},"types","object","Pagination Query Params",{"limit":1661,"cursor":1665},{"type":1662,"severity":1663,"description":1664},"integer","required","Maximum number of items to return",{"type":1666,"severity":1667,"description":1668},"string","optional","Cursor for pagination. The actual value is whatever you decided to use as next in the response.","content:types:pagination-query.type.json","types/pagination-query.type.json","types/pagination-query.type",{"_path":876,"_dir":1657,"_draft":313,"_partial":313,"_locale":314,"type":1658,"title":1673,"properties":1674,"_id":1681,"_type":893,"_source":1649,"_file":1682,"_stem":1683,"_extension":893},"Pagination Response",{"data":1675,"next":1679},{"type":1676,"severity":1663,"description":1677,"items":1678},"array","Array of items. The type of item is defined in the endpoint documentation, e.g. `Customer` for `/customers` endpoint",{"type":1658},{"type":1666,"severity":1667,"description":1680},"Either a next `id` or an `offset` for the next page. You decide what to use, we will send `next` value as a `cursor` query parameter back to you. If `next` is empty, there are no more pages","content:types:pagination-response.type.json","types/pagination-response.type.json","types/pagination-response.type",{"_path":1685,"_dir":1657,"_draft":313,"_partial":313,"_locale":314,"type":1658,"title":1133,"properties":1686,"_id":1737,"_type":893,"_source":1649,"_file":1738,"_stem":1739,"_extension":893},"/types/features.type",{"controllers":1687,"actions":1732},{"type":1658,"severity":1663,"description":1688,"properties":1689},"Defines what controllers are enabled in your integration and what of their features are available. \n Required controllers should be enabled.",{"customers":1690,"prices":1696,"subscriptions":1707,"coupons":1712,"products":1717,"families":1727},{"type":1658,"severity":1663,"description":1691,"properties":1692},"Defines if the `Customers` controller is enabled and what features are available",{"enabled":1693},{"type":1694,"severity":1663,"description":1695},"boolean","Should be always true, because the `Customers` controller is required for minimal integration",{"type":1658,"severity":1663,"description":1697,"properties":1698},"Defines if the `Prices` controller is enabled and what features are available",{"enabled":1699,"type":1701},{"type":1694,"severity":1663,"description":1700},"Should be always true, because the `Prices` controller is required for minimal integration",{"type":1702,"severity":1663,"description":1703,"values":1704},"enum","Defines the architecture of the prices. They can be standalone or belong to a product",[1705,1706],"standalone","product",{"type":1658,"severity":1663,"description":1708,"properties":1709},"Defines if the `Subscriptions` controller is enabled and what features are available",{"enabled":1710},{"type":1694,"severity":1663,"description":1711},"Should be always true, because the `Subscriptions` controller is required for minimal integration",{"type":1658,"severity":1667,"description":1713,"properties":1714},"Defines if the `Coupons` controller is enabled and what features are available. If not set, the controller is disabled.",{"enabled":1715},{"type":1694,"severity":1663,"description":1716},"If true, the `Coupons` controller is enabled and can be used by Churnkey, otherwise it is disabled.",{"type":1658,"severity":1667,"description":1718,"properties":1719},"Defines if the `Products` controller is enabled and what features are available. If not set, the controller is disabled.\n `prices.type` should be set to `product`",{"enabled":1720,"type":1722},{"type":1694,"severity":1663,"description":1721},"If true, the `Products` controller is enabled and can be used by Churnkey, otherwise it is disabled.",{"type":1702,"severity":1663,"description":1723,"values":1724},"Defines the architecture of the products. They can be standalone or belong to a family",[1725,1726],"'standalone'","'family'",{"type":1658,"severity":1667,"description":1728,"properties":1729},"Defines if the `Families` controller is enabled and what features are available. If not set, the controller is disabled.\n `products.type` should be set to `family`",{"enabled":1730},{"type":1694,"severity":1663,"description":1731},"If true, the `Families` controller is enabled and can be used by Churnkey, otherwise it is disabled.",{"type":1658,"severity":1667,"description":1733,"properties":1734},"Defines what actions are enabled in your integration and what features are available.",{"cancel":1735},{"severity":1667,"ref":1736},"/types/actions/cancel/features.type.json","content:types:features.type.json","types/features.type.json","types/features.type",{"data":1741,"body":1742,"toc":1748},{"title":314,"description":1664},{"type":318,"children":1743},[1744],{"type":321,"tag":330,"props":1745,"children":1746},{},[1747],{"type":327,"value":1664},{"title":314,"searchDepth":360,"depth":360,"links":1749},[],{"data":1751,"body":1752,"toc":1758},{"title":314,"description":1668},{"type":318,"children":1753},[1754],{"type":321,"tag":330,"props":1755,"children":1756},{},[1757],{"type":327,"value":1668},{"title":314,"searchDepth":360,"depth":360,"links":1759},[],{"data":1761,"body":1763,"toc":1786},{"title":314,"description":1762},"Array of items. The type of item is defined in the endpoint documentation, e.g. Customer for /customers endpoint",{"type":318,"children":1764},[1765],{"type":321,"tag":330,"props":1766,"children":1767},{},[1768,1770,1776,1778,1784],{"type":327,"value":1769},"Array of items. The type of item is defined in the endpoint documentation, e.g. ",{"type":321,"tag":343,"props":1771,"children":1773},{"className":1772},[],[1774],{"type":327,"value":1775},"Customer",{"type":327,"value":1777}," for ",{"type":321,"tag":343,"props":1779,"children":1781},{"className":1780},[],[1782],{"type":327,"value":1783},"/customers",{"type":327,"value":1785}," endpoint",{"title":314,"searchDepth":360,"depth":360,"links":1787},[],{"data":1789,"body":1791,"toc":1837},{"title":314,"description":1790},"Either a next id or an offset for the next page. You decide what to use, we will send next value as a cursor query parameter back to you. If next is empty, there are no more pages",{"type":318,"children":1792},[1793],{"type":321,"tag":330,"props":1794,"children":1795},{},[1796,1798,1804,1806,1812,1814,1820,1822,1828,1830,1835],{"type":327,"value":1797},"Either a next ",{"type":321,"tag":343,"props":1799,"children":1801},{"className":1800},[],[1802],{"type":327,"value":1803},"id",{"type":327,"value":1805}," or an ",{"type":321,"tag":343,"props":1807,"children":1809},{"className":1808},[],[1810],{"type":327,"value":1811},"offset",{"type":327,"value":1813}," for the next page. You decide what to use, we will send ",{"type":321,"tag":343,"props":1815,"children":1817},{"className":1816},[],[1818],{"type":327,"value":1819},"next",{"type":327,"value":1821}," value as a ",{"type":321,"tag":343,"props":1823,"children":1825},{"className":1824},[],[1826],{"type":327,"value":1827},"cursor",{"type":327,"value":1829}," query parameter back to you. If ",{"type":321,"tag":343,"props":1831,"children":1833},{"className":1832},[],[1834],{"type":327,"value":1819},{"type":327,"value":1836}," is empty, there are no more pages",{"title":314,"searchDepth":360,"depth":360,"links":1838},[],{"data":1840,"body":1842,"toc":1848},{"title":314,"description":1841},"Defines what controllers are enabled in your integration and what of their features are available.\nRequired controllers should be enabled.",{"type":318,"children":1843},[1844],{"type":321,"tag":330,"props":1845,"children":1846},{},[1847],{"type":327,"value":1841},{"title":314,"searchDepth":360,"depth":360,"links":1849},[],{"data":1851,"body":1852,"toc":1858},{"title":314,"description":1733},{"type":318,"children":1853},[1854],{"type":321,"tag":330,"props":1855,"children":1856},{},[1857],{"type":327,"value":1733},{"title":314,"searchDepth":360,"depth":360,"links":1859},[],1775515596732]