[{"data":1,"prerenderedAt":2433},["ShallowReactive",2],{"navigation":3,"/integrations/publish":310,"/integrations/publish-surround":2344,"/types/features.type":2350,"T4B05TP7tk":2412,"yCnUmmDwpY":2423},[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,"body":317,"_type":2337,"_id":2338,"_source":2339,"_file":2340,"_stem":2341,"_extension":2342,"sitemap":2343},"/integrations/publish","integrations",false,"","Publish your Integration","Learn how to make your integration available to Churnkey.",{"type":318,"children":319,"toc":2323},"root",[320,328,335,349,358,378,384,396,402,1882,1888,1903,1934,1950,1958,1964,1969,2012,2017,2022,2028,2033,2052,2058,2070,2076,2081,2317],{"type":321,"tag":322,"props":323,"children":324},"element","p",{},[325],{"type":326,"value":327},"text","Before following this guide, make sure that you have implemented all the required controllers and actions.",{"type":321,"tag":329,"props":330,"children":332},"h2",{"id":331},"get-integration-token",[333],{"type":326,"value":334},"Get Integration Token",{"type":321,"tag":322,"props":336,"children":337},{},[338,340,347],{"type":326,"value":339},"To obtain your ",{"type":321,"tag":341,"props":342,"children":344},"code",{"className":343},[],[345],{"type":326,"value":346},"Integration Token",{"type":326,"value":348},", go to the Churnkey dashboard -> Settings -> Billing Providers:",{"type":321,"tag":322,"props":350,"children":351},{},[352],{"type":321,"tag":353,"props":354,"children":357},"img",{"alt":355,"src":356},"Quick start guide","/img/placeholder-black.png",[],{"type":321,"tag":322,"props":359,"children":360},{},[361,363,369,371,376],{"type":326,"value":362},"Choose ",{"type":321,"tag":341,"props":364,"children":366},{"className":365},[],[367],{"type":326,"value":368},"Custom Provider",{"type":326,"value":370}," and copy the ",{"type":321,"tag":341,"props":372,"children":374},{"className":373},[],[375],{"type":326,"value":346},{"type":326,"value":377},":",{"type":321,"tag":322,"props":379,"children":380},{},[381],{"type":321,"tag":353,"props":382,"children":383},{"alt":355,"src":356},[],{"type":321,"tag":322,"props":385,"children":386},{},[387,389,394],{"type":326,"value":388},"Never store your ",{"type":321,"tag":341,"props":390,"children":392},{"className":391},[],[393],{"type":326,"value":346},{"type":326,"value":395}," in your codebase. Use environment variables or a secure vault to store it.",{"type":321,"tag":329,"props":397,"children":399},{"id":398},"make-integration-publicly-available",[400],{"type":326,"value":401},"Make integration publicly available",{"type":321,"tag":403,"props":404,"children":405},"tabs",{},[406,1239],{"type":321,"tag":407,"props":408,"children":410},"div",{"label":409},"With SDK",[411,432,974,986],{"type":321,"tag":322,"props":412,"children":413},{},[414,416,422,424,430],{"type":326,"value":415},"First you need to create ",{"type":321,"tag":341,"props":417,"children":419},{"className":418},[],[420],{"type":326,"value":421},"Integration",{"type":326,"value":423}," instance, where you should pass your ",{"type":321,"tag":341,"props":425,"children":427},{"className":426},[],[428],{"type":326,"value":429},"Context",{"type":326,"value":431}," and all the controllers and actions you implemented.",{"type":321,"tag":433,"props":434,"children":435},"code-group",{},[436],{"type":321,"tag":437,"props":438,"children":443},"pre",{"className":439,"code":440,"filename":441,"language":442,"meta":314,"style":314},"language-typescript shiki shiki-themes github-light-default github-light-default github-dark-default","import { Integrator } from '@churnkey/sdk'\nimport { Context } from './Context'\nimport { Customers } from './controllers/Customers'\nimport { Prices } from './controllers/Prices'\nimport { Subscriptions } from './controllers/Subscriptions'\nimport { Coupons } from './controllers/Coupons' // optional\nimport { Cancel } from './actions/Cancel' // optional\nimport { ApplyCoupon } from './actions/ApplyCoupon' // optional\nimport { ExtendTrial } from './actions/ExtendTrial' // optional\nimport { ChangePrice } from './actions/ChangePrice' // optional\nimport { Pause } from './actions/Pause' // optional\n\nexport const Integration = new Integrator.Integration({\n    ctx: Context,\n    name: 'YourCompanyName',\n    modules: {\n        controllers: {\n            Customers,\n            Prices,\n            Subscriptions,\n            Coupons // optional\n        },\n        actions: {\n            Cancel, // optional\n            ApplyCoupon, // optional\n            ExtendTrial, // optional\n            ChangePrice, // optional\n            Pause // optional\n        }\n    }\n})\n","Typescript","typescript",[444],{"type":321,"tag":341,"props":445,"children":446},{"__ignoreMap":314},[447,476,498,520,542,564,592,618,644,670,696,722,732,777,786,805,814,823,832,841,850,864,873,882,895,908,921,934,947,956,965],{"type":321,"tag":448,"props":449,"children":452},"span",{"class":450,"line":451},"line",1,[453,459,465,470],{"type":321,"tag":448,"props":454,"children":456},{"style":455},"--shiki-light:#CF222E;--shiki-default:#CF222E;--shiki-dark:#FF7B72",[457],{"type":326,"value":458},"import",{"type":321,"tag":448,"props":460,"children":462},{"style":461},"--shiki-light:#1F2328;--shiki-default:#1F2328;--shiki-dark:#E6EDF3",[463],{"type":326,"value":464}," { Integrator } ",{"type":321,"tag":448,"props":466,"children":467},{"style":455},[468],{"type":326,"value":469},"from",{"type":321,"tag":448,"props":471,"children":473},{"style":472},"--shiki-light:#0A3069;--shiki-default:#0A3069;--shiki-dark:#A5D6FF",[474],{"type":326,"value":475}," '@churnkey/sdk'\n",{"type":321,"tag":448,"props":477,"children":479},{"class":450,"line":478},2,[480,484,489,493],{"type":321,"tag":448,"props":481,"children":482},{"style":455},[483],{"type":326,"value":458},{"type":321,"tag":448,"props":485,"children":486},{"style":461},[487],{"type":326,"value":488}," { Context } ",{"type":321,"tag":448,"props":490,"children":491},{"style":455},[492],{"type":326,"value":469},{"type":321,"tag":448,"props":494,"children":495},{"style":472},[496],{"type":326,"value":497}," './Context'\n",{"type":321,"tag":448,"props":499,"children":501},{"class":450,"line":500},3,[502,506,511,515],{"type":321,"tag":448,"props":503,"children":504},{"style":455},[505],{"type":326,"value":458},{"type":321,"tag":448,"props":507,"children":508},{"style":461},[509],{"type":326,"value":510}," { Customers } ",{"type":321,"tag":448,"props":512,"children":513},{"style":455},[514],{"type":326,"value":469},{"type":321,"tag":448,"props":516,"children":517},{"style":472},[518],{"type":326,"value":519}," './controllers/Customers'\n",{"type":321,"tag":448,"props":521,"children":523},{"class":450,"line":522},4,[524,528,533,537],{"type":321,"tag":448,"props":525,"children":526},{"style":455},[527],{"type":326,"value":458},{"type":321,"tag":448,"props":529,"children":530},{"style":461},[531],{"type":326,"value":532}," { Prices } ",{"type":321,"tag":448,"props":534,"children":535},{"style":455},[536],{"type":326,"value":469},{"type":321,"tag":448,"props":538,"children":539},{"style":472},[540],{"type":326,"value":541}," './controllers/Prices'\n",{"type":321,"tag":448,"props":543,"children":545},{"class":450,"line":544},5,[546,550,555,559],{"type":321,"tag":448,"props":547,"children":548},{"style":455},[549],{"type":326,"value":458},{"type":321,"tag":448,"props":551,"children":552},{"style":461},[553],{"type":326,"value":554}," { Subscriptions } ",{"type":321,"tag":448,"props":556,"children":557},{"style":455},[558],{"type":326,"value":469},{"type":321,"tag":448,"props":560,"children":561},{"style":472},[562],{"type":326,"value":563}," './controllers/Subscriptions'\n",{"type":321,"tag":448,"props":565,"children":567},{"class":450,"line":566},6,[568,572,577,581,586],{"type":321,"tag":448,"props":569,"children":570},{"style":455},[571],{"type":326,"value":458},{"type":321,"tag":448,"props":573,"children":574},{"style":461},[575],{"type":326,"value":576}," { Coupons } ",{"type":321,"tag":448,"props":578,"children":579},{"style":455},[580],{"type":326,"value":469},{"type":321,"tag":448,"props":582,"children":583},{"style":472},[584],{"type":326,"value":585}," './controllers/Coupons'",{"type":321,"tag":448,"props":587,"children":589},{"style":588},"--shiki-light:#6E7781;--shiki-default:#6E7781;--shiki-dark:#8B949E",[590],{"type":326,"value":591}," // optional\n",{"type":321,"tag":448,"props":593,"children":595},{"class":450,"line":594},7,[596,600,605,609,614],{"type":321,"tag":448,"props":597,"children":598},{"style":455},[599],{"type":326,"value":458},{"type":321,"tag":448,"props":601,"children":602},{"style":461},[603],{"type":326,"value":604}," { Cancel } ",{"type":321,"tag":448,"props":606,"children":607},{"style":455},[608],{"type":326,"value":469},{"type":321,"tag":448,"props":610,"children":611},{"style":472},[612],{"type":326,"value":613}," './actions/Cancel'",{"type":321,"tag":448,"props":615,"children":616},{"style":588},[617],{"type":326,"value":591},{"type":321,"tag":448,"props":619,"children":621},{"class":450,"line":620},8,[622,626,631,635,640],{"type":321,"tag":448,"props":623,"children":624},{"style":455},[625],{"type":326,"value":458},{"type":321,"tag":448,"props":627,"children":628},{"style":461},[629],{"type":326,"value":630}," { ApplyCoupon } ",{"type":321,"tag":448,"props":632,"children":633},{"style":455},[634],{"type":326,"value":469},{"type":321,"tag":448,"props":636,"children":637},{"style":472},[638],{"type":326,"value":639}," './actions/ApplyCoupon'",{"type":321,"tag":448,"props":641,"children":642},{"style":588},[643],{"type":326,"value":591},{"type":321,"tag":448,"props":645,"children":647},{"class":450,"line":646},9,[648,652,657,661,666],{"type":321,"tag":448,"props":649,"children":650},{"style":455},[651],{"type":326,"value":458},{"type":321,"tag":448,"props":653,"children":654},{"style":461},[655],{"type":326,"value":656}," { ExtendTrial } ",{"type":321,"tag":448,"props":658,"children":659},{"style":455},[660],{"type":326,"value":469},{"type":321,"tag":448,"props":662,"children":663},{"style":472},[664],{"type":326,"value":665}," './actions/ExtendTrial'",{"type":321,"tag":448,"props":667,"children":668},{"style":588},[669],{"type":326,"value":591},{"type":321,"tag":448,"props":671,"children":673},{"class":450,"line":672},10,[674,678,683,687,692],{"type":321,"tag":448,"props":675,"children":676},{"style":455},[677],{"type":326,"value":458},{"type":321,"tag":448,"props":679,"children":680},{"style":461},[681],{"type":326,"value":682}," { ChangePrice } ",{"type":321,"tag":448,"props":684,"children":685},{"style":455},[686],{"type":326,"value":469},{"type":321,"tag":448,"props":688,"children":689},{"style":472},[690],{"type":326,"value":691}," './actions/ChangePrice'",{"type":321,"tag":448,"props":693,"children":694},{"style":588},[695],{"type":326,"value":591},{"type":321,"tag":448,"props":697,"children":699},{"class":450,"line":698},11,[700,704,709,713,718],{"type":321,"tag":448,"props":701,"children":702},{"style":455},[703],{"type":326,"value":458},{"type":321,"tag":448,"props":705,"children":706},{"style":461},[707],{"type":326,"value":708}," { Pause } ",{"type":321,"tag":448,"props":710,"children":711},{"style":455},[712],{"type":326,"value":469},{"type":321,"tag":448,"props":714,"children":715},{"style":472},[716],{"type":326,"value":717}," './actions/Pause'",{"type":321,"tag":448,"props":719,"children":720},{"style":588},[721],{"type":326,"value":591},{"type":321,"tag":448,"props":723,"children":725},{"class":450,"line":724},12,[726],{"type":321,"tag":448,"props":727,"children":729},{"emptyLinePlaceholder":728},true,[730],{"type":326,"value":731},"\n",{"type":321,"tag":448,"props":733,"children":735},{"class":450,"line":734},13,[736,741,746,752,757,762,767,772],{"type":321,"tag":448,"props":737,"children":738},{"style":455},[739],{"type":326,"value":740},"export",{"type":321,"tag":448,"props":742,"children":743},{"style":455},[744],{"type":326,"value":745}," const",{"type":321,"tag":448,"props":747,"children":749},{"style":748},"--shiki-light:#0550AE;--shiki-default:#0550AE;--shiki-dark:#79C0FF",[750],{"type":326,"value":751}," Integration",{"type":321,"tag":448,"props":753,"children":754},{"style":455},[755],{"type":326,"value":756}," =",{"type":321,"tag":448,"props":758,"children":759},{"style":455},[760],{"type":326,"value":761}," new",{"type":321,"tag":448,"props":763,"children":764},{"style":461},[765],{"type":326,"value":766}," Integrator.",{"type":321,"tag":448,"props":768,"children":770},{"style":769},"--shiki-light:#8250DF;--shiki-default:#8250DF;--shiki-dark:#D2A8FF",[771],{"type":326,"value":421},{"type":321,"tag":448,"props":773,"children":774},{"style":461},[775],{"type":326,"value":776},"({\n",{"type":321,"tag":448,"props":778,"children":780},{"class":450,"line":779},14,[781],{"type":321,"tag":448,"props":782,"children":783},{"style":461},[784],{"type":326,"value":785},"    ctx: Context,\n",{"type":321,"tag":448,"props":787,"children":789},{"class":450,"line":788},15,[790,795,800],{"type":321,"tag":448,"props":791,"children":792},{"style":461},[793],{"type":326,"value":794},"    name: ",{"type":321,"tag":448,"props":796,"children":797},{"style":472},[798],{"type":326,"value":799},"'YourCompanyName'",{"type":321,"tag":448,"props":801,"children":802},{"style":461},[803],{"type":326,"value":804},",\n",{"type":321,"tag":448,"props":806,"children":808},{"class":450,"line":807},16,[809],{"type":321,"tag":448,"props":810,"children":811},{"style":461},[812],{"type":326,"value":813},"    modules: {\n",{"type":321,"tag":448,"props":815,"children":817},{"class":450,"line":816},17,[818],{"type":321,"tag":448,"props":819,"children":820},{"style":461},[821],{"type":326,"value":822},"        controllers: {\n",{"type":321,"tag":448,"props":824,"children":826},{"class":450,"line":825},18,[827],{"type":321,"tag":448,"props":828,"children":829},{"style":461},[830],{"type":326,"value":831},"            Customers,\n",{"type":321,"tag":448,"props":833,"children":835},{"class":450,"line":834},19,[836],{"type":321,"tag":448,"props":837,"children":838},{"style":461},[839],{"type":326,"value":840},"            Prices,\n",{"type":321,"tag":448,"props":842,"children":844},{"class":450,"line":843},20,[845],{"type":321,"tag":448,"props":846,"children":847},{"style":461},[848],{"type":326,"value":849},"            Subscriptions,\n",{"type":321,"tag":448,"props":851,"children":853},{"class":450,"line":852},21,[854,859],{"type":321,"tag":448,"props":855,"children":856},{"style":461},[857],{"type":326,"value":858},"            Coupons ",{"type":321,"tag":448,"props":860,"children":861},{"style":588},[862],{"type":326,"value":863},"// optional\n",{"type":321,"tag":448,"props":865,"children":867},{"class":450,"line":866},22,[868],{"type":321,"tag":448,"props":869,"children":870},{"style":461},[871],{"type":326,"value":872},"        },\n",{"type":321,"tag":448,"props":874,"children":876},{"class":450,"line":875},23,[877],{"type":321,"tag":448,"props":878,"children":879},{"style":461},[880],{"type":326,"value":881},"        actions: {\n",{"type":321,"tag":448,"props":883,"children":885},{"class":450,"line":884},24,[886,891],{"type":321,"tag":448,"props":887,"children":888},{"style":461},[889],{"type":326,"value":890},"            Cancel, ",{"type":321,"tag":448,"props":892,"children":893},{"style":588},[894],{"type":326,"value":863},{"type":321,"tag":448,"props":896,"children":898},{"class":450,"line":897},25,[899,904],{"type":321,"tag":448,"props":900,"children":901},{"style":461},[902],{"type":326,"value":903},"            ApplyCoupon, ",{"type":321,"tag":448,"props":905,"children":906},{"style":588},[907],{"type":326,"value":863},{"type":321,"tag":448,"props":909,"children":911},{"class":450,"line":910},26,[912,917],{"type":321,"tag":448,"props":913,"children":914},{"style":461},[915],{"type":326,"value":916},"            ExtendTrial, ",{"type":321,"tag":448,"props":918,"children":919},{"style":588},[920],{"type":326,"value":863},{"type":321,"tag":448,"props":922,"children":924},{"class":450,"line":923},27,[925,930],{"type":321,"tag":448,"props":926,"children":927},{"style":461},[928],{"type":326,"value":929},"            ChangePrice, ",{"type":321,"tag":448,"props":931,"children":932},{"style":588},[933],{"type":326,"value":863},{"type":321,"tag":448,"props":935,"children":937},{"class":450,"line":936},28,[938,943],{"type":321,"tag":448,"props":939,"children":940},{"style":461},[941],{"type":326,"value":942},"            Pause ",{"type":321,"tag":448,"props":944,"children":945},{"style":588},[946],{"type":326,"value":863},{"type":321,"tag":448,"props":948,"children":950},{"class":450,"line":949},29,[951],{"type":321,"tag":448,"props":952,"children":953},{"style":461},[954],{"type":326,"value":955},"        }\n",{"type":321,"tag":448,"props":957,"children":959},{"class":450,"line":958},30,[960],{"type":321,"tag":448,"props":961,"children":962},{"style":461},[963],{"type":326,"value":964},"    }\n",{"type":321,"tag":448,"props":966,"children":968},{"class":450,"line":967},31,[969],{"type":321,"tag":448,"props":970,"children":971},{"style":461},[972],{"type":326,"value":973},"})\n",{"type":321,"tag":322,"props":975,"children":976},{},[977,979,984],{"type":326,"value":978},"Next, in your router file, you should expose the ",{"type":321,"tag":341,"props":980,"children":982},{"className":981},[],[983],{"type":326,"value":421},{"type":326,"value":985}," to the internet. Authentication and features manifest are handled by the SDK, so you don't need to worry about it.",{"type":321,"tag":433,"props":987,"children":988},{},[989],{"type":321,"tag":437,"props":990,"children":993},{"className":439,"code":991,"filename":992,"language":442,"meta":314,"style":314},"import express from 'express'\nimport { Integration } from './churnkey/Integration'\nimport { Context } from './churnkey/Context'\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            // initialize your context here\n            // parameters can vary depending on your implementation\n        )\n    } \n})\n","Typescript Express",[994],{"type":321,"tag":341,"props":995,"children":996},{"__ignoreMap":314},[997,1018,1039,1059,1066,1093,1110,1123,1146,1178,1200,1208,1216,1224,1232],{"type":321,"tag":448,"props":998,"children":999},{"class":450,"line":451},[1000,1004,1009,1013],{"type":321,"tag":448,"props":1001,"children":1002},{"style":455},[1003],{"type":326,"value":458},{"type":321,"tag":448,"props":1005,"children":1006},{"style":461},[1007],{"type":326,"value":1008}," express ",{"type":321,"tag":448,"props":1010,"children":1011},{"style":455},[1012],{"type":326,"value":469},{"type":321,"tag":448,"props":1014,"children":1015},{"style":472},[1016],{"type":326,"value":1017}," 'express'\n",{"type":321,"tag":448,"props":1019,"children":1020},{"class":450,"line":478},[1021,1025,1030,1034],{"type":321,"tag":448,"props":1022,"children":1023},{"style":455},[1024],{"type":326,"value":458},{"type":321,"tag":448,"props":1026,"children":1027},{"style":461},[1028],{"type":326,"value":1029}," { Integration } ",{"type":321,"tag":448,"props":1031,"children":1032},{"style":455},[1033],{"type":326,"value":469},{"type":321,"tag":448,"props":1035,"children":1036},{"style":472},[1037],{"type":326,"value":1038}," './churnkey/Integration'\n",{"type":321,"tag":448,"props":1040,"children":1041},{"class":450,"line":500},[1042,1046,1050,1054],{"type":321,"tag":448,"props":1043,"children":1044},{"style":455},[1045],{"type":326,"value":458},{"type":321,"tag":448,"props":1047,"children":1048},{"style":461},[1049],{"type":326,"value":488},{"type":321,"tag":448,"props":1051,"children":1052},{"style":455},[1053],{"type":326,"value":469},{"type":321,"tag":448,"props":1055,"children":1056},{"style":472},[1057],{"type":326,"value":1058}," './churnkey/Context'\n",{"type":321,"tag":448,"props":1060,"children":1061},{"class":450,"line":522},[1062],{"type":321,"tag":448,"props":1063,"children":1064},{"emptyLinePlaceholder":728},[1065],{"type":326,"value":731},{"type":321,"tag":448,"props":1067,"children":1068},{"class":450,"line":544},[1069,1074,1079,1083,1088],{"type":321,"tag":448,"props":1070,"children":1071},{"style":455},[1072],{"type":326,"value":1073},"const",{"type":321,"tag":448,"props":1075,"children":1076},{"style":748},[1077],{"type":326,"value":1078}," app",{"type":321,"tag":448,"props":1080,"children":1081},{"style":455},[1082],{"type":326,"value":756},{"type":321,"tag":448,"props":1084,"children":1085},{"style":769},[1086],{"type":326,"value":1087}," express",{"type":321,"tag":448,"props":1089,"children":1090},{"style":461},[1091],{"type":326,"value":1092},"()\n",{"type":321,"tag":448,"props":1094,"children":1095},{"class":450,"line":566},[1096,1101,1106],{"type":321,"tag":448,"props":1097,"children":1098},{"style":461},[1099],{"type":326,"value":1100},"Integration.",{"type":321,"tag":448,"props":1102,"children":1103},{"style":769},[1104],{"type":326,"value":1105},"expose",{"type":321,"tag":448,"props":1107,"children":1108},{"style":461},[1109],{"type":326,"value":776},{"type":321,"tag":448,"props":1111,"children":1112},{"class":450,"line":594},[1113,1118],{"type":321,"tag":448,"props":1114,"children":1115},{"style":461},[1116],{"type":326,"value":1117},"    app: app, ",{"type":321,"tag":448,"props":1119,"children":1120},{"style":588},[1121],{"type":326,"value":1122},"// express app instance\n",{"type":321,"tag":448,"props":1124,"children":1125},{"class":450,"line":620},[1126,1131,1136,1141],{"type":321,"tag":448,"props":1127,"children":1128},{"style":461},[1129],{"type":326,"value":1130},"    token: process.env.",{"type":321,"tag":448,"props":1132,"children":1133},{"style":748},[1134],{"type":326,"value":1135},"CK_INTEGRATION_TOKEN",{"type":321,"tag":448,"props":1137,"children":1138},{"style":461},[1139],{"type":326,"value":1140},", ",{"type":321,"tag":448,"props":1142,"children":1143},{"style":588},[1144],{"type":326,"value":1145},"// your integration token\n",{"type":321,"tag":448,"props":1147,"children":1148},{"class":450,"line":646},[1149,1154,1159,1165,1169,1173],{"type":321,"tag":448,"props":1150,"children":1151},{"style":769},[1152],{"type":326,"value":1153},"    ctx",{"type":321,"tag":448,"props":1155,"children":1156},{"style":461},[1157],{"type":326,"value":1158},"(",{"type":321,"tag":448,"props":1160,"children":1162},{"style":1161},"--shiki-light:#953800;--shiki-default:#953800;--shiki-dark:#FFA657",[1163],{"type":326,"value":1164},"req",{"type":321,"tag":448,"props":1166,"children":1167},{"style":461},[1168],{"type":326,"value":1140},{"type":321,"tag":448,"props":1170,"children":1171},{"style":1161},[1172],{"type":326,"value":1164},{"type":321,"tag":448,"props":1174,"children":1175},{"style":461},[1176],{"type":326,"value":1177},") {\n",{"type":321,"tag":448,"props":1179,"children":1180},{"class":450,"line":672},[1181,1186,1190,1195],{"type":321,"tag":448,"props":1182,"children":1183},{"style":455},[1184],{"type":326,"value":1185},"        return",{"type":321,"tag":448,"props":1187,"children":1188},{"style":455},[1189],{"type":326,"value":761},{"type":321,"tag":448,"props":1191,"children":1192},{"style":769},[1193],{"type":326,"value":1194}," Context",{"type":321,"tag":448,"props":1196,"children":1197},{"style":461},[1198],{"type":326,"value":1199},"(\n",{"type":321,"tag":448,"props":1201,"children":1202},{"class":450,"line":698},[1203],{"type":321,"tag":448,"props":1204,"children":1205},{"style":588},[1206],{"type":326,"value":1207},"            // initialize your context here\n",{"type":321,"tag":448,"props":1209,"children":1210},{"class":450,"line":724},[1211],{"type":321,"tag":448,"props":1212,"children":1213},{"style":588},[1214],{"type":326,"value":1215},"            // parameters can vary depending on your implementation\n",{"type":321,"tag":448,"props":1217,"children":1218},{"class":450,"line":734},[1219],{"type":321,"tag":448,"props":1220,"children":1221},{"style":461},[1222],{"type":326,"value":1223},"        )\n",{"type":321,"tag":448,"props":1225,"children":1226},{"class":450,"line":779},[1227],{"type":321,"tag":448,"props":1228,"children":1229},{"style":461},[1230],{"type":326,"value":1231},"    } \n",{"type":321,"tag":448,"props":1233,"children":1234},{"class":450,"line":788},[1235],{"type":321,"tag":448,"props":1236,"children":1237},{"style":461},[1238],{"type":326,"value":973},{"type":321,"tag":407,"props":1240,"children":1242},{"label":1241},"Without SDK",[1243,1248,1255,1283,1293,1638,1644,1664,1855,1861],{"type":321,"tag":322,"props":1244,"children":1245},{},[1246],{"type":326,"value":1247},"If SDK is not available in your preferred programming language, you should follow this guide to make your integration available to Churnkey.",{"type":321,"tag":1249,"props":1250,"children":1252},"h3",{"id":1251},"features",[1253],{"type":326,"value":1254},"Features",{"type":321,"tag":322,"props":1256,"children":1257},{},[1258,1260,1266,1268,1274,1275,1281],{"type":326,"value":1259},"You should add an endpoint which will return a list of supported features, we call it ",{"type":321,"tag":341,"props":1261,"children":1263},{"className":1262},[],[1264],{"type":326,"value":1265},"Feature Manifest",{"type":326,"value":1267},". This manifest tells us what ",{"type":321,"tag":341,"props":1269,"children":1271},{"className":1270},[],[1272],{"type":326,"value":1273},"Controllers",{"type":326,"value":1140},{"type":321,"tag":341,"props":1276,"children":1278},{"className":1277},[],[1279],{"type":326,"value":1280},"Actions",{"type":326,"value":1282},"\nand their behavior are supported by your integration.",{"type":321,"tag":1284,"props":1285,"children":1287},"collapsible",{"name":1286},"schema",[1288],{"type":321,"tag":1289,"props":1290,"children":1292},"field-schema",{"schema":1291},"/types/features.type.json",[],{"type":321,"tag":1284,"props":1294,"children":1296},{"name":1295},"code example",[1297],{"type":321,"tag":437,"props":1298,"children":1300},{"className":439,"code":1299,"filename":992,"language":442,"meta":314,"style":314},"import { features } from '../actions/Cancel'\n\napp.get('/churnkey/features', async (req, res) => {\n    res.send({\n        controllers: {\n            customers: true,\n            prices: {\n                enabled: true,\n                type: 'product'\n            }\n            subscriptions: true,\n            coupons: true // optional\n            products: { // optional\n                enabled: true,\n                type: 'family'\n            },\n            families: true // optional\n        },\n        actions: {\n            cancel: features, // optional\n            ... // other actions features if you have them\n        }\n    })\n})\n",[1301],{"type":321,"tag":341,"props":1302,"children":1303},{"__ignoreMap":314},[1304,1325,1332,1396,1413,1420,1437,1445,1461,1474,1482,1498,1514,1526,1541,1553,1561,1577,1584,1591,1603,1616,1623,1631],{"type":321,"tag":448,"props":1305,"children":1306},{"class":450,"line":451},[1307,1311,1316,1320],{"type":321,"tag":448,"props":1308,"children":1309},{"style":455},[1310],{"type":326,"value":458},{"type":321,"tag":448,"props":1312,"children":1313},{"style":461},[1314],{"type":326,"value":1315}," { features } ",{"type":321,"tag":448,"props":1317,"children":1318},{"style":455},[1319],{"type":326,"value":469},{"type":321,"tag":448,"props":1321,"children":1322},{"style":472},[1323],{"type":326,"value":1324}," '../actions/Cancel'\n",{"type":321,"tag":448,"props":1326,"children":1327},{"class":450,"line":478},[1328],{"type":321,"tag":448,"props":1329,"children":1330},{"emptyLinePlaceholder":728},[1331],{"type":326,"value":731},{"type":321,"tag":448,"props":1333,"children":1334},{"class":450,"line":500},[1335,1340,1345,1349,1354,1358,1363,1368,1372,1376,1381,1386,1391],{"type":321,"tag":448,"props":1336,"children":1337},{"style":461},[1338],{"type":326,"value":1339},"app.",{"type":321,"tag":448,"props":1341,"children":1342},{"style":769},[1343],{"type":326,"value":1344},"get",{"type":321,"tag":448,"props":1346,"children":1347},{"style":461},[1348],{"type":326,"value":1158},{"type":321,"tag":448,"props":1350,"children":1351},{"style":472},[1352],{"type":326,"value":1353},"'/churnkey/features'",{"type":321,"tag":448,"props":1355,"children":1356},{"style":461},[1357],{"type":326,"value":1140},{"type":321,"tag":448,"props":1359,"children":1360},{"style":455},[1361],{"type":326,"value":1362},"async",{"type":321,"tag":448,"props":1364,"children":1365},{"style":461},[1366],{"type":326,"value":1367}," (",{"type":321,"tag":448,"props":1369,"children":1370},{"style":1161},[1371],{"type":326,"value":1164},{"type":321,"tag":448,"props":1373,"children":1374},{"style":461},[1375],{"type":326,"value":1140},{"type":321,"tag":448,"props":1377,"children":1378},{"style":1161},[1379],{"type":326,"value":1380},"res",{"type":321,"tag":448,"props":1382,"children":1383},{"style":461},[1384],{"type":326,"value":1385},") ",{"type":321,"tag":448,"props":1387,"children":1388},{"style":455},[1389],{"type":326,"value":1390},"=>",{"type":321,"tag":448,"props":1392,"children":1393},{"style":461},[1394],{"type":326,"value":1395}," {\n",{"type":321,"tag":448,"props":1397,"children":1398},{"class":450,"line":522},[1399,1404,1409],{"type":321,"tag":448,"props":1400,"children":1401},{"style":461},[1402],{"type":326,"value":1403},"    res.",{"type":321,"tag":448,"props":1405,"children":1406},{"style":769},[1407],{"type":326,"value":1408},"send",{"type":321,"tag":448,"props":1410,"children":1411},{"style":461},[1412],{"type":326,"value":776},{"type":321,"tag":448,"props":1414,"children":1415},{"class":450,"line":544},[1416],{"type":321,"tag":448,"props":1417,"children":1418},{"style":461},[1419],{"type":326,"value":822},{"type":321,"tag":448,"props":1421,"children":1422},{"class":450,"line":566},[1423,1428,1433],{"type":321,"tag":448,"props":1424,"children":1425},{"style":461},[1426],{"type":326,"value":1427},"            customers: ",{"type":321,"tag":448,"props":1429,"children":1430},{"style":748},[1431],{"type":326,"value":1432},"true",{"type":321,"tag":448,"props":1434,"children":1435},{"style":461},[1436],{"type":326,"value":804},{"type":321,"tag":448,"props":1438,"children":1439},{"class":450,"line":594},[1440],{"type":321,"tag":448,"props":1441,"children":1442},{"style":461},[1443],{"type":326,"value":1444},"            prices: {\n",{"type":321,"tag":448,"props":1446,"children":1447},{"class":450,"line":620},[1448,1453,1457],{"type":321,"tag":448,"props":1449,"children":1450},{"style":461},[1451],{"type":326,"value":1452},"                enabled: ",{"type":321,"tag":448,"props":1454,"children":1455},{"style":748},[1456],{"type":326,"value":1432},{"type":321,"tag":448,"props":1458,"children":1459},{"style":461},[1460],{"type":326,"value":804},{"type":321,"tag":448,"props":1462,"children":1463},{"class":450,"line":646},[1464,1469],{"type":321,"tag":448,"props":1465,"children":1466},{"style":461},[1467],{"type":326,"value":1468},"                type: ",{"type":321,"tag":448,"props":1470,"children":1471},{"style":472},[1472],{"type":326,"value":1473},"'product'\n",{"type":321,"tag":448,"props":1475,"children":1476},{"class":450,"line":672},[1477],{"type":321,"tag":448,"props":1478,"children":1479},{"style":461},[1480],{"type":326,"value":1481},"            }\n",{"type":321,"tag":448,"props":1483,"children":1484},{"class":450,"line":698},[1485,1490,1494],{"type":321,"tag":448,"props":1486,"children":1487},{"style":461},[1488],{"type":326,"value":1489},"            subscriptions: ",{"type":321,"tag":448,"props":1491,"children":1492},{"style":748},[1493],{"type":326,"value":1432},{"type":321,"tag":448,"props":1495,"children":1496},{"style":461},[1497],{"type":326,"value":804},{"type":321,"tag":448,"props":1499,"children":1500},{"class":450,"line":724},[1501,1506,1510],{"type":321,"tag":448,"props":1502,"children":1503},{"style":461},[1504],{"type":326,"value":1505},"            coupons: ",{"type":321,"tag":448,"props":1507,"children":1508},{"style":748},[1509],{"type":326,"value":1432},{"type":321,"tag":448,"props":1511,"children":1512},{"style":588},[1513],{"type":326,"value":591},{"type":321,"tag":448,"props":1515,"children":1516},{"class":450,"line":734},[1517,1522],{"type":321,"tag":448,"props":1518,"children":1519},{"style":461},[1520],{"type":326,"value":1521},"            products: { ",{"type":321,"tag":448,"props":1523,"children":1524},{"style":588},[1525],{"type":326,"value":863},{"type":321,"tag":448,"props":1527,"children":1528},{"class":450,"line":779},[1529,1533,1537],{"type":321,"tag":448,"props":1530,"children":1531},{"style":461},[1532],{"type":326,"value":1452},{"type":321,"tag":448,"props":1534,"children":1535},{"style":748},[1536],{"type":326,"value":1432},{"type":321,"tag":448,"props":1538,"children":1539},{"style":461},[1540],{"type":326,"value":804},{"type":321,"tag":448,"props":1542,"children":1543},{"class":450,"line":788},[1544,1548],{"type":321,"tag":448,"props":1545,"children":1546},{"style":461},[1547],{"type":326,"value":1468},{"type":321,"tag":448,"props":1549,"children":1550},{"style":472},[1551],{"type":326,"value":1552},"'family'\n",{"type":321,"tag":448,"props":1554,"children":1555},{"class":450,"line":807},[1556],{"type":321,"tag":448,"props":1557,"children":1558},{"style":461},[1559],{"type":326,"value":1560},"            },\n",{"type":321,"tag":448,"props":1562,"children":1563},{"class":450,"line":816},[1564,1569,1573],{"type":321,"tag":448,"props":1565,"children":1566},{"style":461},[1567],{"type":326,"value":1568},"            families: ",{"type":321,"tag":448,"props":1570,"children":1571},{"style":748},[1572],{"type":326,"value":1432},{"type":321,"tag":448,"props":1574,"children":1575},{"style":588},[1576],{"type":326,"value":591},{"type":321,"tag":448,"props":1578,"children":1579},{"class":450,"line":825},[1580],{"type":321,"tag":448,"props":1581,"children":1582},{"style":461},[1583],{"type":326,"value":872},{"type":321,"tag":448,"props":1585,"children":1586},{"class":450,"line":834},[1587],{"type":321,"tag":448,"props":1588,"children":1589},{"style":461},[1590],{"type":326,"value":881},{"type":321,"tag":448,"props":1592,"children":1593},{"class":450,"line":843},[1594,1599],{"type":321,"tag":448,"props":1595,"children":1596},{"style":461},[1597],{"type":326,"value":1598},"            cancel: features, ",{"type":321,"tag":448,"props":1600,"children":1601},{"style":588},[1602],{"type":326,"value":863},{"type":321,"tag":448,"props":1604,"children":1605},{"class":450,"line":852},[1606,1611],{"type":321,"tag":448,"props":1607,"children":1608},{"style":455},[1609],{"type":326,"value":1610},"            ...",{"type":321,"tag":448,"props":1612,"children":1613},{"style":588},[1614],{"type":326,"value":1615}," // other actions features if you have them\n",{"type":321,"tag":448,"props":1617,"children":1618},{"class":450,"line":866},[1619],{"type":321,"tag":448,"props":1620,"children":1621},{"style":461},[1622],{"type":326,"value":955},{"type":321,"tag":448,"props":1624,"children":1625},{"class":450,"line":875},[1626],{"type":321,"tag":448,"props":1627,"children":1628},{"style":461},[1629],{"type":326,"value":1630},"    })\n",{"type":321,"tag":448,"props":1632,"children":1633},{"class":450,"line":884},[1634],{"type":321,"tag":448,"props":1635,"children":1636},{"style":461},[1637],{"type":326,"value":973},{"type":321,"tag":1249,"props":1639,"children":1641},{"id":1640},"authentication",[1642],{"type":326,"value":1643},"Authentication",{"type":321,"tag":322,"props":1645,"children":1646},{},[1647,1649,1655,1657,1662],{"type":326,"value":1648},"Each request to your implemented endpoints will contain a ",{"type":321,"tag":341,"props":1650,"children":1652},{"className":1651},[],[1653],{"type":326,"value":1654},"Authorization",{"type":326,"value":1656}," header with a Bearer token. You should compare this token with your ",{"type":321,"tag":341,"props":1658,"children":1660},{"className":1659},[],[1661],{"type":326,"value":346},{"type":326,"value":1663},", if they match you should consider request authorized.",{"type":321,"tag":1284,"props":1665,"children":1666},{"name":1295},[1667],{"type":321,"tag":437,"props":1668,"children":1670},{"className":439,"code":1669,"filename":992,"language":442,"meta":314,"style":314},"// add express middleware before all your routes\napp.use(async (req, res, next) => {\n    if (req.headers.authorization !== process.env.CK_INTEGRATION_TOKEN) {\n        return res.status(401).send({ code: 401, message: 'Unauthorized' })\n    }\n    next()\n})\n",[1671],{"type":321,"tag":341,"props":1672,"children":1673},{"__ignoreMap":314},[1674,1682,1739,1770,1829,1836,1848],{"type":321,"tag":448,"props":1675,"children":1676},{"class":450,"line":451},[1677],{"type":321,"tag":448,"props":1678,"children":1679},{"style":588},[1680],{"type":326,"value":1681},"// add express middleware before all your routes\n",{"type":321,"tag":448,"props":1683,"children":1684},{"class":450,"line":478},[1685,1689,1694,1698,1702,1706,1710,1714,1718,1722,1727,1731,1735],{"type":321,"tag":448,"props":1686,"children":1687},{"style":461},[1688],{"type":326,"value":1339},{"type":321,"tag":448,"props":1690,"children":1691},{"style":769},[1692],{"type":326,"value":1693},"use",{"type":321,"tag":448,"props":1695,"children":1696},{"style":461},[1697],{"type":326,"value":1158},{"type":321,"tag":448,"props":1699,"children":1700},{"style":455},[1701],{"type":326,"value":1362},{"type":321,"tag":448,"props":1703,"children":1704},{"style":461},[1705],{"type":326,"value":1367},{"type":321,"tag":448,"props":1707,"children":1708},{"style":1161},[1709],{"type":326,"value":1164},{"type":321,"tag":448,"props":1711,"children":1712},{"style":461},[1713],{"type":326,"value":1140},{"type":321,"tag":448,"props":1715,"children":1716},{"style":1161},[1717],{"type":326,"value":1380},{"type":321,"tag":448,"props":1719,"children":1720},{"style":461},[1721],{"type":326,"value":1140},{"type":321,"tag":448,"props":1723,"children":1724},{"style":1161},[1725],{"type":326,"value":1726},"next",{"type":321,"tag":448,"props":1728,"children":1729},{"style":461},[1730],{"type":326,"value":1385},{"type":321,"tag":448,"props":1732,"children":1733},{"style":455},[1734],{"type":326,"value":1390},{"type":321,"tag":448,"props":1736,"children":1737},{"style":461},[1738],{"type":326,"value":1395},{"type":321,"tag":448,"props":1740,"children":1741},{"class":450,"line":500},[1742,1747,1752,1757,1762,1766],{"type":321,"tag":448,"props":1743,"children":1744},{"style":455},[1745],{"type":326,"value":1746},"    if",{"type":321,"tag":448,"props":1748,"children":1749},{"style":461},[1750],{"type":326,"value":1751}," (req.headers.authorization ",{"type":321,"tag":448,"props":1753,"children":1754},{"style":455},[1755],{"type":326,"value":1756},"!==",{"type":321,"tag":448,"props":1758,"children":1759},{"style":461},[1760],{"type":326,"value":1761}," process.env.",{"type":321,"tag":448,"props":1763,"children":1764},{"style":748},[1765],{"type":326,"value":1135},{"type":321,"tag":448,"props":1767,"children":1768},{"style":461},[1769],{"type":326,"value":1177},{"type":321,"tag":448,"props":1771,"children":1772},{"class":450,"line":522},[1773,1777,1782,1787,1791,1796,1801,1805,1810,1814,1819,1824],{"type":321,"tag":448,"props":1774,"children":1775},{"style":455},[1776],{"type":326,"value":1185},{"type":321,"tag":448,"props":1778,"children":1779},{"style":461},[1780],{"type":326,"value":1781}," res.",{"type":321,"tag":448,"props":1783,"children":1784},{"style":769},[1785],{"type":326,"value":1786},"status",{"type":321,"tag":448,"props":1788,"children":1789},{"style":461},[1790],{"type":326,"value":1158},{"type":321,"tag":448,"props":1792,"children":1793},{"style":748},[1794],{"type":326,"value":1795},"401",{"type":321,"tag":448,"props":1797,"children":1798},{"style":461},[1799],{"type":326,"value":1800},").",{"type":321,"tag":448,"props":1802,"children":1803},{"style":769},[1804],{"type":326,"value":1408},{"type":321,"tag":448,"props":1806,"children":1807},{"style":461},[1808],{"type":326,"value":1809},"({ code: ",{"type":321,"tag":448,"props":1811,"children":1812},{"style":748},[1813],{"type":326,"value":1795},{"type":321,"tag":448,"props":1815,"children":1816},{"style":461},[1817],{"type":326,"value":1818},", message: ",{"type":321,"tag":448,"props":1820,"children":1821},{"style":472},[1822],{"type":326,"value":1823},"'Unauthorized'",{"type":321,"tag":448,"props":1825,"children":1826},{"style":461},[1827],{"type":326,"value":1828}," })\n",{"type":321,"tag":448,"props":1830,"children":1831},{"class":450,"line":544},[1832],{"type":321,"tag":448,"props":1833,"children":1834},{"style":461},[1835],{"type":326,"value":964},{"type":321,"tag":448,"props":1837,"children":1838},{"class":450,"line":566},[1839,1844],{"type":321,"tag":448,"props":1840,"children":1841},{"style":769},[1842],{"type":326,"value":1843},"    next",{"type":321,"tag":448,"props":1845,"children":1846},{"style":461},[1847],{"type":326,"value":1092},{"type":321,"tag":448,"props":1849,"children":1850},{"class":450,"line":594},[1851],{"type":321,"tag":448,"props":1852,"children":1853},{"style":461},[1854],{"type":326,"value":973},{"type":321,"tag":1249,"props":1856,"children":1858},{"id":1857},"verify-endpoints",[1859],{"type":326,"value":1860},"Verify endpoints",{"type":321,"tag":322,"props":1862,"children":1863},{},[1864,1866,1872,1874,1880],{"type":326,"value":1865},"Make sure that you implemented all required ",{"type":321,"tag":341,"props":1867,"children":1869},{"className":1868},[],[1870],{"type":326,"value":1871},"Controller",{"type":326,"value":1873}," and ",{"type":321,"tag":341,"props":1875,"children":1877},{"className":1876},[],[1878],{"type":326,"value":1879},"Action",{"type":326,"value":1881}," endpoints and your auth middleware is protecting them from unauthorized access.",{"type":321,"tag":329,"props":1883,"children":1885},{"id":1884},"verify-your-integration",[1886],{"type":326,"value":1887},"Verify your Integration",{"type":321,"tag":322,"props":1889,"children":1890},{},[1891,1893,1898,1900],{"type":326,"value":1892},"Go to the Churnkey dashboard -> Settings -> Billing Providers. You should see that your ",{"type":321,"tag":341,"props":1894,"children":1896},{"className":1895},[],[1897],{"type":326,"value":368},{"type":326,"value":1899}," is pending verification:\n",{"type":321,"tag":353,"props":1901,"children":1902},{"alt":355,"src":356},[],{"type":321,"tag":322,"props":1904,"children":1905},{},[1906,1908,1914,1916,1921,1923,1929,1931],{"type":326,"value":1907},"Add your ",{"type":321,"tag":341,"props":1909,"children":1911},{"className":1910},[],[1912],{"type":326,"value":1913},"API URL",{"type":326,"value":1915}," to the ",{"type":321,"tag":341,"props":1917,"children":1919},{"className":1918},[],[1920],{"type":326,"value":368},{"type":326,"value":1922},". This is your API root URL, we will append the endpoint with ",{"type":321,"tag":341,"props":1924,"children":1926},{"className":1925},[],[1927],{"type":326,"value":1928},"/churnkey",{"type":326,"value":1930}," prefix to it automatically:\n",{"type":321,"tag":353,"props":1932,"children":1933},{"alt":355,"src":356},[],{"type":321,"tag":322,"props":1935,"children":1936},{},[1937,1939,1945,1947],{"type":326,"value":1938},"Click on the ",{"type":321,"tag":341,"props":1940,"children":1942},{"className":1941},[],[1943],{"type":326,"value":1944},"Verify",{"type":326,"value":1946}," button to verify your integration:\n",{"type":321,"tag":353,"props":1948,"children":1949},{"alt":355,"src":356},[],{"type":321,"tag":322,"props":1951,"children":1952},{},[1953,1955],{"type":326,"value":1954},"You should see results and list of supported features soon:\n",{"type":321,"tag":353,"props":1956,"children":1957},{"alt":355,"src":356},[],{"type":321,"tag":329,"props":1959,"children":1961},{"id":1960},"troubleshooting",[1962],{"type":326,"value":1963},"Troubleshooting",{"type":321,"tag":322,"props":1965,"children":1966},{},[1967],{"type":326,"value":1968},"If you see any errors during the verification process, the most common issues are:",{"type":321,"tag":1970,"props":1971,"children":1972},"ul",{},[1973,1984,1997,2002],{"type":321,"tag":1974,"props":1975,"children":1976},"li",{},[1977,1979],{"type":326,"value":1978},"Incorrect ",{"type":321,"tag":341,"props":1980,"children":1982},{"className":1981},[],[1983],{"type":326,"value":346},{"type":321,"tag":1974,"props":1985,"children":1986},{},[1987,1989,1995],{"type":326,"value":1988},"Incorrect data format (e.g. wrong ",{"type":321,"tag":341,"props":1990,"children":1992},{"className":1991},[],[1993],{"type":326,"value":1994},"Model",{"type":326,"value":1996}," implementation)",{"type":321,"tag":1974,"props":1998,"children":1999},{},[2000],{"type":326,"value":2001},"Incorrect endpoint implementation (e.g. wrong url or wrong response)",{"type":321,"tag":1974,"props":2003,"children":2004},{},[2005,2010],{"type":321,"tag":341,"props":2006,"children":2008},{"className":2007},[],[2009],{"type":326,"value":1254},{"type":326,"value":2011}," endpoint is not implemented",{"type":321,"tag":322,"props":2013,"children":2014},{},[2015],{"type":326,"value":2016},"Generally, you should be able to fix most of the issues by following the error message you see. If you are still stuck, feel free to reach out to our support team, we are happy to help you.",{"type":321,"tag":322,"props":2018,"children":2019},{},[2020],{"type":326,"value":2021},"Keep in mind that we're following modular architecture, so if one of the optional modules doesn't work, other modules should work fine.",{"type":321,"tag":329,"props":2023,"children":2025},{"id":2024},"updating-integration",[2026],{"type":326,"value":2027},"Updating integration",{"type":321,"tag":322,"props":2029,"children":2030},{},[2031],{"type":326,"value":2032},"Over time you may want to add new features or fix bugs in your integration.",{"type":321,"tag":322,"props":2034,"children":2035},{},[2036,2038,2043,2045,2050],{"type":326,"value":2037},"We cache the ",{"type":321,"tag":341,"props":2039,"children":2041},{"className":2040},[],[2042],{"type":326,"value":1265},{"type":326,"value":2044},", so if your update includes changes to the ",{"type":321,"tag":341,"props":2046,"children":2048},{"className":2047},[],[2049],{"type":326,"value":1265},{"type":326,"value":2051},", you should re-verify your integration. If you only update the implementation, you don't need to re-verify it.",{"type":321,"tag":1249,"props":2053,"children":2055},{"id":2054},"manual-verification",[2056],{"type":326,"value":2057},"Manual verification",{"type":321,"tag":322,"props":2059,"children":2060},{},[2061,2063,2068],{"type":326,"value":2062},"You can go to the Churnkey dashboard -> Settings -> Billing Providers and click on the ",{"type":321,"tag":341,"props":2064,"children":2066},{"className":2065},[],[2067],{"type":326,"value":1944},{"type":326,"value":2069}," button to re-verify your integration.",{"type":321,"tag":1249,"props":2071,"children":2073},{"id":2072},"automatic-verification",[2074],{"type":326,"value":2075},"Automatic verification",{"type":321,"tag":322,"props":2077,"children":2078},{},[2079],{"type":326,"value":2080},"You can call the verify endpoint programmatically from your CI/CD or during the server start. This way, you can ensure that your integration is always up-to-date and verified.",{"type":321,"tag":1284,"props":2082,"children":2083},{"name":1295},[2084],{"type":321,"tag":433,"props":2085,"children":2086},{},[2087,2140,2263],{"type":321,"tag":437,"props":2088,"children":2093},{"className":2089,"code":2090,"filename":2091,"language":2092,"meta":314,"style":314},"language-bash shiki shiki-themes github-light-default github-light-default github-dark-default","curl -X POST https://api.churnkey.co/v2/verify -H \"Authorization: Bearer $CK_API_KEY\"\n","CI/CD","bash",[2094],{"type":321,"tag":341,"props":2095,"children":2096},{"__ignoreMap":314},[2097],{"type":321,"tag":448,"props":2098,"children":2099},{"class":450,"line":451},[2100,2105,2110,2115,2120,2125,2130,2135],{"type":321,"tag":448,"props":2101,"children":2102},{"style":1161},[2103],{"type":326,"value":2104},"curl",{"type":321,"tag":448,"props":2106,"children":2107},{"style":748},[2108],{"type":326,"value":2109}," -X",{"type":321,"tag":448,"props":2111,"children":2112},{"style":472},[2113],{"type":326,"value":2114}," POST",{"type":321,"tag":448,"props":2116,"children":2117},{"style":472},[2118],{"type":326,"value":2119}," https://api.churnkey.co/v2/verify",{"type":321,"tag":448,"props":2121,"children":2122},{"style":748},[2123],{"type":326,"value":2124}," -H",{"type":321,"tag":448,"props":2126,"children":2127},{"style":472},[2128],{"type":326,"value":2129}," \"Authorization: Bearer ",{"type":321,"tag":448,"props":2131,"children":2132},{"style":461},[2133],{"type":326,"value":2134},"$CK_API_KEY",{"type":321,"tag":448,"props":2136,"children":2137},{"style":472},[2138],{"type":326,"value":2139},"\"\n",{"type":321,"tag":437,"props":2141,"children":2143},{"className":439,"code":2142,"filename":441,"language":442,"meta":314,"style":314},"// in your server file\nfetch('https://api.churnkey.co/v2/verify', {\n    method: 'POST',\n    headers: {\n        'Authorization': `Bearer ${process.env.CK_API_KEY}`\n    }\n})\n",[2144],{"type":321,"tag":341,"props":2145,"children":2146},{"__ignoreMap":314},[2147,2155,2177,2194,2202,2249,2256],{"type":321,"tag":448,"props":2148,"children":2149},{"class":450,"line":451},[2150],{"type":321,"tag":448,"props":2151,"children":2152},{"style":588},[2153],{"type":326,"value":2154},"// in your server file\n",{"type":321,"tag":448,"props":2156,"children":2157},{"class":450,"line":478},[2158,2163,2167,2172],{"type":321,"tag":448,"props":2159,"children":2160},{"style":769},[2161],{"type":326,"value":2162},"fetch",{"type":321,"tag":448,"props":2164,"children":2165},{"style":461},[2166],{"type":326,"value":1158},{"type":321,"tag":448,"props":2168,"children":2169},{"style":472},[2170],{"type":326,"value":2171},"'https://api.churnkey.co/v2/verify'",{"type":321,"tag":448,"props":2173,"children":2174},{"style":461},[2175],{"type":326,"value":2176},", {\n",{"type":321,"tag":448,"props":2178,"children":2179},{"class":450,"line":500},[2180,2185,2190],{"type":321,"tag":448,"props":2181,"children":2182},{"style":461},[2183],{"type":326,"value":2184},"    method: ",{"type":321,"tag":448,"props":2186,"children":2187},{"style":472},[2188],{"type":326,"value":2189},"'POST'",{"type":321,"tag":448,"props":2191,"children":2192},{"style":461},[2193],{"type":326,"value":804},{"type":321,"tag":448,"props":2195,"children":2196},{"class":450,"line":522},[2197],{"type":321,"tag":448,"props":2198,"children":2199},{"style":461},[2200],{"type":326,"value":2201},"    headers: {\n",{"type":321,"tag":448,"props":2203,"children":2204},{"class":450,"line":544},[2205,2210,2215,2220,2225,2230,2235,2239,2244],{"type":321,"tag":448,"props":2206,"children":2207},{"style":472},[2208],{"type":326,"value":2209},"        'Authorization'",{"type":321,"tag":448,"props":2211,"children":2212},{"style":461},[2213],{"type":326,"value":2214},": ",{"type":321,"tag":448,"props":2216,"children":2217},{"style":472},[2218],{"type":326,"value":2219},"`Bearer ${",{"type":321,"tag":448,"props":2221,"children":2222},{"style":461},[2223],{"type":326,"value":2224},"process",{"type":321,"tag":448,"props":2226,"children":2227},{"style":472},[2228],{"type":326,"value":2229},".",{"type":321,"tag":448,"props":2231,"children":2232},{"style":461},[2233],{"type":326,"value":2234},"env",{"type":321,"tag":448,"props":2236,"children":2237},{"style":472},[2238],{"type":326,"value":2229},{"type":321,"tag":448,"props":2240,"children":2241},{"style":748},[2242],{"type":326,"value":2243},"CK_API_KEY",{"type":321,"tag":448,"props":2245,"children":2246},{"style":472},[2247],{"type":326,"value":2248},"}`\n",{"type":321,"tag":448,"props":2250,"children":2251},{"class":450,"line":566},[2252],{"type":321,"tag":448,"props":2253,"children":2254},{"style":461},[2255],{"type":326,"value":964},{"type":321,"tag":448,"props":2257,"children":2258},{"class":450,"line":594},[2259],{"type":321,"tag":448,"props":2260,"children":2261},{"style":461},[2262],{"type":326,"value":973},{"type":321,"tag":437,"props":2264,"children":2267},{"className":439,"code":2265,"filename":2266,"language":442,"meta":314,"style":314},"import { Integrator } from '@churnkey/sdk'\nIntegrator.verify(process.env.CK_API_KEY)\n","Typescript SDK",[2268],{"type":321,"tag":341,"props":2269,"children":2270},{"__ignoreMap":314},[2271,2290],{"type":321,"tag":448,"props":2272,"children":2273},{"class":450,"line":451},[2274,2278,2282,2286],{"type":321,"tag":448,"props":2275,"children":2276},{"style":455},[2277],{"type":326,"value":458},{"type":321,"tag":448,"props":2279,"children":2280},{"style":461},[2281],{"type":326,"value":464},{"type":321,"tag":448,"props":2283,"children":2284},{"style":455},[2285],{"type":326,"value":469},{"type":321,"tag":448,"props":2287,"children":2288},{"style":472},[2289],{"type":326,"value":475},{"type":321,"tag":448,"props":2291,"children":2292},{"class":450,"line":478},[2293,2298,2303,2308,2312],{"type":321,"tag":448,"props":2294,"children":2295},{"style":461},[2296],{"type":326,"value":2297},"Integrator.",{"type":321,"tag":448,"props":2299,"children":2300},{"style":769},[2301],{"type":326,"value":2302},"verify",{"type":321,"tag":448,"props":2304,"children":2305},{"style":461},[2306],{"type":326,"value":2307},"(process.env.",{"type":321,"tag":448,"props":2309,"children":2310},{"style":748},[2311],{"type":326,"value":2243},{"type":321,"tag":448,"props":2313,"children":2314},{"style":461},[2315],{"type":326,"value":2316},")\n",{"type":321,"tag":2318,"props":2319,"children":2320},"style",{},[2321],{"type":326,"value":2322},"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":500,"depth":500,"links":2324},[2325,2326,2331,2332,2333],{"id":331,"depth":478,"text":334},{"id":398,"depth":478,"text":401,"children":2327},[2328,2329,2330],{"id":1251,"depth":500,"text":1254},{"id":1640,"depth":500,"text":1643},{"id":1857,"depth":500,"text":1860},{"id":1884,"depth":478,"text":1887},{"id":1960,"depth":478,"text":1963},{"id":2024,"depth":478,"text":2027,"children":2334},[2335,2336],{"id":2054,"depth":500,"text":2057},{"id":2072,"depth":500,"text":2075},"markdown","content:99.integrations:5.publish.md","content","99.integrations/5.publish.md","99.integrations/5.publish","md",{"loc":311},[2345,2349],{"_path":2346,"title":2347,"description":2348},"/integrations/actions/change-price","Change Price - Action","Changes the price and/or product of a subscription.",null,{"_path":2351,"_dir":2352,"_draft":313,"_partial":313,"_locale":314,"type":2353,"title":2354,"properties":2355,"_id":2408,"_type":2409,"_source":2339,"_file":2410,"_stem":2411,"_extension":2409},"/types/features.type","types","object","Features Manifest",{"controllers":2356,"actions":2403},{"type":2353,"severity":2357,"description":2358,"properties":2359},"required","Defines what controllers are enabled in your integration and what of their features are available. \n Required controllers should be enabled.",{"customers":2360,"prices":2366,"subscriptions":2377,"coupons":2382,"products":2388,"families":2398},{"type":2353,"severity":2357,"description":2361,"properties":2362},"Defines if the `Customers` controller is enabled and what features are available",{"enabled":2363},{"type":2364,"severity":2357,"description":2365},"boolean","Should be always true, because the `Customers` controller is required for minimal integration",{"type":2353,"severity":2357,"description":2367,"properties":2368},"Defines if the `Prices` controller is enabled and what features are available",{"enabled":2369,"type":2371},{"type":2364,"severity":2357,"description":2370},"Should be always true, because the `Prices` controller is required for minimal integration",{"type":2372,"severity":2357,"description":2373,"values":2374},"enum","Defines the architecture of the prices. They can be standalone or belong to a product",[2375,2376],"standalone","product",{"type":2353,"severity":2357,"description":2378,"properties":2379},"Defines if the `Subscriptions` controller is enabled and what features are available",{"enabled":2380},{"type":2364,"severity":2357,"description":2381},"Should be always true, because the `Subscriptions` controller is required for minimal integration",{"type":2353,"severity":2383,"description":2384,"properties":2385},"optional","Defines if the `Coupons` controller is enabled and what features are available. If not set, the controller is disabled.",{"enabled":2386},{"type":2364,"severity":2357,"description":2387},"If true, the `Coupons` controller is enabled and can be used by Churnkey, otherwise it is disabled.",{"type":2353,"severity":2383,"description":2389,"properties":2390},"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":2391,"type":2393},{"type":2364,"severity":2357,"description":2392},"If true, the `Products` controller is enabled and can be used by Churnkey, otherwise it is disabled.",{"type":2372,"severity":2357,"description":2394,"values":2395},"Defines the architecture of the products. They can be standalone or belong to a family",[2396,2397],"'standalone'","'family'",{"type":2353,"severity":2383,"description":2399,"properties":2400},"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":2401},{"type":2364,"severity":2357,"description":2402},"If true, the `Families` controller is enabled and can be used by Churnkey, otherwise it is disabled.",{"type":2353,"severity":2383,"description":2404,"properties":2405},"Defines what actions are enabled in your integration and what features are available.",{"cancel":2406},{"severity":2383,"ref":2407},"/types/actions/cancel/features.type.json","content:types:features.type.json","json","types/features.type.json","types/features.type",{"data":2413,"body":2415,"excerpt":-1,"toc":2421},{"title":314,"description":2414},"Defines what controllers are enabled in your integration and what of their features are available.\nRequired controllers should be enabled.",{"type":318,"children":2416},[2417],{"type":321,"tag":322,"props":2418,"children":2419},{},[2420],{"type":326,"value":2414},{"title":314,"searchDepth":478,"depth":478,"links":2422},[],{"data":2424,"body":2425,"excerpt":-1,"toc":2431},{"title":314,"description":2404},{"type":318,"children":2426},[2427],{"type":321,"tag":322,"props":2428,"children":2429},{},[2430],{"type":326,"value":2404},{"title":314,"searchDepth":478,"depth":478,"links":2432},[],1775515594154]