1<!DOCTYPE html> 2<html dir="ltr" lang="en-US" prefix="og: https://ogp.me/ns#"> 3<head> 4<meta charset="UTF-8"> 5<meta name="viewport" content="width=device-width, initial-scale=1"> 6 <link rel="profile" href="https://gmpg.org/xfn/11"> 7
8<script id="getautoseo-conversion-tracker" defer src="https://churnsolution.com/wp-content/plugins/getautoseo-ai-content-publisher/assets/js/conversion-tracker.js?ver=1.3.83" data-endpoint="https://churnsolution.com/wp-json/autoseo/v1/conversion-event" data-pageview-endpoint="https://churnsolution.com/wp-json/autoseo/v1/article-pageview" data-token="c6d45848cb11ecae53357cafd881b3d5d3121e0540f01e0b1f260881a66d2f4a" data-article-id=""></script>
8 9<title>Installing Churn Solution | Churn Solution</title> 10 11 <!-- All in One SEO 4.9.3 - aioseo.com --> 12 <meta name="description" content="How to integrate the cancellation flow with your application or service" /> 13 <meta name="robots" content="max-image-preview:large" /> 14 <link rel="canonical" href="https://churnsolution.com/docs/install/" /> 15 <meta name="generator" content="All in One SEO (AIOSEO) 4.9.3" /> 16 <meta property="og:locale" content="en_US" /> 17 <meta property="og:site_name" content="Churn Solution | Churn solution that turns your customers right around." /> 18 <meta property="og:type" content="article" /> 19 <meta property="og:title" content="Installing Churn Solution | Churn Solution" /> 20 <meta property="og:description" content="How to integrate the cancellation flow with your application or service" /> 21 <meta property="og:url" content="https://churnsolution.com/docs/install/" /> 22 <meta property="og:image" content="https://churnsolution.com/wp-content/uploads/2024/04/CS-logo-300X300-1.png" /> 23 <meta property="og:image:secure_url" content="https://churnsolution.com/wp-content/uploads/2024/04/CS-logo-300X300-1.png" /> 24 <meta property="og:image:width" content="1200" /> 25 <meta property="og:image:height" content="630" /> 26 <meta property="article:published_time" content="2024-03-03T18:30:08+00:00" /> 27 <meta property="article:modified_time" content="2026-08-06T09:08:35+00:00" /> 28 <meta name="twitter:card" content="summary_large_image" /> 29 <meta name="twitter:title" content="Installing Churn Solution | Churn Solution" /> 30 <meta name="twitter:description" content="How to integrate the cancellation flow with your application or service" /> 31 <meta name="twitter:image" content="https://churnsolution.com/wp-content/uploads/2024/04/CS-logo-300X300-1.png" /> 32
32<script type="application/ld+json" class="aioseo-schema"> 33 {"@context":"https:\/\/schema.org","@graph":[{"@type":"BreadcrumbList","@id":"https:\/\/churnsolution.com\/docs\/install\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/churnsolution.com#listItem","position":1,"name":"Home","item":"https:\/\/churnsolution.com","nextItem":{"@type":"ListItem","@id":"https:\/\/churnsolution.com\/docs\/#listItem","name":"docs"}},{"@type":"ListItem","@id":"https:\/\/churnsolution.com\/docs\/#listItem","position":2,"name":"docs","item":"https:\/\/churnsolution.com\/docs\/","nextItem":{"@type":"ListItem","@id":"https:\/\/churnsolution.com\/docs\/install\/#listItem","name":"Installing Churn Solution"},"previousItem":{"@type":"ListItem","@id":"https:\/\/churnsolution.com#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/churnsolution.com\/docs\/install\/#listItem","position":3,"name":"Installing Churn Solution","previousItem":{"@type":"ListItem","@id":"https:\/\/churnsolution.com\/docs\/#listItem","name":"docs"}}]},{"@type":"Organization","@id":"https:\/\/churnsolution.com\/#organization","name":"Churn Solution","description":"Churn solution that turns your customers right around.","url":"https:\/\/churnsolution.com\/","logo":{"@type":"ImageObject","url":"https:\/\/churnsolution.com\/wp-content\/uploads\/2023\/09\/cropped-logo-1-2.png","@id":"https:\/\/churnsolution.com\/docs\/install\/#organizationLogo","width":86,"height":105,"caption":"logo"},"image":{"@id":"https:\/\/churnsolution.com\/docs\/install\/#organizationLogo"}},{"@type":"WebPage","@id":"https:\/\/churnsolution.com\/docs\/install\/#webpage","url":"https:\/\/churnsolution.com\/docs\/install\/","name":"Installing Churn Solution | Churn Solution","description":"How to integrate the cancellation flow with your application or service","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/churnsolution.com\/#website"},"breadcrumb":{"@id":"https:\/\/churnsolution.com\/docs\/install\/#breadcrumblist"},"datePublished":"2024-03-03T18:30:08+00:00","dateModified":"2026-08-06T09:08:35+00:00"},{"@type":"WebSite","@id":"https:\/\/churnsolution.com\/#website","url":"https:\/\/churnsolution.com\/","name":"Churn Solution","description":"Churn solution that turns your customers right around.","inLanguage":"en-US","publisher":{"@id":"https:\/\/churnsolution.com\/#organization"}}]} 34 </script>
34 35 <!-- All in One SEO --> 36 37<link rel="alternate" type="application/rss+xml" title="Churn Solution » Feed" href="https://churnsolution.com/feed/" /> 38<link rel="alternate" type="application/rss+xml" title="Churn Solution » Comments Feed" href="https://churnsolution.com/comments/feed/" /> 39<link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://churnsolution.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fchurnsolution.com%2Fdocs%2Finstall%2F" /> 40<link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://churnsolution.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fchurnsolution.com%2Fdocs%2Finstall%2F&format=xml" /> 41<style id="wp-img-auto-sizes-contain-inline-css"> 42img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px} 43/*# sourceURL=wp-img-auto-sizes-contain-inline-css */ 44</style> 45<link rel='stylesheet' id='astra-theme-css-css' href='https://churnsolution.com/wp-content/themes/astra/assets/css/minified/main.min.css?ver=4.3.0' media='all' /> 46<style id="astra-theme-css-inline-css"> 47:root{--ast-container-default-xlg-padding:3em;--ast-container-default-lg-padding:3em;--ast-container-default-slg-padding:2em;--ast-container-default-md-padding:3em;--ast-container-default-sm-padding:3em;--ast-container-default-xs-padding:2.4em;--ast-container-default-xxs-padding:1.8em;--ast-code-block-background:#ECEFF3;--ast-comment-inputs-background:#F9FAFB;}html{font-size:112.5%;}a{color:var(--ast-global-color-0);}a:hover,a:focus{color:var(--ast-global-color-1);}body,button,input,select,textarea,.ast-button,.ast-custom-button{font-family:Poppins,sans-serif;font-weight:inherit;font-size:18px;font-size:1rem;}blockquote{color:var(--ast-global-color-3);}.site-title{font-size:35px;font-size:1.9444444444444rem;display:block;}header .custom-logo-link img{max-width:30px;}.astra-logo-svg{width:30px;}.site-header .site-description{font-size:15px;font-size:0.83333333333333rem;display:none;}.entry-title{font-size:30px;font-size:1.6666666666667rem;}h1,.entry-content h1{font-size:64px;font-size:3.5555555555556rem;}h2,.entry-content h2{font-size:48px;font-size:2.6666666666667rem;}h3,.entry-content h3{font-size:24px;font-size:1.3333333333333rem;}h4,.entry-content h4{font-size:20px;font-size:1.1111111111111rem;}h5,.entry-content h5{font-size:18px;font-size:1rem;}h6,.entry-content h6{font-size:15px;font-size:0.83333333333333rem;}::selection{background-color:var(--ast-global-color-0);color:#ffffff;}body,h1,.entry-title a,.entry-content h1,h2,.entry-content h2,h3,.entry-content h3,h4,.entry-content h4,h5,.entry-content h5,h6,.entry-content h6{color:var(--ast-global-color-3);}.tagcloud a:hover,.tagcloud a:focus,.tagcloud a.current-item{color:#ffffff;border-color:var(--ast-global-color-0);background-color:var(--ast-global-color-0);}input:focus,input[type="text"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="password"]:focus,input[type="reset"]:focus,input[type="search"]:focus,textarea:focus{border-color:var(--ast-global-color-0);}input[type="radio"]:checked,input[type=reset],input[type="checkbox"]:checked,input[type="checkbox"]:hover:checked,input[type="checkbox"]:focus:checked,input[type=range]::-webkit-slider-thumb{border-color:var(--ast-global-color-0);background-color:var(--ast-global-color-0);box-shadow:none;}.site-footer a:hover + .post-count,.site-footer a:focus + .post-count{background:var(--ast-global-color-0);border-color:var(--ast-global-color-0);}.single .nav-links .nav-previous,.single .nav-links .nav-next{color:var(--ast-global-color-0);}.entry-meta,.entry-meta *{line-height:1.45;color:var(--ast-global-color-0);}.entry-meta a:hover,.entry-meta a:hover *,.entry-meta a:focus,.entry-meta a:focus *,.page-links > .page-link,.page-links .page-link:hover,.post-navigation a:hover{color:var(--ast-global-color-1);}#cat option,.secondary .calendar_wrap thead a,.secondary .calendar_wrap thead a:visited{color:var(--ast-global-color-0);}.secondary .calendar_wrap #today,.ast-progress-val span{background:var(--ast-global-color-0);}.secondary a:hover + .post-count,.secondary a:focus + .post-count{background:var(--ast-global-color-0);border-color:var(--ast-global-color-0);}.calendar_wrap #today > a{color:#ffffff;}.page-links .page-link,.single .post-navigation a{color:var(--ast-global-color-0);}.ast-archive-title{color:var(--ast-global-color-2);}.widget-title,.widget .wp-block-heading{font-size:25px;font-size:1.3888888888889rem;color:var(--ast-global-color-2);}a:focus-visible,.ast-menu-toggle:focus-visible,.site .skip-link:focus-visible,.wp-block-loginout input:focus-visible,.wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper,.ast-header-navigation-arrow:focus-visible,.woocommerce .wc-proceed-to-checkout > .checkout-button:focus-visible,.woocommerce .woocommerce-MyAccount-navigation ul li a:focus-visible,.ast-orders-table__row .ast-orders-table__cell:focus-visible,.woocommerce .woocommerce-order-details .order-again > .button:focus-visible,.woocommerce .woocommerce-message a.button.wc-forward:focus-visible,.woocommerce #minus_qty:focus-visible,.woocommerce #plus_qty:focus-visible,a#ast-apply-coupon:focus-visible,.woocommerce .woocommerce-info a:focus-visible,.woocommerce .astra-shop-summary-wrap a:focus-visible,.woocommerce a.wc-forward:focus-visible,#ast-apply-coupon:focus-visible,.woocommerce-js .woocommerce-mini-cart-item a.remove:focus-visible{outline-style:dotted;outline-color:inherit;outline-width:thin;border-color:transparent;}input:focus,input[type="text"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="password"]:focus,input[type="reset"]:focus,input[type="search"]:focus,input[type="number"]:focus,textarea:focus,.wp-block-search__input:focus,[data-section="section-header-mobile-trigger"] .ast-button-wrap .ast-mobile-menu-trigger-minimal:focus,.ast-mobile-popup-drawer.active .menu-toggle-close:focus,.woocommerce-ordering select.orderby:focus,#ast-scroll-top:focus,#coupon_code:focus,.woocommerce-page #comment:focus,.woocommerce #reviews #respond input#submit:focus,.woocommerce a.add_to_cart_button:focus,.woocommerce .button.single_add_to_cart_button:focus,.woocommerce .woocommerce-cart-form button:focus,.woocommerce .woocommerce-cart-form__cart-item .quantity .qty:focus,.woocommerce .woocommerce-billing-fields .woocommerce-billing-fields__field-wrapper .woocommerce-input-wrapper > .input-text:focus,.woocommerce #order_comments:focus,.woocommerce #place_order:focus,.woocommerce .woocommerce-a
47ddress-fields .woocommerce-address-fields__field-wrapper .woocommerce-input-wrapper > .input-text:focus,.woocommerce .woocommerce-MyAccount-content form button:focus,.woocommerce .woocommerce-MyAccount-content .woocommerce-EditAccountForm .woocommerce-form-row .woocommerce-Input.input-text:focus,.woocommerce .ast-woocommerce-container .woocommerce-pagination ul.page-numbers li a:focus,body #content .woocommerce form .form-row .select2-container--default .select2-selection--single:focus,#ast-coupon-code:focus,.woocommerce.woocommerce-js .quantity input[type=number]:focus,.woocommerce-js .woocommerce-mini-cart-item .quantity input[type=number]:focus,.woocommerce p#ast-coupon-trigger:focus{border-style:dotted;border-color:inherit;border-width:thin;outline-color:transparent;}.ast-logo-title-inline .site-logo-img{padding-right:1em;}.site-logo-img img{ transition:all 0.2s linear;}.ast-header-break-point #ast-desktop-header{display:none;}@media (min-width:921px){#ast-mobile-header{display:none;}}.wp-block-buttons.aligncenter{justify-content:center;}@media (max-width:921px){.ast-theme-transparent-header #primary,.ast-theme-transparent-header #secondary{padding:0;}}@media (max-width:921px){.ast-plain-container.ast-no-sidebar #primary{padding:0;}}.ast-plain-container.ast-no-sidebar #primary{margin-top:0;margin-bottom:0;}.wp-block-button.is-style-outline .wp-block-button__link{border-color:var(--ast-global-color-5);}div.wp-block-button.is-style-outline > .wp-block-button__link:not(.has-text-color),div.wp-block-button.wp-block-button__link.is-style-outline:not(.has-text-color){color:var(--ast-global-color-5);}.wp-block-button.is-style-outline .wp-block-button__link:hover,div.wp-block-button.is-style-outline .wp-block-button__link:focus,div.wp-block-button.is-style-outline > .wp-block-button__link:not(.has-text-color):hover,div.wp-block-button.wp-block-button__link.is-style-outline:not(.has-text-color):hover{color:#0f124d;background-color:var(--ast-global-color-5);border-color:var(--ast-global-color-5);}.post-page-numbers.current .page-link,.ast-pagination .page-numbers.current{color:#ffffff;border-color:var(--ast-global-color-0);background-color:var(--ast-global-color-0);border-radius:2px;}h1.widget-title{font-weight:inherit;}h2.widget-title{font-weight:inherit;}h3.widget-title{font-weight:inherit;}#page{display:flex;flex-direction:column;min-height:100vh;}.ast-404-layout-1 h1.page-title{color:var(--ast-global-color-2);}.single .post-navigation a{line-height:1em;height:inherit;}.error-404 .page-sub-title{font-size:1.5rem;font-weight:inherit;}.search .site-content .content-area .search-form{margin-bottom:0;}#page .site-content{flex-grow:1;}.widget{margin-bottom:1.25em;}#secondary li{line-height:1.5em;}#secondary .wp-block-group h2{margin-bottom:0.7em;}#secondary h2{font-size:1.7rem;}.ast-separate-container .ast-article-post,.ast-separate-container .ast-article-single,.ast-separate-container .ast-comment-list li.depth-1,.ast-separate-container .comment-respond{padding:3em;}.ast-separate-container .ast-article-single .ast-article-single{padding:0;}.ast-article-single .wp-block-post-template-is-layout-grid{padding-left:0;}.ast-separate-container .ast-comment-list li.depth-1,.hentry{margin-bottom:2em;}.ast-separate-container .ast-archive-description,.ast-separate-container .ast-author-box{border-bottom:1px solid var(--ast-border-color);}.ast-separate-container .comments-title{padding:2em 2em 0 2em;}.ast-page-builder-template .comment-form-textarea,.ast-comment-formwrap .ast-grid-common-col{padding:0;}.ast-comment-formwrap{padding:0 20px;display:inline-flex;column-gap:20px;}.archive.ast-page-builder-template .entry-header{margin-top:2em;}.ast-page-builder-template .ast-comment-formwrap{width:100%;}.entry-title{margin-bottom:0.5em;}.ast-archive-description p{font-size:inherit;font-weight:inherit;line-height:inherit;}@media (min-width:921px){.ast-left-sidebar.ast-page-builder-template #secondary,.archive.ast-right-sidebar.ast-page-builder-template .site-main{padding-left:20px;padding-right:20px;}}@media (max-width:544px){.ast-comment-formwrap.ast-row{column-gap:10px;display:inline-block;}#ast-commentform .ast-grid-common-col{position:relative;width:100%;}}@media (min-width:1201px){.ast-separate-container .ast-article-post,.ast-separate-container .ast-article-single,.ast-separate-container .ast-author-box,.ast-separate-container .ast-404-layout-1,.ast-separate-container .no-results{padding:3em;}}@media (max-width:921px){.ast-separate-container #primary,.ast-separate-container #secondary{padding:1.5em 0;}#primary,#secondary{padding:1.5em 0;margin:0;}.ast-left-sidebar #content > .ast-container{display:flex;flex-direction:column-reverse;width:100%;}}@media (min-width:922px){.ast-separate-container.ast-right-sidebar #primary,.ast-separate-container.ast-left-sidebar #primary{border:0;}.search-no-results.ast-separate-container #primary{margin-bottom:4em;}}.wp-block-button .wp-block-button__link{color:var(--ast-global-color-2);}.wp-block-button .wp-block-button__link:hover,.wp-block-button .wp-block-button__link:focus{color:#0f124d;background-color:var(--ast-global-color-5);border-color:var(--ast-global-color-5);}.wp-block-button .wp-block-button__link,.wp-block-search .wp-block-search__button,body .wp-block-file .wp-block-file__button{border-style:solid;border-top-width:0px;border-right-width:0px;border-left-width:0px;border-bottom-width:0px;border-color:var(--ast-global-color-5);background-color:var(--ast-global-color-5);color:var(--ast-global-color-2);font-family:inherit;font-weight:600;line-height:1em;font-size:20px;font-size:1.1111111111111rem;border-top-left-radius:8px;border-top-right-radius:8px;border-bottom-right-radius:8px;border-bottom-left-radius:8px;padding-top:12px;padding-right:24px;padding-bottom:12px;padding-left:24px;}@media (max-width:921px){.wp-block-button .wp-block-button__link,.wp-block-search .wp-block-search__button,body .wp-block-file .wp-block-file__button{padding-top:18px;padding-right:32px;padding-bottom:18px;padding-left:32px;}}@media (max-width:544px){.wp-block-button .wp-block-button__link,.wp-block-search .wp-block-search__button,body .wp-block-file .wp-block-file__button{padding-top:15px;padding-right:28px;padding-bottom:15px;padding-left:28px;}}.menu-toggle,button,.ast-button,.ast-custom-button,.button,input#submit,input[type="button"],input[type="submit"],input[type="reset"],#comments .submit,.search .search-submit,form[CLASS*="wp-block-search__"].wp-block-search .wp-block-search__inside-wrapper .wp-block-search__button,body .wp-block-file .wp-block-file__button,.search .search-submit,.woocommerce-js a.button,.woocommerce button.button,.woocommerce .woocommerce-message a.button,.woocommerce #respond input#submit.alt,.woocommerce input.button.alt,.woocommerce input.button,.woocommerce input.button:disabled,.woocommerce input.button:disabled[disabled],.woocommerce input.button:disabled:hover,.woocommerce input.button:disabled[disabled]:hover,.woocommerce #respond input#submit,.woocommerce button.button.alt.disabled,.wc-block-grid__products .wc-block-grid__product .wp-block-button__link,.wc-block-grid__product-onsale,[CLASS*="wc-block"] button,.woocommerce-js .astra-cart-drawer .astra-cart-drawer-content .woocommerce-mini-cart__buttons .button:not(.checkout):not(.ast-continue-shopping),.woocommerce-js .astra-cart-drawer .astra-cart-drawer-content .woocommerce-mini-cart__buttons a.checkout,.woocommerce button.button.alt.disabled.wc-variation-selection-needed{border-style:solid;border-top-width:0px;border-right-width:0px;border-left-width:0px;border-bottom-width:0px;color:var(--ast-global-color-2);border-color:var(--ast-global-color-5);background-color:var(--ast-global-color-5);padding-top:12px;padding-right:24px;padding-bottom:12px;padding-left:24px;font-family:inherit;font-weight:600;font-size:20px;font-size:1.1111111111111rem;line-height:1em;border-top-left-radius:8px;border-top-right-radius:8px;border-bottom-right-radius:8px;border-bottom-left-radius:8px;}button:focus,.menu-toggle:hover,button:hover,.ast-button:hover,.ast-custom-button:hover .button:hover,.ast-custom-button:hover ,input[type=reset]:hover,input[type=reset]:focus,input#submit:hover,input#submit:focus,input[type="button"]:hover,input[type="button"]:focus,input[type="submit"]:hover,input[type="submit"]:focus,form[CLASS*="wp-block-search__"].wp-block-search .wp-block-search__inside-wrapper .wp-block-search__button:hover,form[CLASS*="wp-block-search__"].wp-block-search .wp-block-search__inside-wrapper .wp-block-search__button:focus,body .wp-block-file .wp-block-file__button:hover,body .wp-block-file .wp-block-file__button:focus,.woocommerce-js a.button:hover,.woocommerce button.button:hover,.woocommerce .woocommerce-message a.button:hover,.woocommerce #respond input#submit:hover,.woocommerce #respond input#submit.alt:hover,.woocommerce input.button.alt:hover,.woocommerce input.button:hover,.woocommerce button.button.alt.disabled:hover,.wc-block-grid__products .wc-block-grid__product .wp-block-button__link:hover,[CLASS*="wc-block"] button:hover,.woocommerce-js .astra-cart-drawer .astra-cart-drawer-content .woocommerce-mini-cart__buttons .button:not(.checkout):not(.ast-continue-shopping):hover,.woocommerce-js .astra-cart-drawer .astra-cart-drawer-content .woocommerce-mini-cart__buttons a.checkout:hover,.woocommerce button.button.alt.disabled.wc-variation-selection-needed:hover{color:#0f124d;background-color:var(--ast-global-color-5);border-color:var(--ast-global-color-5);}form[CLASS*="wp-block-search__"].wp-block-search .wp-block-search__inside-wrapper .wp-block-search__button.has-icon{padding-top:calc(12px - 3px);padding-right:calc(24px - 3px);padding-bottom:calc(12px - 3px);padding-left:calc(24px - 3px);}@media (max-width:921px){.menu-toggle,button,.ast-button,.ast-custom-button,.button,input#submit,input[type="button"],input[type="submit"],input[type="reset"],#comments .submit,.search .search-submit,form[CLASS*="wp-block-search__"].wp-block-search .wp-block-search__inside-wrapper .wp-block-search__button,body .wp-block-file .wp-block-file__button,.search .search-submit,.woocommerce-js a.button,.woocommerce button.button,.woocommerce .woocommerce-message a.button,.woocommerce #respond input#submit.alt,.woocommerce input.button.alt,.woocommerce input.button,.woocommerce input.button:disabled,.woocommerce input.button:disabled[disabled],.woocommerce input.button:disabled:hover,.woocommerce input.button:disabled[disabled]:hover,.woocommerce #respond input#submit,.woocommerce button.button.alt.disabled,.wc-block-grid__products .wc-block-grid__product .wp-block-button__link,.wc-block-grid__product-onsale,[CLASS*="wc-block"] button,.woocommerce-js .astra-cart-drawer .astra-cart-drawer-content .woocommerce-mini-cart__buttons .button:not(.checkout):not(.ast-continue-shopping),.woocommerce-js .astra-cart-drawer .astra-cart-drawer-content .woocommerce-mini-cart__buttons a.checkout,.woocommerce button.button.alt.disabled.wc-variation-selection-needed{padding-top:18px;padding-right:32px;padding-bottom:18px;padding-left:32px;}}@media (max-width:544px){.menu-toggle,button,.ast-button,.ast-custom-button,.button,input#submit,input[type="button"],input[type="submit"],input[type="reset"],#comments .submit,.search .search-submit,form[CLASS*="wp-block-search__"].wp-block-search .wp-block-search__inside-wrapper .wp-block-search__button,body .wp-block-file .wp-block-file__button,.search .search-submit,.woocommerce-js a.button,.woocommerce button.button,.woocommerce .woocommerce-message a.button,.woocommerce #respond input#submit.alt,.woocommerce input.button.alt,.woocommerce input.button,.woocommerce input.button:disabled,.woocommerce input.button:disabled[disabled],.woocommerce input.button:disabled:hover,.woocommerce input.button:disabled[disabled]:hover,.woocommerce #respond input#submit,.woocommerce button.button.alt.disabled,.wc-block-grid__products .wc-block-grid__product .wp-block-button__link,.wc-block-grid__product-onsale,[CLASS*="wc-block"] button,.woocommerce-js .astra-cart-drawer .astra-cart-drawer-content .woocommerce-mini-cart__buttons .button:not(.checkout):not(.ast-continue-shopping),.woocommerce-js .astra-cart-drawer .astra-cart-drawer-content .woocommerce-mini-cart__buttons a.checkout,.woocommerce button.button.alt.disabled.wc-variation-selection-needed{padding-top:15px;padding-right:28px;padding-bottom:15px;padding-left:28px;}}@media (max-width:921px){.ast-mobile-header-stack .main-header-bar .ast-search-menu-icon{display:inline-block;}.ast-header-break-point.ast-header-custom-item-outside .ast-mobile-header-stack .main-header-bar .ast-search-icon{margin:0;}.ast-comment-avatar-wrap img{max-width:2.5em;}.ast-separate-container .ast-comment-list li.depth-1{padding:1.5em 2.14em;}.ast-separate-container .comment-respond{padding:2em 2.14em;}.ast-comment-meta{padding:0 1.8888em 1.3333em;}}@media (min-width:544px){.ast-container{max-width:100%;}}@media (max-width:544px){.ast-separate-container .ast-article-post,.ast-separate-container .ast-article-single,.ast-separate-container .comments-title,.ast-separate-container .ast-archive-description{padding:1.5em 1em;}.ast-separate-container #content .ast-container{padding-left:0.54em;padding-right:0.54em;}.ast-separate-container .ast-comment-list li.depth-1{padding:1.5em 1em;margin-bottom:1.5em;}.ast-separate-container .ast-comment-list .bypostauthor{padding:.5em;}.ast-search-menu-icon.ast-dropdown-active .search-field{width:170px;}}@media (max-width:921px){.site-title{display:block;}
47.site-header .site-description{display:none;}.entry-title{font-size:30px;}h1,.entry-content h1{font-size:30px;}h2,.entry-content h2{font-size:25px;}h3,.entry-content h3{font-size:20px;}}@media (max-width:544px){.site-title{display:none;}.site-header .site-description{display:none;}.entry-title{font-size:30px;}h1,.entry-content h1{font-size:30px;}h2,.entry-content h2{font-size:25px;}h3,.entry-content h3{font-size:20px;}}@media (max-width:921px){html{font-size:102.6%;}}@media (max-width:544px){html{font-size:102.6%;}}@media (min-width:922px){.ast-container{max-width:1240px;}}@media (min-width:922px){.site-content .ast-container{display:flex;}}@media (max-width:921px){.site-content .ast-container{flex-direction:column;}}@media (min-width:922px){.main-header-menu .sub-menu .menu-item.ast-left-align-sub-menu:hover > .sub-menu,.main-header-menu .sub-menu .menu-item.ast-left-align-sub-menu.focus > .sub-menu{margin-left:-0px;}}.entry-content li > p{margin-bottom:0;}blockquote,cite {font-style: initial;}.wp-block-file {display: flex;align-items: center;flex-wrap: wrap;justify-content: space-between;}.wp-block-pullquote {border: none;}.wp-block-pullquote blockquote::before {content: "\201D";font-family: "Helvetica",sans-serif;display: flex;transform: rotate( 180deg );font-size: 6rem;font-style: normal;line-height: 1;font-weight: bold;align-items: center;justify-content: center;}.has-text-align-right > blockquote::before {justify-content: flex-start;}.has-text-align-left > blockquote::before {justify-content: flex-end;}figure.wp-block-pullquote.is-style-solid-color blockquote {max-width: 100%;text-align: inherit;}html body {--wp--custom--ast-default-block-top-padding: 100px;--wp--custom--ast-default-block-right-padding: 80px;--wp--custom--ast-default-block-bottom-padding: 100px;--wp--custom--ast-default-block-left-padding: 80px;--wp--custom--ast-container-width: 1200px;--wp--custom--ast-content-width-size: 1200px;--wp--custom--ast-wide-width-size: calc(1200px + var(--wp--custom--ast-default-block-left-padding) + var(--wp--custom--ast-default-block-right-padding));}.ast-narrow-container {--wp--custom--ast-content-width-size: 750px;--wp--custom--ast-wide-width-size: 750px;}@media(max-width: 921px) {html body {--wp--custom--ast-default-block-top-padding: 50px;--wp--custom--ast-default-block-right-padding: 50px;--wp--custom--ast-default-block-bottom-padding: 50px;--wp--custom--ast-default-block-left-padding: 50px;}}@media(max-width: 544px) {html body {--wp--custom--ast-default-block-top-padding: 50px;--wp--custom--ast-default-block-right-padding: 30px;--wp--custom--ast-default-block-bottom-padding: 50px;--wp--custom--ast-default-block-left-padding: 30px;}}.entry-content > .wp-block-group,.entry-content > .wp-block-cover,.entry-content > .wp-block-columns {padding-top: var(--wp--custom--ast-default-block-top-padding);padding-right: var(--wp--custom--ast-default-block-right-padding);padding-bottom: var(--wp--custom--ast-default-block-bottom-padding);padding-left: var(--wp--custom--ast-default-block-left-padding);}.ast-plain-container.ast-no-sidebar .entry-content > .alignfull,.ast-page-builder-template .ast-no-sidebar .entry-content > .alignfull {margin-left: calc( -50vw + 50%);margin-right: calc( -50vw + 50%);max-width: 100vw;width: 100vw;}.ast-plain-container.ast-no-sidebar .entry-content .alignfull .alignfull,.ast-page-builder-template.ast-no-sidebar .entry-content .alignfull .alignfull,.ast-plain-container.ast-no-sidebar .entry-content .alignfull .alignwide,.ast-page-builder-template.ast-no-sidebar .entry-content .alignfull .alignwide,.ast-plain-container.ast-no-sidebar .entry-content .alignwide .alignfull,.ast-page-builder-template.ast-no-sidebar .entry-content .alignwide .alignfull,.ast-plain-container.ast-no-sidebar .entry-content .alignwide .alignwide,.ast-page-builder-template.ast-no-sidebar .entry-content .alignwide .alignwide,.ast-plain-container.ast-no-sidebar .entry-content .wp-block-column .alignfull,.ast-page-builder-template.ast-no-sidebar .entry-content .wp-block-column .alignfull,.ast-plain-container.ast-no-sidebar .entry-content .wp-block-column .alignwide,.ast-page-builder
47-template.ast-no-sidebar .entry-content .wp-block-column .alignwide {margin-left: auto;margin-right: auto;width: 100%;}[ast-blocks-layout] .wp-block-separator:not(.is-style-dots) {height: 0;}[ast-blocks-layout] .wp-block-separator {margin: 20px auto;}[ast-blocks-layout] .wp-block-separator:not(.is-style-wide):not(.is-style-dots) {max-width: 100px;}[ast-blocks-layout] .wp-block-separator.has-background {padding: 0;}.entry-content[ast-blocks-layout] > * {max-width: var(--wp--custom--ast-content-width-size);margin-left: auto;margin-right: auto;}.entry-content[ast-blocks-layout] > .alignwide {max-width: var(--wp--custom--ast-wide-width-size);}.entry-content[ast-blocks-layout] .alignfull {max-width: none;}.entry-content .wp-block-columns {margin-bottom: 0;}blockquote {margin: 1.5em;border: none;}.wp-block-quote:not(.has-text-align-right):not(.has-text-align-center) {border-left: 5px solid rgba(0,0,0,0.05);}.has-text-align-right > blockquote,blockquote.has-text-align-right {border-right: 5px solid rgba(0,0,0,0.05);}.has-text-align-left > blockquote,blockquote.has-text-align-left {border-left: 5px solid rgba(0,0,0,0.05);}.wp-block-site-tagline,.wp-block-latest-posts .read-more {margin-top: 15px;}.wp-block-loginout p label {display: block;}.wp-block-loginout p:not(.login-remember):not(.login-submit) input {width: 100%;}.wp-block-loginout input:focus {border-color: transparent;}.wp-block-loginout input:focus {outline: thin dotted;}.entry-content .wp-block-media-text .wp-block-media-text__content {padding: 0 0 0 8%;}.entry-content .wp-block-media-text.has-media-on-the-right .wp-block-media-text__content {padding: 0 8% 0 0;}.entry-content .wp-block-media-text.has-background .wp-block-media-text__content {padding: 8%;}.entry-content .wp-block-cover:not([class*="background-color"]) .wp-block-cover__inner-container,.entry-content .wp-block-cover:not([class*="background-color"]) .wp-block-cover-image-text,.entry-content .wp-block-cover:not([class*="background-color"]) .wp-block-cover-text,.entry-content .wp-block-cover-image:not([class*="background-color"]) .wp-block-cover__inner-container,.entry-content .wp-block-cover-image:not([class*="background-color"]) .wp-block-cover-image-text,.entry-content .wp-block-cover-image:not([class*="background-color"]) .wp-block-cover-text {color: var(--ast-global-color-5);}.wp-block-loginout .login-remember input {width: 1.1rem;height: 1.1rem;margin: 0 5px 4px 0;vertical-align: middle;}.wp-block-latest-posts > li > *:first-child,.wp-block-latest-posts:not(.is-grid) > li:first-child {margin-top: 0;}.wp-block-search__inside-wrapper .wp-block-search__input {padding: 0 10px;color: var(--ast-global-color-3);background: var(--ast-global-color-5);border-color: var(--ast-border-color);}.wp-block-latest-posts .read-more {margin-bottom: 1.5em;}.wp-block-search__no-button .wp-block-search__inside-wrapper .wp-block-search__input {padding-top: 5px;padding-bottom: 5px;}.wp-block-latest-posts .wp-block-latest-posts__post-date,.wp-block-latest-posts .wp-block-latest-posts__post-author {font-size: 1rem;}.wp-block-latest-posts > li > *,.wp-block-latest-posts:not(.is-grid) > li {margin-top: 12px;margin-bottom: 12px;}.ast-page-builder-template .entry-content[ast-blocks-layout] > *,.ast-page-builder-template .entry-content[ast-blocks-layout] > .alignfull > * {max-width: none;}.ast-page-builder-template .entry-content[ast-blocks-layout] > .alignwide > * {max-width: var(--wp--custom--ast-wide-width-size);}.ast-page-builder-template .entry-content[ast-blocks-layout] > .inherit-container-width > *,.ast-page-builder-template .entry-content[ast-blocks-layout] > * > *,.entry-content[ast-blocks-layout] > .wp-block-cover .wp-block-cover__inner-container {max-width: var(--wp--custom--ast-content-width-size);margin-left: auto;margin-right: auto;}.entry-content[ast-blocks-layout] .wp-block-cover:not(.alignleft):not(.alignright) {width: auto;}@media(max-width: 1200px) {.ast-separate-container .entry-content > .alignfull,.ast-separate-container .entry-content[ast-blocks-layout] > .alignwide,.ast-plain-container .entry-content[ast-blocks-layout] > .alignwide,.ast-plain-container .entry-content .alignfull {margin-left: calc(-1 * min(var(--ast-container-default-xlg-padding),20px)) ;margin-right: calc(-1 * min(var(--ast-container-default-xlg-padding),20px));}}@media(min-width: 1201px) {.ast-separate-container .entry-content > .alignfull {margin-left: calc(-1 * var(--ast-container-default-xlg-padding) );margin-right: calc(-1 * var(--ast-container-default-xlg-padding) );}.ast-separate-container .entry-content[ast-blocks-layout] > .alignwide,.ast-plain-container .entry-content[ast-blocks-layout] > .alignwide {margin-left: calc(-1 * var(--wp--custom--ast-default-block-left-padding) );margin-right: calc(-1 * var(--wp--custom--ast-default-block-right-padding) );}}@media(min-width: 921px) {.ast-separate-container .entry-content .wp-block-group.alignwide:not(.inherit-container-width) >
47 :where(:not(.alignleft):not(.alignright)),.ast-plain-container .entry-content .wp-block-group.alignwide:not(.inherit-container-width) > :where(:not(.alignleft):not(.alignright)) {max-width: calc( var(--wp--custom--ast-content-width-size) + 80px );}.ast-plain-container.ast-right-sidebar .entry-content[ast-blocks-layout] .alignfull,.ast-plain-container.ast-left-sidebar .entry-content[ast-blocks-layout] .alignfull {margin-left: -60px;margin-right: -60px;}}@media(min-width: 544px) {.entry-content > .alignleft {margin-right: 20px;}.entry-content > .alignright {margin-left: 20px;}}@media (max-width:544px){.wp-block-columns .wp-block-column:not(:last-child){margin-bottom:20px;}.wp-block-latest-posts{margin:0;}}@media( max-width: 600px ) {.entry-content .wp-block-media-text .wp-block-media-text__content,.entry-content .wp-block-media-text.has-media-on-the-right .wp-block-media-text__content {padding: 8% 0 0;}.entry-content .wp-block-media-text.has-background .wp-block-media-text__content {padding: 8%;}}.ast-narrow-container .site-content .wp-block-uagb-image--align-full .wp-block-uagb-image__figure {max-width: 100%;margin-left: auto;margin-right: auto;}.entry-content ul,.entry-content ol {padding: revert;margin: revert;}:root .has-ast-global-color-0-color{color:var(--ast-global-color-0);}:root .has-ast-global-color-0-background-color{background-color:var(--ast-global-color-0);}:root .wp-block-button .has-ast-global-color-0-color{color:var(--ast-global-color-0);}:root .wp-block-button .has-ast-global-color-0-background-color{background-color:var(--ast-global-color-0);}:root .has-ast-global-color-1-color{color:var(--ast-global-color-1);}:root .has-ast-global-color-1-background-color{background-color:var(--ast-global-color-1);}:root .wp-block-button .has-ast-global-color-1-color{color:var(--ast-global-color-1);}:root .wp-block-button .has-ast-global-color-1-background-color{background-color:var(--ast-global-color-1);}:root .has-ast-global-color-2-color{color:var(--ast-global-color-2);}:root .has-ast-global-color-2-background-color{background-color:var(--ast-global-color-2);}:root .wp-block-button .has-ast-global-color-2-color{color:var(--ast-global-color-2);}:root .wp-block-button .has-ast-global-color-2-background-color{background-color:var(--ast-global-color-2);}:root .has-ast-global-color-3-color{color:var(--ast-global-color-3);}:root .has-ast-global-color-3-background-color{background-color:var(--ast-global-color-3);}:root .wp-block-button .has-ast-global-color-3-color{color:var(--ast-global-color-3);}:root .wp-block-button .has-ast-global-color-3-background-color{background-color:var(--ast-global-color-3);}:root .has-ast-global-color-4-color{color:var(--ast-global-color-4);}:root .has-ast-global-color-4-background-color{background-color:var(--ast-global-color-4);}:root .wp-block-button .has-ast-global-color-4-color{color:var(--ast-global-color-4);}:root .wp-block-button .has-ast-global-color-4-background-color{background-color:var(--ast-global-color-4);}:root .has-ast-global-color-5-color{color:var(--ast-global-color-5);}:root .has-ast-global-color-5-background-color{background-color:var(--ast-global-color-5);}:root .wp-block-button .has-ast-global-color-5-color{color:var(--ast-global-color-5);}:root .wp-block-button .has-ast-global-color-5-background-color{background-color:var(--ast-global-color-5);}:root .has-ast-global-color-6-color{color:var(--ast-global-color-6);}:root .has-ast-global-color-6-background-color{background-color:var(--ast-global-color-6);}:root .wp-block-button .has-ast-global-color-6-color{color:var(--ast-global-color-6);}:root .wp-block-button .has-ast-global-color-6-background-color{background-color:var(--ast-global-color-6);}:root .has-ast-global-color-7-color{color:var(--ast-global-color-7);}:root .has-ast-global-color-7-background-color{background-color:var(--ast-global-color-7);}:root .wp-block-button .has-ast-global-color-7-color{color:var(--ast-global-color-7);}:root .wp-block-button .has-ast-global-color-7-background-color{background-color:var(--ast-global-color-7);}:root .has-ast-global-color-8-color{color:var(--ast-global-color-8);}:root .has-ast-global-color-8-background-color{background-color:var(--ast-global-color-8);}:root .wp-block-button .has-ast-global-color-8-color{color:var(--ast-global-color-8);}:root .wp-block-button .has-ast-global-color-8-background-color{background-color:var(--ast-global-color-8);}:root{--ast-global-color-0:#060097;--ast-global-color-1:#c10fff;--ast-global-color-2:#1e293b;--ast-global-color-3:#67768e;--ast-global-color-4:#f9f6fe;--ast-global-color-5:#FFFFFF;--ast-global-color-6:#F2F5F7;--ast-global-color-7:#ffcd57;--ast-global-color-8:#000000;}:root {--ast-border-color : var(--ast-global-color-6);}.ast-single-entry-banner {-js-display: flex;display: flex;flex-direction: column;justify-content: center;text-align: center;position: relative;background: #eeeeee;}.ast-single-entry-banner[data-banner-layout="layout-1"] {max-width: 1200px;background: inherit;padding: 20px 0;}.ast-single-entry-banner[data-banner-width-type="custom"] {margin: 0 auto;width: 100%;}.ast-single-entry-banner + .site-content .entry-header {margin-bottom: 0;}header.entry-header .entry-title{font-weight:600;font-size:32px;font-size:1.7777777777778rem;}header.entry-header > *:not(:last-child){margin-bottom:10px;}.ast-archive-entry-banner {-js-display: flex;display: flex;flex-direction: column;justify-content: center;text-align: center;position: relative;background: #eeeeee;}.ast-archive-entry-banner[data-banner-width-type="custom"] {margin: 0 auto;width: 100%;}.ast-archive-entry-banner[data-banner-layout="layout-1"] {background: inherit;padding: 20px 0;text-align: left;}body.archive .ast-archive-description{max-width:1200px;width:100%;text-align:left;padding-top:3em;padding-right:3em;padding-bottom:3em;padding-left:3em;}body.archive .ast-archive-description .ast-archive-title,body.archive .ast-archive-description .ast-archive-title *{font-weight:600;font-size:32px;font-size:1.7777777777778rem;}body.archive .ast-archive-description > *:not(:last-child){margin-bottom:10px;}@media (max-width:921px){body.archive .ast-archive-description{text-align:left;}}@media (max-width:544px){body.archive .ast-archive-description{text-align:left;}}.ast-breadcrumbs .trail-browse,.ast-breadcrumbs .trail-items,.ast-breadcrumbs .trail-items li{display:inline-block;margin:0;padding:0;border:none;background:inherit;text-indent:0;text-decoration:none;}.ast-breadcrumbs .trail-browse{font-size:inherit;font-style:inherit;font-weight:inherit;color:inherit;}.ast-breadcrumbs .trail-items{list-style:none;}.trail-items li::after{padding:0 0.3em;content:"\00bb";}.trail-items li:last-of-type::after{display:none;}
47h1,.entry-content h1,h2,.entry-content h2,h3,.entry-content h3,h4,.entry-content h4,h5,.entry-content h5,h6,.entry-content h6{color:var(--ast-global-color-2);}.entry-title a{color:var(--ast-global-color-2);}@media (max-width:921px){.ast-builder-grid-row-container.ast-builder-grid-row-tablet-3-firstrow .ast-builder-grid-row > *:first-child,.ast-builder-grid-row-container.ast-builder-grid-row-tablet-3-lastrow .ast-builder-grid-row > *:last-child{grid-column:1 / -1;}}@media (max-width:544px){.ast-builder-grid-row-container.ast-builder-grid-row-mobile-3-firstrow .ast-builder-grid-row > *:first-child,.ast-builder-grid-row-container.ast-builder-grid-row-mobile-3-lastrow .ast-builder-grid-row > *:last-child{grid-column:1 / -1;}}.footer-widget-area.widget-area.site-footer-focus-item{width:auto;}.ast-header-break-point .main-header-bar{border-bottom-width:1px;}@media (min-width:922px){.main-header-bar{border-bottom-width:1px;}}.main-header-menu .menu-item, #astra-footer-menu .menu-item, .main-header-bar .ast-masthead-custom-menu-items{-js-display:flex;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-moz-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-moz-box-orient:vertical;-moz-box-direction:normal;-ms-flex-direction:column;flex-direction:column;}.main-header-menu > .menu-item > .menu-link, #astra-footer-menu > .menu-item > .menu-link{height:100%;-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;-ms-flex-align:center;align-items:center;-js-display:flex;display:flex;}.ast-header-break-point .main-navigation ul .menu-item .menu-link .icon-arrow:first-of-type svg{top:.2em;margin-top:0px;margin-left:0px;width:.65em;transform:translate(0, -2px) rotateZ(270deg);}.ast-mobile-popup-content .ast-submenu-expanded > .ast-menu-toggle{transform:rotateX(180deg);overflow-y:auto;}.ast-separate-container .blog-layout-1, .ast-separate-container .blog-layout-2, .ast-separate-container .blog-layout-3{background-color:transparent;background-image:none;}.ast-separate-container .ast-article-post{background-color:var(--ast-global-color-5);;background-image:none;;}@media (max-width:921px){.ast-separate-container .ast-article-post{background-color:var(--ast-global-color-5);;background-image:none;;}}@media (max-width:544px){.ast-separate-container .ast-article-post{background-color:var(--ast-global-color-5);;background-image:none;;}}.ast-separate-container .ast-article-single:not(.ast-related-post), .ast-separate-container .comments-area .comment-respond,.ast-separate-container .comments-area .ast-comment-list li, .woocommerce.ast-separate-container .ast-woocommerce-container, .ast-separate-container .error-404, .ast-separate-container .no-results, .single.ast-separate-container .site-main .ast-author-meta, .ast-separate-container .related-posts-title-wrapper,.ast-separate-container .comments-count-wrapper, .ast-box-layout.ast-plain-container .site-content,.ast-padded-layout.ast-plain-container .site-content, .ast-separate-container .comments-area .comments-title, .ast-separate-container .ast-archive-description{background-color:var(--ast-global-color-5);;background-image:none;;}@media (max-width:921px){.ast-separate-container .ast-article-single:not(.ast-related-post), .ast-separate-container .comments-area .comment-respond,.ast-separate-container .comments-area .ast-comment-list li, .woocommerce.ast-separate-container .ast-woocommerce-container, .ast-separate-container .error-404, .ast-separate-container .no-results, .single.ast-separate-container .site-main .ast-author-meta, .ast-separate-container .related-posts-title-wrapper,.ast-separate-container .comments-count-wrapper, .ast-box-layout.ast-plain-container .site-content,.ast-padded-layout.ast-plain-container .site-content, .ast-separate-container .comments-area .comments-title, .ast-separate-container .ast-archive-description{background-color:var(--ast-global-color-5);;background-image:none;;}}@media (max-width:544px){.ast-separate-container .ast-article-single:not(.ast-related-post), .ast-separate-container .comments-area .comment-respond,.ast-separate-container .comments-area .ast-comment-list li, .
47woocommerce.ast-separate-container .ast-woocommerce-container, .ast-separate-container .error-404, .ast-separate-container .no-results, .single.ast-separate-container .site-main .ast-author-meta, .ast-separate-container .related-posts-title-wrapper,.ast-separate-container .comments-count-wrapper, .ast-box-layout.ast-plain-container .site-content,.ast-padded-layout.ast-plain-container .site-content, .ast-separate-container .comments-area .comments-title, .ast-separate-container .ast-archive-description{background-color:var(--ast-global-color-5);;background-image:none;;}}.ast-separate-container.ast-two-container #secondary .widget{background-color:var(--ast-global-color-5);;background-image:none;;}@media (max-width:921px){.ast-separate-container.ast-two-container #secondary .widget{background-color:var(--ast-global-color-5);;background-image:none;;}}@media (max-width:544px){.ast-separate-container.ast-two-container #secondary .widget{background-color:var(--ast-global-color-5);;background-image:none;;}}.ast-plain-container, .ast-page-builder-template{background-color:var(--ast-global-color-5);;background-image:none;;}@media (max-width:921px){.ast-plain-container, .ast-page-builder-template{background-color:var(--ast-global-color-5);;background-image:none;;}}@media (max-width:544px){.ast-plain-container, .ast-page-builder-template{background-color:var(--ast-global-color-5);;background-image:none;;}}.ast-builder-menu-mobile .main-navigation .menu-item.menu-item-has-children > .ast-menu-toggle{top:0;}.ast-builder-menu-mobile .main-navigation .menu-item-has-children > .menu-link:after{content:unset;}.ast-hfb-header .ast-builder-menu-mobile .main-navigation .main-header-menu, .ast-hfb-header .ast-builder-menu-mobile .main-navigation .main-header-menu, .ast-hfb-header .ast-mobile-header-content .ast-builder-menu-mobile .main-navigation .main-header-menu, .ast-hfb-header .ast-mobile-popup-content .ast-builder-menu-mobile .main-navigation .main-header-menu{border-top-width:1px;border-color:#eaeaea;}.ast-hfb-header .ast-builder-menu-mobile .main-navigation .menu-item .sub-menu .menu-link, .ast-hfb-header .ast-builder-menu-mobile .main-navigation .menu-item .menu-link, .ast-hfb-header .ast-builder-menu-mobile .main-navigation .menu-item .sub-menu .menu-link, .ast-hfb-header .ast-builder-menu-mobile .main-navigation .menu-item .menu-link, .ast-hfb-header .ast-mobile-header-content .ast-builder-menu-mobile .main-navigation .menu-item .sub-menu .menu-link, .ast-hfb-header .ast-mobile-header-content .ast-builder-menu-mobile .main-navigation .menu-item .menu-link, .ast-hfb-header .ast-mobile-popup-content .ast-builder-menu-mobile .main-navigation .menu-item .sub-menu .menu-link, .ast-hfb-header .ast-mobile-popup-content .ast-builder-menu-mobile .main-navigation .menu-item .menu-link{border-bottom-width:1px;border-color:#eaeaea;border-style:solid;}.ast-builder-menu-mobile .main-navigation .menu-item.menu-item-has-children > .ast-menu-toggle{top:0;}@media (max-width:921px){.ast-builder-menu-mobile .main-navigation .main-header-menu .menu-item > .menu-link{color:var(--ast-global-color-2);padding-top:10px;padding-bottom:10px;padding-left:15px;padding-right:15px;}.ast-builder-menu-mobile .main-navigation .menu-item > .ast-menu-toggle{color:var(--ast-global-color-2);}.ast-builder-menu-mobile .main-navigation .menu-item:hover > .menu-link, .ast-builder-menu-mobile .main-navigation .inline-on-mobile .menu-item:hover > .ast-menu-toggle{color:var(--ast-global-color-2);}.ast-builder-menu-mobile .main-navigation .menu-item:hover > .ast-menu-toggle{color:var(--ast-global-color-2);}.ast-builder-menu-mobile .main-navigation .menu-item.current-menu-item > .menu-link, .ast-builder-menu-mobile .main-navigation .inline-on-mobile .menu-item.current-menu-item > .ast-menu-toggle, .ast-builder-menu-mobile .main-navigation .menu-item.current-menu-ancestor > .menu-link, .ast-builder-menu-mobile .main-navigation .menu-item.current-menu-ancestor > .ast-menu-toggle{color:var(--ast-global-color-0);}.ast-builder-menu-mobile .main-navigation .menu-item.current-menu-item > .ast-menu-toggle{color:var(--ast-global-color-0);}
47.ast-builder-menu-mobile .main-navigation .menu-item.menu-item-has-children > .ast-menu-toggle{top:10px;right:calc( 15px - 0.907em );}.ast-builder-menu-mobile .main-navigation .menu-item-has-children > .menu-link:after{content:unset;}}@media (max-width:544px){.ast-builder-menu-mobile .main-navigation .menu-item.menu-item-has-children > .ast-menu-toggle{top:10px;}}.ast-builder-menu-mobile .main-navigation{display:block;}@media (max-width:921px){.ast-header-break-point .ast-builder-menu-mobile .main-navigation{display:block;}}@media (max-width:544px){.ast-header-break-point .ast-builder-menu-mobile .main-navigation{display:block;}} 48/*# sourceURL=astra-theme-css-inline-css */ 49</style> 50<style id="wp-block-library-inline-css"> 51:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root{--wp--preset--font-size--normal:16px;
51--wp--preset--font-size--huge:42px}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}:root .has-text-align-center{text-align:center}:root .has-text-align-left{text-align:left}:root .has-text-align-right{text-align:right}.has-fit-text{white-space:nowrap!important}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{word-wrap:normal!important;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-break:normal!important}.screen-reader-text:focus{background-color:#ddd;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style^=border-color],[style*=";border-color"],[style*="; border-color"]){border-style:solid}html :where([style^=border-top-color],[style*=";border-top-color"],[style*="; border-top-color"]){border-top-style:solid}html :where([style^=border-right-color],[style*=";border-right-color"],[style*="; border-right-color"]){border-right-style:solid}html :where([style^=border-bottom-color],[style*=";border-bottom-color"],[style*="; border-bottom-color"]){border-bottom-style:solid}html :where([style^=border-left-color],[style*=";border-left-color"],[style*="; border-left-color"]){border-left-style:solid}html :where([style^=border-width],[style*=";border-width"],[style*="; border-width"]){border-style:solid}html :where([style^=border-top-width],[style*=";border-top-width"],[style*="; border-top-width"]){border-top-style:solid}html :where([style^=border-right-width],[style*=";border-right-width"],[style*="; border-right-width"]){border-right-style:solid}html :where([style^=border-bottom-width],[style*=";border-bottom-width"],[style*="; border-bottom-width"]){border-bottom-style:solid}html :where([style^=border-left-width],[style*=";border-left-width"],[style*="; border-left-width"]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}} 52 53/*# sourceURL=/wp-includes/css/dist/block-library/common.min.css */ 54</style> 55<style id="wp-block-group-inline-css"> 56.wp-block-group{box-sizing:border-box}:where(.wp-block-group.wp-block-group-is-layout-constrained){position:relative} 57/*# sourceURL=https://churnsolution.com/wp-includes/blocks/group/style.min.css */ 58</style> 59 60 61<style id="global-styles-inline-css"> 62:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--color--ast-global-color-0: var(--ast-global-color-0);--wp--preset--color--ast-global-color-1: var(--ast-global-color-1);--wp--preset--color--ast-global-color-2: var(--ast-global-color-2);--wp--preset--color--ast-global-color-3: var(--ast-global-color-3);--wp--preset--color--ast-global-color-4: var(--ast-global-color-4);--wp--preset--color--ast-global-color-5: var(--ast-global-color-5);--wp--preset--color--ast-global-color-6: var(--ast-global-color-6);--wp--preset--color--ast-global-color-7: var(--ast-global-color-7);--wp--preset--color--ast-global-color-8: var(--ast-global-color-8);--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,
620) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}.wp-block-button{--wp--preset--dimension--25: 25%;--wp--preset--dimension--50: 50%;--wp--preset--dimension--75: 75%;--wp--preset--dimension--100: 100%;}:root { --wp--style--global--content-size: var(--wp--custom--ast-content-width-size);--wp--style--global--wide-size: var(--wp--custom--ast-wide-width-size); }:where(body) { margin: 0; }.wp-site-blocks > .alignleft { float: left; margin-right: 2em; }.wp-site-blocks > .alignright { float: right; margin-left: 2em; }.wp-site-blocks > .aligncenter { justify-content: center; margin-left: auto; margin-right: auto; }:where(.wp-site-blocks) > * { margin-block-start: 24px; margin-block-end: 0; }:where(.wp-site-blocks) > :first-child { margin-block-start: 0; }:where(.wp-site-blocks) > :last-child { margin-block-end: 0; }:root { --wp--style--block-gap: 24px; }:root :where(.is-layout-flow) > :first-child{margin-block-start: 0;}:root :where(.is-layout-flow) > :last-child{margin-block-end: 0;}:root :where(.is-layout-flow) > *{margin-block-start: 24px;margin-block-end: 0;}:root :where(.is-layout-constrained) > :first-child{margin-block-start: 0;}:root :where(.is-layout-constrained) > :last-child{margin-block-end: 0;}:root :where(.is-layout-constrained) > *{margin-block-start: 24px;margin-block-end: 0;}:root :where(.is-layout-flex){gap: 24px;}:root :where(.is-layout-grid){gap: 24px;}.is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}.is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}.is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}.is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}.is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}
62a:where(:not(.wp-element-button)){text-decoration: none;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-ast-global-color-0-color{color: var(--wp--preset--color--ast-global-color-0) !important;}.has-ast-global-color-1-color{color: var(--wp--preset--color--ast-global-color-1) !important;}.has-ast-global-color-2-color{color: var(--wp--preset--color--ast-global-color-2) !important;}.has-ast-global-color-3-color{color: var(--wp--preset--color--ast-global-color-3) !important;}.has-ast-global-color-4-color{color: var(--wp--preset--color--ast-global-color-4) !important;}.has-ast-global-color-5-color{color: var(--wp--preset--color--ast-global-color-5) !important;}.has-ast-global-color-6-color{color: var(--wp--preset--color--ast-global-color-6) !important;}.has-ast-global-color-7-color{color: var(--wp--preset--color--ast-global-color-7) !important;}.has-ast-global-color-8-color{color: var(--wp--preset--color--ast-global-color-8) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-ast-global-color-0-background-color{background-color: var(--wp--preset--color--ast-global-color-0) !important;}.has-ast-global-color-1-background-color{background-color: var(--wp--preset--color--ast-global-color-1) !important;}.has-ast-global-color-2-background-color{background-color: var(--wp--preset--color--ast-global-color-2) !important;}.has-ast-global-color-3-background-color{background-color: var(--wp--preset--color--ast-global-color-3) !important;}.has-ast-global-color-4-background-color{background-color: var(--wp--preset--color--ast-global-color-4) !important;}.has-ast-global-color-5-background-color{background-color: var(--wp--preset--color--ast-global-color-5) !important;}.has-ast-global-color-6-background-color{background-color: var(--wp--preset--color--ast-global-color-6) !important;}.has-ast-global-color-7-background-color{background-color: var(--wp--preset--color--ast-global-color-7) !important;}.has-ast-global-color-8-background-color{background-color: var(--wp--preset--color--ast-global-color-8) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-ast-global-color-0-border-color{border-color: var(--wp--preset--color--ast-global-color-0) !important;}.has-ast-global-color-1-border-color{border-color: var(--wp--preset--color--ast-global-color-1) !important;}.has-ast-global-color-2-border-color{border-color: var(--wp--preset--color--ast-global-color-2) !important;}.has-ast-global-color-3-border-color{border-color: var(--wp--preset--color--ast-global-color-3) !important;}.has-ast-global-color-4-border-color{border-color: var(--wp--preset--color--ast-global-color-4) !important;}.has-ast-global-color-5-border-color{border-color: var(--wp--preset--color--ast-global-color-5) !important;}.has-ast-global-color-6-border-color{border-color: var(--wp--preset--color--ast-global-color-6) !important;}.has-ast-global-color-7-border-color{border-color: var(--wp--preset--color--ast-global-color-7) !important;}.has-ast-global-color-8-border-color{border-color: var(--wp--preset--color--ast-global-color-8) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}
62.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;} 63/*# sourceURL=global-styles-inline-css */ 64</style> 65 66<link rel='stylesheet' id='eb-reusable-block-style-1384-css' href='https://churnsolution.com/wp-content/uploads/eb-style/reusable-blocks/eb-reusable-1384.min.css?ver=17985c6653' media='all' /> 67<link rel='stylesheet' id='astra-child-css' href='https://churnsolution.com/wp-content/themes/astra-child/style.css?ver=1.0.0' media='all' /> 68<link rel="https://api.w.org/" href="https://churnsolution.com/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://churnsolution.com/wp-json/wp/v2/pages/1821" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://churnsolution.com/xmlrpc.php?rsd" /> 69<meta name="generator" content="WordPress 7.1.2" /> 70<link rel='shortlink' href='https://churnsolution.com/?p=1821' /> 71<meta name="cdp-version" content="1.5.0" /><style id="essential-blocks-global-styles"> 72 :root { 73 --eb-global-primary-color: #101828; 74--eb-global-secondary-color: #475467; 75--eb-global-tertiary-color: #98A2B3; 76--eb-global-text-color: #475467; 77--eb-global-heading-color: #1D2939; 78--eb-global-link-color: #444CE7; 79--eb-global-background-color: #F9FAFB; 80--eb-global-button-text-color: #FFFFFF; 81--eb-global-button-background-color: #101828; 82--eb-gradient-primary-color: linear-gradient(90deg, hsla(259, 84%, 78%, 1) 0%, hsla(206, 67%, 75%, 1) 100%); 83--eb-gradient-secondary-color: linear-gradient(90deg, hsla(18, 76%, 85%, 1) 0%, hsla(203, 69%, 84%, 1) 100%); 84--eb-gradient-tertiary-color: linear-gradient(90deg, hsla(248, 21%, 15%, 1) 0%, hsla(250, 14%, 61%, 1) 100%); 85--eb-gradient-background-color: linear-gradient(90deg, rgb(250, 250, 250) 0%, rgb(233, 233, 233) 49%, rgb(244, 243, 243) 100%); 86 87 --eb-tablet-breakpoint: 1024px; 88--eb-mobile-breakpoint: 767px; 89 90 } 91 92 93 </style>
93<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
93 94<!--
94<script>window.SavvyCal=window.SavvyCal||function(){(SavvyCal.q=SavvyCal.q||[]).push(arguments)};</script>
vendor: 2 bytes, line 94
94
95<script defer src="https://embed.savvycal.com/v1/embed.js"></script>
95 --> 96<!-- OpenReplay Tracking Code for ChurnSolution WordPress -->
97<script> 98 var initOpts = { 99 projectKey: "EnGYQGyTf1AcR9a0oUgT", 100 ingestPoint: "https://openreplay.quizplusdev.com/ingest", 101 defaultInputMode: 2, 102 obscureTextNumbers: false, 103 obscureTextEmails: false, 104 }; 105 var startOpts = { userID: "" }; 106 function getUTMParams() { 107 const params = new URLSearchParams(window.location.search); 108 const utmParams = {}; 109 ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content'].forEach(key => { 110 const value = params.get(key); 111 if (value) utmParams[key] = value; 112 }); 113 return utmParams; 114 } 115 function onOpenReplayLoaded() { 116 console.log("OpenReplay script loaded."); 117 const utmData = getUTMParams(); 118 if (window.OpenReplay) { 119 Object.entries(utmData).forEach(([key, value]) => { 120 window.OpenReplay.setMetadata(key, value); 121 }); 122 window.OpenReplay.start(); 123 } 124 } 125 (function(A,s,a,y,e,r){ 126 r=window.OpenReplay=[e,r,y,[s-1, e]]; 127 s=document.createElement('script');s.src=A;s.async=!a; 128 s.onload = onOpenReplayLoaded; 129 document.getElementsByTagName('head')[0].appendChild(s); 130 r.start=function(v){r.push([0])}; 131 r.stop=function(v){r.push([1])}; 132 r.setUserID=function(id){r.push([2,id])}; 133 r.setUserAnonymousID=function(id){r.push([3,id])}; 134 r.setMetadata=function(k,v){r.push([4,k,v])}; 135 r.event=function(k,p,i){r.push([5,k,p,i])}; 136 r.issue=function(k,p){r.push([6,k,p])}; 137 r.isActive=function(){return false}; 138 r.getSessionToken=function(){}; 139 })("//static.openreplay.com/11.0.1/openreplay.js",1,0,initOpts,startOpts); 140</script>
140 141<!-- Begin Inspectlet Asynchronous Code // Commented --> 142<!--
142<script type="text/javascript"> 143(function() { 144window.__insp = window.__insp || []; 145__insp.push(['wid', 2049275049]); 146var ldinsp = function(){ 147if(typeof window.__inspld != "undefined") return; window.__inspld = 1; var insp = document.createElement('script'); insp.type = 'text/javascript'; insp.async = true; insp.id = "inspsync"; insp.src = ('https:' == document.location.protocol ? 'https' : 'http') + '://cdn.inspectlet.com/inspectlet.js?wid=2049275049&r=' + Math.floor(new Date().getTime()/3600000); var x = document.getElementsByTagName('script')[0]; x.parentNode.insertBefore(insp, x); }; 148setTimeout(ldinsp, 0); 149})(); 150</script>
150 --> 151<!-- End Inspectlet Asynchronous Code --> 152<!-- Google Tag Manager -->
153<script>
vendor: 331 bytes, lines 153-157
153(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 154new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 155j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 156'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 157})(window,document,'script','dataLayer','
157GTM-KFH8XXKN
vendor: 3 bytes, line 157
157');
157</script>
157 158<!-- End Google Tag Manager --> 159<!-- Start Send Events via OR & GTM -->
160<script> 161 window.sendEvent = function({ action, category, label, value, ...args }) { 162 const payload = { 163 event: action, 164 event_category: category, 165 event_label: label, 166 value, 167 ...args 168 }; 169 170 if (window.dataLayer) { 171 window.dataLayer.push(payload); 172 } else { 173 console.warn("GTM not loaded yet"); 174 } 175 176 if (window.OpenReplay && window.OpenReplay.event) { 177 const eventParams = { 178 event_category: category, 179 event_label: label, 180 value: value, 181 ...args 182 }; 183 window.OpenReplay.event(action, eventParams); 184 } else { 185 console.warn('OpenReplay is not available. Event not tracked in OpenReplay.'); 186 } 187 }; 188 189 window.addInfoToDataLayer = function(dict) { 190 if (!window.dataLayer) { 191 console.warn('window.dataLayer is not defined. GTM may not be loaded yet.'); 192 return; 193 } 194 window.dataLayer.push(dict); 195 }; 196 197 window.setOpenReplayMetadata = function(key, value) { 198 if (window.OpenReplay && window.OpenReplay.setMetadata) { 199 window.OpenReplay.setMetadata(key, value); 200 } 201 }; 202</script>
202 203<!-- End Send Events via OR & GTM -->
204<script type="application/ld+json"> 205{ 206 "@context": "https://schema.org", 207 "@type": "SoftwareApplication", 208 "name": "ChurnSolution", 209 "applicationCategory": "BusinessApplication", 210 "operatingSystem": "Web", 211 "description": "ChurnSolution is a B2B SaaS platform that helps subscription-based businesses reduce customer churn and increase retention by analyzing customer behavior, usage, and payment data.", 212 "url": "https://churnsolution.com" 213} 214</script>
vendor: 2 bytes, line 214
214
215<script type="application/ld+json"> 216{ 217 "@context": "https://schema.org", 218 "@type": "FAQPage", 219 "mainEntity": [ 220 { 221 "@type": "Question", 222 "name": "What is ChurnSolution?", 223 "acceptedAnswer": { 224 "@type": "Answer", 225 "text": "ChurnSolution is a B2B SaaS platform that helps subscription-based businesses reduce customer churn and improve retention using customer behavior and payment data." 226 } 227 }, 228 { 229 "@type": "Question", 230 "name": "Is ChurnSolution for SaaS companies?", 231 "acceptedAnswer": { 232 "@type": "Answer", 233 "text": "Yes. ChurnSolution is designed for SaaS and subscription businesses with monthly recurring revenue." 234 } 235 }, 236{ 237 "@type": "Question", 238 "name": "Is ChurnSolution for B2C companies?", 239 "acceptedAnswer": { 240 "@type": "Answer", 241 "text": "Yes. ChurnSolution is designed for B2C and subscription businesses with monthly or yearly recurring revenue." 242 } 243 }, 244 { 245 "@type": "Question", 246 "name": "What problem does ChurnSolution solve?", 247 "acceptedAnswer": { 248 "@type": "Answer", 249 "text": "ChurnSolution helps businesses identify churn risk early and take action to retain customers and protect monthly recurring revenue." 250 } 251 } 252 ] 253} 254</script>
254 255<link rel="preconnect" href="https://fonts.googleapis.com"> 256<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><style> 257@font-face { 258 font-family: 'Poppins'; 259 src: url('https://churnsolution.com/wp-content/themes/astra/assets/fonts/poppins/regular.woff2') format('woff2'); 260 font-weight: 400; 261 font-style: normal; 262 font-display: swap; 263 } 264@font-face { 265 font-family: 'Poppins'; 266 src: url('https://churnsolution.com/wp-content/themes/astra/assets/fonts/poppins/italic.woff2') format('woff2'); 267 font-weight: 400; 268 font-style: italic; 269 font-display: swap; 270 } 271@font-face { 272 font-family: 'Poppins'; 273 src: url('https://churnsolution.com/wp-content/themes/astra/assets/fonts/poppins/medium.woff2') format('woff2'); 274 font-weight: 500; 275 font-style: normal; 276 font-display: swap; 277 } 278@font-face { 279 font-family: 'Poppins'; 280 src: url('https://churnsolution.com/wp-content/themes/astra/assets/fonts/poppins/medium-italic.woff2') format('woff2'); 281 font-weight: 500; 282 font-style: italic; 283 font-display: swap; 284 } 285@font-face { 286 font-family: 'Poppins'; 287 src: url('https://churnsolution.com/wp-content/themes/astra/assets/fonts/poppins/semi-bold.woff2') format('woff2'); 288 font-weight: 600; 289 font-style: normal; 290 font-display: swap; 291 } 292@font-face { 293 font-family: 'Poppins'; 294 src: url('https://churnsolution.com/wp-content/themes/astra/assets/fonts/poppins/semi-bold-italic.woff2') format('woff2'); 295 font-weight: 600; 296 font-style: italic; 297 font-display: swap; 298 } 299@font-face { 300 font-family: 'Poppins'; 301 src: url('https://churnsolution.com/wp-content/themes/astra/assets/fonts/poppins/bold.woff2') format('woff2'); 302 font-weight: 700; 303 font-style: normal; 304 font-display: swap; 305 } 306@font-face { 307 font-family: 'Poppins'; 308 src: url('https://churnsolution.com/wp-content/themes/astra/assets/fonts/poppins/bold-italic.woff2') format('woff2'); 309 font-weight: 700; 310 font-style: italic; 311 font-display: swap; 312 } 313</style> 314<meta name="redi-version" content="1.3.0" /><link rel="preconnect" href="https://koalendar.com" /> 315<link rel="preconnect" href="https://api.koalendar.com" /> 316<style> 317div[id^=koa-popover-widget-]{display:none}div[id^=koa-popover-widget-].chr-chr-active{display:unset} 318</style>
319<script> 320 window.Koalendar = 321 window.Koalendar || 322 function () { 323 (Koalendar.props = Koalendar.props || []).push(arguments); 324 }; 325</script>
vendor: 2 bytes, line 325
325
326<script async src="https://koalendar.com/assets/widget.js"></script>
vendor: 2 bytes, line 326
326
327<script> 328function attachBackdropListener(){let t=document.querySelector("div[id^=koa-popover-widget-]"),e=t.querySelector("div[aria-modal=true][role=dialog]");e?.parentElement?.classList.remove("koa:md:max-h-[700px]"),e?.parentElement?.attributeStyleMap.set("max-height","750px"),t?.querySelector(".koa\\:fixed.koa\\:inset-0.koa\\:transition-opacity.koa\\:duration-500")?.addEventListener("click",setButtonStyles)}function setButtonStyles(){document.querySelectorAll("div[id^=koa-popover-widget-] > div > button").forEach(t=>{t.removeEventListener("click",setButtonStyles),t.removeEventListener("click",attachBackdropListener),t.addEventListener("click",t.hasAttribute("id")?attachBackdropListener:setButtonStyles),t.style.setProperty("justify-content","center"),t.style.setProperty("width","3.55555555556rem","important"),t.style.setProperty("height","3.55555555556rem","important"),t.style.setProperty("padding","0px","important")})}function hasKoalendarLoaded(){let t=document.querySelector("div[id^=koa-popover-widget-]");return!!t}function updateKoalendarStyles(){let t=document.querySelectorAll('input[name="2UEU8"]');t.forEach(t=>{t.style.setProperty("margin-top","4px"),t.style.setProperty("align-self","start")});let e=document.querySelector("div[id^=koa-popover-widget-]");setButtonStyles(),e?.attributeStyleMap.set("--koa-spacing","0.22222222222rem"),e?.attributeStyleMap.set("--koa-container-4xl","49.5rem"),e?.classList.add("chr-chr-active")}function updateKoalendarStyles(){let t=document.querySelector("div[id^=koa-popover-widget-]"),e=t.querySelector("div[aria-modal=true][role=dialog]");setButtonStyles(),t?.attributeStyleMap.set("--koa-spacing","0.22222222222rem"),t?.attributeStyleMap.set("--koa-container-4xl","53.5rem"),t?.classList.add("chr-chr-active"),e?.attributeStyleMap.set("padding-top","2rem"),e?.attributeStyleMap.set("padding-left","2rem"),e?.attributeStyleMap.set("padding-right","2rem"),e?.parentElement?.classList.remove("koa:md:max-h-[700px]"),e?.parentElement?.attributeStyleMap.set("max-height","750px")}function onKoalendarLoad(t,e=1e4,a=300){let r=Date.now(),o=()=>{hasKoalendarLoaded()?t():Date.now()-r<e&&setTimeout(o,a)};o()}Koalendar("init"),Koalendar("widget",{url:"https://koalendar.com/e/meet-with-churnsolution",text:"",shape:"rounded-full",backgroundColor:"#0f124d",textColor:"#ffffff",position:"bottom-right",icon:"calendar"}),onKoalendarLoad(()=>updateKoalendarStyles()); 329</script>
329<style> 330.chr-chr-btn-contact-us,.chr-chr-btn-demo,.chr-chr-btn-signup,.chr-chr-nav-link{font-family:inherit;font-size:.77777777777rem!important;cursor:pointer;text-decoration:none}.chr-chr-header{--chr-active-tab-color:#0f124d;color:#0f124d;background:#fefcf4;border-bottom:1px solid #8e98a8;padding:0 32px;position:fixed;width:100%;top:0;z-index:1000}.chr-chr-logo,.chr-chr-logo>a,.chr-chr-nav{color:inherit}.chr-chr-header[data-variant=light]{background:#fff;border-bottom-color:#dbdbe4}.chr-chr-header[data-variant=dark]{--chr-active-tab-color:#eebd23;color:#fff;background:#0f124d}.chr-chr-nav{display:flex;align-items:center;justify-content:space-between;max-width:1400px;margin:0 auto;height:72px;gap:24px}.chr-chr-header[data-variant=light] .chr-chr-nav{max-width:unset}.chr-chr-logo{display:flex;align-items:center;gap:8px;font-weight:700;text-decoration:none}.chr-chr-cropped-logo-icon,.chr-chr-logo-icon,.chr-chr-logo>a{height:35px}.chr-chr-cropped-logo-icon,.chr-chr-mobile-item[data-hidden]{display:none}.chr-chr-nav-links{display:flex;align-items:center;height:100%;gap:16px;margin-left:auto}.chr-chr-nav-item{height:100%;cursor:pointer}.chr-chr-btn-contact-us,.chr-chr-btn-signup,.chr-chr-nav-link{display:flex;align-items:center;height:100%;gap:6px;color:inherit!important;font-weight:500;padding:8px;background:0 0!important;border:none}.chr-chr-nav-link.chr-chr-active{padding-bottom:6px;border-bottom:2px solid var(--chr-active-tab-color)}:is( 331.chr-chr-nav-link,.chr-chr-product-item,.chr-chr-resource-item,.chr-chr-footer-nav-link 332):is(:focus,:focus-visible){outline:0}.chr-chr-dropdown-arrow{display:flex;align-items:center;justify-content:center;width:20px;height:20px;transition:transform .2s}.chr-chr-nav-item:hover .chr-chr-dropdown-arrow{transform:rotate(180deg)}.chr-chr-nav-actions{display:flex;align-items:center;gap:16px}.chr-chr-btn-demo{color:#0f124d!important;background:#fff;border:1px solid #e0e0e0;padding:8px 16px;border-radius:6px;font-weight:500;transition:.2s}.chr-chr-btn-demo:hover{background:#e0e0e0}.chr-chr-dropdown{width:100%;margin-top:1px;position:absolute;top:100%;left:50%;transform:translateX(-50%);background:#fff;border-bottom:1px solid #8e98a8;padding:32px;box-shadow:0 4px 4px 0 #00000040;opacity:0;visibility:hidden;transition:opacity .2s,visibility .2s;cursor:default}.chr-chr-nav-item:hover .chr-chr-dropdown{opacity:1;visibility:visible}.chr-chr-dropdown-content{display:grid;grid-template-columns:minmax(420px,1fr) repeat(2,minmax(0,1fr));grid-template-rows:repeat(2,minmax(0,1fr)) auto;gap:16px;max-width:1400px;margin:0 auto}.chr-chr-primary-product{display:flex;flex-direction:column;align-items:flex-start;gap:8px;min-width:fit-content;height:100%;border:1px solid #e0e0e0;border-radius:12px;transition:background .2s}.chr-chr-primary-product:hover{background:#f9f9fb}.chr-chr-primary-product.chr-chr-active{background:#f9f9fb;box-shadow:0 0 8px 4px #0000000f}.chr-chr-product-item,.chr-chr-resource-item{display:flex;align-items:flex-start;gap:12px;padding:12px;border-radius:8px;transition:background .2s;text-decoration:none;cursor:default;border:1px solid #e0e0e0;filter:brightness(1)!important}.chr-chr-primary-product .chr-chr-product-item{border:none}.chr-chr-primary-product .chr-chr-product-item:hover{background-color:transparent}:is(.chr-chr-product-item,.chr-chr-resource-item):not( 333.chr-chr-disabled 334):hover{cursor:pointer;background:#f9f9fb}:is(.chr-chr-product-item,.chr-chr-resource-item):not( 335.chr-chr-disabled 336).chr-chr-active{background:#f9f9fb;box-shadow:0 0 8px 4px #0000000f;border-color:#c1c1c1}.chr-chr-product-details,.chr-chr-resource-content{display:flex;flex-direction:column;gap:8px;flex:1}.chr-chr-product-icon{width:28px;aspect-ratio:1;object-fit:contain;flex-shrink:0}.chr-chr-product-name,.chr-chr-resource-title{font-family:Poppins,sans-serif;font-weight:500;color:#0f124d;font-size:.88888888888rem;line-height:1.3;margin:0}.chr-chr-product-description,.chr-chr-resource-description{font-weight:500;color:#6b7280;font-size:.66666666666rem;line-height:1.4;margin:0}.chr-chr-feature-name,.chr-chr-section-title{font-size:.77777777777rem;line-height:normal;font-weight:500;letter-spacing:0}
336.chr-chr-features-section{display:flex;flex-direction:column;gap:10px;margin:0 32px 12px 48px}.chr-chr-section-title{color:#eebd23;margin:0}.chr-chr-features-grid{display:grid;gap:12px;grid-template-columns:repeat(2,minmax(0,1fr))}.chr-chr-feature-name{color:#0f124d!important;white-space:nowrap;text-decoration:none}.chr-chr-feature-bullet{display:none;line-height:.5;font-size:16px}.chr-chr-btn-contact-us:hover,.chr-chr-btn-signup:hover,.chr-chr-feature-name.chr-chr-active,.chr-chr-feature-name:hover,.chr-chr-nav-link:hover{filter:brightness(2)}.chr-chr-header[data-variant=dark] .chr-chr-btn-contact-us:hover,.chr-chr-header[data-variant=dark] .chr-chr-btn-signup:hover,.chr-chr-header[data-variant=dark] .chr-chr-nav-link:hover{filter:brightness(.8)}.chr-chr-product-title-row{display:flex;align-items:start;justify-content:space-between;gap:16px}.chr-chr-product-title{font-family:Poppins,sans-serif;font-weight:500;color:#0f124d;font-size:.88888888888rem;letter-spacing:0;line-height:1.3;margin:0}.chr-chr-status-badge{display:inline-block;padding:6px 10px;font-size:.44444444444rem;line-height:1;font-weight:700;white-space:nowrap;color:#0f124d;background:linear-gradient(#fefcf4,#fefcf4) padding-box,linear-gradient(90deg,#efc130 0,#896f1c 100%) border-box;border:1px solid transparent;border-radius:200px}.chr-chr-resources-tab{display:grid;grid-template-columns:minmax(450px,1fr) 1px minmax(0,1.25fr);align-items:center;gap:16px;max-width:1400px;margin:0 auto}.chr-chr-resources-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}.chr-chr-resource-icon-wrapper{display:flex;align-items:center;justify-content:center;width:28px;aspect-ratio:1;flex-shrink:0;overflow:hidden}.chr-chr-resource-icon{width:135.71%;aspect-ratio:1;max-width:none;object-fit:contain;mix-blend-mode:multiply}.chr-chr-divider{width:0;height:100%;border-left:1px solid #e0e0e0}.chr-chr-integration-section{display:grid;align-items:center;justify-content:center;gap:32px;grid-template-columns:minmax(200px,1fr) minmax(calc(100% - 252px - 32px),1fr)}.chr-chr-integration-image{width:100%;max-width:252px;aspect-ratio:252/236}.chr-chr-integration-content{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:24px}.chr-chr-integration-text{font-weight:500;color:#0f124d;font-size:16px;text-align:center}.chr-chr-cta-button{width:100%;max-width:238px;padding:12px 24px;font-weight:700;font-size:14px;color:#eebd23;background-color:#fff;border-radius:8px;border:1px solid #eebd23;text-align:center;text-decoration:none;transition:background-color .2s,color .2s;cursor:pointer}.chr-chr-cta-button:hover{color:#fff;background-color:#eebd23}.chr-chr-mobile-menu-btn{display:none;height:24px;padding:0;color:inherit!important;background:0 0!important;border:none;cursor:pointer}.chr-chr-mobile-link,.chr-chr-mobile-sublink{display:flex;text-decoration:none;font-weight:500}.chr-chr-mobile-menu-btn svg{pointer-events:none}.chr-chr-mobile-nav{position:fixed;top:72px;left:0;right:0;background:#fff;border-bottom:1px solid #e0e0e0;max-height:0;overflow:hidden;transition:max-height .3s;z-index:1000}.chr-chr-mobile-nav.chr-chr-active{max-height:calc(100vh - 72px);overflow-y:auto}.chr-chr-mobile-backdrop{position:fixed;top:72px;left:0;right:0;bottom:0;opacity:0;background:rgba(0,0,0,.5);z-index:999;transition:opacity .3s;pointer-events:none}.chr-chr-mobile-backdrop.chr-chr-active{opacity:1;pointer-events:all}.chr-chr-mobile-menu{padding:16px 0}.chr-chr-mobile-item{border-bottom:1px solid #f0f0f0}.chr-chr-mobile-item:has(+ .chr-chr-mobile-item[data-hidden]),.chr-chr-mobile-item:last-child{border:0}.chr-chr-mobile-link{align-items:center;justify-content:space-between;padding:16px 24px;color:#0f124d;font-size:16px!important;cursor:pointer;background:0 0;border:none;width:100%;text-align:left}.chr-chr-mobile-arrow{transition:transform .3s;color:#6b7280}.chr-chr-mobile-item.chr-chr-expanded .chr-chr-mobile-arrow{transform:rotate(90deg)}.chr-chr-mobile-submenu{max-height:0;overflow:hidden;background:#f9f9fb;transition:max-height .15s}.chr-chr-mobile-item.chr-chr-expanded .chr-chr-mobile-submenu{max-height:calc(var(--chr-links-count) * 50px + var(--chr-grid-height,0));transition:max-height .15s .15s}.chr-chr-mobile-sublink{align-items:center;gap:8px;padding:12px 24px 12px 40px;color:#0f124d;font-size:14px}.chr-chr-mobile-sublink:not(:first-child){border-top:1px solid #e0e0e0}.chr-chr-mobile-nav .chr-chr-product-icon,.chr-chr-mobile-nav .chr-chr-resource-icon-wrapper{width:20px}.chr-chr-mobile-nav .chr-chr-features-grid{padding:12px 24px 12px 72px}@media (max-width:1070px){.chr-chr-nav-links{display:none}.chr-chr-mobile-menu-btn{display:block}.chr-chr-dropdown{display:none!important}.chr-chr-features-grid{display:flex;align-items:center;flex-wrap:wrap;gap:6px}.chr-chr-feature-name{font-size:11px}.chr-chr-feature-bullet{display:inline-block}}@media (max-width:640px){.chr-chr-logo-icon{display:none}.chr-chr-cropped-logo-icon{display:block}.chr-chr-header{padding:0 16px}}@media (max-width:480px){.chr-chr-logo-icon{display:block}.chr-chr-cropped-logo-icon,.chr-chr-nav-actions{display:none}} 337</style> 338<header class="chr-chr-header"> 339 <nav class="chr-chr-nav"> 340 <div class="chr-chr-logo"> 341 <button class="chr-chr-mobile-menu-btn" id="menuBtn"> 342 <svg 343 xmlns="http://www.w3.org/2000/svg" 344 width="24" 345 height="24"
346 viewBox="0 0 24 24" 347 fill="none" 348 stroke="currentColor" 349 stroke-width="2" 350 stroke-linecap="round" 351 stroke-linejoin="round" 352 > 353 <path d="M4 5h16 M4 12h16 M4 19h16" /> 354 </svg> 355 </button> 356 <a href="/"> 357 <svg 358 xmlns="http://www.w3.org/2000/svg" 359 width="191" 360 height="35" 361 viewBox="0 0 191 35" 362 fill="none" 363 class="chr-chr-logo-icon" 364 > 365 <path 366 d="M27.6906 25.7173L15.049 34.1841C14.749 34.3854 14.3947 34.4918 14.0327 34.4893C13.6708 34.4868 13.318 34.3756 13.0208 34.1701L0.772539 25.7187C0.534038 25.5543 0.339161 25.3348 0.204614 25.0791C0.070067 24.8234 -0.000140343 24.5391 2.10625e-07 24.2505V4.48388C-0.000130718 4.0875 0.13228 3.70232 0.376393 3.38898C0.620507 3.07565 0.962459 2.85194 1.34843 2.75308L10.2902 0.455122C12.5769 -0.132683 14.974 -0.151396 17.2697 0.40064L27.1147 2.76845C27.5069 2.86249 27.856 3.08501 28.1056 3.40021C28.3553 3.71541 28.4911 4.10497 28.4912 4.50623V24.2338C28.4911 24.5269 28.4186 24.8155 28.28 25.0742C28.1413 25.3329 27.9409 25.5538 27.6962 25.7173" 367 fill="#EEBD23" 368 /> 369 <path 370 d="M27.5474 10.6765H26.7313H26.0641V9.92776C26.0515 9.1371 26.0388 8.34643 26.022 7.55297C26.0091 7.46808 25.9792 7.38663 25.9341 7.31344C25.889 7.24025 25.8295 7.17682 25.7593 7.12691C18.9764 2.27256 9.5978 2.253 2.78401 7.06405C2.67423 7.12797 2.58397 7.22034 2.52287 7.3313C2.46176 7.44226 2.4321 7.56764 2.43707 7.69406C2.41319 10.4586 2.37105 13.2231 2.33594 15.9877C2.33594 16.1343 2.33594 16.2824 2.33594 16.4542H9.88293C9.91443 16.3982 9.9403 16.3393 9.96019 16.2782C10.1262 15.4969 10.5048 14.7759 11.0548 14.1941C11.6047 13.6122 12.3049 13.1918 13.0787 12.9787C13.8526 12.7656 14.6704 12.7681 15.443 12.9859C16.2155 13.2037 16.9131 13.6283 17.4594 14.2136C17.4774 14.233 17.4972 14.2508 17.5184 14.2666H19.9751C19.9091 14.1353 19.8571 14.0306 19.7981 13.9314C17.3077 9.6819 11.1176 9.71124 8.64828 13.9928C8.46989 14.3044 8.40809 14.4008 7.93473 14.4119C7.30547 14.4119 6.67058 14.4035 6.04552 14.4035H4.41757C4.41757 14.2164 4.41757 14.0976 4.41757 13.9775C4.44145 12.2676 4.47376 10.5578 4.47937 8.84653C4.46641 8.70508 4.49627 8.563 4.5651 8.43854C4.63392 8.31409 4.73858 8.21293 4.86564 8.14806C6.62968 7.0557 8.57865 6.29126 10.6175 5.89201C15.2092 5.01334 19.5326 5.7174 23.5597 8.11733C23.7018 8.18377 23.8203 8.29165 23.8993 8.42664C23.9783 8.56163 24.0142 8.71733 24.0021 8.87307C24.0021 9.46817 24.0059 10.0637 24.0134 10.6598H22.5568C22.4885 10.6597 22.4214 10.6775 22.3622 10.7113C22.303 10.7451 22.2537 10.7938 22.2193 10.8525C22.1849 10.9111 22.1666 10.9777 22.1662 11.0457C22.1657 11.1136 22.1832 11.1804 22.2169 11.2395L23.2001 12.9354L23.4628 13.3936L23.8659 14.092L24.7016 15.5462C24.7359 15.6051 24.7852 15.654 24.8445 15.6879C24.9038 15.7219 24.971 15.7398 25.0394 15.7398C25.1079 15.7398 25.1751 15.7219 25.2344 15.6879C25.2937 15.654 25.3429 15.6051 25.3772 15.5462L26.633 13.4019L26.9406 12.8767L27.6204 11.7172L27.8901 11.2576C27.9243 11.1988 27.9423 11.132 27.9424 11.0641C27.9425 10.9961 27.9247 10.9293 27.8907 10.8704C27.8567 10.8114 27.8078 10.7623 27.7488 10.7281C27.6898 10.6938 27.6227 10.6756 27.5544 10.6751" 371 fill="#0F124D" 372 /> 373 <path 374 d="M18.489 18.2004C17.5732 21.553 13.615 22.637 11.119 20.2231C11.0451 20.1454 10.9615 20.0774 10.8704 20.0206H8.48252C8.53168 20.1323 8.55977 20.2036 8.59629 20.272C9.23858 21.4309 10.2262 22.3633 11.4233 22.941C12.6204 23.5186 13.9681 23.713 15.2809 23.4975C17.3105 23.1427 18.8303 22.0573 19.8754 20.2958C19.9624 20.1491 20.0467 19.9605 20.2897 19.9605C21.5539 19.9605 22.8279 19.9451 24.2816 19.9451C24.1412 20.3558 24.0695 20.7107 23.8883 20.9705C21.5117 24.3846 18.3513 26.8614 14.5687 28.5698C14.3494 28.6537 14.1061 28.6507 13.8889 28.5614C10.7875 27.1561 8.08783 25.2367 5.89944 22.6747L6.62001 22.2738L7.08914 22.014C7.14915 21.9806 7.19927 21.9322 7.23448 21.8734C7.26969 21.8147 7.28876 21.7478 7.28975 21.6795C7.29075 21.6111 7.27364 21.5437 7.24016 21.484C7.20667 21.4243 7.15798 21.3744 7.09898 21.3393L6.39667 20.9202L5.10583 20.1533L4.9471 20.0597L2.79383 18.7815C2.73481 18.7464 2.66756 18.7274 2.59883 18.7264C2.5301 18.7254 2.46231 18.7423 2.40226 18.7756C2.34221 18.8089 2.292 18.8573 2.25669 18.9159C2.22138 18.9746 2.2022 19.0414 2.20108 19.1098L2.17158 21.0725V21.6033L2.15895 22.4135L2.13506 24.0982C2.13394 24.1665 2.15094 24.2339 2.18437 24.2936C2.21779 24.3532 2.26645 24.4031 2.32543 24.4381C2.38441 24.4731 2.45163 24.492 2.5203 24.4929C2.58898 24.4938 2.65668 24.4767 2.71658 24.4433L4.06922 23.6931C6.72394 26.8921 10.0655 29.232 13.9858 30.8426C14.1504 30.9027 14.3311 30.9027 14.4957 30.8426C18.739 29.0951 22.318 26.4842 25.123 22.834C25.5298 22.3338 25.8497 21.7696 26.0697 21.1647V17.8833H18.5944C18.5564 17.9936 18.5171 18.0928 18.489 18.1948" 375 fill="#0F124D" 376 /> 377 <path 378 d="M40.4875 18.0027C40.4875 16.6146 40.7975 15.3748 41.4174 14.2832C42.0508 13.1782 42.9065 12.3224 43.9846 11.716C45.0762 11.0961 46.2958 10.7861 47.6435 10.7861C49.2202 10.7861 50.6015 11.1904 51.7874 11.999C52.9733 12.8076 53.8021 13.9261 54.2738 15.3546H51.0193C50.6958 14.6808 50.2376 14.1754 49.6447 13.8385C49.0652 13.5016 48.3914 13.3332 47.6232 13.3332C46.8012 13.3332 46.0667 13.5286 45.4199 13.9194C44.7865 14.2967 44.2879 14.8358 43.924
37815.5365C43.5736 16.2373 43.3984 17.0594 43.3984 18.0027C43.3984 18.9326 43.5736 19.7546 43.924 20.4689C44.2879 21.1696 44.7865 21.7154 45.4199 22.1062C46.0667 22.4836 46.8012 22.6722 47.6232 22.6722C48.3914 22.6722 49.0652 22.5038 49.6447 22.1669C50.2376 21.8165 50.6958 21.3044 51.0193 20.6306H54.2738C53.8021 22.0725 52.9733 23.1978 51.7874 24.0064C50.615 24.8015 49.2337 25.199 47.6435 25.199C46.2958 25.199 45.0762 24.8958 43.9846 24.2894C42.9065 23.6695 42.0508 22.8137 41.4174 21.7222C40.7975 20.6306 40.4875 19.3908 40.4875 18.0027Z" 379 fill="currentColor" 380 /> 381 <path 382 d="M62.9979 13.7172C63.8469 13.7172 64.6016 13.9059 65.2619 14.2832C65.9223 14.6471 66.4344 15.1929 66.7982 15.9206C67.1756 16.6348 67.3642 17.4973 67.3642 18.5081V25.0778H64.5342V18.8921C64.5342 18.0027 64.3118 17.3221 63.8671 16.8505C63.4224 16.3653 62.816 16.1227 62.0478 16.1227C61.2662 16.1227 60.6463 16.3653 60.1881 16.8505C59.7434 17.3221 59.521 18.0027 59.521 18.8921V25.0778H56.691V10.1191H59.521V15.2737C59.8849 14.7886 60.37 14.4113 60.9765 14.1417C61.5829 13.8587 62.2567 13.7172 62.9979 13.7172Z" 383 fill="currentColor" 384 /> 385 <path 386 d="M80.6276 13.8789V25.0778H77.7773V23.6627C77.4135 24.1479 76.9351 24.532 76.3421 24.815C75.7626 25.0845 75.1293 25.2193 74.442 25.2193C73.566 25.2193 72.7911 25.0373 72.1173 24.6735C71.4435 24.2961 70.9112 23.7503 70.5204 23.0361C70.143 22.3084 69.9544 21.4459 69.9544 20.4486V13.8789H72.7844V20.0444C72.7844 20.9338 73.0067 21.6211 73.4515 22.1062C73.8962 22.5779 74.5026 22.8137 75.2708 22.8137C76.0524 22.8137 76.6656 22.5779 77.1103 22.1062C77.555 21.6211 77.7773 20.9338 77.7773 20.0444V13.8789H80.6276Z" 387 fill="currentColor" 388 /> 389 <path 390 d="M86.2499 15.6174C86.6137 15.0244 87.0854 14.5595 87.6649 14.2226C88.2579 13.8857 88.9317 13.7172 89.6863 13.7172V16.6888H88.9384C88.049 16.6888 87.3752 16.8976 86.917 17.3154C86.4722 17.7332 86.2499 18.4609 86.2499 19.4986V25.0778H83.4199V13.8789H86.2499V15.6174Z" 391 fill="currentColor" 392 /> 393 <path 394 d="M97.7983 13.7172C99.1325 13.7172 100.211 14.1417 101.033 14.9907C101.855 15.8263 102.266 16.9987 102.266 18.5081V25.0778H99.4357V18.8921C99.4357 18.0027 99.2133 17.3221 98.7686 16.8505C98.3239 16.3653 97.7175 16.1227 96.9493 16.1227C96.1677 16.1227 95.5478 16.3653 95.0896 16.8505C94.6449 17.3221 94.4225 18.0027 94.4225 18.8921V25.0778H91.5925V13.8789H94.4225V15.2737C94.7999 14.7886 95.2783 14.4113 95.8577 14.1417C96.4507 13.8587 97.0976 13.7172 97.7983 13.7172Z" 395 fill="currentColor" 396 /> 397 <path 398 d="M114.645 25.2193C113.662 25.2193 112.772 25.0508 111.977 24.7139C111.195 24.377 110.575 23.8918 110.117 23.2585C109.659 22.6251 109.423 21.8771 109.41 21.0147H112.442C112.482 21.5941 112.685 22.0523 113.048 22.3892C113.426 22.7261 113.938 22.8946 114.585 22.8946C115.245 22.8946 115.764 22.7396 116.141 22.4297C116.519 22.1062 116.707 21.6885 116.707 21.1764C116.707 20.7586 116.579 20.415 116.323 20.1454C116.067 19.8759 115.744 19.667 115.353 19.5188C114.975 19.3571 114.45 19.1819 113.776 18.9932C112.86 18.7237 112.112 18.4609 111.532 18.2048C110.966 17.9353 110.474 17.5378 110.057 17.0122C109.652 16.4731 109.45 15.7589 109.45 14.8695C109.45 14.0339 109.659 13.3062 110.077 12.6863C110.495 12.0664 111.081 11.5947 111.836 11.2713C112.59 10.9344 113.453 10.7659 114.423 10.7659C115.878 10.7659 117.058 11.123 117.96 11.8373C118.877 12.538 119.382 13.5218 119.477 14.7886H116.364C116.337 14.3034 116.128 13.9059 115.737 13.5959C115.36 13.2725 114.854 13.1108 114.221 13.1108C113.668 13.1108 113.224 13.2523 112.887 13.5353C112.563 13.8183 112.402 14.2293 112.402 14.7684C112.402 15.1457 112.523 15.4624 112.765 15.7185C113.021 15.961 113.331 16.1632 113.695 16.3249C114.073 16.4731 114.598 16.6483 115.272 16.8505C116.188 17.12 116.936 17.3895 117.516 17.659C118.095 17.9286 118.594 18.3329 119.012 18.8719C119.429 19.411 119.638 20.1185 119.638 20.9944C119.638 21.7491 119.443 22.4499 119.052 23.0967C118.661 23.7436 118.089 24.2624 117.334 24.6533C116.579 25.0306 115.683 25.2193 114.645 25.2193Z" 399 fill="currentColor" 400 /> 401 <path 402 d="M127.065 25.2597C125.986 25.2597 125.016 25.0239 124.154 24.5522C123.291 24.067 122.611 23.3865 122.112 22.5105C121.627 21.6346 121.384 20.6238 121.384 19.4784C121.384 18.3329 121.634 17.3221 122.132 16.4462C122.644 15.5702 123.338 14.8964 124.214 14.4247C125.09 13.9396 126.067 13.697 127.145 13.697C128.224 13.697 129.201 13.9396 130.077 14.4247C130.952 14.8964 131.64 15.5702 132.138 16.4462C132.651 17.3221 132.907 18.3329 132.907 19.4784C132.907 20.6238 132.644 21.6346 132.118 22.5105C131.606 23.3865 130.905 24.067 130.016 24.5522C129.14 25.0239 128.156 25.2597 127.065 25.2597ZM127.065 22.7935C127.577 22.7935 128.055 22.6722 128.5 22.4297C128.958 22.1736 129.322 21.7963 129.591 21.2977C129.861 20.799 129.996 20.1926 129.996 19.4784C129.99
4026 18.4137 129.713 17.5984 129.147 17.0324C128.594 16.4529 127.914 16.1632 127.105 16.1632C126.296 16.1632 125.616 16.4529 125.063 17.0324C124.524 17.5984 124.255 18.4137 124.255 19.4784C124.255 20.543 124.518 21.365 125.043 21.9445C125.582 22.5105 126.256 22.7935 127.065 22.7935Z" 403 fill="currentColor" 404 /> 405 <path 406 d="M137.813 10.1191V25.0778H134.982V10.1191H137.813Z" 407 fill="currentColor" 408 /> 409 <path 410 d="M151.181 13.8789V25.0778H148.33V23.6627C147.967 24.1479 147.488 24.532 146.895 24.815C146.316 25.0845 145.682 25.2193 144.995 25.2193C144.119 25.2193 143.344 25.0373 142.67 24.6735C141.997 24.2961 141.464 23.7503 141.074 23.0361C140.696 22.3084 140.508 21.4459 140.508 20.4486V13.8789H143.338V20.0444C143.338 20.9338 143.56 21.6211 144.005 22.1062C144.449 22.5779 145.056 22.8137 145.824 22.8137C146.606 22.8137 147.219 22.5779 147.663 22.1062C148.108 21.6211 148.33 20.9338 148.33 20.0444V13.8789H151.181Z" 411 fill="currentColor" 412 /> 413 <path 414 d="M157.268 16.2036V21.6211C157.268 21.9984 157.356 22.2747 157.531 22.4499C157.719 22.6116 158.029 22.6925 158.461 22.6925H159.775V25.0778H157.996C155.61 25.0778 154.418 23.9188 154.418 21.6009V16.2036H153.084V13.8789H154.418V11.1096H157.268V13.8789H159.775V16.2036H157.268Z" 415 fill="currentColor" 416 /> 417 <path 418 d="M163.245 12.5448C162.747 12.5448 162.329 12.3898 161.992 12.0799C161.669 11.7564 161.507 11.3589 161.507 10.8872C161.507 10.4155 161.669 10.0247 161.992 9.71476C162.329 9.39133 162.747 9.22961 163.245 9.22961C163.744 9.22961 164.155 9.39133 164.478 9.71476C164.815 10.0247 164.984 10.4155 164.984 10.8872C164.984 11.3589 164.815 11.7564 164.478 12.0799C164.155 12.3898 163.744 12.5448 163.245 12.5448ZM164.64 13.8789V25.0778H161.81V13.8789H164.64Z" 419 fill="currentColor" 420 /> 421 <path 422 d="M172.409 25.2597C171.331 25.2597 170.36 25.0239 169.498 24.5522C168.636 24.067 167.955 23.3865 167.456 22.5105C166.971 21.6346 166.729 20.6238 166.729 19.4784C166.729 18.3329 166.978 17.3221 167.477 16.4462C167.989 15.5702 168.683 14.8964 169.559 14.4247C170.435 13.9396 171.412 13.697 172.49 13.697C173.568 13.697 174.545 13.9396 175.421 14.4247C176.297 14.8964 176.984 15.5702 177.483 16.4462C177.995 17.3221 178.251 18.3329 178.251 19.4784C178.251 20.6238 177.988 21.6346 177.463 22.5105C176.95 23.3865 176.25 24.067 175.36 24.5522C174.484 25.0239 173.5 25.2597 172.409 25.2597ZM172.409 22.7935C172.921 22.7935 173.399 22.6722 173.844 22.4297C174.302 22.1736 174.666 21.7963 174.936 21.2977C175.205 20.799 175.34 20.1926 175.34 19.4784C175.34 18.4137 175.057 17.5984 174.491 17.0324C173.938 16.4529 173.258 16.1632 172.449 16.1632C171.641 16.1632 170.96 16.4529 170.408 17.0324C169.869 17.5984 169.599 18.4137 169.599 19.4784C169.599 20.543 169.862 21.365 170.387 21.9445C170.927 22.5105 171.6 22.7935 172.409 22.7935Z" 423 fill="currentColor" 424 /> 425 <path 426 d="M186.533 13.7172C187.867 13.7172 188.945 14.1417 189.767 14.9907C190.589 15.8263 191 16.9987 191 18.5081V25.0778H188.17V18.8921C188.17 18.0027 187.948 17.3221 187.503 16.8505C187.058 16.3653 186.452 16.1227 185.684 16.1227C184.902 16.1227 184.282 16.3653 183.824 16.8505C183.379 17.3221 183.157 18.0027 183.157 18.8921V25.0778H180.327V13.8789H183.157V15.2737C183.534 14.7886 184.013 14.4113 184.592 14.1417C185.185 13.8587 185.832 13.7172 186.533 13.7172Z" 427 fill="currentColor" 428 /> 429 </svg> 430 <img 431 class="chr-chr-cropped-logo-icon" 432 src="https://churnsolution.com/wp-content/uploads/2026/01/cropped-logo.svg" 433 alt="cropped-site-logo" 434 /> 435 </a> 436 </div> 437 <div class="chr-chr-nav-links"> 438 <div class="chr-chr-nav-item"> 439 <a data-match="products" class="chr-chr-nav-link"> 440 Products 441 <svg 442 xmlns="http://www.w3.org/2000/svg" 443 width="24" 444 height="24"
445 viewBox="0 0 24 24" 446 fill="none" 447 stroke="currentColor" 448 stroke-width="2" 449 stroke-linecap="round" 450 stroke-linejoin="round" 451 class="chr-chr-dropdown-arrow" 452 > 453 <path d="m6 9 6 6 6-6" /> 454 </svg> 455 </a> 456 <div class="chr-chr-dropdown"> 457 <main class="chr-chr-dropdown-content"> 458 <section 459 class="chr-chr-primary-product" 460 data-match="cancellation-flows" 461 style="grid-row: span 2" 462 > 463 <a 464 href="/products/cancellation-flows/" 465 class="chr-chr-product-item" 466 > 467 <img 468 class="chr-chr-product-icon" 469 src="https://churnsolution.com/wp-content/uploads/2023/09/flows.png" 470 alt="cancellation-flows" 471 /> 472 <div class="chr-chr-product-details"> 473 <h2 class="chr-chr-product-name">Cancellation Flows</h2> 474 <p class="chr-chr-product-description"> 475 Reduce cancellations instantly with Personalized 476 Cancellation flows 477 </p> 478 </div> 479 </a> 480 <aside class="chr-chr-features-section"> 481 <h3 class="chr-chr-section-title">FEATURES</h3> 482 <div class="chr-chr-features-grid"> 483 <a 484 data-match="exit-surveys" 485 href="/products/exit-surveys/" 486 class="chr-chr-feature-name" 487 > 488 Exit Survey 489 </a> 490 <span class="chr-chr-feature-bullet">•</span> 491 <a 492 data-match="ab-experiments" 493 href="/products/ab-experiments" 494 class="chr-chr-feature-name" 495 > 496 A/B Experiments 497 </a> 498 <span class="chr-chr-feature-bullet">•</span> 499 <a 500 data-match="dynamic-offers" 501 href="/products/dynamic-offers/" 502 class="chr-chr-feature-name" 503 > 504 Dynamic Offers 505 </a> 506 <span class="chr-chr-feature-bullet">•</span> 507 <a 508 data-match="customer-segmentation" 509 href="/products/customer-segmentation/" 510 class="chr-chr-feature-name" 511 > 512 Customer Segmentation 513 </a> 514 <span class="chr-chr-feature-bullet">•</span> 515 <a 516 data-match="easy-setup" 517 href="/products/easy-setup/" 518 class="chr-chr-feature-name" 519 > 520 Easy Setup 521 </a> 522 <span class="chr-chr-feature-bullet">•</span> 523 <a 524 data-match="custom-branding" 525 href="/products/custom-branding/" 526 class="chr-chr-feature-name" 527 > 528 Custom Branding 529 </a> 530 <span class="chr-chr-feature-bullet">•</span> 531 <a 532 data-match="session-recording" 533 href="/products/session-recording/" 534 class="chr-chr-feature-name" 535 > 536 Session Recording 537 </a> 538 <span class="chr-chr-feature-bullet">•</span> 539 <a 540 data-match="pause-wall" 541 href="/products/pause-wall/" 542 class="chr-chr-feature-name" 543 > 544 Pause Wall 545 </a> 546 </div> 547 </aside> 548 </section> 549 <section 550 class="chr-chr-primary-product" 551 data-match="payment-recovery"
552 style="grid-row: span 2" 553 > 554 <a 555 href="/products/payment-recovery/" 556 class="chr-chr-product-item" 557 > 558 <img 559 class="chr-chr-product-icon" 560 src="https://churnsolution.com/wp-content/uploads/2025/08/payment-recovery-icon.svg" 561 alt="payment-recovery" 562 /> 563 <div class="chr-chr-product-details"> 564 <h2 class="chr-chr-product-name">Payment Recovery</h2> 565 <p class="chr-chr-product-description"> 566 Stop involuntary churn by recovering failed payments 567 automatically. 568 </p> 569 </div> 570 </a> 571 <aside class="chr-chr-features-section"> 572 <h3 class="chr-chr-section-title">FEATURES</h3> 573 <div 574 class="chr-chr-features-grid" 575 style="grid-template-columns: minmax(0, 1fr)" 576 > 577 <a 578 data-match="payment-recovery" 579 href="/products/payment-recovery/" 580 class="chr-chr-feature-name" 581 > 582 Dunning Emails 583 </a> 584 <span class="chr-chr-feature-bullet">•</span> 585 <a 586 data-match="smart-retries" 587 href="/products/smart-retries/" 588 class="chr-chr-feature-name" 589 > 590 Smart Retries 591 </a> 592 <span class="chr-chr-feature-bullet">•</span> 593 <a 594 data-match="payment-wall" 595 href="/products/payment-wall/" 596 class="chr-chr-feature-name" 597 > 598 Payment Wall 599 </a> 600 </div> 601 </aside> 602 </section> 603 <a 604 data-match="reactivation" 605 href="/products/reactivation/" 606 class="chr-chr-product-item" 607 > 608 <img 609 class="chr-chr-product-icon" 610 src="https://churnsolution.com/wp-content/uploads/2025/11/reactivation-icon.svg" 611 alt="reactivation" 612 /> 613 <div class="chr-chr-product-details"> 614 <h2 class="chr-chr-product-name">Reactivation Campaigns</h2> 615 <p class="chr-chr-product-description"> 616 Win back cancelled users through automated reactivation emails 617 </p> 618 </div> 619 </a> 620 <a 621 data-match="feedback-analysis" 622 href="/products/feedback-analysis/" 623 class="chr-chr-product-item" 624 > 625 <img 626 class="chr-chr-product-icon" 627 src="https://churnsolution.com/wp-content/uploads/2026/01/feedback-analysis-icon-2.svg" 628 alt="feedback-analysis" 629 /> 630 <div class="chr-chr-product-details"> 631 <h2 class="chr-chr-product-name">AI Feedback Analysis</h2> 632 <p class="chr-chr-product-description"> 633 Understand cancellation reasons instantly using AI 634 </p> 635 </div> 636 </a> 637 <a 638 data-match="churn-metrics" 639 href="/products/churn-metrics/" 640 class="chr-chr-product-item" 641 > 642 <img 643 class="chr-chr-product-icon" 644 src="https://churnsolution.com/wp-content/uploads/2025/12/chur-metrics-icon-1.png" 645 alt="churn-metrics" 646 /> 647 <div class="chr-chr-product-details"> 648 <h2 class="chr-chr-product-name">Churn Metrics</h2> 649 <p class="chr-chr-product-description"> 650 Track churn trends clearly with actionable insights 651 </p> 652 </div> 653 </a> 654 <a 655 data-match="customer-portal" 656 href="/products/customer-portal/" 657 class="chr-chr-product-item" 658 > 659 <img 660 class="chr-chr-product-icon"
661 src="https://churnsolution.com/wp-content/uploads/2026/01/customer-portal-icon.svg" 662 alt="customer-portal" 663 /> 664 <div class="chr-chr-product-details"> 665 <h2 class="chr-chr-product-name">Customer Portal</h2> 666 <p class="chr-chr-product-description"> 667 Let customers manage billing easily for free 668 </p> 669 </div> 670 </a> 671 <a 672 data-match="mcp-server" 673 href="/products/mcp-server/" 674 class="chr-chr-product-item" 675 > 676 <img 677 class="chr-chr-product-icon" 678 src="https://churnsolution.com/wp-content/uploads/2026/07/mcp-server-icon.svg" 679 alt="mcp-server" 680 /> 681 <div class="chr-chr-product-details"> 682 <div class="chr-chr-product-title-row"> 683 <h2 class="chr-chr-product-name">MCP Server</h2> 684 <span class="chr-chr-status-badge">New</span> 685 </div> 686 <p class="chr-chr-product-description"> 687 Ask your AI assistant about churn using live data 688 </p> 689 </div> 690 </a> 691 </main> 692 </div> 693 </div> 694 <div class="chr-chr-nav-item"> 695 <a data-match="resources" class="chr-chr-nav-link"> 696 Resources 697 <svg 698 xmlns="http://www.w3.org/2000/svg" 699 width="24" 700 height="24"
701 viewBox="0 0 24 24" 702 fill="none" 703 stroke="currentColor" 704 stroke-width="2" 705 stroke-linecap="round" 706 stroke-linejoin="round" 707 class="chr-chr-dropdown-arrow" 708 > 709 <path d="m6 9 6 6 6-6" /> 710 </svg> 711 </a> 712 <div class="chr-chr-dropdown"> 713 <main class="chr-chr-resources-tab"> 714 <section 715 class="chr-chr-resources-grid" 716 aria-label="Resource navigation" 717 > 718 <a 719 data-match="docs" 720 href="/docs/install/" 721 class="chr-chr-resource-item" 722 > 723 <div class="chr-chr-resource-icon-wrapper"> 724 <img 725 class="chr-chr-resource-icon" 726 src="https://churnsolution.com/wp-content/uploads/2026/01/developer-docs-icon.png" 727 alt="docs" 728 /> 729 </div> 730 <div class="chr-chr-resource-content"> 731 <h2 class="chr-chr-resource-title">Developer Docs</h2> 732 <p class="chr-chr-resource-description"> 733 Guides, API references, and integration instructions. 734 </p> 735 </div> 736 </a> 737 <a 738 href="/demo/" 739 target="_blank" 740 class="chr-chr-resource-item" 741 data-event-action="book_demo" 742 data-event-category="cta" 743 data-event-label="header_book_demo" 744 data-event-from="WP-header" 745 > 746 <div class="chr-chr-resource-icon-wrapper"> 747 <img 748 class="chr-chr-resource-icon" 749 src="https://churnsolution.com/wp-content/uploads/2026/01/book-demo-icon.png" 750 alt="demo" 751 /> 752 </div> 753 <div class="chr-chr-resource-content"> 754 <h2 class="chr-chr-resource-title">Book Demo</h2> 755 <p class="chr-chr-resource-description"> 756 Schedule a live demo with our team. 757 </p> 758 </div> 759 </a> 760 <a 761 data-match="how-it-works" 762 href="/how-it-works/" 763 class="chr-chr-resource-item" 764 > 765 <div class="chr-chr-resource-icon-wrapper"> 766 <img 767 class="chr-chr-resource-icon" 768 src="https://churnsolution.com/wp-content/uploads/2026/01/how-it-works-icon.png" 769 alt="how-it-works" 770 /> 771 </div> 772 <div class="chr-chr-resource-content"> 773 <h2 class="chr-chr-resource-title">How it works</h2> 774 <p class="chr-chr-resource-description"> 775 Step-by-step overview of our platform. 776 </p> 777 </div> 778 </a> 779 <a data-match="blog" href="/blog/" class="chr-chr-resource-item"> 780 <div class="chr-chr-resource-icon-wrapper"> 781 <img 782 class="chr-chr-resource-icon" 783 src="https://churnsolution.com/wp-content/uploads/2026/01/blog-icon.png" 784 alt="blog" 785 /> 786 </div> 787 <div class="chr-chr-resource-content"> 788 <h2 class="chr-chr-resource-title">Blog</h2> 789 <p class="chr-chr-resource-description"> 790 Articles, tips, and case studies on retention. 791 </p> 792 </div> 793 </a> 794 <a 795 data-match="calculator" 796 href="/calculator/" 797 class="chr-chr-resource-item" 798 > 799 <div class="chr-chr-resource-icon-wrapper"> 800 <img 801 class="chr-chr-resource-icon"
802 src="https://churnsolution.com/wp-content/uploads/2026/01/roi-calculator-icon.png" 803 alt="calculator" 804 /> 805 </div> 806 <div class="chr-chr-resource-content"> 807 <h2 class="chr-chr-resource-title">ROI Calculator</h2> 808 <p class="chr-chr-resource-description"> 809 Estimate revenue saved and potential growth. 810 </p> 811 </div> 812 </a> 813 <a 814 data-match="case-studies" 815 href="/case-studies/" 816 class="chr-chr-resource-item" 817 > 818 <div class="chr-chr-resource-icon-wrapper"> 819 <img 820 class="chr-chr-resource-icon" 821 src="https://churnsolution.com/wp-content/uploads/2026/04/case-studies-icon.png" 822 alt="case-studies" 823 /> 824 </div> 825 <div class="chr-chr-resource-content"> 826 <h2 class="chr-chr-resource-title">Case Studies</h2> 827 <p class="chr-chr-resource-description"> 828 Explore how teams reduced churn and grew revenue. 829 </p> 830 </div> 831 </a> 832 <a 833 data-match="integrations" 834 href="/integrations/" 835 class="chr-chr-resource-item" 836 style="grid-column: span 2" 837 > 838 <div class="chr-chr-resource-icon-wrapper"> 839 <img 840 class="chr-chr-resource-icon" 841 src="https://churnsolution.com/wp-content/uploads/2026/08/integrations-icon.png" 842 alt="integrations" 843 /> 844 </div> 845 <div class="chr-chr-resource-content"> 846 <h2 class="chr-chr-resource-title">Integrations</h2> 847 <p class="chr-chr-resource-description"> 848 Connect your gateway and tools in minutes. 849 </p> 850 </div> 851 </a> 852 </section> 853 <div 854 class="chr-chr-divider" 855 role="separator" 856 aria-hidden="true" 857 ></div> 858 <section class="chr-chr-integration-section"> 859 <img 860 class="chr-chr-integration-image" 861 src="https://churnsolution.com/wp-content/uploads/2026/01/mutiple-processors.svg" 862 alt="mutiple-processors" 863 /> 864 <div class="chr-chr-integration-content"> 865 <p class="chr-chr-integration-text"> 866 Connect Churn Solution with your favorite tools in minutes and 867 start reducing cancellations instantly. 868 </p> 869 <a 870 href="/integrations/" 871 class="chr-chr-cta-button" 872 data-event-action="integrations" 873 data-event-category="navigation" 874 data-event-label="integrations" 875 data-event-from="WP-header" 876 > 877 Get Started 878 </a> 879 </div> 880 </section> 881 </main> 882 </div> 883 </div> 884 <a href="/pricing/" data-match="pricing" class="chr-chr-nav-link"> 885 Pricing 886 </a> 887 <a 888 href="/case-studies/" 889 data-match="case-studies" 890 class="chr-chr-nav-link" 891 > 892 Case Studies 893 </a> 894 </div> 895 <div class="chr-chr-nav-actions"> 896 <a 897 href="#" 898 class="chr-chr-btn-contact-us" 899 onclick="goToPage('contact-us')" 900 data-event-action="contact-us_navigate_to_app" 901 data-event-category="navigation" 902 data-event-label="contact-us" 903 data-event-from="WP-header" 904 > 905 Contact Us 906 </a> 907 <button 908 class="chr-chr-btn-signup" 909 onclick="goToPage('signup')" 910 data-event-action="signup_navigate_to_app" 911 data-event-category="navigation" 912 data-event-label="signup" 913 data-event-from="WP-header" 914 > 915 Sign Up 916 </button> 917 <a 918 class="chr-chr-btn-demo" 919 href="/demo/" 920 target="_blank" 921 data-event-action="book_demo" 922 data-event-category="cta" 923 data-event-label="header_book_demo" 924 data-event-from="WP-header" 925 > 926 Book Demo 927 </a> 928 </div> 929 </nav> 930</header> 931<div class="chr-chr-mobile-nav" id="mobileNav"> 932 <nav class="chr-chr-mobile-menu"> 933 <div class="chr-chr-mobile-item" style="--chr-links-count: 7"> 934 <button class="chr-chr-mobile-link" data-toggle="products"> 935 Products 936 <svg 937 class="chr-chr-mobile-arrow" 938 xmlns="http://www.w3.org/2000/svg" 939 width="20" 940 height="20"
941 viewBox="0 0 24 24" 942 fill="none" 943 stroke="currentColor" 944 stroke-width="2" 945 > 946 <path d="m9 18 6-6-6-6" /> 947 </svg> 948 </button> 949 <div class="chr-chr-mobile-submenu"> 950 <a href="/products/cancellation-flows/" class="chr-chr-mobile-sublink"> 951 <img 952 class="chr-chr-product-icon" 953 src="https://churnsolution.com/wp-content/uploads/2023/09/flows.png" 954 alt="cancellation-flows" 955 /> 956 <span>Cancellation Flows</span> 957 </a> 958 <div class="chr-chr-features-grid"> 959 <a href="/products/exit-surveys/" class="chr-chr-feature-name"> 960 Exit Survey 961 </a> 962 <span class="chr-chr-feature-bullet">•</span> 963 <a href="/products/ab-experiments" class="chr-chr-feature-name"> 964 A/B Experiments 965 </a> 966 <span class="chr-chr-feature-bullet">•</span> 967 <a 968 data-match="dynamic-offers" 969 href="/products/dynamic-offers/" 970 class="chr-chr-feature-name" 971 > 972 Dynamic Offers 973 </a> 974 <span class="chr-chr-feature-bullet">•</span> 975 <a 976 href="/products/customer-segmentation/" 977 class="chr-chr-feature-name" 978 > 979 Customer Segmentation 980 </a> 981 <span class="chr-chr-feature-bullet">•</span> 982 <a href="/products/easy-setup/" class="chr-chr-feature-name"> 983 Easy Setup 984 </a> 985 <span class="chr-chr-feature-bullet">•</span> 986 <a href="/products/custom-branding/" class="chr-chr-feature-name"> 987 Custom Branding 988 </a> 989 <span class="chr-chr-feature-bullet">•</span> 990 <a href="/products/session-recording/" class="chr-chr-feature-name"> 991 Session Recording 992 </a> 993 <span class="chr-chr-feature-bullet">•</span> 994 <a href="/products/pause-wall/" class="chr-chr-feature-name"> 995 Pause Wall 996 </a> 997 </div> 998 <a href="/products/payment-recovery/" class="chr-chr-mobile-sublink"> 999 <img 1000 class="chr-chr-product-icon" 1001 src="https://churnsolution.com/wp-content/uploads/2025/08/payment-recovery-icon.svg" 1002 alt="payment-recovery" 1003 /> 1004 <span>Payment Recovery</span> 1005 </a> 1006 <div class="chr-chr-features-grid"> 1007 <a href="/products/payment-recovery/" class="chr-chr-feature-name"> 1008 Dunning Emails 1009 </a> 1010 <span class="chr-chr-feature-bullet">•</span> 1011 <a href="/products/smart-retries" class="chr-chr-feature-name"> 1012 Smart Retries 1013 </a> 1014 <span class="chr-chr-feature-bullet">•</span> 1015 <a href="/products/payment-wall/" class="chr-chr-feature-name"> 1016 Payment Wall 1017 </a> 1018 </div> 1019 <a href="/products/reactivation/" class="chr-chr-mobile-sublink"> 1020 <img 1021 class="chr-chr-product-icon" 1022 src="https://churnsolution.com/wp-content/uploads/2025/11/reactivation-icon.svg" 1023 alt="reactivation" 1024 /> 1025 <span>Reactivation Campaigns</span> 1026 </a> 1027 <a href="/products/feedback-analysis/" class="chr-chr-mobile-sublink"> 1028 <img 1029 class="chr-chr-product-icon" 1030 src="https://churnsolution.com/wp-content/uploads/2026/01/feedback-analysis-icon-2.svg" 1031 alt="feedback-analysis" 1032 /> 1033 <span>AI Feedback Analysis</span> 1034 </a> 1035 <a href="/products/churn-metrics/" class="chr-chr-mobile-sublink"> 1036 <img 1037 class="chr-chr-product-icon" 1038 src="https://churnsolution.com/wp-content/uploads/2025/12/chur-metrics-icon-1.png" 1039 alt="churn-metrics" 1040 /> 1041 <span>Churn Metrics</span> 1042 </a> 1043 <a href="/products/customer-portal/" class="chr-chr-mobile-sublink"> 1044 <img 1045 class="chr-chr-product-icon"
1046 src="https://churnsolution.com/wp-content/uploads/2026/01/customer-portal-icon.svg" 1047 alt="customer-portal" 1048 /> 1049 <span>Customer Portal</span> 1050 </a> 1051 <a href="/products/mcp-server/" class="chr-chr-mobile-sublink"> 1052 <img 1053 class="chr-chr-product-icon" 1054 src="https://churnsolution.com/wp-content/uploads/2026/07/mcp-server-icon.svg" 1055 alt="mcp-server" 1056 /> 1057 <span>MCP Server</span> 1058 </a> 1059 </div> 1060 </div> 1061 <div class="chr-chr-mobile-item" style="--chr-links-count: 7"> 1062 <button class="chr-chr-mobile-link" data-toggle="resources"> 1063 Resources 1064 <svg 1065 class="chr-chr-mobile-arrow" 1066 xmlns="http://www.w3.org/2000/svg" 1067 width="20" 1068 height="20" 1069 viewBox="0 0 24 24" 1070 fill="none" 1071 stroke="currentColor" 1072 stroke-width="2" 1073 > 1074 <path d="m9 18 6-6-6-6" /> 1075 </svg> 1076 </button> 1077 <div class="chr-chr-mobile-submenu"> 1078 <a href="/docs/install/" class="chr-chr-mobile-sublink"> 1079 <div class="chr-chr-resource-icon-wrapper"> 1080 <img 1081 class="chr-chr-resource-icon" 1082 src="https://churnsolution.com/wp-content/uploads/2026/01/developer-docs-icon.png" 1083 alt="docs" 1084 /> 1085 </div> 1086 <span>Developer Docs</span> 1087 </a> 1088 <a 1089 href="/demo/" 1090 target="_blank" 1091 class="chr-chr-mobile-sublink" 1092 data-event-action="book_demo" 1093 data-event-category="cta" 1094 data-event-label="header_book_demo" 1095 data-event-from="WP-header" 1096 > 1097 <div class="chr-chr-resource-icon-wrapper"> 1098 <img 1099 class="chr-chr-resource-icon" 1100 src="https://churnsolution.com/wp-content/uploads/2026/01/book-demo-icon.png" 1101 alt="demo" 1102 /> 1103 </div> 1104 <span>Book Demo</span> 1105 </a> 1106 <a href="/how-it-works/" class="chr-chr-mobile-sublink"> 1107 <div class="chr-chr-resource-icon-wrapper"> 1108 <img 1109 class="chr-chr-resource-icon" 1110 src="https://churnsolution.com/wp-content/uploads/2026/01/how-it-works-icon.png" 1111 alt="how-it-works" 1112 /> 1113 </div> 1114 <span>How it works</span> 1115 </a> 1116 <a href="/blog/" class="chr-chr-mobile-sublink"> 1117 <div class="chr-chr-resource-icon-wrapper"> 1118 <img 1119 class="chr-chr-resource-icon" 1120 src="https://churnsolution.com/wp-content/uploads/2026/01/blog-icon.png" 1121 alt="blog" 1122 /> 1123 </div> 1124 <span>Blog</span> 1125 </a> 1126 <a href="/calculator/" class="chr-chr-mobile-sublink"> 1127 <div class="chr-chr-resource-icon-wrapper"> 1128 <img 1129 class="chr-chr-resource-icon" 1130 src="https://churnsolution.com/wp-content/uploads/2026/01/roi-calculator-icon.png" 1131 alt="calculator" 1132 /> 1133 </div> 1134 <span>ROI Calculator</span> 1135 </a> 1136 <a href="/case-studies/" class="chr-chr-mobile-sublink"> 1137 <div class="chr-chr-resource-icon-wrapper"> 1138 <img 1139 class="chr-chr-resource-icon" 1140 src="https://churnsolution.com/wp-content/uploads/2026/04/case-studies-icon.png" 1141 alt="case-studies" 1142 /> 1143 </div> 1144 <span>Case Studies</span> 1145 </a> 1146 <a href="/integrations/" class="chr-chr-mobile-sublink"> 1147 <div class="chr-chr-resource-icon-wrapper"> 1148 <img 1149 class="chr-chr-resource-icon" 1150 src="https://churnsolution.com/wp-content/uploads/2026/08/integrations-icon.png" 1151 alt="integrations" 1152 /> 1153 </div> 1154 <span>Integrations</span> 1155 </a> 1156 </div> 1157 </div> 1158 <div class="chr-chr-mobile-item"> 1159 <a href="/pricing/" class="chr-chr-mobile-link">Pricing</a> 1160 </div> 1161 <div class="chr-chr-mobile-item"> 1162 <a href="/case-studies/" class="chr-chr-mobile-link">Case Studies</a> 1163 </div> 1164 <div class="chr-chr-mobile-item" data-action> 1165 <a 1166 href="#" 1167 class="chr-chr-mobile-link" 1168 onclick="goToPage('contact-us')" 1169 data-event-action="contact-us_navigate_to_app" 1170 data-event-category="navigation" 1171 data-event-label="contact-us" 1172 data-event-from="WP-header" 1173 > 1174 Contact Us 1175 </a> 1176 </div> 1177 <div class="chr-chr-mobile-item" data-action> 1178 <a 1179 href="#" 1180 class="chr-chr-mobile-link" 1181 onclick="goToPage('signup')" 1182 data-event-action="signup_navigate_to_app" 1183 data-event-category="navigation" 1184 data-event-label="signup" 1185 data-event-from="WP-header" 1186 > 1187 Sign Up 1188 </a> 1189 </div> 1190 <div class="chr-chr-mobile-item" data-action> 1191 <a 1192 class="chr-chr-mobile-link" 1193 href="/demo/" 1194 target="_blank" 1195 data-event-action="book_demo" 1196 data-event-category="cta" 1197 data-event-label="header_book_demo" 1198 data-event-from="WP-header" 1199 > 1200 Book Demo 1201 </a> 1202 </div> 1203 </nav> 1204</div> 1205<div class="chr-chr-mobile-backdrop" id="mobileBackdrop"></div>
1206<script> 1207function goToPage(e="signup"){let t=window.location.hostname.match(/\.([a-z]{2,})$/i)?.at(1);window.open(`https://app.churnsolution.${t}/${e}`,"_blank")}function calculateMobileFeaturesHeight(){let e=document.querySelector(".chr-chr-mobile-link[data-toggle=products]"),t=e?.parentElement,a=[...t.querySelectorAll(".chr-chr-features-grid"),].reduce((e,t)=>e+t.getBoundingClientRect().height,0);t?.style.setProperty("--chr-grid-height",`${a}px`)}function overwriteMobileDocsLink(){let e=document.querySelector(".chr-chr-mobile-nav a[href^='/docs']");window.innerWidth>921?e?.setAttribute("href","/docs/install"):e?.setAttribute("href","/docs")}setTimeout(()=>{let[,e,t=""]=window.location.pathname.split("/"),a=t?`WP-${e}-${t}`:`WP-${e||"home"}`;document.addEventListener("click",function(e){let t=e.target.closest("[data-event-action]");if(!t)return;let r=t.getAttribute("data-event-action"),c=t.getAttribute("data-event-category"),l=t.getAttribute("data-event-label"),i=t.getAttribute("data-event-from")||a,n=t.getAttribute("data-event-value"),o={action:r,category:c,label:l,from:i};n&&(o.value=n),Array.from(t.attributes).forEach(e=>{if(e.name.startsWith("data-event-")&&!["data-event-action","data-event-category","data-event-label","data-event-from","data-event-value",].includes(e.name)){let t=e.name.replace("data-event-","");o[t]=e.value}}),window.sendEvent?.(o)})},500),document.addEventListener("click",e=>{let t=document.getElementById("mobileNav"),a=menuBtn.querySelector("svg");!e.target.closest(".chr-chr-header")&&t.classList.contains("chr-chr-active")&&(t.classList.remove("chr-chr-active"),a.innerHTML='<path d="M4 5h16 M4 12h16 M4 19h16" />')}),window.addEventListener("resize",()=>{let e=document.getElementById("mobileNav"),t=menuBtn.querySelector("svg"),a=document.getElementById("mobileBackdrop"),r=document.querySelectorAll("[data-toggle]"),c=document.querySelectorAll(".chr-chr-mobile-item[data-action]");window.innerWidth>1070?(e.classList.remove("chr-chr-active"),a.classList.remove("chr-chr-active"),t.innerHTML='<path d="M4 5h16 M4 12h16 M4 19h16" />',r.forEach(e=>{e.parentElement.classList.remove("chr-chr-expanded")})):calculateMobileFeaturesHeight(),window.innerWidth>480?c.forEach(e=>e.setAttribute("data-hidden","")):c.forEach(e=>e.removeAttribute("data-hidden")),overwriteMobileDocsLink()}),(()=>{let e=document.querySelector(".chr-chr-header"),t=document.getElementById("menuBtn"),a=document.getElementById("mobileNav"),r=t.querySelector("svg"),c=document.querySelectorAll("[data-toggle]"),l=d
1207ocument.getElementById("mobileBackdrop"),[,i,n=""]=window.location.pathname.split("/");if(["blog","docs"].includes(i)?e.setAttribute("data-variant","light"):["pricing","blog","calculator"].includes(i)&&e.setAttribute("data-variant","dark"),["blog","docs","calculator","how-it-works","integrations"].includes(i))document.querySelector(".chr-chr-nav-link[data-match='resources']")?.classList.add("chr-chr-active"),document.querySelector(`[data-match='${i}']`)?.classList.add("chr-chr-active");else{let o=document.querySelector(`.chr-chr-nav-link[data-match='${i}']`);o?.classList.add("chr-chr-active"),document.querySelectorAll(`[data-match='${n}'], .chr-chr-primary-product:has([data-match='${n}'])`).forEach(e=>e.classList.add("chr-chr-active"))}document.querySelector(".chr-chr-mobile-menu").addEventListener("click",e=>e.stopPropagation()),calculateMobileFeaturesHeight(),c.forEach(e=>{e.addEventListener("click",t=>{t.stopPropagation(),e.parentElement.classList.toggle("chr-chr-expanded"),c.forEach(t=>{t.getAttribute("data-toggle")!==e.getAttribute("data-toggle")&&t.parentElement.classList.remove("chr-chr-expanded")})})});let h=()=>{let e=a.classList.toggle("chr-chr-active");l.classList.toggle("chr-chr-active"),r.innerHTML=e?'<path d="M18 6 6 18"/><path d="m6 6 12 12"/>':'<path d="M4 5h16 M4 12h16 M4 19h16" />',e||c.forEach(e=>{e.parentElement.classList.remove("chr-chr-expanded")})};t.addEventListener("click",h),l.addEventListener("click",h),overwriteMobileDocsLink()})(); 1208</script>
1208<style id="uagb-style-conditional-extension">@media (min-width: 1025px){body .uag-hide-desktop.uagb-google-map__wrap,body .uag-hide-desktop{display:none !important}}@media (min-width: 768px) and (max-width: 1024px){body .uag-hide-tab.uagb-google-map__wrap,body .uag-hide-tab{display:none !important}}@media (max-width: 767px){body .uag-hide-mob.uagb-google-map__wrap,body .uag-hide-mob{display:none !important}}</style><style id="uagb-style-frontend-1821">.uag-blocks-common-selector{z-index:var(--z-index-desktop) !important}@media(max-width: 976px){.uag-blocks-common-selector{z-index:var(--z-index-tablet) !important}}@media(max-width: 767px){.uag-blocks-common-selector{z-index:var(--z-index-mobile) !important}}</style><link rel="icon" href="https://churnsolution.com/wp-content/uploads/2024/04/cropped-image-22-2-32x32.png" sizes="32x32" /> 1209<link rel="icon" href="https://churnsolution.com/wp-content/uploads/2024/04/cropped-image-22-2-192x192.png" sizes="192x192" /> 1210<link rel="apple-touch-icon" href="https://churnsolution.com/wp-content/uploads/2024/04/cropped-image-22-2-180x180.png" /> 1211<meta name="msapplication-TileImage" content="https://churnsolution.com/wp-content/uploads/2024/04/cropped-image-22-2-270x270.png" /> 1212<style id="wp-custom-css"> 1213/* Center the CTA content inside the sidebar */ 1214.single-post .chr-article-side-content .wp-block-essential-blocks-button { 1215 text-align: center !important; 1216} 1217 1218/* If the CTA block uses a normal link styled as a button */ 1219.single-post .chr-article-side-content a.wp-element-button, 1220.single-post .chr-article-side-content .wp-element-button { 1221 margin-left: auto !important; 1222 margin-right: auto !important; 1223 display: inline-flex !important; 1224 align-items: center !important; 1225 justify-content: center !important; 1226} 1227 1228/* Related Articles - force old 3-column layout */ 1229.chr-related-articles .eb-post-grid-wrapper.eb-post-grid-b0aeqrp .eb-post-grid-posts-wrapper, 1230.chr-related-articles .eb-post-grid-posts-wrapper { 1231 display: grid !important; 1232 grid-template-columns: repeat(3, minmax(0, 1fr)) !important; 1233 gap: 32px !important; 1234 align-items: stretch !important; 1235} 1236 1237/* Card style */ 1238.chr-related-articles .ebpg-grid-post-holder { 1239 height: 100% !important; 1240 border-radius: 14px !important; 1241 overflow: hidden !important; 1242} 1243 1244/* Image */ 1245.chr-related-articles .ebpg-entry-thumbnail { 1246 margin: 0 0 16px 0 !important; 1247} 1248 1249.chr-related-articles .ebpg-entry-thumbnail img { 1250 width: 100% !important; 1251 height: 250px !important; 1252 object-fit: cover !important; 1253 border-radius: 12px !important; 1254 display: block !important; 1255} 1256 1257/* Title */ 1258.chr-related-articles .ebpg-entry-title { 1259 margin: 0 0 8px 0 !important; 1260 font-size: 18px !important; 1261 line-height: 1.25 !important; 1262} 1263 1264.chr-related-articles .ebpg-entry-title a { 1265 font-size: 18px !important; 1266 font-weight: 700 !important; 1267 line-height: 1.25 !important; 1268 display: -webkit-box !important; 1269 -webkit-line-clamp: 1 !important; 1270 -webkit-box-orient: vertical !important; 1271 overflow: hidden !important; 1272} 1273 1274/* Excerpt */ 1275.chr-related-articles .ebpg-grid-post-excerpt p { 1276 font-size: 15px !important; 1277 line-height: 1.5 !important; 1278 margin: 0 0 18px 0 !important; 1279 display: -webkit-box !important; 1280 -webkit-line-clamp: 2 !important; 1281 -webkit-box-orient: vertical !important; 1282 overflow: hidden !important; 1283} 1284 1285/* Author/date row */ 1286.chr-related-articles .ebpg-header-meta, 1287.chr-related-articles .ebpg-footer-meta { 1288 display: flex !important; 1289 align-items: center !important; 1290 justify-content: flex-start !important; 1291 gap: 10px !important; 1292 margin-top: auto !important; 1293} 1294 1295.chr-related-articles .ebpg-entry-meta-items { 1296 display: flex !important; 1297 align-items: center !important; 1298 gap: 8px !important; 1299 flex-wrap: wrap !important; 1300} 1301 1302.chr-related-articles .ebpg-author-avatar img { 1303 width: 48px !important; 1304 height: 48px !important; 1305 border-radius: 50% !important; 1306 object-fit: cover !important; 1307} 1308 1309.chr-related-articles .ebpg-posted-by, 1310.chr-related-articles .ebpg-posted-by a, 1311.chr-related-articles .ebpg-posted-on { 1312 font-size: 13px !important; 1313} 1314 1315/* Tablet and mobile */ 1316@media (max-width: 1024px) { 1317 .chr-related-articles .eb-post-grid-wrapper.eb-post-grid-b0aeqrp .eb-post-grid-posts-wrapper, 1318 .chr-related-articles .eb-post-grid-posts-wrapper { 1319 grid-template-columns: repeat(1, minmax(0, 1fr)) !important; 1320 } 1321} 1322</style> 1323 1324 <!-- Google tag (gtag.js) --> 1325<!--
vendor: 64 bytes, line 1325
1325 <script async src="https://www.googletagmanager.com/gtag/js?id=
1325G-VZ7XSDM7FG
vendor: 13 bytes, lines 1325-1326
1325"> 1326</script>
1327<script> 1328
vendor: 134 bytes, lines 1328-1332
1328window.dataLayer = window.dataLayer || []; 1329 function gtag(){dataLayer.push(arguments);} 1330 gtag('js', new Date()); 1331 1332 gtag('config', '
1332G-VZ7XSDM7FG
vendor: 4 bytes, line 1332
1332');
1333</script>
1333 --> 1334</head> 1335 1336<body itemtype='https://schema.org/WebPage' itemscope='itemscope' class="wp-singular page-template-default page page-id-1821 page-child parent-pageid-1803 wp-custom-logo wp-theme-astra wp-child-theme-astra-child ast-desktop ast-plain-container ast-no-sidebar astra-4.3.0 group-blog ast-single-post ast-inherit-site-logo-transparent ast-hfb-header ast-full-width-primary-header"> 1337<!-- Google Tag Manager (noscript) -->
vendor: 69 bytes, lines 1337-1338
1337 1338<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
1338GTM-KFH8XXKN
vendor: 85 bytes, lines 1338-1339
1338" 1339height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
1340<!-- End Google Tag Manager (noscript) --> 1341<a 1342 class="skip-link screen-reader-text" 1343 href="#content" 1344 role="link" 1345 title="Skip to content"> 1346 Skip to content</a> 1347 1348<div 1349class="hfeed site" id="page"> 1350 <header 1351 class="site-header header-main-layout-1 ast-primary-menu-enabled ast-logo-title-inline ast-hide-custom-menu-mobile ast-builder-menu-toggle-icon ast-mobile-header-inline" id="masthead" itemtype="https://schema.org/WPHeader" itemscope="itemscope" itemid="#masthead" > 1352 <div id="ast-desktop-header" data-toggle-type="dropdown"> 1353 </div> <!-- Main Header Bar Wrap --> 1354<div id="ast-mobile-header" class="ast-mobile-header-wrap " data-type="dropdown"> 1355 </div> 1356 </header><!-- #masthead --> 1357 <div id="content" class="site-content"> 1358 <div class="ast-container"> 1359 1360 1361 1362 <div id="primary" class="content-area primary"> 1363 1364 1365 <main id="main" class="site-main"> 1366 <article 1367class="post-1821 page type-page status-publish ast-article-single" id="post-1821" itemtype="https://schema.org/CreativeWork" itemscope="itemscope"> 1368 1369 1370 <header class="entry-header ast-no-thumbnail ast-no-title ast-header-without-markup"> 1371 </header> <!-- .entry-header --> 1372 1373 1374<div class="entry-content clear" 1375 ast-blocks-layout="true" itemprop="text"> 1376 1377 1378 1379<div class="wp-block-group chr-docs-container alignfull is-layout-constrained wp-block-group-is-layout-constrained"><style> 1380.chr-docs-navigator-section a,.chr-docs-navigator-section-header{font-size:14px;font-stretch:normal;font-style:normal;line-height:normal;letter-spacing:normal;text-align:left}.site-content{overflow:visible!important}.ast-above-header-wrap .ast-above-header.ast-above-header-bar,.ast-primary-header-bar.ast-primary-header{background-color:#fff!important;color:#0f124d!important;border-bottom:1px solid #dbdbe4!important}.ast-above-header.ast-above-header-bar *,.ast-primary-header-bar.ast-primary-header *{color:#0f124d!important}.ast-above-header.ast-above-header-bar .resources-menu-trigger:hover a,.ast-above-header.ast-above-header-bar a.menu-link:hover{color:#fff!important}#ast-mobile-header .mobile-free-trial,.ast-above-header.ast-above-header-bar .ast-custom-button{color:#fff!important;background-color:#0f124d!important}.ast-above-header.ast-above-header-bar .wp-block-button__link:hover{border-color:#0f124d}.chr-docs-container{display:flex;gap:0;padding:48px 0 0!important;position:relative}.chr-docs-navigator-container{background-color:#fff;max-height:calc(100vh - 72px);overflow-y:auto;position:sticky;top:72px;padding:8px 28px 24px;height:auto;border-right:1px solid #dbdbe4;width:306px;min-width:306px;margin-right:0!important;margin-left:0!important;margin-top:0!important}.chr-docs-navigator-section-container{position:sticky;top:108px}.chr-docs-navigator-section{margin-bottom:32px;display:flex;gap:0;flex-direction:column}.chr-docs-navigator-section-header{font-weight:500;color:#b5b6c8;margin-bottom:12px!important}.chr-docs-navigator-section a{text-decoration:none!important;font-weight:700;color:#0f124d;padding:12px 16px;border-radius:8px;display:flex;gap:0;align-items:center}.chr-docs-navigator-section a.chr-active-link,.chr-docs-navigator-section a:hover{background-color:#e7e7ed}.chr-docs-navigator-section a:focus{outline:0}.chr-docs-navigator-section a span{display:inline-block;margin-left:12px}@media (max-width:921px){.chr-docs-navigator-container{display:none}}@media (max-width:768px){.chr-docs-container{flex-direction:column-reverse}} 1381</style> 1382<div class="chr-docs-navigator-container alignleft"> 1383 <div class="chr-docs-navigator-section-container"> 1384 <div class="chr-docs-navigator-section"> 1385 <p class="chr-docs-navigator-section-header">DEVELOPER GUIDE</p> 1386 <a href="/docs/install" style="margin-bottom: 8px;"> 1387 <svg width="26" height="19" viewBox="0 0 26 19" fill="none" xmlns="http://www.w3.org/2000/svg"> 1388 <g clip-path="url(#rhke6pubsa)" fill="#0F124D"> 1389 <path d="M8.659 14.573 0 10.65V8.436l8.659-4.005v2.49L2.969 9.56l5.69 2.566v2.447zM10.876 18.27c-.086.23-.156.338-.312.338a.645.645 0 0 1-.224-.053l-1.215-.481c-.121-.053-.296-.144-.296-.305a.717.717 0 0 1 .089-.301L15.162.782c.103-.277.173-.374.348-.374.093.006.185.03.27.072l1.093.429c.121.053.294.125.294.321a.484.484 0 0 1-.052.213L10.876 18.27zM17.328 14.572v-2.46l5.712-2.567-5.712-2.624v-2.46l8.675 3.98v2.214l-8.675 3.917z"/> 1390 </g> 1391 <defs> 1392 <clipPath id="rhke6pubsa"> 1393 <path fill="#fff" transform="translate(0 .4)" d="M0 0h2
13936v18.2H0z"/> 1394 </clipPath> 1395 </defs> 1396 </svg> 1397 <span>Installing Churn Solution</span> 1398 </a> 1399 <a href="/docs/subscription-walls" style="margin-bottom: 8px;"> 1400 <svg width="26" height="26" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 1401 <path d="M12 9V11" stroke="#0F124D" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 1402 <path d="M16 3V9" stroke="#0F124D" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 1403 <path d="M21 9.118V5C21 4.46957 20.7893 3.96086 20.4142 3.58579C20.0391 3.21071 19.5304 3 19 3H5C4.46957 3 3.96086 3.21071 3.58579 3.58579C3.21071 3.96086 3 4.46957 3 5V19C3 19.5304 3.21071 20.0391 3.58579 20.4142C3.96086 20.7893 4.46957 21 5 21H10.75" stroke="#0F124D" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 1404 <path d="M3 15H10" stroke="#0F124D" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 1405 <path d="M3 9H16" stroke="#0F124D" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 1406 <path d="M8 15V21" stroke="#0F124D" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 1407 <path d="M8 3V9" stroke="#0F124D" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 1408 <path d="M18 22C20.7614 22 23 19.7614 23 17C23 14.2386 20.7614 12 18 12C15.2386 12 13 14.2386 13 17C13 19.7614 15.2386 22 18 22Z" stroke="#0F124D" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 1409 <path d="M20 15H17C16.7348 15 16.4804 15.1054 16.2929 15.2929C16.1054 15.4804 16 15.7348 16 16C16 16.2652 16.1054 16.5196 16.2929 16.7071C16.4804 16.8946 16.7348 17 17 17H19C19.2652 17 19.5196 17.1054 19.7071 17.2929C19.8946 17.4804 20 17.7348 20 18C20 18.2652 19.8946 18.5196 19.7071 18.7071C19.5196 18.8946 19.2652 19 19 19H16" stroke="#0F124D" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 1410 <path d="M18 20V14" stroke="#0F124D" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 1411 </svg> 1412 <span>Subscription Walls</span> 1413 </a> 1414 <a href="/docs/mcp-server" style="margin-bottom: 8px;"> 1415 <svg width="26" height="26" xmlns="http://www.w3.org/2000/svg" fill="currentColor" fill-rule="evenodd" viewBox="0 0 24 24"> 1416 <path d="M15.688 2.343a2.588 2.588 0 00-3.61 0l-9.626 9.44a.863.863 0 01-1.203 0 .823.823 0 010-1.18l9.626-9.44a4.313 4.313 0 016.016 0 4.116 4.116 0 011.204 3.54 4.3 4.3 0 013.609 1.18l.05.05a4.115 4.115 0 010 5.9l-8.706 8.537a.274.274 0 000 .393l1.788 1.754a.823.823 0 010 1.18.863.863 0 01-1.203 0l-1.788-1.753a1.92 1.92 0 010-2.754l8.706-8.538a2.47 2.47 0 000-3.54l-.05-.049a2.588 2.588 0 00-3.607-.003l-7.172 7.034-.002.002-.098.097a.863.863 0 01-1.204 0 .823.823 0 010-1.18l7.273-7.133a2.47 2.47 0 00-.003-3.537z"/> 1417 <path d="M14.485 4.703a.823.823 0 000-1.18.863.863 0 00-1.204 0l-7.119 6.982a4.115 4.115 0 000 5.9 4.314 4.314 0 006.016 0l7.12-6.982a.823.823 0 000-1.18.863.863 0 00-1.204 0l-7.119 6.982a2.588 2.588 0 01-3.61 0 2.47 2.47 0 010-3.54l7.12-6.982z"/> 1418 </svg> 1419 <span>MCP Server</span> 1420 </a> 1421 <a href="/docs/webhooks" style="margin-bottom: 8px;"> 1422 <svg width="26" height="26" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 1423 <path fill-rule="evenodd" clip-rule="evenodd" d="M12.52 3.046a3 3 0 0 0-2.13 5.486 1 1 0 0 1 .306 1.38l-3.922 6.163a2 2 0 1 1-1.688-1.073l3.44-5.405a5 5 0 1 1 8.398-2.728 1 1 0 1 1-1.97-.348 3 3 0 0 0-2.433-3.475zM10 6a2 2 0 1 1 3.774.925l3.44 5.405a5 5 0 1 1-1.427 8.5 1 1 0 0 1 1.285-1.532 3 3 0 1 0 .317-4.83 1 1 0 0 1-1.38-.307l-3.923-6.163A2 2 0 0 1 10 6zm-5.428 6.9a1 1 0 0 1-.598 1.281A3 3 0 1 0 8.001 17a1 1 0 0 1 1-1h8.266a2 2 0 1 1 0 2H9.9a5 5 0 1 1-6.61-5.698 1 1 0 0 1 1.282.597Z" fill="currentColor"></path> 1424 </svg>
1425 <span>Webhooks</span> 1426 </a> 1427 <!-- <a href="/docs/payment-recovery" style="margin-bottom: 8px;"> 1428 <svg 1429 width="24" 1430 height="24" 1431 viewBox="0 0 48 48" 1432 xmlns="http://www.w3.org/2000/svg" 1433 fill="#0F124D" 1434 > 1435 <path 1436 d="M 28.5 20.25 C 28.5 18.179 26.4854 16.5 24 16.5 C 21.5146 16.5 19.5 18.179 19.5 20.25 C 19.5 22.321 21.5146 24 24 24 C 26.4854 24 28.5 25.679 28.5 27.75 C 28.5 29.821 26.4854 31.5 24 31.5 C 21.5146 31.5 19.5 29.821 19.5 27.75 M 24 31.5 V 32.25 V 33 M 24 15 V 15.75 V 16.5 M 28.5 20.25 C 28.5 18.179 26.4854 16.5 24 16.5 C 21.5146 16.5 19.5 18.179 19.5 20.25 C 19.5 22.321 21.5146 24 24 24 C 26.4854 24 28.5 25.679 28.5 27.75 C 28.5 29.821 26.4854 31.5 24 31.5 C 21.5146 31.5 19.5 29.821 19.5 27.75 M 24 31.5 V 32.25 V 33 M 24 15 V 15.75 V 16.5" 1437 fill="none" 1438 stroke="#0F124D" 1439 stroke-width="3.5" 1440 stroke-linecap="round" 1441 ></path> 1442 <path 1443 d="M24,2A21.8,21.8,0,0,0,8,8.9V5A2,2,0,0,0,5.7,3,2.1,2.1,0,0,0,4,5.1V14a2,2,0,0,0,2,2h9a2,2,0,0,0,2-2.3A2.1,2.1,0,0,0,14.9,12H10.6A18,18,0,0,1,41.9,22.2a2,2,0,0,0,2,1.8h0a2,2,0,0,0,2-2.2A22,22,0,0,0,24,2Z" 1444 ></path> 1445 <path 1446 d="M42,32H33a2,2,0,0,0-2,2.3A2.1,2.1,0,0,0,33.1,36h4.3A18,18,0,0,1,6.1,25.8a2,2,0,0,0-2-1.8h0a2,2,0,0,0-2,2.2A22,22,0,0,0,40,39.1V43a2,2,0,0,0,2.3,2A2.1,2.1,0,0,0,44,42.9V34A2,2,0,0,0,42,32Z" 1447 ></path> 1448 </svg> 1449 <span>Failed Payment Recovery</span> 1450 </a> --> 1451 <a href="/docs/faqs"> 1452 <svg width="26" height="21" viewBox="0 0 26 21" fill="none" xmlns="http://www.w3.org/2000/svg"> 1453 <g clip-path="url(#9njoh7gfza)" fill="#0F124D"> 1454 <path d="M25.415 9.037a7.343 7.343 0 0 0-1.657-2.394 7.462 7.462 0 0 0-2.466-1.575 7.544 7.544 0 0 0-5.762.118.73.73 0 0 0-.37.404.717.717 0 0 0 .02.545c.077.172.22.307.397.378.177.07.375.07.552-.002a6.052 6.052 0 0 1 4.24-.223 5.959 5.959 0 0 1 3.319 2.609 5.82 5.82 0 0 1 .723 4.124 5.88 5.88 0 0 1-2.238 3.557.727.727 0 0 0-.282.667l.115.911-.796-.596a.742.742 0 0 0-.687-.107 6.054 6.054 0 0 1-4.082-.053 5.95 5.95 0 0 1-3.095-2.627.745.745 0 0 0-.987-.251.717.717 0 0 0-.296.961 7.41 7.41 0 0 0 3.67 3.204c1.554.629 3.278.72 4.892.26l1.886 1.411a.743.743 0 0 0 .808.05.717.717 0 0 0 .362-.719l-.281-2.226a7.466 7.466 0 0 0 1.8-2.252 7.259 7.259 0 0 0 .214-6.165v-.009z"/> 1455 <path d="M14.3 10.695a7.245 7.245 0 0 0-.726-7.013 7.412 7.412 0 0 0-2.78-2.392 7.53 7.53 0 0 0-7.145.24 7.391 7.391 0 0 0-2.61 2.572 7.253 7.253 0 0 0-.242 7.045 7.42 7.42 0 0 0 1.802 2.26l-.285 2.222a.717.717 0 0 0 .362.719.743.743 0 0 0 .812-.05l1.885-1.41a7.548 7.548 0 0 0 5.27-.427 7.394 7.394 0 0 0 3.657-3.766zM3.825 12.523a5.878 5.878 0 0 1-2.264-3.667 5.822 5.822 0 0 1 .861-4.208 5.97 5.97 0 0 1 3.53-2.514 6.05 6.05 0 0 1 4.322.515 5.914 5.914 0 0 1 2.82 3.272 5.814 5.814 0 0 1-.182 4.289 5.933 5.933 0 0 1-3.086 3.028 6.053 6.053 0 0 1-4.351.16.745.745 0 0 0-.687.107l-.796.596.116-.912a.716.716 0 0 0-.283-.666z"/> 1456 <path d="M7.128 10.693c.675 0 1.331-.217 1.871-.617l.626.657a.338.338 0 0 0 .236.106.342.342 0 0 0 .243-.09.334.334 0 0 0 .016-.475l-.622-.653a3.063 3.063 0 0 0 .132-3.878 3.14 3.14 0 0 0-1.737-1.14 3.177 3.177 0 0 0-2.077.187c-.651.295-1.18.8-1.5 1.431a3.053 3.053 0 0 0-.256 2.042c.153.69.541 1.306 1.1 1.748a3.165 3.165 0 0 0 1.968.682zm0-5.37a2.32 2.32 0 0 1 1.23.348c.369.229.664.556.85.944a2.236 2.236 0 0 1-.297 2.406l-.478-.502a.33.33 0 0 0-.568.211c-.003.086.03.17.089.232l.474.5a2.317 2.317 0 0 1-2.06.284 2.303 2.303 0 0 1-.902-.565 2.235 2.235 0 0 1-.198-2.928 2.29 2.29 0 0 1 .819-.677c.323-.16.68-.242 1.041-.24v-.013zM16.58 14.62a.56.56 0 0 0 .43.012.549.549 0 0 0 .31-.289l.66-1.443h1.888l.659 1.443a.558.558 0 0 0 .511.326.556.556 0 0 0 .522-.356.546.546 0 0 0-.012-.422l-2.109-4.63a.553.553 0 0 0-.51-.325.564.564 0 0 0-.509.324l-2.108 4.631a.545.545 0 0 0-.014.423.56.56 0 0 0 .283.306zm1.758-2.52.58-1.268.58 1.268h-1.16z"/> 1457 </g> 1458 <defs> 1459 <clipPath id="9njoh7gfza"> 1460 <path fill="#fff" transform="translate(0 .5)" d="M0 0h2
14606v20H0z"/> 1461 </clipPath> 1462 </defs> 1463 </svg> 1464 <span>FAQs</span> 1465 </a> 1466 </div> 1467 <div class="chr-docs-navigator-section"> 1468 <p class="chr-docs-navigator-section-header">INTEGRATION</p> 1469 <a href="/docs/integrations/stripe/"> 1470 <svg width="26" height="26" viewBox="0 0 26 26" fill="none" xmlns="http://www.w3.org/2000/svg"> 1471 <g clip-path="url(#0hn7r8q5ua)"> 1472 <path d="M13 26c7.18 0 13-5.82 13-13S20.18 0 13 0 0 5.82 0 13s5.82 13 13 13z" fill="#635BFF"/> 1473 <path d="M22.685 13.134c0-1.377-.667-2.464-1.942-2.464s-2.056 1.087-2.056 2.454c0 1.62.915 2.437 2.227 2.437.64 0 1.125-.143 1.49-.35v-1.077a2.86 2.86 0 0 1-1.317.296c-.52 0-.985-.183-1.044-.818h2.633c-.002-.069.009-.348.009-.478zm-2.658-.51c0-.609.372-.862.71-.862.329 0 .679.25.679.862h-1.389zM16.61 10.67c-.392-.001-.77.15-1.054.42l-.07-.332H14.3v6.272l1.345-.285.005-1.523c.195.14.479.339.953.339.963 0 1.84-.774 1.84-2.48-.004-1.56-.892-2.411-1.833-2.411zm-.323 3.707c-.317 0-.506-.113-.635-.251l-.005-1.996c.14-.156.333-.264.64-.264.49 0 .829.549.829 1.254 0 .72-.334 1.257-.829 1.257zm-3.835-4.024 1.35-.29V8.97l-1.35.285v1.098zm0 .409h1.35v4.708h-1.351l.001-4.708zm-1.447.398-.087-.398H9.755v4.708H11.1v-3.191c.318-.415.856-.34 1.022-.28v-1.237c-.171-.065-.801-.183-1.118.398zm-2.69-1.566-1.312.281-.005 4.31c0 .796.597 1.383 1.393 1.383.441 0 .764-.08.943-.178v-1.093c-.172.07-1.023.317-1.023-.479v-1.91h1.023v-1.146H8.31l.004-1.168zM4.676 12.13c0-.21.172-.29.457-.29.465.01.922.127 1.333.343v-1.265a3.544 3.544 0 0 0-1.332-.247c-1.092 0-1.82.57-1.82 1.523 0 1.485 2.045 1.248 2.045 1.888 0 .248-.216.329-.517.329-.446 0-1.017-.183-1.469-.431v1.28c.464.201.963.306 1.468.309 1.12 0 1.889-.553 1.889-1.518-.006-1.603-2.056-1.318-2.056-1.92h.002z" 1474 fill="#fff"/> 1475 </g> 1476 <defs> 1477 <clipPath id="0hn7r8q5ua"> 1478 <path fill="#fff" d="M0 0h26v26H0z"/> 1479 </clipPath> 1480 </defs> 1481 </svg> 1482 <span>Stripe</span> 1483 </a> 1484 <a href="/docs/integrations/braintree/" style="margin-top: 8px"> 1485 <svg xmlns="http://www.w3.org/2000/svg" 1486 width="26" height="26" viewBox="0 0 129.000000 129.000000" preserveAspectRatio="xMidYMid meet"> 1487 <g transform="translate(0.000000,129.000000) scale(0.100000,-0.100000)" 1488 fill="#000000" stroke="none"> 1489 <path d="M510 1254 c-111 -23 -224 -86 -311 -173 -335 -336 -203 -897 248 1490-1056 59 -21 86 -25 201 -25 108 0 144 4 195 21 197 65 358 227 418 419 11 36 149123 106 26 155 24 421 -362 749 -777 659z m270 -294 c90 -33 139 -108 126 -192 1492-8 -48 -45 -103 -77 -113 -19 -6 -15 -10 27 -35 63 -36 88 -79 87 -147 0 -66 1493-30 -114 -91 -151 -47 -27 -47 -27 -274 -30 l-228 -3 0 50 0 51 40 0 40 0 0 1494239 0 240 -37 3 c-36 3 -38 5 -41 42 -6 71 -14 69 201 64 118 -3 205 -10 227 1495-18z"/> 1496 <path d="M540 780 l0 -90 90 0 c132 0 182 34 164 112 -10 50 -54 68 -161 68 1497l-93 0 0 -90z"/> 1498 <path d="M547 583 c-4 -3 -7 -48 -7 -100 l0 -93 100 0 c147 0 190 23 190 103 14990 40 -30 73 -81 87 -38 11 -192 14 -202 3z"/> 1500 </g> 1501 </svg> 1502 <span>BrainTree</span> 1503 </a> 1504 <a href="/docs/integrations/recurpay" style="margin-top: 8px"> 1505 <img decoding="async" src="https://churnsolution.com/wp-content/uploads/2025/04/recurpay-logo.png" alt="recurpay" width="26" 1506 height="26" style="margin: 0; border-radius: 100%;"> 1507 <span>Recurpay</span> 1508 </a> 1509 <a href="/docs/integrations/slack" style="margin-top: 8px"> 1510 <img decoding="async" src="https://churnsolution.com/wp-content/uploads/2024/04/slack-logo.png" alt="slack" width="26" 1511 height="26" style="margin: 0;">
1512 <span>Slack</span> 1513 </a> 1514 <a href="/docs/integrations/wordpress/" style="margin-top: 8px"> 1515 <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" width="26" height="26" 1516 xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 122.88 122.88" 1517 style="enable-background:new 0 0 122.88 122.88" xml:space="preserve"><style type="text/css">.st0 { 1518 fill: #32373C; 1519 }</style> 1520 <g><path class="st0" d="M61.44,0C27.51,0,0,27.51,0,61.44c0,33.93,27.51,61.44,61.44,61.44c33.93,0,61.44-27.51,61.44-61.44 C122.88,27.51,95.37,0,61.44,0L61.44,0z M106.37,36.88c0.22,1.63,0.34,3.38,0.34,5.26c0,5.19-0.97,11.03-3.89,18.34l-15.64,45.21 c15.22-8.87,25.46-25.37,25.46-44.25C112.64,52.54,110.37,44.17,106.37,36.88L106.37,36.88z M62.34,65.92l-15.36,44.64 c4.59,1.35,9.44,2.09,14.46,2.09c5.96,0,11.68-1.03,17-2.9c-0.14-0.22-0.26-0.45-0.37-0.71L62.34,65.92L62.34,65.92z M96,58.86 c0-6.33-2.27-10.71-4.22-14.12c-2.6-4.22-5.03-7.79-5.03-12.01c0-4.71,3.57-9.09,8.6-9.09c0.23,0,0.44,0.03,0.66,0.04 c-9.11-8.35-21.25-13.44-34.57-13.44c-17.89,0-33.62,9.18-42.78,23.08c1.2,0.04,2.33,0.06,3.3,0.06c5.35,0,13.65-0.65,13.65-0.65 c2.76-0.16,3.08,3.89,0.33,4.22c0,0-2.77,0.32-5.86,0.49l18.64,55.46l11.21-33.6l-7.98-21.86c-2.76-0.16-5.37-0.49-5.37-0.49 c-2.76-0.16-2.44-4.38,0.32-4.22c0,0,8.45,0.65,13.48,0.65c5.35,0,13.65-0.65,13.65-0.65c2.76-0.16,3.08,3.89,0.33,4.22 c0,0-2.78,0.32-5.86,0.49L87,92.47l5.28-16.74C94.63,68.42,96,63.24,96,58.86L96,58.86z M10.24,61.44 c0,20.27,11.78,37.78,28.86,46.08L14.67,40.6C11.83,46.97,10.24,54.01,10.24,61.44L10.24,61.44z M61.44,3.69 c7.8,0,15.36,1.53,22.48,4.54c3.42,1.45,6.72,3.24,9.81,5.32c3.06,2.07,5.94,4.44,8.55,7.05c2.61,2.61,4.99,5.49,7.05,8.55 c2.09,3.09,3.88,6.39,5.32,9.81c3.01,7.12,4.54,14.68,4.54,22.48c0,7.8-1.53,15.36-4.54,22.48c-1.45,3.42-3.24,6.72-5.32,9.81 c-2.07,3.06-4.44,5.94-7.05,8.55c-2.61,2.61-5.49,4.99-8.55,7.05c-3.09,2.09-6.39,3.88-9.81,5.32c-7.12,3.01-14.68,4.54-22.48,4.54 c-7.8,0-15.36-1.53-22.48-4.54c-3.42-1.45-6.72-3.24-9.81-5.32c-3.06-2.07-5.94-4.44-8.55-7.05c-2.61-2.61-4.99-5.49-7.05-8.55 c-2.09-3.09-3.88-6.39-5.32-9.81C5.21,76.8,3.69,69.24,3.69,61.44c0-7.8,1.53-15.36,4.54-22.48c1.45-3.42,3.24-6.72,5.32-9.81 c2.07-3.06,4.44-5.94,7.05-8.55c2.61-2.61,5.49-4.99,8.55-7.05c3.09-2.09,6.39-3.88,9.81-5.32C46.08,5.21,53.64,3.69,61.44,3.69 L61.44,3.69z"/></g> 1521 </svg> 1522 <span>WordPress</span> 1523 </a> 1524 <a href="/docs/integrations/wordpress/paid-memberships-pro/" style="margin-top: 8px"> 1525 <img decoding="async" height="26" width="26" style="margin: 0" 1526 src="https://churnsolution.com/wp-content/uploads/2024/06/pmpro.png" 1527 alt="PMPRO"> 1528 <span>Paid Memberships Pro</span> 1529 </a> 1530 <a href="/docs/integrations/wordpress/woocommerce/" style="margin-top: 8px"> 1531 <img loading="lazy" decoding="async" height="26" width="26" style="margin: 0; border-radius: 100%;" 1532 src="https://churnsolution.com/wp-content/uploads/2025/06/woocommerce-logo.png" 1533 alt="WooCommerce"> 1534 <span>WooCommerce</span> 1535 </a> 1536 <a href="/docs/integrations/paddle/" style="margin-top: 8px"> 1537 <img loading="lazy" decoding="async" height="26" width="26" style="margin: 0; border-radius: 100%;" 1538 src="https://churnsolution.com/wp-content/uploads/2026/09/paddle-logo.jpeg" 1539 alt="Paddle"> 1540 <span>Paddle</span> 1541 </a> 1542 <a href="/docs/integrations/hubspot/" style="margin-top: 8px"> 1543 <img loading="lazy" decoding="async" height="26" width="26" style="margin: 0; object-fit: contain;" 1544 src="https://churnsolution.com/wp-content/uploads/2026/09/hubspot-logo.png" 1545 alt="HubSpot"> 1546 <span>HubSpot</span> 1547 </a> 1548 <a href="/docs/integrations/omnisend/" style="margin-top: 8px"> 1549 <img loading="lazy" decoding="async" height="26" width="26" style="margin: 0; border-radius: 100%;"
1550 src="https://churnsolution.com/wp-content/uploads/2026/09/omnisend-logo.png" 1551 alt="Omnisend"> 1552 <span>Omnisend</span> 1553 </a> 1554 <a href="/docs/integrations/zapier/" style="margin-top: 8px"> 1555 <img loading="lazy" decoding="async" height="26" width="26" style="margin: 0; object-fit: contain;" 1556 src="https://churnsolution.com/wp-content/uploads/2026/09/zapier-logo.png" 1557 alt="Zapier"> 1558 <span>Zapier</span> 1559 </a> 1560 </div> 1561 </div> 1562</div>
1563<script> 1564$(function(){$(".chr-docs-navigator-section-container a").each(function(a,c){location.pathname.replace(/\/$/g,"")===$(c).attr("href")&&$(c).addClass("chr-active-link")})}); 1565</script>
1565 1566 1567 1568<style> 1569.chr-docs-content h1,.chr-docs-content h2,.chr-docs-content h6{font-stretch:normal!important;font-style:normal!important;line-height:normal!important;letter-spacing:normal!important;text-align:left!important}.alert{padding:0;background-color:#f44336;color:#fff;opacity:0;transition:opacity .6s;margin-bottom:15px;right:16px;top:124px;position:fixed;overflow:hidden;height:0;border-radius:12px;z-index:2}.alert.show{height:auto;opacity:1;padding:12px 16px}.alert.success{background-color:#04aa6d}.chr-docs-content-container{display:flex;color:#0f124d!important;width:100%;overflow:auto}.chr-docs-content{padding:29px 32px;overflow:auto}.chr-docs-content a:focus,.chr-docs-table-of-contents .chr-docs-table-content a:focus{border:none!important;outline:0!important}.chr-docs-content h1::before,.chr-docs-content h2::before,.chr-docs-content h3::before{content:"";display:block;height:132px;margin:-132px 0 0}.chr-docs-content h1{font-size:24px!important;font-weight:600!important;color:#0f124d!important;margin-bottom:16px!important}.chr-docs-content h6{font-size:16px!important;font-weight:400!important;color:#0f124d!important;margin-bottom:24px}.chr-docs-content h2{font-size:20px!important;font-weight:700!important;color:#0f124d!important;margin-bottom:16px}.chr-docs-content .chr-info,.chr-docs-content h3{font-stretch:normal;font-style:normal;color:#0f124d}.chr-docs-content h3{font-size:16px;font-weight:700;line-height:normal;letter-spacing:normal;text-align:left}.chr-docs-content li,.chr-docs-content p{font-size:14px!important;font-weight:400!important;font-stretch:normal!important;font-style:normal!important;line-height:1.5!important;letter-spacing:normal!important;text-align:left!important;color:#0f124d!important;margin:16px auto}.chr-docs-content img{margin:0 auto 39px;display:block}.chr-docs-content .chr-info{display:flex;flex-direction:row;justify-content:flex-start;align-items:start;gap:0;padding:12px 16px;border-radius:8px;border:1px solid #e6f0f3;background-color:#f7fafb;font-size:14px;font-weight:400;line-height:1.5;letter-spacing:normal;text-align:left}.chr-docs-content .chr-code,.chr-docs-table-of-contents .chr-table-header{font-size:16px;font-weight:500;font-stretch:normal;font-style:normal;line-height:normal;letter-spacing:normal;text-align:left}.chr-docs-content .chr-info svg{margin-right:8px;min-width:20px}.chr-docs-content .chr-info div{margin:auto 0}.chr-docs-content a{color:#d6aa20;text-decoration:none!important}.chr-docs-content a:hover{text-decoration:underline!important}.chr-docs-content .chr-code{flex-direction:column;justify-content:center;align-items:flex-end;padding:8px 8px 8px 32px;border-radius:12px;border:1px solid #e6f0f3;background-color:#f7fafb;color:#484848;position:relative}.chr-docs-content .chr-code pre{background-color:transparent!important;padding:0!important;margin:0!important}.chr-docs-content .chr-code .chr-copy-code{position:absolute;top:8px;right:20px;cursor:pointer}.chr-docs-content .chr-docs-sub-section{margin-bottom:24px}code.highlighted{background:#f7fafb;padding:1px 4px;border-radius:4px;border:1px solid #e6f0f3;color:#905}.chr-docs-content .chr-docs-table-wrapper{overflow-x:auto;margin:16px 0;border-radius:12px;border:1px solid #e6f0f3}.chr-docs-content table.chr-docs-table{width:100%;border-collapse:collapse;font-size:14px;text-align:left;color:#0f124d;margin:0}.chr-docs-content table.chr-docs-table td,.chr-docs-content table.chr-docs-table th{padding:12px 16px;border-bottom:1px solid #e6f0f3;vertical-align:top;text-align:left}.chr-docs-content table.chr-docs-table thead th{background-color:#f7fafb;font-weight:600;white-space:nowrap}.chr-docs-content table.chr-docs-table tbody tr:last-child td{border-bottom:none}.chr-docs-content table.chr-docs-table td code{font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;white-space:nowrap}.chr-docs-content table.chr-docs-table.chr-docs-table-wrap td code{white-space:normal}.chr-docs-content .chr-video-embed-wrapper{display:flex;align-items:center;justify-content:center;margin-top:16px}.chr-docs-content .chr-video-embed{width:100%;max-width:876px;aspect-ratio:16/9;border-radius:12px}.chr-docs-table-of-contents{padding-top:32px;min-width:235px;width:235px;position:relative;margin-top:0!important;margin-right:32px!important;margin-left:0!important}.chr-table-contents-container{position:sticky;top:108px;margin-bottom:64px}.chr-docs-table-of-contents .chr-table-header{color:#0f124d;margin-bottom:16px}.chr-docs-table-of-contents .chr-docs-table-content{display:flex;flex-direction:column;justify-content:start;align-items:start;padding:0 8px;border-radius:8px;border:1px solid #9d9d9d;background-color:#fff;color:#0f124d;margin-bottom:64px}.chr-docs-table-of-contents .chr-docs-table-content div{display:flex;flex-direction:column;justify-content:start;align-items:start}.chr-docs-table-of-contents .chr-docs-table-content a{color:#0f124d;margin:8px 0;font-weight:400!important;transition:none;text-decoration:none!important}.chr-docs-table-of-contents .chr-docs-table-content a:hover{font-weight:500!important}.chr-docs-table-of-contents .chr-docs-table-content a.active{font-weight:700!important;outline:0!important}.chr-docs-table-of-contents .chr-docs-table-content .chr-main-section.active{position:relative;
1569left:-8px;padding-left:8px;border-left:1px solid #0f124d!important}.chr-docs-table-of-contents .chr-docs-table-content hr{border-color:#9d9d9d;width:100%;margin:8px 0}.chr-docs-table-of-contents .chr-docs-table-content .chr-main-section{font-size:14px}.chr-docs-table-of-contents .chr-docs-table-content .chr-sub-section{font-size:12px;padding-left:8px}.chr-docs-table-of-contents .chr-docs-table-content .chr-sub-sub-section{font-size:12px;padding-left:16px}.chr-docs-back{color:#0f124d!important;display:none;margin-bottom:8px;font-size:12px}a.chr-docs-back:hover{text-decoration:none!important}@media (max-width:921px){.chr-docs-back{display:inline-block}}@media (max-width:768px){.chr-docs-content{padding:16px 32px}.chr-docs-table-of-contents{display:none;margin-right:32px!important;margin-left:32px!important}.chr-docs-table-content{margin-bottom:0!important}.chr-docs-content .chr-code{font-size:12px;padding:16px 8px 8px}.chr-docs-content .chr-info,.chr-docs-content h4,.chr-docs-content li,.chr-docs-content p,.chr-docs-content table.chr-docs-table{font-size:12px!important}.chr-docs-content table.chr-docs-table td,.chr-docs-content table.chr-docs-table th{padding:8px 12px}.chr-docs-content h1,.chr-docs-content h2{font-size:16px!important}.chr-docs-content h3{font-size:14px!important}}@media (max-width:480px){button{width:100%}} 1570</style> 1571<div id="chr_alert" class="alert success"> 1572 <strong>Success!</strong> Link copied successfully 1573</div> 1574<div class="chr-docs-content-container"> 1575 <div class="chr-docs-content"> 1576 <a href="/docs" class="chr-docs-back"> 1577 <svg 1578 style="rotate: 180deg" 1579 width="12" 1580 height="10.5"
1581 viewBox="0 0 17 15" 1582 fill="none" 1583 xmlns="http://www.w3.org/2000/svg" 1584 > 1585 <path 1586 fill-rule="evenodd" 1587 clip-rule="evenodd" 1588 d="M1.717 6.629a1 1 0 1 0 0 2h11.586L9.009 12.92a1.001 1.001 0 0 0 1.416 1.416l6-6a1 1 0 0 0 0-1.416l-6-6a1.001 1.001 0 0 0-1.416 1.416l4.294 4.292H1.717z" 1589 fill="#0f124d" 1590 /> 1591 </svg> 1592 Back 1593 </a> 1594 <h1 id="chr-3-steps">2 Simple Steps to Get Started</h1> 1595 <div class="chr-info" style="margin-bottom: 24px"> 1596 <svg 1597 width="21" 1598 height="23" 1599 viewBox="0 0 21 23" 1600 fill="none" 1601 xmlns="http://www.w3.org/2000/svg" 1602 > 1603 <g clip-path="url(#ujqm33ofja)" fill="#0F124D"> 1604 <path 1605 d="M12.376 19.567h-3.72a.548.548 0 0 1-.409-.164.583.583 0 0 1-.17-.418.6.6 0 0 1 .17-.418.561.561 0 0 1 .41-.165h3.719a.557.557 0 0 1 .389.176.593.593 0 0 1 0 .813.557.557 0 0 1-.39.177h.001zM12.376 21.32h-3.72a.548.548 0 0 1-.409-.166.585.585 0 0 1-.17-.417.6.6 0 0 1 .17-.418.563.563 0 0 1 .41-.165h3.719a.557.557 0 0 1 .389.176.593.593 0 0 1 0 .813.556.556 0 0 1-.39.176h.001zM11.543 23H9.49a.556.556 0 0 1-.39-.176.593.593 0 0 1 0-.813.556.556 0 0 1 .39-.176h2.053a.556.556 0 0 1 .389.176.593.593 0 0 1 0 .813.556.556 0 0 1-.39.176zM13.616 11.34a.555.555 0 0 1-.4-.171.593.593 0 0 1-.165-.412 2.388 2.388 0 0 0-.437-1.388 2.265 2.265 0 0 0-1.15-.85.559.559 0 0 1-.33-.286.6.6 0 0 1 .069-.644.548.548 0 0 1 .602-.18c.69.223 1.292.669 1.719 1.27.427.603.656 1.33.654 2.078 0 .154-.059.302-.164.411a.556.556 0 0 1-.398.171z" 1606 /> 1607 <path 1608 d="M8.248 17.786a.554.554 0 0 1-.377-.15.588.588 0 0 1-.183-.371c-.05-.49-.439-.964-.931-1.564-.815-.995-1.936-2.359-1.936-4.683 0-3.242 2.554-5.88 5.693-5.88 3.14 0 5.694 2.64 5.694 5.88 0 2.324-1.12 3.688-1.936 4.683-.492.6-.881 1.074-.931 1.564a.597.597 0 0 1-.206.391.557.557 0 0 1-.414.127.55.55 0 0 1-.38-.213.59.59 0 0 1-.122-.428c.086-.847.623-1.501 1.192-2.194.782-.953 1.668-2.033 1.668-3.93 0-1.25-.48-2.45-1.337-3.333a4.493 4.493 0 0 0-3.228-1.381c-1.21 0-2.371.497-3.227 1.38a4.794 4.794 0 0 0-1.337 3.334c0 1.897.886 2.977 1.668 3.93.568.693 1.105 1.347 1.192 2.194a.6.6 0 0 1-.142.452.564.564 0 0 1-.42.192zM10.5 3.24a.555.555 0 0 1-.399-.17.592.592 0 0 1-.165-.413V.583c0-.155.06-.303.165-.412a.555.555 0 0 1 .798 0c.106.11.165.257.165.412v2.074a.6.6 0 0 1-.165.412.562.562 0 0 1-.399.17zM4.895 5.638a.549.549 0 0 1-.4-.17L3.075 4a.592.592 0 0 1 0-.824.555.555 0 0 1 .798 0l1.42 1.467a.6.6 0 0 1 .122.635.58.58 0 0 1-.207.262.552.552 0 0 1-.313.098zM17.526 18.683a.545.545 0 0 1-.399-.17l-1.42-1.467a.583.583 0 0 1-.176-.415.6.6 0 0 1 .166-.42.564.564 0 0 1 .406-.17.548.548 0 0 1 .402.18l1.42 1.468a.6.6 0 0 1 .122.635.579.579 0 0 1-.207.261.55.55 0 0 1-.314.098zM2.573 11.427H.564a.548.548 0 0 1-.409-.165.585.585 0 0 1-.17-.418.6.6 0 0 1 .17-.417.561.561 0 0 1 .41-.165h2.008a.546.546 0 0 1 .409.165.584.584 0 0 1 .17.417.6.6 0 0 1-.17.418.563.563 0 0 1-.41.165zM20.436 11.427h-2.008a.548.548 0 0 1-.41-.165.585.585 0 0 1-.17-.418.6.6 0 0 1 .17-.417.561.561 0 0 1 .41-.165h2.008a.546.546 0 0 1 .41.165.585.585 0 0 1 .17.417.6.6 0 0 1-.17.418.563.563 0 0 1-.41.165zM3.474 18.683a.552.552 0 0 1-.313-.098.579.579 0 0 1-.208-.261.6.6 0 0 1 .122-.635l1.42-1.467a.555.555 0 0 1 .788.01.593.593 0 0 1 .01.814l-1.42 1.467a.563.563 0 0 1-.399.17zM16.105 5.638a.552.552 0 0 1-.313-.098.58.58 0 0 1-.208-.262.602.602 0 0 1 .123-.635l1.42-1.466a.555.555 0 0 1 .798 0 .592.592 0 0 1 0 .823l-1.42 1.468a.564.564 0 0 1-.4.17z" 1609 /> 1610 </g> 1611 <defs> 1612 <clipPath id="ujqm33ofja"> 1613 <path fill="#fff" d="M0 0h21v23H0z" /> 1614 </clipPath> 1615 </defs> 1616 </svg> 1617 1618 <div> 1619 How to integrate the cancellation flow with your application or service: 1620 </div> 1621 </div> 1622 <div id="chr-insert-embed" class="chr-docs-sub-section"> 1623 <h2>Step 1: Place the embed code and launch snippet</h2> 1624 <p> 1625 Copy the code below. Paste it before the closing </body> tag in 1626 your app code. It loads Churn Solution, makes it available in the global 1627 JS namespace as <b>window.churnSolution</b>, and launches the 1628 cancellation flow from your cancel button. 1629 </p> 1630 <div class="chr-code"> 1631 <div 1632 class="chr-copy-code" 1633 onclick="copyLink('chr-code-insert-script-1')" 1634 > 1635 <img loading="lazy" decoding="async" 1636 id="chr-code-insert-script-1-img"
1637 src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png" 1638 width="20" 1639 height="23" 1640 alt="" 1641 /> 1642 </div> 1643 <pre><code class="language-javascript" id="chr-code-insert-script-1"> 1644<script> 1645 !function(){ 1646 if (!window.churnSolution || !window.churnSolution.ready) { 1647 window.churnSolution = { ready: true }; 1648 const s = document.createElement('script'); 1649 s.src = 'https://app.churnsolution.com/sdk/index.min.js'; 1650 s.async = true; 1651 const e = document.getElementsByTagName('script')[0]; 1652 e.parentNode.insertBefore(s, e); 1653 } 1654 }(); 1655 1656 document.addEventListener('DOMContentLoaded', () => { 1657 document.getElementById('cancel-button').addEventListener('click', function (e) { 1658 e.preventDefault(); 1659 window.churnSolution?.run({ 1660 subscriptionId, // your subscription ID from your payment provider 1661 appId: 'APP_ID', // your App ID 1662 }); 1663 }); 1664 }); 1665</script> 1666 </code></pre> 1667 </div> 1668 <p> 1669 The loader on its own can also go in the <head> section of your 1670 HTML, as long as the launch snippet still runs after your cancel button 1671 exists: 1672 </p> 1673 <div class="chr-code"> 1674 <div 1675 class="chr-copy-code" 1676 onclick="copyLink('chr-code-insert-script-2')" 1677 > 1678 <img loading="lazy" decoding="async" 1679 id="chr-code-insert-script-2-img" 1680 src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png" 1681 width="20" 1682 height="23" 1683 alt="" 1684 /> 1685 </div> 1686 <pre><code class="language-javascript" id="chr-code-insert-script-2"> 1687<script src="https://app.churnsolution.com/sdk/index.min.js"></script> 1688 </code></pre> 1689 </div> 1690 <div class="chr-info" style="margin-top: 16px"> 1691 <svg 1692 width="21" 1693 height="23"
1694 viewBox="0 0 21 23" 1695 fill="none" 1696 xmlns="http://www.w3.org/2000/svg" 1697 > 1698 <g clip-path="url(#ujqm33ofja)" fill="#0F124D"> 1699 <path 1700 d="M12.376 19.567h-3.72a.548.548 0 0 1-.409-.164.583.583 0 0 1-.17-.418.6.6 0 0 1 .17-.418.561.561 0 0 1 .41-.165h3.719a.557.557 0 0 1 .389.176.593.593 0 0 1 0 .813.557.557 0 0 1-.39.177h.001zM12.376 21.32h-3.72a.548.548 0 0 1-.409-.166.585.585 0 0 1-.17-.417.6.6 0 0 1 .17-.418.563.563 0 0 1 .41-.165h3.719a.557.557 0 0 1 .389.176.593.593 0 0 1 0 .813.556.556 0 0 1-.39.176h.001zM11.543 23H9.49a.556.556 0 0 1-.39-.176.593.593 0 0 1 0-.813.556.556 0 0 1 .39-.176h2.053a.556.556 0 0 1 .389.176.593.593 0 0 1 0 .813.556.556 0 0 1-.39.176zM13.616 11.34a.555.555 0 0 1-.4-.171.593.593 0 0 1-.165-.412 2.388 2.388 0 0 0-.437-1.388 2.265 2.265 0 0 0-1.15-.85.559.559 0 0 1-.33-.286.6.6 0 0 1 .069-.644.548.548 0 0 1 .602-.18c.69.223 1.292.669 1.719 1.27.427.603.656 1.33.654 2.078 0 .154-.059.302-.164.411a.556.556 0 0 1-.398.171z" 1701 /> 1702 <path 1703 d="M8.248 17.786a.554.554 0 0 1-.377-.15.588.588 0 0 1-.183-.371c-.05-.49-.439-.964-.931-1.564-.815-.995-1.936-2.359-1.936-4.683 0-3.242 2.554-5.88 5.693-5.88 3.14 0 5.694 2.64 5.694 5.88 0 2.324-1.12 3.688-1.936 4.683-.492.6-.881 1.074-.931 1.564a.597.597 0 0 1-.206.391.557.557 0 0 1-.414.127.55.55 0 0 1-.38-.213.59.59 0 0 1-.122-.428c.086-.847.623-1.501 1.192-2.194.782-.953 1.668-2.033 1.668-3.93 0-1.25-.48-2.45-1.337-3.333a4.493 4.493 0 0 0-3.228-1.381c-1.21 0-2.371.497-3.227 1.38a4.794 4.794 0 0 0-1.337 3.334c0 1.897.886 2.977 1.668 3.93.568.693 1.105 1.347 1.192 2.194a.6.6 0 0 1-.142.452.564.564 0 0 1-.42.192zM10.5 3.24a.555.555 0 0 1-.399-.17.592.592 0 0 1-.165-.413V.583c0-.155.06-.303.165-.412a.555.555 0 0 1 .798 0c.106.11.165.257.165.412v2.074a.6.6 0 0 1-.165.412.562.562 0 0 1-.399.17zM4.895 5.638a.549.549 0 0 1-.4-.17L3.075 4a.592.592 0 0 1 0-.824.555.555 0 0 1 .798 0l1.42 1.467a.6.6 0 0 1 .122.635.58.58 0 0 1-.207.262.552.552 0 0 1-.313.098zM17.526 18.683a.545.545 0 0 1-.399-.17l-1.42-1.467a.583.583 0 0 1-.176-.415.6.6 0 0 1 .166-.42.564.564 0 0 1 .406-.17.548.548 0 0 1 .402.18l1.42 1.468a.6.6 0 0 1 .122.635.579.579 0 0 1-.207.261.55.55 0 0 1-.314.098zM2.573 11.427H.564a.548.548 0 0 1-.409-.165.585.585 0 0 1-.17-.418.6.6 0 0 1 .17-.417.561.561 0 0 1 .41-.165h2.008a.546.546 0 0 1 .409.165.584.584 0 0 1 .17.417.6.6 0 0 1-.17.418.563.563 0 0 1-.41.165zM20.436 11.427h-2.008a.548.548 0 0 1-.41-.165.585.585 0 0 1-.17-.418.6.6 0 0 1 .17-.417.561.561 0 0 1 .41-.165h2.008a.546.546 0 0 1 .41.165.585.585 0 0 1 .17.417.6.6 0 0 1-.17.418.563.563 0 0 1-.41.165zM3.474 18.683a.552.552 0 0 1-.313-.098.579.579 0 0 1-.208-.261.6.6 0 0 1 .122-.635l1.42-1.467a.555.555 0 0 1 .788.01.593.593 0 0 1 .01.814l-1.42 1.467a.563.563 0 0 1-.399.17zM16.105 5.638a.552.552 0 0 1-.313-.098.58.58 0 0 1-.208-.262.602.602 0 0 1 .123-.635l1.42-1.466a.555.555 0 0 1 .798 0 .592.592 0 0 1 0 .823l-1.42 1.468a.564.564 0 0 1-.4.17z" 1704 /> 1705 </g> 1706 <defs> 1707 <clipPath id="ujqm33ofja"> 1708 <path fill="#fff" d="M0 0h21v23H0z" /> 1709 </clipPath> 1710 </defs> 1711 </svg> 1712 1713 <div> 1714 You can find your <b>APP_ID</b> in the 1715 <a 1716 target="_blank" 1717 href="https://app.churnsolution.com/settings/network" 1718 rel="noopener" 1719 >Integration page</a 1720 >, after connecting your payment provider. 1721 </div> 1722 </div> 1723 </div> 1724 <div id="chr-generate-hash" class="chr-docs-sub-section"> 1725 <h2> 1726 Step 2: Generate Security Token<span class="chr-step-optional" 1727 >Optional</span 1728 > 1729 </h2> 1730 <p> 1731 Use the code below to generate a hash on your server, so that every 1732 request sent to Churn Solution is secure. Send the generated hash to 1733 your front end and pass it as <b>authKey</b> in the launch call. Below 1734 are some examples of how this hash can be generated in different backend 1735 languages and frameworks. 1736 </p> 1737 <div class="chr-info"> 1738 <svg 1739 width="21" 1740 height="23"
1741 viewBox="0 0 21 23" 1742 fill="none" 1743 xmlns="http://www.w3.org/2000/svg" 1744 > 1745 <g clip-path="url(#ujqm33ofja)" fill="#0F124D"> 1746 <path 1747 d="M12.376 19.567h-3.72a.548.548 0 0 1-.409-.164.583.583 0 0 1-.17-.418.6.6 0 0 1 .17-.418.561.561 0 0 1 .41-.165h3.719a.557.557 0 0 1 .389.176.593.593 0 0 1 0 .813.557.557 0 0 1-.39.177h.001zM12.376 21.32h-3.72a.548.548 0 0 1-.409-.166.585.585 0 0 1-.17-.417.6.6 0 0 1 .17-.418.563.563 0 0 1 .41-.165h3.719a.557.557 0 0 1 .389.176.593.593 0 0 1 0 .813.556.556 0 0 1-.39.176h.001zM11.543 23H9.49a.556.556 0 0 1-.39-.176.593.593 0 0 1 0-.813.556.556 0 0 1 .39-.176h2.053a.556.556 0 0 1 .389.176.593.593 0 0 1 0 .813.556.556 0 0 1-.39.176zM13.616 11.34a.555.555 0 0 1-.4-.171.593.593 0 0 1-.165-.412 2.388 2.388 0 0 0-.437-1.388 2.265 2.265 0 0 0-1.15-.85.559.559 0 0 1-.33-.286.6.6 0 0 1 .069-.644.548.548 0 0 1 .602-.18c.69.223 1.292.669 1.719 1.27.427.603.656 1.33.654 2.078 0 .154-.059.302-.164.411a.556.556 0 0 1-.398.171z" 1748 /> 1749 <path 1750 d="M8.248 17.786a.554.554 0 0 1-.377-.15.588.588 0 0 1-.183-.371c-.05-.49-.439-.964-.931-1.564-.815-.995-1.936-2.359-1.936-4.683 0-3.242 2.554-5.88 5.693-5.88 3.14 0 5.694 2.64 5.694 5.88 0 2.324-1.12 3.688-1.936 4.683-.492.6-.881 1.074-.931 1.564a.597.597 0 0 1-.206.391.557.557 0 0 1-.414.127.55.55 0 0 1-.38-.213.59.59 0 0 1-.122-.428c.086-.847.623-1.501 1.192-2.194.782-.953 1.668-2.033 1.668-3.93 0-1.25-.48-2.45-1.337-3.333a4.493 4.493 0 0 0-3.228-1.381c-1.21 0-2.371.497-3.227 1.38a4.794 4.794 0 0 0-1.337 3.334c0 1.897.886 2.977 1.668 3.93.568.693 1.105 1.347 1.192 2.194a.6.6 0 0 1-.142.452.564.564 0 0 1-.42.192zM10.5 3.24a.555.555 0 0 1-.399-.17.592.592 0 0 1-.165-.413V.583c0-.155.06-.303.165-.412a.555.555 0 0 1 .798 0c.106.11.165.257.165.412v2.074a.6.6 0 0 1-.165.412.562.562 0 0 1-.399.17zM4.895 5.638a.549.549 0 0 1-.4-.17L3.075 4a.592.592 0 0 1 0-.824.555.555 0 0 1 .798 0l1.42 1.467a.6.6 0 0 1 .122.635.58.58 0 0 1-.207.262.552.552 0 0 1-.313.098zM17.526 18.683a.545.545 0 0 1-.399-.17l-1.42-1.467a.583.583 0 0 1-.176-.415.6.6 0 0 1 .166-.42.564.564 0 0 1 .406-.17.548.548 0 0 1 .402.18l1.42 1.468a.6.6 0 0 1 .122.635.579.579 0 0 1-.207.261.55.55 0 0 1-.314.098zM2.573 11.427H.564a.548.548 0 0 1-.409-.165.585.585 0 0 1-.17-.418.6.6 0 0 1 .17-.417.561.561 0 0 1 .41-.165h2.008a.546.546 0 0 1 .409.165.584.584 0 0 1 .17.417.6.6 0 0 1-.17.418.563.563 0 0 1-.41.165zM20.436 11.427h-2.008a.548.548 0 0 1-.41-.165.585.585 0 0 1-.17-.418.6.6 0 0 1 .17-.417.561.561 0 0 1 .41-.165h2.008a.546.546 0 0 1 .41.165.585.585 0 0 1 .17.417.6.6 0 0 1-.17.418.563.563 0 0 1-.41.165zM3.474 18.683a.552.552 0 0 1-.313-.098.579.579 0 0 1-.208-.261.6.6 0 0 1 .122-.635l1.42-1.467a.555.555 0 0 1 .788.01.593.593 0 0 1 .01.814l-1.42 1.467a.563.563 0 0 1-.399.17zM16.105 5.638a.552.552 0 0 1-.313-.098.58.58 0 0 1-.208-.262.602.602 0 0 1 .123-.635l1.42-1.466a.555.555 0 0 1 .798 0 .592.592 0 0 1 0 .823l-1.42 1.468a.564.564 0 0 1-.4.17z" 1751 /> 1752 </g> 1753 <defs> 1754 <clipPath id="ujqm33ofja"> 1755 <path fill="#fff" d="M0 0h21v23H0z" /> 1756 </clipPath> 1757 </defs> 1758 </svg> 1759 1760 <div> 1761 You can find your <b>secret key</b> 1762 <a 1763 target="_blank" 1764 href="https://app.churnsolution.com/settings" 1765 rel="noopener" 1766 >in the Account settings page</a 1767 >. Keep it on your server — never ship it to the browser. 1768 </div> 1769 </div> 1770 <div data-chr-auth-panel></div> 1771 <h3 style="margin-top: 24px">Update: Launch Churn Solution</h3> 1772 <p> 1773 Once your endpoint returns an auth key, pass it to the launch call you 1774 added in step 1: 1775 </p> 1776 <div class="chr-launch-diff"> 1777 <div class="chr-launch-diff-side"> 1778 <p class="chr-launch-diff-label">Before</p> 1779 <div class="chr-code"> 1780 <div 1781 class="chr-copy-code" 1782 onclick="copyLink('chr-generate-hash-before')" 1783 > 1784 <img loading="lazy" decoding="async" 1785 id="chr-generate-hash-before-img"
1786 src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png" 1787 width="20" 1788 height="23" 1789 alt="" 1790 /> 1791 </div> 1792 <pre><code class="language-javascript" id="chr-generate-hash-before"> 1793window.churnSolution?.run({ 1794 subscriptionId, 1795 appId: 'APP_ID', 1796}); 1797 </code></pre> 1798 </div> 1799 </div> 1800 <div class="chr-launch-diff-arrow">→</div> 1801 <div class="chr-launch-diff-side"> 1802 <p class="chr-launch-diff-label">After</p> 1803 <div class="chr-code"> 1804 <div 1805 class="chr-copy-code" 1806 onclick="copyLink('chr-generate-hash-after')" 1807 > 1808 <img loading="lazy" decoding="async" 1809 id="chr-generate-hash-after-img" 1810 src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png" 1811 width="20" 1812 height="23" 1813 alt="" 1814 /> 1815 </div> 1816 <pre><code class="language-javascript" id="chr-generate-hash-after"> 1817window.churnSolution?.run({ 1818 authKey, // hash generated by your server 1819 subscriptionId, 1820 appId: 'APP_ID', 1821}); 1822 </code></pre> 1823 </div> 1824 </div> 1825 </div> 1826 </div> 1827 <h1 1828 id="chr-config-options" 1829 style="margin-top: 32px; margin-bottom: 24px !important" 1830 > 1831 Configuration Options 1832 </h1> 1833 <div id="chr-sdk-options" class="chr-docs-sub-section"> 1834 <h2>SDK Options</h2> 1835 <p> 1836 Everything below goes in the <code class="highlighted">options</code> 1837 object of the launch call. 1838 </p> 1839 <div class="chr-docs-table-wrapper"> 1840 <table class="chr-docs-table chr-docs-table-wrap"> 1841 <thead> 1842 <tr> 1843 <th>Option</th> 1844 <th>Description</th> 1845 <th>Example</th> 1846 </tr> 1847 </thead> 1848 <tbody> 1849 <tr> 1850 <td><code class="highlighted">options.record</code></td> 1851 <td> 1852 Records the session. On by default. See 1853 <a href="#chr-session-recording">Session Recording</a> 1854 </td> 1855 <td><code class="highlighted">record: false</code></td> 1856 </tr> 1857 <tr> 1858 <td><code class="highlighted">options.email</code></td> 1859 <td>Email of the customer who started the flow</td> 1860 <td><code class="highlighted">email: '<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c7ada6a9a287a2bfa6aab7aba2e9a4a8aa">[email protected]</a>'</code></td> 1861 </tr> 1862 <tr> 1863 <td><code class="highlighted">options.font</code></td> 1864 <td> 1865 Font for the flow, overriding the design page. See 1866 <a href="#chr-session-font">Add Custom Fonts</a> 1867 </td> 1868 <td><code class="highlighted">font: 'Roboto'</code></td> 1869 </tr> 1870 <tr> 1871 <td><code class="highlighted">options.fontUrl</code></td> 1872 <td>Stylesheet URL that loads <code>font</code></td> 1873 <td> 1874 <code class="highlighted" 1875 >fontUrl: 'https://fonts.googleapis.com/css2?family=Roboto'</code 1876 > 1877 </td> 1878 </tr> 1879 <tr> 1880 <td><code class="highlighted">options.customerAttributes</code></td> 1881 <td> 1882 Values for the custom attributes your audiences segment on. See 1883 <a href="#chr-customer-attributes">Custom Attributes</a> 1884 </td> 1885 <td> 1886 <code class="highlighted" 1887 >customerAttributes: { Has_Extended_Free_Trial: true }</code 1888 > 1889 </td> 1890 </tr> 1891 <tr> 1892 <td><code class="highlighted">options.customTexts</code></td> 1893 <td> 1894 Replaces default texts in the flow. See 1895 <a href="#chr-custom-texts">Custom Texts</a> 1896 </td> 1897 <td> 1898 <code class="highlighted">customTexts: { 'Back': 'Retour' }</code> 1899 </td> 1900 </tr> 1901 <tr> 1902 <td><code class="highlighted">options.language</code></td> 1903 <td> 1904 Forces the flow language, taking priority over every other 1905 language source 1906 </td> 1907 <td><code class="highlighted">language: 'de'</code></td> 1908 </tr> 1909 <tr> 1910 <td><code class="highlighted">options.cancellationSettings</code></td> 1911 <td> 1912 Overrides the saved cancellation term for this session only. See 1913 <a href="#chr-cancellation-settings">Set Cancellation Term</a> 1914 </td> 1915 <td> 1916 <code class="highlighted" 1917 >cancellationSettings: { settings: { CANCEL_TIME: { 1918 cancellation_time_type: 'IMMEDIATE' } } }</code 1919 > 1920 </td> 1921 </tr> 1922 <tr> 1923 <td><code class="highlighted">options.pauseSettings</code></td> 1924 <td> 1925 Sets the earliest date a customer can pick to resume a pause: 1926 the day after <code>nextPaymentDate</code> 1927 </td> 1928 <td> 1929 <code class="highlighted" 1930 >pauseSettings: { nextPaymentDate: '2026-10-15' }</code 1931 > 1932 </td> 1933 </tr> 1934 <tr> 1935 <td><code class="highlighted">options.handleCancel</code></td> 1936 <td>Called when the customer cancels</td> 1937 <td>Takes <code>(customer, cancelFlowInfo)</code></td> 1938 </tr> 1939 <tr> 1940 <td><code class="highlighted">options.handleAbandon</code></td> 1941 <td>Called when the customer leaves the flow before finishing it</td> 1942 <td>Takes <code>(customer, cancelFlowInfo)</code></td> 1943 </tr> 1944 <tr> 1945 <td><code class="highlighted">options.handleDone</code></td> 1946 <td>Called when the customer closes the success screen</td> 1947 <td>Takes <code>(customer, cancelFlowInfo)</code></td> 1948 </tr> 1949 <tr> 1950 <td><code class="highlighted">options.handleClose</code></td> 1951 <td>Called whenever the modal closes, for any reason</td> 1952 <td>Takes <code>(customer, cancelFlowInfo)</code></td> 1953 </tr> 1954 <tr> 1955 <td><code class="highlighted">options.handlePause</code></td> 1956 <td>Custom pause logic callback</td> 1957 <td>Takes <code>
1957({ pausePeriod }, customer, cancelFlowInfo)</code></td> 1958 </tr> 1959 <tr> 1960 <td><code class="highlighted">options.handleCoupon</code></td> 1961 <td>Custom coupon logic callback</td> 1962 <td>Takes <code>({ code }, customer, cancelFlowInfo)</code></td> 1963 </tr> 1964 <tr> 1965 <td><code class="highlighted">options.handleTrialExtension</code></td> 1966 <td>Custom trial extension logic callback</td> 1967 <td> 1968 Takes <code>({ trialExtensionDays }, customer, cancelFlowInfo)</code> 1969 </td> 1970 </tr> 1971 <tr> 1972 <td><code class="highlighted">options.handleSwitchPlan</code></td> 1973 <td>Custom switch-plan logic callback</td> 1974 <td>Takes <code>({ plan }, customer, cancelFlowInfo)</code></td> 1975 </tr> 1976 <tr> 1977 <td> 1978 <code class="highlighted">options.handleSwitchPlanWithCoupon</code> 1979 </td> 1980 <td>Custom switch-plan-with-coupon logic callback</td> 1981 <td>Takes <code>({ plan, code }, customer, cancelFlowInfo)</code></td> 1982 </tr> 1983 <tr> 1984 <td><code class="highlighted">options.handleSwitchProduct</code></td> 1985 <td>Custom switch-product logic callback</td> 1986 <td>Takes <code>({ product }, customer, cancelFlowInfo)</code></td> 1987 </tr> 1988 <tr> 1989 <td><code class="highlighted">options.autoCancel</code></td> 1990 <td>Auto-handle cancellation. On by default</td> 1991 <td><code class="highlighted">false</code> (to use custom handler)</td> 1992 </tr> 1993 <tr> 1994 <td><code class="highlighted">options.autoPause</code></td> 1995 <td>Auto-handle pausing. On by default</td> 1996 <td><code class="highlighted">false</code> (to use custom handler)</td> 1997 </tr> 1998 <tr> 1999 <td><code class="highlighted">options.autoCoupon</code></td> 2000 <td>Auto-handle coupons. On by default</td> 2001 <td><code class="highlighted">false</code> (to use custom handler)</td> 2002 </tr> 2003 <tr> 2004 <td><code class="highlighted">options.autoTrialExtension</code></td> 2005 <td>Auto-handle trial extensions. On by default</td> 2006 <td><code class="highlighted">false</code> (to use custom handler)</td> 2007 </tr> 2008 <tr> 2009 <td><code class="highlighted">options.autoSwitchPlan</code></td> 2010 <td>Auto-handle plan switching. On by default</td> 2011 <td><code class="highlighted">false</code> (to use custom handler)</td> 2012 </tr> 2013 <tr> 2014 <td> 2015 <code class="highlighted">options.autoSwitchPlanWithCoupon</code> 2016 </td> 2017 <td>Auto-handle plan switching with a coupon. On by default</td> 2018 <td><code class="highlighted">false</code> (to use custom handler)</td> 2019 </tr> 2020 <tr> 2021 <td><code class="highlighted">options.autoSwitchProduct</code></td> 2022 <td>Auto-handle product switching. On by default</td> 2023 <td><code class="highlighted">false</code> (to use custom handler)</td> 2024 </tr> 2025 </tbody> 2026 </table> 2027 </div> 2028 <h3>Full example</h3> 2029 <p>A launch call that sets every option:</p> 2030 <div class="chr-code"> 2031 <div class="chr-copy-code" onclick="copyLink('chr-sdk-options-code')"> 2032 <img loading="lazy" decoding="async" 2033 id="chr-sdk-options-code-img" 2034 src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png" 2035 width="20" 2036 height="23" 2037 alt="" 2038 /> 2039 </div> 2040 <pre><code class="language-javascript" id="chr-sdk-options-code"> 2041document.getElementById('cancel-button').addEventListener('click', function () { 2042 window.churnSolution?.run({ 2043 authKey, // hash generated by your server 2044 subscriptionId, // your subscription ID from your payment provider
2045 appId: 'APP_ID', // your App ID 2046 options: { 2047 record: true, // default true, switch to false to turn off recording 2048 email: '<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="086269666d486d70696578646d266b6765">[email protected]</a>', // User email that initiates the cancel flow 2049 font: 'Roboto', 2050 fontUrl: 'https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap', 2051 language: 'de', 2052 customerAttributes: { 2053 Has_Extended_Free_Trial: false, 2054 }, 2055 customTexts: { 2056 "Back": "Zurück", 2057 "Next": "Weiter", 2058 }, 2059 cancellationSettings: { 2060 settings: { 2061 CANCEL_TIME: { 2062 cancellation_time_type: 'CUSTOM_DATE', // 'IMMEDIATE' | 'END_OF_BILLING_PERIOD' | 'CUSTOM_DATE' (Stripe only) 2063 cancel_after_days: 7, // only used with 'CUSTOM_DATE' 2064 }, 2065 }, 2066 }, 2067 pauseSettings: { 2068 nextPaymentDate: '2026-10-15', 2069 }, 2070 handleCancel: (customer, cancelFlowInfo) => { 2071 // cancel callback 2072 }, 2073 handleAbandon: (customer, cancelFlowInfo) => { 2074 // abandon callback 2075 }, 2076 handleDone: (customer, cancelFlowInfo) => { 2077 // success screen closed callback 2078 }, 2079 handleClose: (customer, cancelFlowInfo) => { 2080 // modal closed callback 2081 }, 2082 handlePause: ({pausePeriod}, customer, cancelFlowInfo) => { 2083 // pause callback 2084 }, 2085 handleCoupon: ({code}, customer, cancelFlowInfo) => { 2086 // coupon/discount callback 2087 }, 2088 handleTrialExtension: ({trialExtensionDays}, customer, cancelFlowInfo) => { 2089 // trial extension callback 2090 }, 2091 handleSwitchPlan: ({plan}, customer, cancelFlowInfo) => { 2092 // switch plan callback 2093 }, 2094 handleSwitchPlanWithCoupon: ({plan, code}, customer, cancelFlowInfo) => { 2095 // switch plan with coupon callback 2096 }, 2097 handleSwitchProduct: ({product}, customer, cancelFlowInfo) => { 2098 // switch product callback 2099 }, 2100 // Default true. Set any of these to false to make 2101 // the matching handler responsible for the action 2102 autoCancel: true, 2103 autoPause: true, 2104 autoCoupon: true, 2105 autoTrialExtension: true, 2106 autoSwitchPlan: true, 2107 autoSwitchPlanWithCoupon: true, 2108 autoSwitchProduct: true, 2109 }, 2110 }); 2111}); 2112 </code></pre> 2113 </div> 2114 </div> 2115 <div id="chr-session-font" class="chr-docs-sub-section"> 2116 <h2>Add Custom Fonts</h2> 2117 <p> 2118 By default, Churn Solution uses the font selected on the 2119 <a target="_blank" href="https://app.churnsolution.com/design" 2120 >design page</a 2121 >. However, you can override this with any font you prefer for your 2122 cancellation flow. To do this, you need to pass two parameters to the 2123 sessions API: font and fontUrl. 2124 </p> 2125 <p>Here’s an example of how to specify the font:</p> 2126 <div class="chr-code"> 2127 <div class="chr-copy-code" onclick="copyLink('chr-font-code')"> 2128 <img loading="lazy" decoding="async" 2129 id="chr-font-code-img" 2130 src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png" 2131 width="20" 2132 height="23" 2133 alt="" 2134 /> 2135 </div> 2136 <pre><code class="language-javascript" id="chr-font-code"> 2137document.getElementById('cancel-button').addEventListener('click', function () { 2138 window.churnSolution?.run({ 2139 authKey, // hash generated by your server 2140 subscriptionId, // your subscription ID from your payment provider
2141 appId: 'APP_ID', // your App ID 2142 options: { 2143 record: true, 2144 email: '', 2145 font: 'Roboto', // Font example 2146 fontUrl: 'https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap', // Font URL example 2147 }, 2148 }); 2149}); 2150 </code></pre> 2151 </div> 2152 </div> 2153 <div id="chr-session-recording" class="chr-docs-sub-section"> 2154 <h2>Enable/Disable Session Recording</h2> 2155 <p> 2156 Session recording is enabled by default. You have the option to disable 2157 session recording by setting the record parameter to false in the 2158 options of 2159 <a href="#chr-insert-embed" 2160 >Step 1: Place the embed code and launch snippet</a 2161 > 2162 from the installing section. 2163 </p> 2164 </div> 2165 <div id="chr-cancellation-settings" class="chr-docs-sub-section"> 2166 <h2>Set Cancellation Term</h2> 2167 <p> 2168 Learn how Churn Solution manages the cancellation of your customers' 2169 subscriptions. By default, each flow follows the option saved on the 2170 <a 2171 target="_blank" 2172 href="https://app.churnsolution.com/settings/configuration#Cancellation-Terms" 2173 >configuration page</a 2174 >. 2175 </p> 2176 <ul> 2177 <li> 2178 <strong>Immediate:</strong> Choose this option for instant 2179 subscription cancellation. The customer's subscription will be 2180 terminated immediately upon cancelling his subscription. 2181 </li> 2182 <li> 2183 <strong>End of billing period:</strong> Select this option to handle 2184 cancellations at the end of the current billing period. This allows 2185 customers to access services until the end of their paid subscription 2186 duration. 2187 </li> 2188 <li> 2189 <strong>Custom:</strong> Opt for this option for personalized 2190 cancellation processes. If chosen, specify a Cancellation Delay in 2191 terms of the number of days to define the precise termination 2192 timeline. 2193 </li> 2194 </ul> 2195 <img decoding="async" 2196 src="https://churnsolution.com/wp-content/uploads/2024/04/Animation.gif" 2197 alt="Cancellation Settings" 2198 style="border-radius: 12px" 2199 /> 2200 <p> 2201 <b>Please Note:</b> Each flow follows the term saved on the 2202 configuration page, but you can override it for a single customer by 2203 passing <code class="highlighted">cancellationSettings</code> in the 2204 launch call. The override applies to that session only and does not 2205 change your saved configuration. 2206 </p> 2207 <div class="chr-code"> 2208 <div 2209 class="chr-copy-code" 2210 onclick="copyLink('chr-cancellation-settings-code')" 2211 > 2212 <img loading="lazy" decoding="async" 2213 id="chr-cancellation-settings-code-img" 2214 src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png" 2215 width="20" 2216 height="23" 2217 alt="" 2218 /> 2219 </div> 2220 <pre><code class="language-javascript" id="chr-cancellation-settings-code"> 2221document.getElementById('cancel-button').addEventListener('click', function () { 2222 window.churnSolution?.run({ 2223 authKey, // hash generated by your server 2224 subscriptionId, // your subscription ID from your payment provider 2225 appId: 'APP_ID', // your App ID 2226 options: { 2227 cancellationSettings: { 2228 settings: { 2229 CANCEL_TIME: { 2230 cancellation_time_type: 'IMMEDIATE', 2231 }, 2232 }, 2233 }, 2234 }, 2235 }); 2236}); 2237 </code></pre> 2238 </div> 2239 <div class="chr-docs-table-wrapper"> 2240 <table class="chr-docs-table"> 2241 <thead> 2242 <tr> 2243 <th>Term on the configuration page</th> 2244 <th><code>cancellation_time_type</code></th> 2245 <th>Extra field</th> 2246 </tr> 2247 </thead> 2248 <tbody> 2249 <tr> 2250 <td>Immediate</td> 2251 <td><code class="highlighted">'IMMEDIATE'</code></td> 2252 <td>—</td> 2253 </tr> 2254 <tr> 2255 <td>End of billing period</td> 2256 <td><code class="highlighted">'END_OF_BILLING_PERIOD'</code></td> 2257 <td>—</td> 2258 </tr> 2259 <tr> 2260 <td>Custom</td> 2261 <td><code class="highlighted">'CUSTOM_DATE'</code></td> 2262 <td><code class="highlighted">cancel_after_days: 7</code></td> 2263 </tr> 2264 </tbody> 2265 </table> 2266 </div> 2267 <div class="chr-info"> 2268 <svg 2269 width="21" 2270 height="23"
2271 viewBox="0 0 21 23" 2272 fill="none" 2273 xmlns="http://www.w3.org/2000/svg" 2274 > 2275 <g clip-path="url(#ujqm33ofja)" fill="#0F124D"> 2276 <path 2277 d="M12.376 19.567h-3.72a.548.548 0 0 1-.409-.164.583.583 0 0 1-.17-.418.6.6 0 0 1 .17-.418.561.561 0 0 1 .41-.165h3.719a.557.557 0 0 1 .389.176.593.593 0 0 1 0 .813.557.557 0 0 1-.39.177h.001zM12.376 21.32h-3.72a.548.548 0 0 1-.409-.166.585.585 0 0 1-.17-.417.6.6 0 0 1 .17-.418.563.563 0 0 1 .41-.165h3.719a.557.557 0 0 1 .389.176.593.593 0 0 1 0 .813.556.556 0 0 1-.39.176h.001zM11.543 23H9.49a.556.556 0 0 1-.39-.176.593.593 0 0 1 0-.813.556.556 0 0 1 .39-.176h2.053a.556.556 0 0 1 .389.176.593.593 0 0 1 0 .813.556.556 0 0 1-.39.176zM13.616 11.34a.555.555 0 0 1-.4-.171.593.593 0 0 1-.165-.412 2.388 2.388 0 0 0-.437-1.388 2.265 2.265 0 0 0-1.15-.85.559.559 0 0 1-.33-.286.6.6 0 0 1 .069-.644.548.548 0 0 1 .602-.18c.69.223 1.292.669 1.719 1.27.427.603.656 1.33.654 2.078 0 .154-.059.302-.164.411a.556.556 0 0 1-.398.171z" 2278 /> 2279 <path 2280 d="M8.248 17.786a.554.554 0 0 1-.377-.15.588.588 0 0 1-.183-.371c-.05-.49-.439-.964-.931-1.564-.815-.995-1.936-2.359-1.936-4.683 0-3.242 2.554-5.88 5.693-5.88 3.14 0 5.694 2.64 5.694 5.88 0 2.324-1.12 3.688-1.936 4.683-.492.6-.881 1.074-.931 1.564a.597.597 0 0 1-.206.391.557.557 0 0 1-.414.127.55.55 0 0 1-.38-.213.59.59 0 0 1-.122-.428c.086-.847.623-1.501 1.192-2.194.782-.953 1.668-2.033 1.668-3.93 0-1.25-.48-2.45-1.337-3.333a4.493 4.493 0 0 0-3.228-1.381c-1.21 0-2.371.497-3.227 1.38a4.794 4.794 0 0 0-1.337 3.334c0 1.897.886 2.977 1.668 3.93.568.693 1.105 1.347 1.192 2.194a.6.6 0 0 1-.142.452.564.564 0 0 1-.42.192zM10.5 3.24a.555.555 0 0 1-.399-.17.592.592 0 0 1-.165-.413V.583c0-.155.06-.303.165-.412a.555.555 0 0 1 .798 0c.106.11.165.257.165.412v2.074a.6.6 0 0 1-.165.412.562.562 0 0 1-.399.17zM4.895 5.638a.549.549 0 0 1-.4-.17L3.075 4a.592.592 0 0 1 0-.824.555.555 0 0 1 .798 0l1.42 1.467a.6.6 0 0 1 .122.635.58.58 0 0 1-.207.262.552.552 0 0 1-.313.098zM17.526 18.683a.545.545 0 0 1-.399-.17l-1.42-1.467a.583.583 0 0 1-.176-.415.6.6 0 0 1 .166-.42.564.564 0 0 1 .406-.17.548.548 0 0 1 .402.18l1.42 1.468a.6.6 0 0 1 .122.635.579.579 0 0 1-.207.261.55.55 0 0 1-.314.098zM2.573 11.427H.564a.548.548 0 0 1-.409-.165.585.585 0 0 1-.17-.418.6.6 0 0 1 .17-.417.561.561 0 0 1 .41-.165h2.008a.546.546 0 0 1 .409.165.584.584 0 0 1 .17.417.6.6 0 0 1-.17.418.563.563 0 0 1-.41.165zM20.436 11.427h-2.008a.548.548 0 0 1-.41-.165.585.585 0 0 1-.17-.418.6.6 0 0 1 .17-.417.561.561 0 0 1 .41-.165h2.008a.546.546 0 0 1 .41.165.585.585 0 0 1 .17.417.6.6 0 0 1-.17.418.563.563 0 0 1-.41.165zM3.474 18.683a.552.552 0 0 1-.313-.098.579.579 0 0 1-.208-.261.6.6 0 0 1 .122-.635l1.42-1.467a.555.555 0 0 1 .788.01.593.593 0 0 1 .01.814l-1.42 1.467a.563.563 0 0 1-.399.17zM16.105 5.638a.552.552 0 0 1-.313-.098.58.58 0 0 1-.208-.262.602.602 0 0 1 .123-.635l1.42-1.466a.555.555 0 0 1 .798 0 .592.592 0 0 1 0 .823l-1.42 1.468a.564.564 0 0 1-.4.17z" 2281 /> 2282 </g> 2283 <defs> 2284 <clipPath id="ujqm33ofja"> 2285 <path fill="#fff" d="M0 0h21v23H0z" /> 2286 </clipPath> 2287 </defs> 2288 </svg> 2289 2290 <div> 2291 Values are case-sensitive. <b>Custom is supported on Stripe only.</b> 2292 On other payment providers, the cancellation fails. End of billing 2293 period is not supported on WooCommerce or Recurpay. 2294 </div> 2295 </div> 2296 <p> 2297 Example: cancel trial users immediately and everyone else at the end of 2298 the period: 2299 </p> 2300 <div class="chr-code"> 2301 <div 2302 class="chr-copy-code" 2303 onclick="copyLink('chr-cancellation-settings-example-code')" 2304 > 2305 <img loading="lazy" decoding="async" 2306 id="chr-cancellation-settings-example-code-img" 2307 src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png" 2308 width="20" 2309 height="23" 2310 alt="" 2311 /> 2312 </div> 2313 <pre><code class="language-javascript" id="chr-cancellation-settings-example-code"> 2314options: { 2315 cancellationSettings: { 2316 settings: { 2317 CANCEL_TIME: { 2318 cancellation_time_type: isOnTrial ? 'IMMEDIATE' : 'END_OF_BILLING_PERIOD', 2319 }, 2320 }, 2321 }, 2322}, 2323 </code></pre> 2324 </div> 2325 </div> 2326 <div id="chr-renewal-settings" class="chr-docs-sub-section"> 2327 <h2>Subscription Renewal Configuration</h2> 2328 <p> 2329 This feature allows you to win back customers who have cancelled their 2330 subscription, with the cancellation setting after a specified date or at 2331 the end of the billing period (cancellation has not happened yet). You 2332 can configure and display a call-to-action (CTA) to let your customers 2333 renew their subscription using these settings from the configuration 2334 page 2335 </p> 2336 <ul> 2337 <li> 2338 <b>Immediate Renewal:</b> Once the user clicks on the renew CTA, their 2339 subscription is cancelled directly. 2340 </li> 2341 <li> 2342 <b>Renew with Customer Confirmation:</b> The user has the option to 2343 set a headline, message, and CTA text for the pop-up that will be 2344 shown when the user clicks on the renew CTA. 2345 </li> 2346 <li> 2347 <b>Renew with Special Offer:</b> Here you have the option to add a 2348 headline, message, CTA text, and offer users a coupon that will be 2349 applied to their first payment. 2350 </li> 2351 </ul> 2352 <img decoding="async"
2353 src="https://churnsolution.com/wp-content/uploads/2024/07/uncancel.gif" 2354 alt="Renew Settings" 2355 style="border-radius: 12px" 2356 /> 2357 <p> 2358 Once you've determined the desired configuration, you need to implement 2359 the renewal functionality on your site. Typically, you will attach an 2360 event listener to your <b>Renew Plan</b> button. The following code 2361 calls a function in Churn Solution side that handles the renewal 2362 process: 2363 </p> 2364 <div class="chr-code"> 2365 <div 2366 class="chr-copy-code" 2367 onclick="copyLink('chr-renewal-settings-code')" 2368 > 2369 <img loading="lazy" decoding="async" 2370 id="chr-renewal-settings-code-img" 2371 src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png" 2372 width="20" 2373 height="23" 2374 alt="" 2375 /> 2376 </div> 2377 <pre><code class="language-javascript" id="chr-renewal-settings-code"> 2378document.getElementById('renew-button').addEventListener('click', function () { 2379 window.churnSolution?.renew({ 2380 authKey, // hash generated by your server 2381 subscriptionId, // your subscription ID from your payment provider 2382 appId: 'APP_ID', // your App ID 2383 options: { 2384 record: true, 2385 email: '', 2386 }, 2387 }); 2388}); 2389 </code></pre> 2390 </div> 2391 </div> 2392 <div id="chr-unpause-settings" class="chr-docs-sub-section"> 2393 <h2>Resume Configuration</h2> 2394 <p> 2395 This feature enables you to offer your customers the option to resume 2396 their subscription after they have paused payment collection. You can 2397 configure and display a call-to-action (CTA) to let your customers 2398 resume their subscription using these settings from the configuration 2399 page 2400 </p> 2401 <ul> 2402 <li> 2403 <b>Immediate Resume:</b> Once the user clicks on the resume CTA, their 2404 subscription will be resumed directly. 2405 </li> 2406 <li> 2407 <b>Resume with Customer Confirmation:</b> You will have the option to 2408 set a headline, message, and CTA text for the pop-up that will be 2409 shown when the user clicks on the resume CTA. 2410 </li> 2411 </ul> 2412 <img decoding="async" 2413 src="https://churnsolution.com/wp-content/uploads/2024/07/unpause.gif" 2414 alt="Resume Settings" 2415 style="border-radius: 12px" 2416 /> 2417 <p> 2418 Once you've determined the desired configuration, you need to implement 2419 the resume functionality on your site. Typically, you will attach an 2420 event listener to your <b>Resume Plan</b> button. The following code 2421 calls a function in Churn Solution side that handles the resume process: 2422 </p> 2423 <div class="chr-code"> 2424 <div 2425 class="chr-copy-code" 2426 onclick="copyLink('chr-resume-settings-code')" 2427 > 2428 <img loading="lazy" decoding="async" 2429 id="chr-resume-settings-code-img" 2430 src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png" 2431 width="20" 2432 height="23" 2433 alt="" 2434 /> 2435 </div> 2436 <pre><code class="language-javascript" id="chr-resume-settings-code"> 2437document.getElementById('resume-button').addEventListener('click', function () { 2438 window.churnSolution?.resume({ 2439 authKey, // hash generated by your server 2440 subscriptionId, // your subscription ID from your payment provider 2441 appId: 'APP_ID', // your App ID 2442 options: { 2443 record: true, 2444 email: '', 2445 }, 2446 }); 2447}); 2448 </code></pre> 2449 </div> 2450 </div> 2451 <div id="chr-pause-flow" class="chr-docs-sub-section"> 2452 <h2>Pause Flow</h2> 2453 <p> 2454 Launches the pause flow directly instead of the cancel flow. Available 2455 for WooCommerce and Paddle. 2456 </p> 2457 <div class="chr-code"> 2458 <div class="chr-copy-code" onclick="copyLink('chr-pause-flow-code')"> 2459 <img loading="lazy" decoding="async" 2460 id="chr-pause-flow-code-img"
2461 src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png" 2462 width="20" 2463 height="23" 2464 alt="" 2465 /> 2466 </div> 2467 <pre><code class="language-javascript" id="chr-pause-flow-code"> 2468document.getElementById('pause-button').addEventListener('click', function () { 2469 window.churnSolution?.pause({ 2470 authKey, // hash generated by your server 2471 subscriptionId, // your subscription ID from your payment provider 2472 appId: 'APP_ID', // your App ID 2473 options: { 2474 record: true, 2475 email: '', 2476 }, 2477 }); 2478}); 2479 </code></pre> 2480 </div> 2481 <p> 2482 To pause for one month immediately without showing a flow, call 2483 <code class="highlighted">window.churnSolution?.skip({...})</code> with 2484 the same arguments. 2485 </p> 2486 </div> 2487 <div id="chr-customer-attributes" class="chr-docs-sub-section"> 2488 <h2>Custom Attributes</h2> 2489 <p> 2490 When configuring the cancel flow, you can define custom attributes to 2491 effectively segment your customers. Here's how to proceed: 2492 </p> 2493 <ul> 2494 <li> 2495 Within the 2496 <a 2497 target="_blank" 2498 href="https://app.churnsolution.com/settings/configuration" 2499 >Configuration Settings</a 2500 > 2501 tab or directly from the cancellation flow in the Audience page, 2502 create a custom attribute. For instance, you might create an attribute 2503 like <strong>Has_Extended_Free_Trial</strong> to segment users based 2504 on whether they've already extended their free trial. 2505 </li> 2506 <li> 2507 Use this custom attribute to apply flows for the specified segments 2508 within your cancel flow. For example, you could target customers who 2509 have use free trial and have already extended it. 2510 </li> 2511 <li> 2512 When invoking <i>window.churnSolution.run()</i>, ensure that you 2513 include <strong>Has_Extended_Free_Trial</strong> under 2514 <i>options.customerAttributes</i>. 2515 </li> 2516 </ul> 2517 <div class="chr-code"> 2518 <div 2519 class="chr-copy-code" 2520 onclick="copyLink('chr-custom-attributes-code')" 2521 > 2522 <img loading="lazy" decoding="async" 2523 id="chr-custom-attributes-code-img" 2524 src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png" 2525 width="20" 2526 height="23" 2527 alt="" 2528 /> 2529 </div> 2530 <pre><code class="language-javascript" id="chr-custom-attributes-code"> 2531document.getElementById('cancel-button').addEventListener('click', function () { 2532 window.churnSolution?.run({ 2533 authKey, // hash generated by your server 2534 subscriptionId, // your subscription ID from your payment provider 2535 appId: 'APP_ID', // your App ID 2536 options: { 2537 customerAttributes: { 2538 Has_Extended_Free_Trial: false // or true, based on user's status 2539 }, 2540 record: true, 2541 email: '', 2542 }, 2543 }); 2544}); 2545 </code></pre> 2546 </div> 2547 <div class="chr-video-embed-wrapper"> 2548 <iframe 2549 class="chr-video-embed" 2550 src="https://www.youtube.com/embed/uBfVr978DQA" 2551 title="Segmentation & Custom Attributes: Churn Solution" 2552 frameborder="0" 2553 allow=" 2554 accelerometer; 2555 autoplay; 2556 clipboard-write; 2557 encrypted-media; 2558 gyroscope; 2559 picture-in-picture; 2560 web-share; 2561 " 2562 referrerpolicy="strict-origin-when-cross-origin" 2563 allowfullscreen 2564 ></iframe> 2565 </div> 2566 </div> 2567 <div id="chr-customer-attributes-meta" class="chr-docs-sub-section"> 2568 <h2>Customer Segmentation based on Metadata</h2> 2569 <p> 2570 Suppose you already have a metadata field either from the customer 2571 metadata or subscription metadata and it's set for all your customers. 2572 </p> 2573 <p> 2574 In the 2575 <a 2576 target="_blank" 2577 href="https://app.churnsolution.com/settings/configuration" 2578 >Configuration Settings</a 2579 > 2580 tab or directly from the cancellation flow in the Audience page, 2581 establish a new custom attribute. Specify the fields used in your 2582 metadata and their respective data types. 2583 </p> 2584 <p> 2585 Employ this custom attribute to define segments within your cancel flow, 2586 similar to the previous example. 2587 </p> 2588 <p> 2589 Now, when a customer interacts with the Embed, we'll first prioritize 2590 the value of the entered key field, if provided during session creation. 2591 Subsequently, we'll search for the relevant data in both their customer 2592 and subscription metadata. If found, we'll use that value from the 2593 subscription metadata first, then from the customer metadata, to 2594 evaluate your segment conditions. 2595 </p> 2596 </div> 2597 <div id="chr-custom-callbacks" class="chr-docs-sub-section"> 2598 <h2>Custom Callbacks</h2> 2599 <p> 2600 Handler callbacks are used when you want to manage actions to a 2601 customer's subscription by yourself, rather than letting Churn Solution 2602 do it automatically for you. When you define a handler callback for a 2603 specific event, like a subscription cancellation, and turn off its 2604 matching auto flag, Churn Solution will follow your instructions 2605 instead of doing its implementation for it. 2606 </p> 2607 <p> 2608 Most of these handler callbacks work like promises in JavaScript. When 2609 something happens, you have two options: resolve or reject. If 2610 everything goes well and you want Churn Solution to proceed as planned, 2611 you call resolve. You can even include a message to let the customer 2612 know what's happening. On the other hand, if there's an issue and you 2613 want Churn Solution to stop and handle it differently, you call reject. 2614 </p> 2615 <p> 2616 This object will contain the actions handlers with a flag for each 2617 action to specify whether the action handler is a replacement to Churn 2618 Solution handler or an extra functionality. If any of the below props is 2619 true its action will be handled from Churn Solution side and if you have 2620 callback for this event it will be called also when executing the action 2621 events from our side. Furthermore, you have the option to send the 2622 customer email who started the cancellation flow. 2623 </p> 2624 <div class="chr-code"> 2625 <div class="chr-copy-code" onclick="copyLink('chr-options-code')"> 2626 <img loading="lazy" decoding="async" 2627 id="chr-options-code-img"
2628 src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png" 2629 width="20" 2630 height="23" 2631 alt="" 2632 /> 2633 </div> 2634 <pre><code class="language-javascript" id="chr-options-code"> 2635{ 2636 record: true, // default true, switch to false to turn off recording 2637 email: '', // User email that initiates the cancel flow 2638 handleCancel: (customer, cancelFlowInfo) => { 2639 // cancel callback 2640 }, 2641 handleAbandon: (customer, cancelFlowInfo) => { 2642 // abandon callback 2643 }, 2644 handleDone: (customer, cancelFlowInfo) => { 2645 // success screen closed callback 2646 }, 2647 handleClose: (customer, cancelFlowInfo) => { 2648 // modal closed callback 2649 }, 2650 handlePause: ({pausePeriod}, customer, cancelFlowInfo) => { 2651 // pause callback 2652 }, 2653 handleTrialExtension: ({trialExtensionDays}, customer, cancelFlowInfo) => { 2654 // trial extension callback 2655 }, 2656 handleCoupon: ({code}, customer, cancelFlowInfo) => { 2657 // coupon/discount callback 2658 }, 2659 handleSwitchPlan: ({plan}, customer, cancelFlowInfo) => { 2660 // switch plan callback 2661 }, 2662 handleSwitchPlanWithCoupon: ({plan, code}, customer, cancelFlowInfo) => { 2663 // switch plan with coupon callback 2664 }, 2665 handleSwitchProduct: ({product}, customer, cancelFlowInfo) => { 2666 // switch product callback 2667 }, 2668 // If any of the below props is true 2669 // its action will be handled from Churn Solution side 2670 autoCancel: false, 2671 autoPause: false, 2672 autoSwitchPlan: false, 2673 autoSwitchPlanWithCoupon: false, 2674 autoSwitchProduct: false, 2675 autoTrialExtension: false, 2676 autoCoupon: false, 2677} 2678 </code></pre> 2679 </div> 2680 <p> 2681 Every offer handler is called as 2682 <code class="highlighted">handler(offer, customer, cancelFlowInfo)</code>, 2683 where <code class="highlighted">offer</code> always carries 2684 <code class="highlighted">offerType</code> plus the fields below. The 2685 lifecycle callbacks (<code class="highlighted">handleAbandon</code>, 2686 <code class="highlighted">handleDone</code>, 2687 <code class="highlighted">handleClose</code>) and 2688 <code class="highlighted">handleCancel</code> receive only 2689 <code class="highlighted">(customer, cancelFlowInfo)</code>. 2690 </p> 2691 <div class="chr-docs-table-wrapper"> 2692 <table class="chr-docs-table"> 2693 <thead> 2694 <tr> 2695 <th>Handler</th> 2696 <th><code>offer</code> fields</th> 2697 </tr> 2698 </thead> 2699 <tbody> 2700 <tr> 2701 <td><code class="highlighted">handlePause</code></td> 2702 <td><code class="highlighted">pausePeriod</code></td> 2703 </tr> 2704 <tr> 2705 <td><code class="highlighted">handleCoupon</code></td> 2706 <td><code class="highlighted">code</code></td> 2707 </tr> 2708 <tr> 2709 <td><code class="highlighted">handleTrialExtension</code></td> 2710 <td><code class="highlighted">trialExtensionDays</code></td> 2711 </tr> 2712 <tr> 2713 <td><code class="highlighted">handleSwitchPlan</code></td> 2714 <td><code class="highlighted">plan</code></td> 2715 </tr> 2716 <tr> 2717 <td><code class="highlighted">handleSwitchPlanWithCoupon</code></td> 2718 <td> 2719 <code class="highlighted">plan</code>, 2720 <code class="highlighted">code</code> 2721 </td> 2722 </tr> 2723 <tr> 2724 <td><code class="highlighted">handleSwitchProduct</code></td> 2725 <td><code class="highlighted">product</code></td> 2726 </tr> 2727 </tbody> 2728 </table> 2729 </div> 2730 <p> 2731 A handler may return 2732 <code class="highlighted">{ title, message }</code> to replace the text 2733 on the success screen. 2734 </p> 2735 <div class="chr-info"> 2736 <svg 2737 width="21" 2738 height="23"
2739 viewBox="0 0 21 23" 2740 fill="none" 2741 xmlns="http://www.w3.org/2000/svg" 2742 > 2743 <g clip-path="url(#ujqm33ofja)" fill="#0F124D"> 2744 <path 2745 d="M12.376 19.567h-3.72a.548.548 0 0 1-.409-.164.583.583 0 0 1-.17-.418.6.6 0 0 1 .17-.418.561.561 0 0 1 .41-.165h3.719a.557.557 0 0 1 .389.176.593.593 0 0 1 0 .813.557.557 0 0 1-.39.177h.001zM12.376 21.32h-3.72a.548.548 0 0 1-.409-.166.585.585 0 0 1-.17-.417.6.6 0 0 1 .17-.418.563.563 0 0 1 .41-.165h3.719a.557.557 0 0 1 .389.176.593.593 0 0 1 0 .813.556.556 0 0 1-.39.176h.001zM11.543 23H9.49a.556.556 0 0 1-.39-.176.593.593 0 0 1 0-.813.556.556 0 0 1 .39-.176h2.053a.556.556 0 0 1 .389.176.593.593 0 0 1 0 .813.556.556 0 0 1-.39.176zM13.616 11.34a.555.555 0 0 1-.4-.171.593.593 0 0 1-.165-.412 2.388 2.388 0 0 0-.437-1.388 2.265 2.265 0 0 0-1.15-.85.559.559 0 0 1-.33-.286.6.6 0 0 1 .069-.644.548.548 0 0 1 .602-.18c.69.223 1.292.669 1.719 1.27.427.603.656 1.33.654 2.078 0 .154-.059.302-.164.411a.556.556 0 0 1-.398.171z" 2746 /> 2747 <path 2748 d="M8.248 17.786a.554.554 0 0 1-.377-.15.588.588 0 0 1-.183-.371c-.05-.49-.439-.964-.931-1.564-.815-.995-1.936-2.359-1.936-4.683 0-3.242 2.554-5.88 5.693-5.88 3.14 0 5.694 2.64 5.694 5.88 0 2.324-1.12 3.688-1.936 4.683-.492.6-.881 1.074-.931 1.564a.597.597 0 0 1-.206.391.557.557 0 0 1-.414.127.55.55 0 0 1-.38-.213.59.59 0 0 1-.122-.428c.086-.847.623-1.501 1.192-2.194.782-.953 1.668-2.033 1.668-3.93 0-1.25-.48-2.45-1.337-3.333a4.493 4.493 0 0 0-3.228-1.381c-1.21 0-2.371.497-3.227 1.38a4.794 4.794 0 0 0-1.337 3.334c0 1.897.886 2.977 1.668 3.93.568.693 1.105 1.347 1.192 2.194a.6.6 0 0 1-.142.452.564.564 0 0 1-.42.192zM10.5 3.24a.555.555 0 0 1-.399-.17.592.592 0 0 1-.165-.413V.583c0-.155.06-.303.165-.412a.555.555 0 0 1 .798 0c.106.11.165.257.165.412v2.074a.6.6 0 0 1-.165.412.562.562 0 0 1-.399.17zM4.895 5.638a.549.549 0 0 1-.4-.17L3.075 4a.592.592 0 0 1 0-.824.555.555 0 0 1 .798 0l1.42 1.467a.6.6 0 0 1 .122.635.58.58 0 0 1-.207.262.552.552 0 0 1-.313.098zM17.526 18.683a.545.545 0 0 1-.399-.17l-1.42-1.467a.583.583 0 0 1-.176-.415.6.6 0 0 1 .166-.42.564.564 0 0 1 .406-.17.548.548 0 0 1 .402.18l1.42 1.468a.6.6 0 0 1 .122.635.579.579 0 0 1-.207.261.55.55 0 0 1-.314.098zM2.573 11.427H.564a.548.548 0 0 1-.409-.165.585.585 0 0 1-.17-.418.6.6 0 0 1 .17-.417.561.561 0 0 1 .41-.165h2.008a.546.546 0 0 1 .409.165.584.584 0 0 1 .17.417.6.6 0 0 1-.17.418.563.563 0 0 1-.41.165zM20.436 11.427h-2.008a.548.548 0 0 1-.41-.165.585.585 0 0 1-.17-.418.6.6 0 0 1 .17-.417.561.561 0 0 1 .41-.165h2.008a.546.546 0 0 1 .41.165.585.585 0 0 1 .17.417.6.6 0 0 1-.17.418.563.563 0 0 1-.41.165zM3.474 18.683a.552.552 0 0 1-.313-.098.579.579 0 0 1-.208-.261.6.6 0 0 1 .122-.635l1.42-1.467a.555.555 0 0 1 .788.01.593.593 0 0 1 .01.814l-1.42 1.467a.563.563 0 0 1-.399.17zM16.105 5.638a.552.552 0 0 1-.313-.098.58.58 0 0 1-.208-.262.602.602 0 0 1 .123-.635l1.42-1.466a.555.555 0 0 1 .798 0 .592.592 0 0 1 0 .823l-1.42 1.468a.564.564 0 0 1-.4.17z" 2749 /> 2750 </g> 2751 <defs> 2752 <clipPath id="ujqm33ofja"> 2753 <path fill="#fff" d="M0 0h21v23H0z" /> 2754 </clipPath> 2755 </defs> 2756 </svg> 2757 2758 <div> 2759 A handler on its own does <b>not</b> stop Churn Solution from acting. 2760 With <code class="highlighted">autoCancel</code> left at its default 2761 (<code class="highlighted">true</code>), 2762 <code class="highlighted">handleCancel</code> is only a notification 2763 fired after we cancel. Set 2764 <code class="highlighted">autoCancel: false</code> to make your 2765 handler responsible for the cancellation. The same applies to every 2766 <code class="highlighted">autoX</code> / 2767 <code class="highlighted">handleX</code> pair. 2768 </div> 2769 </div> 2770 </div> 2771 <div id="chr-callbacks-example" class="chr-docs-sub-section"> 2772 <h3>Example callbacks for custom cancel handling</h3> 2773 <p> 2774 If you want to customize and use your cancel logic rather than letting 2775 Churn Solution cancel through your payment provider, you can define the 2776 handleCancel option and set the autoCancel to false, similarly you can 2777 do it to all other actions. This callback is triggered when a customer 2778 selects to cancel his subscription. If you've defined this callback, 2779 Churn Solution won't automatically attempt to manage these actions 2780 through your payment provider. Instead, it will execute the logic you've 2781 specified within the respective callback. 2782 </p> 2783 <div class="chr-code"> 2784 <div 2785 class="chr-copy-code" 2786 onclick="copyLink('chr-options-code-example')" 2787 > 2788 <img loading="lazy" decoding="async" 2789 id="chr-options-code-example-img"
2790 src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png" 2791 width="20" 2792 height="23" 2793 alt="" 2794 /> 2795 </div> 2796 <pre><code class="language-javascript" id="chr-options-code-example"> 2797window.churnSolution.run({ 2798 authKey, // hash generated by your server 2799 subscriptionId, // your subscription ID from your payment provider 2800 appId: 'APP_ID', // your App ID 2801 options: { 2802 handleCancel: (customer, flowInfo) => { 2803 return new Promise(async (resolve, reject) => { 2804 try { 2805 // handle cancel logic 2806 2807 // You can pass a message that will be showed to user after cancelling 2808 // if you don't pass a message, a generic message will be shown 2809 resolve({ message: 'Your account has been canceled. You will not be billed again' }); 2810 } catch (e) { 2811 console.log(e); 2812 reject({ message: 'Failed to cancel account. Please contact support.' }); 2813 } 2814 }); 2815 }, 2816 handlePause: async ({pausePeriod}, customer, flowInfo) => { 2817 return new Promise(async (resolve, reject) => { 2818 try { 2819 // handle pause logic 2820 2821 // You can pass a message that will be showed to user after cancelling 2822 // if you don't pass a message, a generic message will be shown 2823 resolve({ message: `Your account has been paused ${pausePeriod} month${pausePeriod === 1 ? '' : 's'}. You will not be billed until resume` }); 2824 } catch (e) { 2825 console.log(e); 2826 reject({ message: 'Failed to cancel account. Please contact support.' }); 2827 } 2828 }); 2829 }, 2830 // If any of the below props is true 2831 // its action will be handled from Churn Solution side 2832 autoCancel: false, 2833 autoPause: false, 2834 autoSwitchPlan: false, 2835 autoSwitchPlanWithCoupon: false, 2836 autoTrialExtension: false, 2837 autoCoupon: false, 2838 }, 2839}); 2840 </code></pre> 2841 </div> 2842 </div> 2843 <div id="chr-custom-texts" class="chr-docs-sub-section"> 2844 <h2>Custom Texts & Multi-language Support</h2> 2845 <p> 2846 Churn Solution gives you full flexibility to override any default text 2847 in the cancellation, resume, or renewal flows. This allows you to fully 2848 localize the experience into any language or customize the wording to 2849 match your brand tone. 2850 </p> 2851 <p> 2852 You can pass a <code><strong>customTexts</strong></code> object to 2853 <code><strong>window.churnSolution.run()</strong></code> with key-value 2854 pairs where: 2855 </p> 2856 <ul> 2857 <li> 2858 <p><strong>Key</strong> = the original system text</p> 2859 </li> 2860 <li> 2861 <p><strong>Value</strong> = the text you want to display instead</p> 2862 </li> 2863 </ul> 2864 <p>as below:</p> 2865 <div class="chr-code"> 2866 <div class="chr-copy-code" onclick="copyLink('chr-custom-texts-code')"> 2867 <img loading="lazy" decoding="async" 2868 id="chr-custom-texts-code-img" 2869 src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png" 2870 width="20" 2871 height="23" 2872 alt="" 2873 /> 2874 </div> 2875 <pre><code class="language-javascript" id="chr-custom-texts-code"> 2876{ 2877 record: true, // default true, switch to false to turn off recording 2878 email: '', // User email that initiates the cancel flow 2879 customTexts: { 2880 "Back": "Back", 2881 "Next": "Next", 2882 "Decline Offer": "Decline Offer", 2883 "Done": "Done", 2884 "Cancel": "Cancel", 2885 "Cancel Subscription": "Cancel Subscription", 2886 "Close": "Close", 2887 "Yes, Leave": "Yes, Leave", 2888 "No, Back": "No, Back", 2889 "Powered by": "Powered by", 2890 "Cancellation Guaranteed by": "Cancellation Guaranteed by", 2891 "Offer Guaranteed by": "Offer Guaranteed by", 2892 "You are already paused": "You are already paused", 2893 "You won't be billed until your subscription resumes": "You won't be billed until your subscription resumes", 2894 "Subscription Cancelled.": "Subscription Cancelled.", 2895 "Subscription Uncancelled.": "Subscription Uncancelled.", 2896 "Subscription Resumed.": "Subscription Resumed.", 2897 "Subscription paused.": "Subscription paused.", 2898 "Subscription Activated.": "Subscription Activated.", 2899 "You can enjoy all our features again!": "You can enjoy all our features again!", 2900 "Something went wrong!": "Something went wrong!", 2901 "Please refresh your page and try again": "Please refresh your page and try again", 2902 "Offer applied": "Offer applied", 2903 "Successfully claimed offer": "Successfully claimed offer", 2904 "Switch Plan": "Switch Plan", 2905 "Successfully switched plan": "Successfully switched plan", 2906 "Successfully switched plan with a discount.": "Successfully switched plan with a discount.", 2907 "Extend Free Trial": "Extend Free Trial", 2908 "Successfully extended you free trial": "Successfully extended you free trial", 2909 "Unable to Recover Payment": "Unable to Recover Payment", 2910 "Unable to Switch Plan": "Unable to Switch Plan", 2911 "Please contact customer support for assistance": "Please contact customer support for assistance", 2912 "Submit the form to proceed with your cancellation": "Submit the form to proceed with your cancellation", 2913 "Go To Form": "Go To Form", 2914 "Write your answer...": "Write your answer...", 2915 "Answer...": "Answer...", 2916 "empty option": "empty option", 2917 "Minimum number of characters:": "Minimum number of characters:", 2918 "Day": "Day", 2919 "Days": "Days", 2920 "day": "day", 2921 "days": "days", 2922 "week": "week", 2923 "weeks": "weeks", 2924 "month": "month", 2925 "months": "months", 2926 "year": "year", 2927 "years": "years", 2928 "billing cycle": "billing cycle", 2929 "billing cycles": "billing cycles", 2930 "Choose offer type": "Choose offer type", 2931 "Pause Subscription": "Pause Subscription", 2932 "Accept": "Accept", 2933 "Accept Offer": "Accept Offer", 2934 "Claim your offer": "Claim your offer", 2935 "Switch and Claim Your Offer": "Switch and Claim Your Offer", 2936 "Discover a Better Plan for You": "Discover a Better Plan for You", 2937 "Claim Your Offer & Switch Plan": "Claim Your Offer & Switch Plan", 2938 "Extend Trial By": "Extend Trial By", 2939 "Chat on WhatsApp": "Chat on WhatsApp", 2940 "Send an Email": "Send an Email", 2941 "Choose how long you want to pause": "Choose how long you want to pause", 2942 "Loading...": "Loading...", 2943 "Waiting Submit...": "Waiting Submit...", 2944 "Limited time offer for": "Limited time offer for", 2945 "Enjoy This Discounted Price Forever": "Enjoy This Discounted Price Forever", 2946 "You subscription is successfully restored": "You subscription is successfully restored", 2947 "You subscription is successfully resumed": "You subscription is successfully resumed", 2948 "You won't be billed again.": "You won't be billed again.", 2949 "Your subscription is canceled and will end at the end of your current billing period.": "Your subscription is canceled and will end at the end of your current billing period.", 2950 "Your subscription is canceled and will end after": "Your subscription is canceled and will end after", 2951 "Your subscription is canceled and will end": "Your subscription is canceled and will end", 2952 "Today": "Today",
2953 "Can't Cancel": "Can't Cancel", 2954 "Success": "Success", 2955 "Your action has been successfully done": "Your action has been successfully done", 2956 "Cancellation Incomplete": "Cancellation Incomplete", 2957 "You've started the cancellation Process but haven't finished it. Are you sure you want to leave?": "You've started the cancellation Process but haven't finished it. Are you sure you want to leave?", 2958 "Oops! something went wrong!": "Oops! something went wrong!", 2959 "It seems you have already claimed this coupon": "It seems you have already claimed this coupon", 2960 "Offer Already Redeemed": "Offer Already Redeemed", 2961 "Off your next renewal": "Off your next renewal", 2962 "Off all of your next renewals": "Off all of your next renewals", 2963 "Off for": "Off for", 2964 }, 2965} 2966 </code></pre> 2967 </div> 2968 </div> 2969 <div id="chr-custom-texts-example" class="chr-docs-sub-section"> 2970 <h3>Example callbacks for custom texts handling</h3> 2971 <p> 2972 The following example shows how to override default texts and display 2973 the cancellation flow in French: 2974 </p> 2975 <div class="chr-code"> 2976 <div 2977 class="chr-copy-code" 2978 onclick="copyLink('chr-custom-texts-example-code')" 2979 > 2980 <img loading="lazy" decoding="async" 2981 id="chr-custom-texts-example-code-img" 2982 src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png" 2983 width="20" 2984 height="23" 2985 alt="" 2986 /> 2987 </div> 2988 <pre><code class="language-javascript" id="chr-custom-texts-example-code"> 2989window.churnSolution?.run({ 2990 authKey, // hash generated by your server 2991 subscriptionId, // your subscription ID from your payment provider 2992 appId: 'APP_ID', // your App ID 2993 options: { 2994 record: true, 2995 customTexts: { 2996 "Back": "Retour", 2997 "Next": "Suivant", 2998 "Decline Offer": "Refuser l'offre", 2999 "Accept Offer": "Accepter l'offre", 3000 "Done": "Terminé", 3001 "Pause Subscription": "Mettre l'abonnement en pause", 3002 "Cancel Subscription": "Annuler l'abonnement", 3003 "Extend Free Trial": "Prolonger l'essai gratuit", 3004 "Claim your offer": "Réclamez votre offre", 3005 "Switch Plan": "Changer de forfait", 3006 "No, Back": "Non, Retour", 3007 "Yes, Leave": "Oui, Quitter", 3008 "Chat on WhatsApp": "Discuter sur WhatsApp", 3009 "Send an Email": "Envoyer un e-mail", 3010 ... 3011 }, 3012 }, 3013}); 3014 </code></pre> 3015 </div> 3016 </div> 3017 <div id="chr-google-form-configuration" class="chr-docs-sub-section"> 3018 <h2>Integrating Google Form into Cancellation Confirmation</h2> 3019 <p> 3020 In the cancellation confirmation process, you have the option to include 3021 a Google Form for your customers. This form can be set as either 3022 required or optional. 3023 </p> 3024 <h3>Steps to Add Google Form:</h3> 3025 <ol> 3026 <li> 3027 Make the Form Public: Ensure that your Google Form is public, allowing 3028 customers to access it without restrictions. 3029 </li> 3030 <li> 3031 Enable the Google Form in Confirmation step: 3032 <ul> 3033 <li> 3034 In the cancellation confirmation settings, enable the option to 3035 show the Google Form button in the confirmation modal. 3036 </li> 3037 <li> 3038 Customize the button text that will appear to your customers and 3039 specify the link it will redirect to. 3040 </li> 3041 </ul> 3042 </li> 3043 </ol> 3044 <p> 3045 If you want customers to submit the form before proceeding with the 3046 cancellation, enable the option to require Google Form submission so 3047 that your customers will be blocked from cancelling the subscription 3048 until they submit the form. 3049 </p> 3050 <p>you have to follow these steps:</p> 3051 <ul> 3052 <li> 3053 Adding a Unique Field to the Google Form: 3054 <p> 3055 Create a new field titled <b>"Cancellation Bin Code"</b> as a 3056 <b>Short Answer</b> field in your Google Form. This field will be 3057 pre-filled with a unique value at runtime to validate form 3058 submissions. 3059 </p> 3060 </li> 3061 </ul> 3062 <img decoding="async"
3063 src="https://churnsolution.com/wp-content/uploads/2024/10/google_form_field.png" 3064 alt="Cancellation Bin Code Field" 3065 height="auto" 3066 width="450" 3067 style="border-radius: 12px; margin-bottom: 24px; display: block" 3068 /> 3069 <div class="chr-info"> 3070 <svg 3071 width="21" 3072 height="23" 3073 viewBox="0 0 21 23" 3074 fill="none" 3075 xmlns="http://www.w3.org/2000/svg" 3076 > 3077 <g clip-path="url(#ujqm33ofja)" fill="#0F124D"> 3078 <path 3079 d="M12.376 19.567h-3.72a.548.548 0 0 1-.409-.164.583.583 0 0 1-.17-.418.6.6 0 0 1 .17-.418.561.561 0 0 1 .41-.165h3.719a.557.557 0 0 1 .389.176.593.593 0 0 1 0 .813.557.557 0 0 1-.39.177h.001zM12.376 21.32h-3.72a.548.548 0 0 1-.409-.166.585.585 0 0 1-.17-.417.6.6 0 0 1 .17-.418.563.563 0 0 1 .41-.165h3.719a.557.557 0 0 1 .389.176.593.593 0 0 1 0 .813.556.556 0 0 1-.39.176h.001zM11.543 23H9.49a.556.556 0 0 1-.39-.176.593.593 0 0 1 0-.813.556.556 0 0 1 .39-.176h2.053a.556.556 0 0 1 .389.176.593.593 0 0 1 0 .813.556.556 0 0 1-.39.176zM13.616 11.34a.555.555 0 0 1-.4-.171.593.593 0 0 1-.165-.412 2.388 2.388 0 0 0-.437-1.388 2.265 2.265 0 0 0-1.15-.85.559.559 0 0 1-.33-.286.6.6 0 0 1 .069-.644.548.548 0 0 1 .602-.18c.69.223 1.292.669 1.719 1.27.427.603.656 1.33.654 2.078 0 .154-.059.302-.164.411a.556.556 0 0 1-.398.171z" 3080 /> 3081 <path 3082 d="M8.248 17.786a.554.554 0 0 1-.377-.15.588.588 0 0 1-.183-.371c-.05-.49-.439-.964-.931-1.564-.815-.995-1.936-2.359-1.936-4.683 0-3.242 2.554-5.88 5.693-5.88 3.14 0 5.694 2.64 5.694 5.88 0 2.324-1.12 3.688-1.936 4.683-.492.6-.881 1.074-.931 1.564a.597.597 0 0 1-.206.391.557.557 0 0 1-.414.127.55.55 0 0 1-.38-.213.59.59 0 0 1-.122-.428c.086-.847.623-1.501 1.192-2.194.782-.953 1.668-2.033 1.668-3.93 0-1.25-.48-2.45-1.337-3.333a4.493 4.493 0 0 0-3.228-1.381c-1.21 0-2.371.497-3.227 1.38a4.794 4.794 0 0 0-1.337 3.334c0 1.897.886 2.977 1.668 3.93.568.693 1.105 1.347 1.192 2.194a.6.6 0 0 1-.142.452.564.564 0 0 1-.42.192zM10.5 3.24a.555.555 0 0 1-.399-.17.592.592 0 0 1-.165-.413V.583c0-.155.06-.303.165-.412a.555.555 0 0 1 .798 0c.106.11.165.257.165.412v2.074a.6.6 0 0 1-.165.412.562.562 0 0 1-.399.17zM4.895 5.638a.549.549 0 0 1-.4-.17L3.075 4a.592.592 0 0 1 0-.824.555.555 0 0 1 .798 0l1.42 1.467a.6.6 0 0 1 .122.635.58.58 0 0 1-.207.262.552.552 0 0 1-.313.098zM17.526 18.683a.545.545 0 0 1-.399-.17l-1.42-1.467a.583.583 0 0 1-.176-.415.6.6 0 0 1 .166-.42.564.564 0 0 1 .406-.17.548.548 0 0 1 .402.18l1.42 1.468a.6.6 0 0 1 .122.635.579.579 0 0 1-.207.261.55.55 0 0 1-.314.098zM2.573 11.427H.564a.548.548 0 0 1-.409-.165.585.585 0 0 1-.17-.418.6.6 0 0 1 .17-.417.561.561 0 0 1 .41-.165h2.008a.546.546 0 0 1 .409.165.584.584 0 0 1 .17.417.6.6 0 0 1-.17.418.563.563 0 0 1-.41.165zM20.436 11.427h-2.008a.548.548 0 0 1-.41-.165.585.585 0 0 1-.17-.418.6.6 0 0 1 .17-.417.561.561 0 0 1 .41-.165h2.008a.546.546 0 0 1 .41.165.585.585 0 0 1 .17.417.6.6 0 0 1-.17.418.563.563 0 0 1-.41.165zM3.474 18.683a.552.552 0 0 1-.313-.098.579.579 0 0 1-.208-.261.6.6 0 0 1 .122-.635l1.42-1.467a.555.555 0 0 1 .788.01.593.593 0 0 1 .01.814l-1.42 1.467a.563.563 0 0 1-.399.17zM16.105 5.638a.552.552 0 0 1-.313-.098.58.58 0 0 1-.208-.262.602.602 0 0 1 .123-.635l1.42-1.466a.555.555 0 0 1 .798 0 .592.592 0 0 1 0 .823l-1.42 1.468a.564.564 0 0 1-.4.17z" 3083 /> 3084 </g> 3085 <defs> 3086 <clipPath id="ujqm33ofja"> 3087 <path fill="#fff" d="M0 0h21v23H0z" /> 3088 </clipPath> 3089 </defs> 3090 </svg> 3091 3092 <div> 3093 <b>Important:</b> Inform customers not to edit this field, as the 3094 unique value is essential for form validation. 3095 </div> 3096 </div> 3097 <ul> 3098 <li>Google Form Script Setup:</li> 3099 </ul> 3100 <ol> 3101 <li> 3102 Access Script Editor: 3103 <ul> 3104 <li> 3105 In the Google Form builder, click on the three dots in the upper 3106 right corner and select Script editor. 3107 </li> 3108 </ul> 3109 <img decoding="async"
3110 src="https://churnsolution.com/wp-content/uploads/2024/10/google_form_menu-1.png" 3111 alt="Google Form Menu" 3112 height="auto" 3113 width="300" 3114 style="border-radius: 12px; display: block" 3115 /> 3116 </li> 3117 <li> 3118 Add the Script: 3119 <ul> 3120 <li>Copy and paste the following code into the script editor</li> 3121 <div class="chr-code"> 3122 <div 3123 class="chr-copy-code" 3124 onclick="copyLink('chr-google-form-code')" 3125 > 3126 <img loading="lazy" decoding="async" 3127 id="chr-google-form-code-img" 3128 src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png" 3129 width="20" 3130 height="23" 3131 alt="" 3132 /> 3133 </div> 3134 <pre><code class="language-javascript" id="chr-google-form-code"> 3135function onFormSubmit(e) { 3136 const CANCELLATION_BIN_CODE_FIELD = "Cancellation Bin Code"; 3137 const API_URL = 'https://google-form.churnsolution.com/submit'; 3138 3139 // Extract item responses 3140 const itemResponses = e.response.getItemResponses(); 3141 3142 // Extract the value of the "Cancellation Bin Code" field 3143 const cancellationBinCode = itemResponses 3144 .find(item => item.getItem().getTitle() === CANCELLATION_BIN_CODE_FIELD) 3145 ?.getResponse(); 3146 3147 // Validate the cancellationBinCode 3148 if (!cancellationBinCode) { 3149 Logger.log('Error: Cancellation Bin Code is empty. Aborting API call.'); 3150 return; 3151 } 3152 3153 // Define API request options 3154 const options = { 3155 method: 'post', 3156 contentType: 'application/json', 3157 payload: JSON.stringify({ cancellationBinCode }) 3158 }; 3159 3160 // Send the HTTP request 3161 try { 3162 UrlFetchApp.fetch(API_URL, options); 3163 } catch (error) { 3164 // Catch and log errors during the HTTP request 3165 Logger.log('Error during API request: ' + error.message); 3166 } 3167} 3168 </code></pre> 3169 </div> 3170 </ul> 3171 </li> 3172 <li> 3173 Save the Script: After pasting the code, save the script. 3174 <img decoding="async" 3175 src="https://churnsolution.com/wp-content/uploads/2024/10/google_form_code.png" 3176 alt="Google Form Code" 3177 height="auto" 3178 width="550" 3179 style="border-radius: 12px; display: block" 3180 /> 3181 </li> 3182 <li> 3183 Set Up Triggers: 3184 <ul> 3185 <li> 3186 From the same page, click on triggers, add new trigger, and match 3187 these settings. 3188 </li> 3189 </ul> 3190 <img decoding="async" 3191 src="https://churnsolution.com/wp-content/uploads/2024/10/google_form_trigger.png" 3192 alt="Google Form Trigger" 3193 height="auto" 3194 width="450" 3195 style="border-radius: 12px; display: block" 3196 /> 3197 </li> 3198 <li> 3199 After setting it up, save the trigger to ensure it appears on the 3200 triggers page. 3201 <img decoding="async" 3202 src="https://churnsolution.com/wp-content/uploads/2024/10/google_form_trigger_created.png" 3203 alt="Google Form Code" 3204 height="auto" 3205 width="auto" 3206 style="border-radius: 12px; display: block" 3207 /> 3208 </li> 3209 <li> 3210 In the settings page, you can add a message for customers after they 3211 submit the form. Navigate to Form 3212 <b 3213 >settings -> Presentation -> After submission -> Confirmation 3214 message</b 3215 >, and edit the message to inform customers not to close the form. For 3216 example: "Your response has been recorded! Please keep this form open 3217 until we process your cancellation. We'll close it automatically when 3218 done. Thank you!" 3219 <img decoding="async" 3220 src="https://churnsolution.com/wp-content/uploads/2024/10/google_form_msg.png" 3221 alt="Google Form Code" 3222 height="auto" 3223 width="550" 3224 style="border-radius: 12px; display: block" 3225 /> 3226 </li> 3227 </ol> 3228 <p> 3229 Now you can easily integrate this Google Form into your cancellation 3230 flow. 3231 </p> 3232 </div> 3233 </div> 3234</div> 3235<div class="alignright chr-docs-table-of-contents"> 3236 <div class="chr-table-contents-container"> 3237 <p class="chr-table-header">On This Page</p> 3238 <div class="chr-docs-table-content"> 3239 <div> 3240 <a href="#chr-3-steps" class="chr-main-section" 3241 >2 Simple Steps to Get Started</a 3242 > 3243 <a href="#chr-insert-embed" class="chr-sub-section" 3244 >Step 1: Place the embed code
3245 <span style="display: block">and launch snippet</span></a 3246 > 3247 <a href="#chr-generate-hash" class="chr-sub-section" 3248 >Step 2: Generate Security 3249 <span style="display: inline-block">Token</span></a 3250 > 3251 </div> 3252 <hr /> 3253 <div> 3254 <a href="#chr-config-options" class="chr-main-section" 3255 >Configuration Options</a 3256 > 3257 <a href="#chr-sdk-options" class="chr-sub-section">SDK Options</a> 3258 <a href="#chr-session-font" class="chr-sub-section">Add Custom Fonts</a> 3259 <a href="#chr-session-recording" class="chr-sub-section" 3260 >Enable/Disable Session 3261 <span style="display: block">Recording</span></a 3262 > 3263 <a href="#chr-cancellation-settings" class="chr-sub-section" 3264 >Set Cancellation Term</a 3265 > 3266 <a href="#chr-renewal-settings" class="chr-sub-section" 3267 >Subscription Renewal Configuration</a 3268 > 3269 <a href="#chr-unpause-settings" class="chr-sub-section" 3270 >Resume Configuration</a 3271 > 3272 <a href="#chr-pause-flow" class="chr-sub-section">Pause Flow</a> 3273 <a href="#chr-customer-attributes" class="chr-sub-section" 3274 >Customer Attributes</a 3275 > 3276 <a href="#chr-customer-attributes-meta" class="chr-sub-section" 3277 >Customer Segmentation based 3278 <span style="display: inline-block">on Metadata</span></a 3279 > 3280 <a href="#chr-custom-callbacks" class="chr-sub-section" 3281 >Custom Callbacks</a 3282 > 3283 <a href="#chr-custom-texts" class="chr-sub-section" 3284 >Custom Texts & 3285 <span style="display: block">Multi-language Support</span></a 3286 > 3287 <a href="#chr-google-form-configuration" class="chr-sub-section" 3288 >Integrating Google Form into Cancellation Confirmation</a 3289 > 3290 </div> 3291 </div> 3292 </div> 3293</div>
vendor: 110 bytes, lines 3293-3294
3293 3294<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
3294<script> 3295function copyLink(t){let c=document.getElementById(`${t}-img`),e=document.getElementById(t);navigator.clipboard.writeText(e.innerText),c.src="https://churnsolution.com/wp-content/uploads/2024/03/copied.png",setTimeout(()=>{c.src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png"},3e3)}var addClassOnScroll=function(){var t=$(window).scrollTop();let c=[...document.querySelectorAll(".chr-docs-table-content a"),].map(t=>t.hash.replace(/#/g,""));$("div[id]").each(function(e,s){var a=$(s).offset().top,i=$(this).outerHeight(!0),l=$(s).attr("id");c.includes(l)&&t>a-80&&t<a+i&&($(".chr-docs-table-content a.active").removeClass("active"),$(".chr-docs-table-content a[href='#"+l+"']").addClass("active"),$(".chr-docs-table-content a.active").siblings(":first-child").addClass("active"))});let e=$(".chr-docs-table-content a.active");if(!e||e.length<1){let s=$(".chr-sub-section").first();s.addClass("active"),s.siblings(":first-child").addClass("active")}};$(function(){addClassOnScroll(),$(window).on("scroll",function(){addClassOnScroll()}),$(".chr-docs-table-content a").each(function(t,c){$(c).click(function(){setTimeout(()=>{$(this).siblings().each(function(t,c){$(c).removeClass("active")}),$(this).addClass("active"),$(this).siblings(":first-child").addClass("active")},600)})})}); 3296</script>
3296 3297 3298 3299<style> 3300.chr-auth-panel-action,.chr-auth-panel-tab{font-weight:500;white-space:nowrap;cursor:pointer}.chr-step-optional{display:inline-block;margin-left:8px;padding:2px 8px;border-radius:6px;background-color:#e6f0f3;color:#9eb9c2;font-size:12px;font-weight:500;vertical-align:middle}.chr-auth-panel-action,.chr-auth-panel-tab{font-size:14px;color:#9eb9c2;background:0 0}.chr-auth-panel{margin:16px 0}.chr-auth-panel-controls{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:16px}.chr-auth-panel-select{-webkit-appearance:none;-moz-appearance:none;appearance:none;min-width:200px;padding:9px 34px 9px 12px;border:1px solid #e6f0f3;border-radius:8px;background-color:#fff;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8' fill='none'%3E%3Cpath d='M1 1.5 6 6.5l5-5' stroke='%230f124d' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 12px center;color:#0f124d;font-size:14px;line-height:1.4;cursor:pointer}.chr-auth-panel-frame,.chr-auth-panel-select:hover{background-color:#f7fafb}.chr-auth-panel-select:focus{outline:0;border-color:#c9d7dc}.chr-auth-panel-frame{border:1px solid #e6f0f3;border-radius:12px;overflow:hidden}.chr-auth-panel-bar{display:flex;align-items:stretch;gap:8px;padding-right:4px;border-bottom:1px solid #e6f0f3;background-color:#fff}.chr-auth-panel-tabs{display:flex;flex:1;min-width:0;overflow-x:auto;-ms-overflow-style:none;scrollbar-width:none}.chr-auth-panel-tabs::-webkit-scrollbar{display:none}.chr-auth-panel-spacer{flex:1}.chr-auth-panel-tab{flex-shrink:0;padding:10px 12px;border:none;border-bottom:2px solid transparent;border-radius:0}.chr-auth-panel-tab:hover{color:#0f124d}.chr-auth-panel-tab.active{border-bottom-color:#0f124d;color:#0f124d;font-weight:700}.chr-auth-panel-actions{display:flex;flex-shrink:0;align-self:center;gap:4px}.chr-auth-panel-action{display:flex;align-items:center;gap:6px;padding:6px 8px;border:none;border-radius:6px}.chr-auth-panel-action:hover{background-color:#f7fafb;color:#0f124d}.chr-auth-panel-action:focus{outline:0}.chr-auth-panel-action svg{min-width:13px}.chr-auth-panel-body{padding:8px;overflow:auto;font-size:16px}.chr-auth-panel-body code[class*=language-],.chr-auth-panel-body pre[class*=language-]{margin:0;padding:0;background:0 0}.chr-launch-diff{display:flex;align-items:flex-start;gap:12px;margin:8px 0 16px}.chr-launch-diff-side{flex:1;min-width:0}.chr-docs-content .chr-launch-diff-label{margin:0 0 4px!important;color:#9eb9c2!important;font-size:11px!important;letter-spacing:.5px;text-transform:uppercase}.chr-launch-diff-arrow{padding-top:32px;color:#9eb9c2;font-size:18px}@media (max-width:768px){.chr-auth-panel-body{font-size:12px}.chr-launch-diff{flex-direction:column}.chr-launch-diff-arrow{align-self:center;padding-top:0;transform:rotate(90deg)}}@media (max-width:480px){.chr-auth-panel button{width:auto}.chr-auth-panel-select{width:100%;min-width:0}} 3301</style>
3302<script> 3303window.CHR_AUTH_LANGUAGES=[{label:"Node.js",frameworks:[{label:"Express",language:"javascript",extension:"js",snippets:[{label:"",code:"const CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\napp.post('/churnsolution/auth-key', (req, res) => {\n const { subscriptionExternalId } = req.body;\n const authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n res.json({ auth_key: authKey });\n});\n\nfunction getSha256HmacHash(secretKey, subscriptionExternalId) {\n return createHmac('sha256', secretKey).update(subscriptionExternalId).digest('hex');\n}"},]},{label:"Fastify",language:"javascript",extension:"js",snippets:[{label:"",code:"const CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\napp.post('/churnsolution/auth-key', async (request) => {\n const { subscriptionExternalId } = request.body;\n const authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n return { auth_key: authKey };\n});\n\nfunction getSha256HmacHash(secretKey, subscriptionExternalId) {\n return createHmac('sha256', secretKey).update(subscriptionExternalId).digest('hex');\n}"},]},{label:"NestJS",language:"typescript",extension:"ts",snippets:[{label:"",code:"private static readonly CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\n@Post('/churnsolution/auth-key')\ngenerateAuthKey(@Body('subscriptionExternalId') subscriptionExternalId: string) {\n const authKey = ChurnSolutionController.getSha256HmacHash(\n ChurnSolutionController.CHURNSOLUTION_SECRET_KEY,\n subscriptionExternalId,\n );\n\n return { auth_key: authKey };\n}\n\nprivate static getSha256HmacHash(secretKey: string, subscriptionExternalId: string): string {\n return createHmac('sha256', secretKey).update(subscriptionExternalId).digest('hex');\n}"},]},{label:"Koa",language:"javascript",extension:"js",snippets:[{label:"",code:"const CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\nrouter.post('/churnsolution/auth-key', (ctx) => {\n const { subscriptionExternalId } = ctx.request.body;\n const authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n ctx.body = { auth_key: authKey };\n});\n\nfunction getSha256HmacHash(secretKey, subscriptionExternalId) {\n return createHmac('sha256', secretKey).update(subscriptionExternalId).digest('hex');\n}"},]},{label:"Hapi",language:"javascript",extension:"js",snippets:[{label:"",code:"const CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\nserver.route({\n method: 'POST',\n path: '/churnsolution/auth-key',\n handler: (request) => {\n const { subscriptionExternalId } = request.payload;\n const authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n return { auth_key: authKey };\n },\n});\n\nfunction getSha256HmacHash(secretKey, subscriptionExternalId) {\n return createHmac('sha256', secretKey).update(subscriptionExternalId).digest('hex');\n}"},]},{label:"Next.js",language:"typescript",extension:"ts",snippets:[{label:"App Router",code:"const CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\nexport async function POST(request: Request) {\n const { subscriptionExternalId } = await request.json();\n const authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n return NextResponse.json({ auth_key: authKey });\n}\n\nfunction getSha256HmacHash(secretKey: string, subscriptionExternalId: string): string {\n return createHmac('sha256', secretKey).update(subscriptionExternalId).digest('hex');\n}"},{label:"Pages Router",code:"const CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\nexport default function handler(req: NextApiRequest, res: NextApiResponse) {\n const { subscriptionExternalId } = req.body;\n const authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n res.status(200).json({ auth_key: authKey });\n}\n\nfunction getSha256HmacHash(secretKey: string, subscriptionExternalId: string): string {\n return createHmac('sha256', secretKey).update(subscriptionExternalId).digest('hex');\n}"},]},{label:"node:http",language:"javascript",extension:"js",snippets:[{label:"",code:"const CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\nfunction handleAuthKey(req, res) {\n let body = '';\n req.on('data', (chunk) =>
3303 {\n body += chunk;\n if (body.length > 1e4) req.destroy();\n });\n\n req.on('end', () => {\n const { subscriptionExternalId } = JSON.parse(body);\n const authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ auth_key: authKey }));\n });\n}\n\nfunction getSha256HmacHash(secretKey, subscriptionExternalId) {\n return createHmac('sha256', secretKey).update(subscriptionExternalId).digest('hex');\n}"},]},]},{label:"Python",frameworks:[{label:"Flask",language:"python",extension:"py",snippets:[{label:"",code:'CHURNSOLUTION_SECRET_KEY = "YOUR_SECRET_KEY"\n\n\[email protected]("/churnsolution/auth-key")\ndef generate_auth_key():\n subscription_external_id = request.json["subscriptionExternalId"]\n auth_key = get_sha256_hmac_hash(CHURNSOLUTION_SECRET_KEY, subscription_external_id)\n\n return jsonify(auth_key=auth_key)\n\n\ndef get_sha256_hmac_hash(secret_key: str, subscription_external_id: str) -> str:\n return hmac.new(\n secret_key.encode(),\n subscription_external_id.encode(),\n hashlib.sha256,\n ).hexdigest()'},]},{label:"FastAPI",language:"python",extension:"py",snippets:[{label:"",code:'CHURNSOLUTION_SECRET_KEY = "YOUR_SECRET_KEY"\n\n\[email protected]("/churnsolution/auth-key")\nasync def generate_auth_key(subscription_external_id: str = Body(alias="subscriptionExternalId")):\n auth_key = get_sha256_hmac_hash(CHURNSOLUTION_SECRET_KEY, subscription_external_id)\n\n return {"auth_key": auth_key}\n\n\ndef get_sha256_hmac_hash(secret_key: str, subscription_external_id: str) -> str:\n return hmac.new(\n secret_key.encode(),\n subscription_external_id.encode(),\n hashlib.sha256,\n ).hexdigest()'},]},{label:"Django",language:"python",extension:"py",snippets:[{label:"",code:'CHURNSOLUTION_SECRET_KEY = "YOUR_SECRET_KEY"\n\n\n@require_POST\ndef generate_auth_key(request):\n subscription_external_id = json.loads(request.body)["subscriptionExternalId"]\n auth_key = get_sha256_hmac_hash(CHURNSOLUTION_SECRET_KEY, subscription_external_id)\n\n return JsonResponse({"auth_key": auth_key})\n\n\ndef get_sha256_hmac_hash(secret_key: str, subscription_external_id: str) -> str:\n return hmac.new(\n secret_key.encode(),\n subscription_external_id.encode(),\n hashlib.sha256,\n ).hexdigest()'},]},{label:"Django REST Framework",language:"python",extension:"py",snippets:[{label:"",code:'CHURNSOLUTION_SECRET_KEY = "YOUR_SECRET_KEY"\n\n\n@api_view(["POST"])\n@permission_classes([IsAuthenticated])\ndef generate_auth_key(request):\n subscription_external_id = request.data["subscriptionExternalId"]\n auth_key = get_sha256_hmac_hash(CHURNSOLUTION_SECRET_KEY, subscription_external_id)\n\n return Response({"auth_key": auth_key})\n\n\ndef get_sha256_hmac_hash(secret_key: str, subscription_external_id: str) -> str:\n return hmac.new(\n secret_key.encode(),\n subscription_external_id.encode(),\n hashlib.sha256,\n ).hexdigest()'},]},{label:"Tornado",language:"python",extension:"py",snippets:[{label:"",code:'CHURNSOLUTION_SECRET_KEY = "YOUR_SECRET_KEY"\n\n\nclass ChurnSolutionAuthKeyHandler(tornado.web.RequestHandler):\n def post(self):\n subscription_external_id = json.loads(self.request.body)["subscriptionExternalId"]\n auth_key = get_sha256_hmac_hash(CHURNSOLUTION_SECRET_KEY, subscription_external_id)\n\n self.write({"auth_key": auth_key})\n\n\ndef get_sha256_hmac_hash(secret_key: str, subscription_external_id: str) -> str:\n return hmac.new(\n secret_key.encode(),\n subscription_external_id.encode(),\n hashlib.sha256,\n ).hexdigest()'},]},]},{label:"PHP",frameworks:[{label:"Laravel",language:"php",extension:"php",snippets:[{label:"",code:"private const CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\npublic function generateAuthKey(Request $request): JsonResponse\n{\n $subscriptionExternalId = $request->input('subscriptionExternalId');\n $authKey = self::getSha256HmacHash(self::CHURNSOLUTION_SECRET_KEY, $subscriptionExternalId);\n\n return response()->json(['auth_key' => $authKey]);\n}\n\nprivate static function getSha256HmacHash(string $secretKey, string $subscriptionExternalId): string\n{\n return hash_hmac('sha256', $subscriptionExternalId, $secretKey);\n}"},]},{label:"Symfony",language:"php",extension:"php",snippets:[{label:"",code:"private const CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\n#[Route('/churnsolution/auth-key', methods: ['POST'])]\npublic function generateAuthKey(Request $request): JsonResponse\n{\n $subscriptionExternalId = $request->getPayload()->getString('subscriptionExternalId');\n $authKey = self::getSha256HmacHash(self::CHURNSOLUTION_SECRET_KEY, $subscriptionExternalId);\n\n return $this->json(['auth_key' => $authKey]);\n}\n\nprivate static function getSha256HmacHash(string $secretKey, string $subscriptionExternalId): string\n{\n return hash_hmac('sha256', $subscriptionExternalId, $secretKey);\n}"},]},{label:"Slim 4",language:"php",extension:"php",snippets:[{label:"",code:"const CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\n$app->post('/churnsolution/auth-key', function (Request $request, Response $response): Response {\n $body = (array) $request->getParsedBody();\n $authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, $body['subscriptionExternalId']);\n\n $response->getBody()->write(json_encode(['auth_key' =>
3303 $authKey], JSON_THROW_ON_ERROR));\n\n return $response->withHeader('Content-Type', 'application/json');\n});\n\nfunction getSha256HmacHash(string $secretKey, string $subscriptionExternalId): string\n{\n return hash_hmac('sha256', $subscriptionExternalId, $secretKey);\n}"},]},{label:"CodeIgniter 4",language:"php",extension:"php",snippets:[{label:"",code:"private const CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\npublic function generateAuthKey()\n{\n $subscriptionExternalId = $this->request->getJsonVar('subscriptionExternalId');\n $authKey = self::getSha256HmacHash(self::CHURNSOLUTION_SECRET_KEY, $subscriptionExternalId);\n\n return $this->respond(['auth_key' => $authKey]);\n}\n\nprivate static function getSha256HmacHash(string $secretKey, string $subscriptionExternalId): string\n{\n return hash_hmac('sha256', $subscriptionExternalId, $secretKey);\n}"},]},{label:"WordPress",language:"php",extension:"php",snippets:[{label:"",code:"const CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\nfunction churnsolution_generate_auth_key(WP_REST_Request $request): array\n{\n $subscription_external_id = $request->get_param('subscriptionExternalId');\n $auth_key = churnsolution_get_sha256_hmac_hash(\n CHURNSOLUTION_SECRET_KEY,\n $subscription_external_id,\n );\n\n return ['auth_key' => $auth_key];\n}\n\nfunction churnsolution_get_sha256_hmac_hash(string $secret_key, string $subscription_external_id): string\n{\n return hash_hmac('sha256', $subscription_external_id, $secret_key);\n}"},]},{label:"No framework",language:"php",extension:"php",snippets:[{label:"",code:"const CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\nheader('Content-Type: application/json');\n\n$body = json_decode(file_get_contents('php://input') ?: '{}', true);\n$authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, $body['subscriptionExternalId']);\n\necho json_encode(['auth_key' => $authKey], JSON_THROW_ON_ERROR);\n\nfunction getSha256HmacHash(string $secretKey, string $subscriptionExternalId): string\n{\n return hash_hmac('sha256', $subscriptionExternalId, $secretKey);\n}"},]},]},{label:"Java",frameworks:[{label:"Spring Boot",language:"java",extension:"java",snippets:[{label:"",code:'private static final String CHURNSOLUTION_SECRET_KEY = "YOUR_SECRET_KEY";\n\n@PostMapping("/churnsolution/auth-key")\npublic ResponseEntity<Map<String, String>> generateAuthKey(String subscriptionExternalId)\n throws NoSuchAlgorithmException, InvalidKeyException {\n String authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n return ResponseEntity.ok(Map.of("auth_key", authKey));\n}\n\nprivate static String getSha256HmacHash(String secretKey, String subscriptionExternalId)\n throws NoSuchAlgorithmException, InvalidKeyException {\n Mac sha256HMAC = Mac.getInstance("HmacSHA256");\n SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256");\n sha256HMAC.init(secretKeySpec);\n\n byte[] hash = (sha256HMAC.doFinal(subscriptionExternalId.getBytes()));\n StringBuffer result = new StringBuffer();\n for (byte b : hash) {\n result.append(String.format("%02x", b));\n }\n return result.toString();\n}'},]},{label:"Jakarta EE / JAX-RS",language:"java",extension:"java",snippets:[{label:"",code:'private static final String CHURNSOLUTION_SECRET_KEY = "YOUR_SECRET_KEY";\n\n@POST\n@Path("/churnsolution/auth-key")\n@Produces(MediaType.APPLICATION_JSON)\npublic Response generateAuthKey(@QueryParam("subscriptionExternalId") String subscriptionExternalId)\n throws NoSuchAlgorithmException, InvalidKeyException {\n String authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n return Response.ok(Map.of("auth_key", authKey)).build();\n}\n\nprivate static String getSha256HmacHash(String secretKey, String subscriptionExternalId)\n throws NoSuchAlgorithmException, InvalidKeyException {\n Mac sha256HMAC = Mac.getInstance("HmacSHA256");\n SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256");\n sha256HMAC.init(secretKeySpec);\n\n byte[] hash = (sha256HMAC.doFinal(subscriptionExternalId.getBytes()));\n StringBuffer result = new StringBuffer();\n for (byte b : hash) {\n result.append(String.format("%02x", b));\n }\n return result.toString();\n}'},]},{label:"Micronaut",language:"java",extension:"java",snippets:[{label:"",code:'private static final Str
3303ing CHURNSOLUTION_SECRET_KEY = "YOUR_SECRET_KEY";\n\n@Post("/churnsolution/auth-key")\npublic HttpResponse<Map<String, String>> generateAuthKey(@QueryValue String subscriptionExternalId)\n throws NoSuchAlgorithmException, InvalidKeyException {\n String authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n return HttpResponse.ok(Map.of("auth_key", authKey));\n}\n\nprivate static String getSha256HmacHash(String secretKey, String subscriptionExternalId)\n throws NoSuchAlgorithmException, InvalidKeyException {\n Mac sha256HMAC = Mac.getInstance("HmacSHA256");\n SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256");\n sha256HMAC.init(secretKeySpec);\n\n byte[] hash = (sha256HMAC.doFinal(subscriptionExternalId.getBytes()));\n StringBuffer result = new StringBuffer();\n for (byte b : hash) {\n result.append(String.format("%02x", b));\n }\n return result.toString();\n}'},]},{label:"Javalin",language:"java",extension:"java",snippets:[{label:"",code:'private static final String CHURNSOLUTION_SECRET_KEY = "YOUR_SECRET_KEY";\n\napp.post("/churnsolution/auth-key", ctx -> {\n String subscriptionExternalId = ctx.formParam("subscriptionExternalId");\n String authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n ctx.json(Map.of("auth_key", authKey));\n});\n\nprivate static String getSha256HmacHash(String secretKey, String subscriptionExternalId)\n throws NoSuchAlgorithmException, InvalidKeyException {\n Mac sha256HMAC = Mac.getInstance("HmacSHA256");\n SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256");\n sha256HMAC.init(secretKeySpec);\n\n byte[] hash = (sha256HMAC.doFinal(subscriptionExternalId.getBytes()));\n StringBuffer result = new StringBuffer();\n for (byte b : hash) {\n result.append(String.format("%02x", b));\n }\n return result.toString();\n}'},]},{label:"Spark Java",language:"java",extension:"java",snippets:[{label:"",code:'private static final String CHURNSOLUTION_SECRET_KEY = "YOUR_SECRET_KEY";\n\npost("/churnsolution/auth-key", (req, res) -> {\n res.type("application/json");\n\n String subscriptionExternalId = req.queryParams("subscriptionExternalId");\n String authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n return new Gson().toJson(Map.of("auth_key", authKey));\n});\n\nprivate static String getSha256HmacHash(String secretKey, String subscriptionExternalId)\n throws NoSuchAlgorithmException, InvalidKeyException {\n Mac sha256HMAC = Mac.getInstance("HmacSHA256");\n SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256");\n sha256HMAC.init(secretKeySpec);\n\n byte[] hash = (sha256HMAC.doFinal(subscriptionExternalId.getBytes()));\n StringBuffer result = new StringBuffer();\n for (byte b : hash) {\n result.append(String.format("%02x", b));\n }\n return result.toString();\n}'},]},]},{label:"Go",frameworks:[{label:"net/http",language:"go",extension:"go",snippets:[{label:"",code:'const churnsolutionSecretKey = "YOUR_SECRET_KEY"\n\nfunc generateAuthKey(w http.ResponseWriter, r *http.Request) {\n var body struct {\n SubscriptionExternalID string `json:"subscriptionExternalId"`\n }\n if err := json.NewDecoder(r.Body).Decode(&body); err != nil {\n http.Error(w, `{"error":"invalid JSON body"}`, http.StatusBadRequest)\n return\n }\n\n authKey := getSha256HmacHash(churnsolutionSecretKey, body.SubscriptionExternalID)\n\n w.Header().Set("Content-Type", "application/json")\n _ = json.NewEncoder(w).Encode(map[string]string{"auth_key": authKey})\n}\n\nfunc getSha256HmacHash(secretKey string, subscriptionExternalID string) string {\n sha256HMAC := hmac.New(sha256.New, []byte(secretKey))\n sha256HMAC.Write([]byte(subscriptionExternalID))\n\n return hex.EncodeToString(sha256HMAC.Sum(nil))\n}'},]},{label:"Gin",language:"go",extension:"go",snippets:[{label:"",code:'const churnsolutionSecretKey = "YOUR_SECRET_KEY"\n\nfunc generateAuthKey(c *gin.Context) {\n var body struct {\n SubscriptionExternalID string `json:"subscriptionExternalId" binding:"required"`\n }\n if err := c.ShouldBindJSON(&body); err != nil {\n c.JSON(http.StatusBadRequest, gin.H{"error": "subscriptionExternalId is required"})\n return\n }\n\n authKey := getSha256HmacHash(churnsolutionSecretKey, body.SubscriptionExternalID)\n\n c.JSON(http.StatusOK, gin.H{"auth_key": authKey})\n}\n\nfunc getSha256HmacHash(secretKey string, subscriptionExternalID string) string {\n sha256HMAC := hmac.New(sha256.New, []byte(secretKey))\n sha256HMAC.Write([]byte(subscriptionExternalID))\n\n return hex.EncodeToString(sha256HMAC.Sum(nil))\n}'},]},{label:"Echo",language:"go",extension:"go",snippets:[{label:"",code:'const churnsolutionSecretKey = "YOUR_SECRET_KEY"\n\nfunc generateAuthKey(c echo.Context) error {\n var body struct {\n SubscriptionExternalID string `json:"subscriptionExternalId"`\n }\n if err := c.Bind(&body); err != nil {\n return echo.NewHTTPError(http.StatusBadRequest, "invalid JSON body")\n }\n\n authKey := getSha256HmacHash(churnsolutionSecretKey, body.SubscriptionExternalID)\n\n return c.JSON(http.StatusOK, map[string]string{"auth_key": authKey})\n}\n\nfunc getSha256HmacHash(secretKey string, subscriptionExternalID string) string {\n sha256HMAC := hmac.New(sha256.New, []byte(secretKey))\n sha256HMAC.Write([]byte(subscriptionExternalID))\n\n return hex.EncodeToString(sha256HMAC.Sum(nil))\n}'},]},{label:"Fiber",language:"go",extension:"go",snippets:[{label:"",code:'const churnsolutionSecretKey = "YOUR_SECRET_KEY"\n\nfunc generateAuthKey(c *fiber.Ctx) error {\n var body struct {\n SubscriptionExternalID string `json:"subscriptionExternalId"`\n }\n if err := c.BodyParser(&body); err != nil {\n return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "invali
3303d JSON body"})\n }\n\n authKey := getSha256HmacHash(churnsolutionSecretKey, body.SubscriptionExternalID)\n\n return c.JSON(fiber.Map{"auth_key": authKey})\n}\n\nfunc getSha256HmacHash(secretKey string, subscriptionExternalID string) string {\n sha256HMAC := hmac.New(sha256.New, []byte(secretKey))\n sha256HMAC.Write([]byte(subscriptionExternalID))\n\n return hex.EncodeToString(sha256HMAC.Sum(nil))\n}'},]},{label:"Chi",language:"go",extension:"go",snippets:[{label:"",code:'const churnsolutionSecretKey = "YOUR_SECRET_KEY"\n\nfunc generateAuthKey(w http.ResponseWriter, r *http.Request) {\n var body struct {\n SubscriptionExternalID string `json:"subscriptionExternalId"`\n }\n if err := json.NewDecoder(r.Body).Decode(&body); err != nil {\n render.Status(r, http.StatusBadRequest)\n render.JSON(w, r, map[string]string{"error": "invalid JSON body"})\n return\n }\n\n authKey := getSha256HmacHash(churnsolutionSecretKey, body.SubscriptionExternalID)\n\n render.JSON(w, r, map[string]string{"auth_key": authKey})\n}\n\nfunc getSha256HmacHash(secretKey string, subscriptionExternalID string) string {\n sha256HMAC := hmac.New(sha256.New, []byte(secretKey))\n sha256HMAC.Write([]byte(subscriptionExternalID))\n\n return hex.EncodeToString(sha256HMAC.Sum(nil))\n}'},]},]},{label:"Ruby",frameworks:[{label:"Ruby on Rails",language:"ruby",extension:"rb",snippets:[{label:"",code:"CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY'.freeze\n\ndef generate_auth_key\n subscription_external_id = params.require(:subscriptionExternalId)\n auth_key = get_sha256_hmac_hash(CHURNSOLUTION_SECRET_KEY, subscription_external_id)\n\n render json: { auth_key: auth_key }\nend\n\nprivate\n\ndef get_sha256_hmac_hash(secret_key, subscription_external_id)\n OpenSSL::HMAC.hexdigest('SHA256', secret_key, subscription_external_id)\nend"},]},{label:"Sinatra",language:"ruby",extension:"rb",snippets:[{label:"",code:"CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY'.freeze\n\npost '/churnsolution/auth-key' do\n content_type :json\n\n subscription_external_id = JSON.parse(request.body.read)['subscriptionExternalId']\n auth_key = get_sha256_hmac_hash(CHURNSOLUTION_SECRET_KEY, subscription_external_id)\n\n { auth_key: auth_key }.to_json\nend\n\ndef get_sha256_hmac_hash(secret_key, subscription_external_id)\n OpenSSL::HMAC.hexdigest('SHA256', secret_key, subscription_external_id)\nend"},]},{label:"Grape",language:"ruby",extension:"rb",snippets:[{label:"",code:"CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY'.freeze\n\nparams do\n requires :subscriptionExternalId, type: String, allow_blank: false\nend\npost '/churnsolution/auth-key' do\n auth_key = get_sha256_hmac_hash(CHURNSOLUTION_SECRET_KEY, params[:subscriptionExternalId])\n\n { auth_key: auth_key }\nend\n\nhelpers do\n def get_sha256_hmac_hash(secret_key, subscription_external_id)\n OpenSSL::HMAC.hexdigest('SHA256', secret_key, subscription_external_id)\n end\nend"},]},]},{label:"C#",frameworks:[{label:"ASP.NET Core",language:"csharp",extension:"cs",snippets:[{label:"",code:'private const string ChurnsolutionSecretKey = "YOUR_SECRET_KEY";\n\n[HttpPost("/churnsolution/auth-key")]\npublic IActionResult GenerateAuthKey([FromBody] AuthKeyRequest body)\n{\n string authKey = GetSha256HmacHash(ChurnsolutionSecretKey, body.SubscriptionExternalId);\n\n return Ok(new { auth_key = authKey });\n}\n\nprivate static string GetSha256HmacHash(string secretKey, string subscriptionExternalId)\n{\n using var sha256HMAC = new HMACSHA256(Encoding.UTF8.GetBytes(secretKey));\n byte[] hash = sha256HMAC.ComputeHash(Encoding.UTF8.GetBytes(subscriptionExternalId));\n\n var result = new StringBuilder();\n foreach (byte b in hash)\n {\n result.Append(b.ToString("x2"));\n }\n return result.ToString();\n}'},]},]},{label:"Kotlin",frameworks:[{label:"Ktor",language:"kotlin",extension:"kt",snippets:[{label:"",code:'const val CHURNSOLUTION_SECRET_KEY = "YOUR_SECRET_KEY"\n\npost("/churnsolution/auth-key") {\n val subscriptionExternalId = call.receiveParameters()["subscriptionExternalId"]!!\n val authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId)\n\n call.respond(mapOf("auth_key" to authKey))\n}\n\nfun getSha256HmacHash(secretKey: String, subscriptionExternalId: String): String {\n val sha256HMAC = Mac.getInstance("HmacSHA256")\n val secretKeySpec = SecretKeySpec(secretKey.toByteArray(), "HmacSHA256")\n sha256HMAC.init(secretKeySpec)\n\n val hash = sha256HMAC.doFinal(subscriptionExternalId.toByteArray())\n val result = StringBuilder()\n for (b in hash) {\n result.append("%02x".format(b))\n }\n return result.toString()\n}'},]},]},{label:"Rust",frameworks:[{label:"Axum",language:"rust",extension:"rs",snippets:[{label:"",code:'const CHURNSOLUTION_SECRET_KEY: &str = "YOUR_SECRET_KEY";\n\nasync fn generate_auth_key(Json(body): Json<AuthKeyRequest>) -> Json<Value> {\n let auth_key = get_sha256_hmac_hash(CHURNSOLUTION_SECRET_KEY, &body.subscription_external_id);\n\n Json(json!({ "auth_key": auth_key }))\n}\n\nfn get_sha256_hmac_hash(secret_key: &str, subscription_external_id: &str) -> String {\n let mut sha256_hmac = Hmac::<Sha256>::new_from_slice(secret_key.as_bytes())\n .expect("HMAC accepts a key of any length");\n sha256_hmac.update(subscription_external_id.as_bytes());\n\n hex::encode(sha256_hmac.finalize().into_bytes())\n}'},]},]},{label:"Elixir",frameworks:[{label:"Phoenix",language:"elixir",extension:"ex",snippets:[{label:"",code:'@churnsolution_secret_key "YOUR_SECRET_KEY"\n\ndef generate_auth_key(conn, %{"
3303subscriptionExternalId" => subscription_external_id}) do\n auth_key = get_sha256_hmac_hash(@churnsolution_secret_key, subscription_external_id)\n\n json(conn, %{auth_key: auth_key})\nend\n\ndefp get_sha256_hmac_hash(secret_key, subscription_external_id) do\n :crypto.mac(:hmac, :sha256, secret_key, subscription_external_id)\n |> Base.encode16(case: :lower)\nend'},]},]},{label:"Serverless & Edge",frameworks:[{label:"AWS Lambda",language:"javascript",extension:"js",snippets:[{label:"",code:"const CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\nexport const handler = async (event) => {\n const { subscriptionExternalId } = JSON.parse(event.body);\n const authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n return {\n statusCode: 200,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ auth_key: authKey }),\n };\n};\n\nfunction getSha256HmacHash(secretKey, subscriptionExternalId) {\n return createHmac('sha256', secretKey).update(subscriptionExternalId).digest('hex');\n}"},]},{label:"Deno",language:"typescript",extension:"ts",snippets:[{label:"",code:'const CHURNSOLUTION_SECRET_KEY = "YOUR_SECRET_KEY";\n\nasync function generateAuthKey(request: Request): Promise<Response> {\n const { subscriptionExternalId } = await request.json();\n const authKey = await getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n return Response.json({ auth_key: authKey });\n}\n\nasync function getSha256HmacHash(\n secretKey: string,\n subscriptionExternalId: string,\n): Promise<string> {\n const encoder = new TextEncoder();\n const key = await crypto.subtle.importKey(\n "raw",\n encoder.encode(secretKey),\n { name: "HMAC", hash: "SHA-256" },\n false,\n ["sign"],\n );\n const hash = await crypto.subtle.sign("HMAC", key, encoder.encode(subscriptionExternalId));\n\n return Array.from(new Uint8Array(hash))\n .map((b) => b.toString(16).padStart(2, "0"))\n .join("");\n}'},]},{label:"Bun",language:"typescript",extension:"ts",snippets:[{label:"",code:'const CHURNSOLUTION_SECRET_KEY = "YOUR_SECRET_KEY";\n\nasync function generateAuthKey(request: Request): Promise<Response> {\n const { subscriptionExternalId } = await request.json();\n const authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n return Response.json({ auth_key: authKey });\n}\n\nfunction getSha256HmacHash(secretKey: string, subscriptionExternalId: string): string {\n return createHmac("sha256", secretKey).update(subscriptionExternalId).digest("hex");\n}'},]},{label:"Cloudflare Workers",language:"typescript",extension:"ts",snippets:[{label:"",code:'const CHURNSOLUTION_SECRET_KEY = "YOUR_SECRET_KEY";\n\nasync function generateAuthKey(request: Request): Promise<Response> {\n const { subscriptionExternalId } = await request.json<{ subscriptionExternalId: string }>();\n const authKey = await getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n return Response.json({ auth_key: authKey });\n}\n\nasync function getSha256HmacHash(\n secretKey: string,\n subscriptionExternalId: string,\n): Promise<string> {\n const encoder = new TextEncoder();\n const key = await crypto.subtle.importKey(\n "raw",\n encoder.encode(secretKey),\n { name: "HMAC", hash: "SHA-256" },\n false,\n ["sign"],\n );\n const hash = await crypto.subtle.sign("HMAC", key, encoder.encode(subscriptionExternalId));\n\n return [...new Uint8Array(hash)].map((b) => b.toString(16).padStart(2, "0")).join("");\n}'},]},]},],function(){var e=window.CHR_AUTH_LANGUAGES;if(e){var n='<svg width="12" height="14" viewBox="0 0 12 14" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8 0H1a1 1 0 0 0-1 1v9h1.5V1.5H8V0zm2.5 2.5h-7a1 1 0 0 0-1 1V13a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V3.5a1 1 0 0 0-1-1zM10 12.5H4V4h6v8.5z" fill="currentColor"/></svg>',t='<svg width="13" height="13" viewBox="0 0 13 13" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M6.5 0v8m0 0L3.5 5m3 3 3-3M1 10.5v1a1 1 0 0 0 1 1h9a1 1 0 0 0 1-1v-1" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/></svg>';"loading"===document.readyState?document.addEventListener("DOMContentLoaded",c):c()}function a(e,n){var t=document.createElement("option");return t.value=String(n),t.textContent=e,t}function s(e,n){e.innerHTML="";for(var t=0;t<n.length;t++)e.appendChild(a(n[t].label,t))}function r(e,n){var t=e.querySelector(".chr-auth-panel-action-label");if(t&&"1"!==e.dataset.flashing){var a=t.textContent;e.dataset.flashing="1",t.textContent=n,setTimeout(function(){t.textContent=a,e.dataset.flashing="0"},1e3)}}function i(e,n){var t=document.createElement("button");
3303return t.type="button",t.className="chr-auth-panel-action",t.title=e,t.setAttribute("aria-label",e),t.innerHTML=n+'<span class="chr-auth-panel-action-label">'+e+"</span>",t}function o(a){var o=0,c=0,u=0,h=document.createElement("select");h.className="chr-auth-panel-select",h.setAttribute("aria-label","Language"),s(h,e);var l=document.createElement("select");l.className="chr-auth-panel-select",l.setAttribute("aria-label","Framework");var p=document.createElement("div");p.className="chr-auth-panel-controls",p.appendChild(h),p.appendChild(l);var E=document.createElement("div");E.className="chr-auth-panel-tabs",E.setAttribute("role","tablist"),E.setAttribute("aria-label","Variants");var d=document.createElement("div");d.className="chr-auth-panel-spacer";var y=i("Copy",n),S=i("Download",t),g=document.createElement("div");g.className="chr-auth-panel-actions",g.appendChild(y),g.appendChild(S);var b=document.createElement("div");b.className="chr-auth-panel-bar",b.appendChild(E),b.appendChild(d),b.appendChild(g);var x=document.createElement("code"),H=document.createElement("pre");H.appendChild(x);var K=document.createElement("div");K.className="chr-auth-panel-body",K.appendChild(H);var R=document.createElement("div");function C(){return e[o].frameworks[c]}function m(){return C().snippets[u]}function I(){var e=C().snippets,n=e.length>1;E.innerHTML="",E.style.display=n?"":"none",d.style.display=n?"none":"",H.setAttribute("role",n?"tabpanel":"presentation"),n&&e.forEach(function(e,n){var t=document.createElement("button");t.type="button",t.className="chr-auth-panel-tab"+(n===u?" active":""),t.setAttribute("role","tab"),t.setAttribute("aria-selected",String(n===u)),t.textContent=e.label,t.addEventListener("click",function(){u=n,I(),O()}),E.appendChild(t)})}function O(){var e=C();x.className="language-"+e.language,x.textContent=m().code,setTimeout(()=>window.Prism?.highlightAll())}function T(){var n=e[o].frameworks;s(l,n),l.value=String(c),l.style.display=n.length>1?"":"none"}R.className="chr-auth-panel-frame",R.appendChild(b),R.appendChild(K),a.className="chr-auth-panel",a.innerHTML="",a.appendChild(p),a.appendChild(R),h.addEventListener("change",function(){o=Number(h.value),c=0,u=0,T(),I(),O()}),l.addEventListener("change",function(){c=Number(l.value),u=0,I(),O()}),y.addEventListener("click",function(){navigator.clipboard.writeText(m().code),r(y,"Copied")}),S.addEventListener("click",function(){var e,n,t,a;e=m().code,n="churnsolution-auth-key."+C().extension,t=URL.createObjectURL(new Blob([e],{type:"text/plain;charset=utf-8"})),(a=document.createElement("a")).href=t,a.download=n,document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(t),r(S,"Downloaded")}),T(),I(),O()}function c(){for(var e=document.querySelectorAll("[data-chr-auth-panel]"),n=0;n<e.length;n++)o(e[n])}}(); 3304</script>
3304 3305 3306 3307<style>code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}</style>
vendor: 6,291 bytes, line 3308
3308<script>var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(e){var n=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,r={},a={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof i?new i(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function e(n,t){var r,i;switch(t=t||{},a.util.type(n)){case"Object":if(i=a.util.objId(n),t[i])return t[i];for(var l in r={},t[i]=r,n)n.hasOwnProperty(l)&&(r[l]=e(n[l],t));return r;case"Array":return i=a.util.objId(n),t[i]?t[i]:(r=[],t[i]=r,n.forEach((function(n,a){r[a]=e(n,t)})),r);default:return n}},getLanguage:function(e){for(;e;){var t=n.exec(e.className);if(t)return t[1].toLowerCase();e=e.parentElement}return"none"},setLanguage:function(e,t){e.className=e.className.replace(RegExp(n,"gi"),""),e.classList.add("language-"+t)},currentScript:function(){if("undefined"==typeof document)return null;if(document.currentScript&&"SCRIPT"===document.currentScript.tagName)return document.currentScript;try{throw new Error}catch(r){var e=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(r.stack)||[])[1];if(e){var n=document.getElementsByTagName("script");for(var t in n)if(n[t].src==e)return n[t]}return null}},isActive:function(e,n,t){for(var r="no-"+n;e;){var a=e.classList;if(a.contains(n))return!0;if(a.contains(r))return!1;e=e.parentElement}return!!t}},languages:{plain:r,plaintext:r,text:r,txt:r,extend:function(e,n){var t=a.util.clone(a.languages[e]);for(var r in n)t[r]=n[r];return t},insertBefore:function(e,n,t,r){var i=(r=r||a.languages)[e],l={};for(var o in i)if(i.hasOwnProperty(o)){if(o==n)for(var s in t)t.hasOwnProperty(s)&&(l[s]=t[s]);t.hasOwnProperty(o)||(l[o]=i[o])}var u=r[e];return r[e]=l,a.languages.DFS(a.languages,(function(n,t){t===u&&n!=e&&(this[n]=l)})),l},DFS:function e(n,t,r,i){i=i||{};var l=a.util.objId;for(var o in n)if(n.hasOwnProperty(o)){t.call(n,o,n[o],r||o);var s=n[o],u=a.util.type(s);"Object"!==u||i[l(s)]?"Array"!==u||i[l(s)]||(i[l(s)]=!0,e(s,t,o,i)):(i[l(s)]=!0,e(s,t,null,i))}}},plugins:{},highlightAll:function(e,n){a.highlightAllUnder(document,e,n)},highlightAllUnder:function(e,n,t){var r={callback:t,container:e,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};a.hooks.run("before-highlightall",r),r.elements=Array.prototype.slice.apply(r.container.querySelectorAll(r.selector)),a.hooks.run("before-all-elements-highlight",r);for(var i,l=0;i=r.elements[l++];)a.highlightElement(i,!0===n,r.callback)},highlightElement:function(n,t,r){var i=a.util.getLanguage(n),l=a.languages[i];a.util.setLanguage(n,i);var o=n.parentElement;o&&"pre"===o.nodeName.toLowerCase()&&a.util.setLanguage(o,i);var s={element:n,language:i,grammar:l,code:n.textContent};function u(e){s.highlightedCode=e,a.hooks.run("before-insert",s),s.element.innerHTML=s.highlightedCode,a.hooks.run("after-highlight",s),a.hooks.run("complete",s),r&&r.call(s.element)}if(a.hooks.run("before-sanity-check",s),(o=s.element.parentElement)&&"pre"===o.nodeName.toLowerCase()&&!o.hasAttribute("tabindex")&&o.setAttribute("tabindex","0"),!s.code)return a.hooks.run("complete",s),void(r&&r.call(s.element));if(a.hooks.run("before-highlight",s),s.grammar)if(t&&e.Worker){var c=new Worker(a.filename);c.onmessage=function(e){u(e.data)},c.postMessage(JSON.stringify({language:s.language,code:s.code,immediateClose:!0}))}else u(a.highlight(s.code,s.grammar,s.language));else u(a.util.encode(s.code))},highlight:function(e,n,t){var r={code:e,grammar:n,language:t};if(a.hooks.run("before-tokenize",r),!r.grammar)throw new Error('The language "'+r.language+'" has no grammar.');return r.tokens=a.tokenize(r.code,r.grammar),a.hooks.run("after-tokenize",r),i.stringify(a.util.encode(r.tokens),r.language)},tokenize:function(e,n){var t=n.rest;if(t){for(var r in t)n[r]=t[r];delete n.rest}var a=new s;return u(a,a.head,e),o(e,a,n,a.head,0),function(e){for(var n=[],t=e.head.next;t!==e.tail;)n.push(t.value),t=t.next;return n}(a)},hooks:{all:{},add:function(e,n){var t=a.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=a.hooks.all[e];if(t&&t.length)for(var r,i=0;r=t[i++];)r(n)}},Token:i};function i(e,n,t,r){this.type=e,this.content=n,this.alias=t,this.length=0|(r||"").length}function l(e,n,t,r){e.lastIndex=n;var a=e.exec(t);if(a&&r&&a[1]){var i=a[1].length;a.index+=i,a[0]=a[0].slice(i)}return a}function o(e,n,t,r,s,g){for(var f in t)if(t.hasOwnProperty(f)&&t[f]){var h=t[f];h=Array.isArray(h)?h:[h];for(var d=0;d<h.length;++d){if(g&&g.cause==f+","+d)return;var v=h[d],p=v.inside,m=!!v.lookbehind,y=!!v.greedy,k=v.alias;if(y&&!v.pattern.global){var x=v.pattern.toString().match(/[imsuy]*$/)[0];v.pattern=RegExp(v.pattern.source,x+"g")}for(var b=v.pattern||v,w=r.next,A=s;w!==n.tail&&!(g&&A>=g.reach);A+=w.value.length,w=w.next){var P=w.value;if(n.length>e.length)return;if(!(P instanceof i)){var E,S=1;if(y){if(!(E=l(b,A,e,m))||E.index>=e.length)break;var L=E.index,O=E.index+E[0].length,C=A;for(C+=w.value.length;L>=C;)C+=(w=w.next).value.length;if(A=C-=w.value.length,w.value instanceof i)continue;for(var j=w;j!==n.tail&&(C<O||"string"==typeof j.value);j=j.next)S++,C+=j.value.length;S--,P=e.slice(A,C),E.index-=A}else if(!(E=l(b,0,P,m)))continue;L=E.index;var N=E[0],_=P.slice(0,L),M=P.slice(L+N.length),W=A+P.length;g&&W>g.reach&&(g.reach=W);var I=w.prev;if(_&&(I=u(n,I,_),A+=_.length),c(n,I,S),w=u(n,I,new i(f,p?a.tokenize(N,p):N,k,N)),M&&u(n,w,M),S>1){var T={cause:f+","+d,reach:W};o(e,n,t,w.prev,A,T),g&&T.reach>g.reach&&(g.reach=T.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function u(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function c(e,n,t){for(var r=n.next,a=0;a<t&&r!==e.tail;a++)r=r.next;n.next=r,r.prev=n,e.length-=a}if(e.Prism=a,i.stringify=function e(n,t){if("string"==typeof n)return n;if(Array.isArray(n)){var r="";
vendor: 4,184 bytes, lines 3308-3310
3308return n.forEach((function(n){r+=e(n,t)})),r}var i={type:n.type,content:e(n.content,t),tag:"span",classes:["token",n.type],attributes:{},language:t},l=n.alias;l&&(Array.isArray(l)?Array.prototype.push.apply(i.classes,l):i.classes.push(l)),a.hooks.run("wrap",i);var o="";for(var s in i.attributes)o+=" "+s+'="'+(i.attributes[s]||"").replace(/"/g,""")+'"';return"<"+i.tag+' class="'+i.classes.join(" ")+'"'+o+">"+i.content+"</"+i.tag+">"},!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener("message",(function(n){var t=JSON.parse(n.data),r=t.language,i=t.code,l=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),l&&e.close()}),!1),a):a;var g=a.util.currentScript();function f(){a.manual||a.highlightAll()}if(g&&(a.filename=g.src,g.hasAttribute("data-manual")&&(a.manual=!0)),!a.manual){var h=document.readyState;"loading"===h||"interactive"===h&&g&&g.defer?document.addEventListener("DOMContentLoaded",f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16)}return a}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); 3309Prism.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",(function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))})),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^<!\[CDATA\[|\]\]>$/i;var t={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:<!\\[CDATA\\[(?:[^\\]]|\\](?!\\]>))*\\]\\]>|(?!<!\\[CDATA\\[)[^])*?(?=</__>)".replace(/__/g,(function(){return a})),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml; 3310Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}
vendor: 4,227 bytes, lines 3310-3311
3310],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}; 3311Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp("((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/(?:(?:\\[(?:[^\\]\\\\\r\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}|(?:\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}v[dgimyus]{0,7})(?=(?:\\s|/\\*(?:[^*]|\\*(?!/))*\\*/)*(?:$|[\r\n,.;:})\\]]|//))"),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2}
3311)*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript; 3312!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_
3312CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",a={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},n={bash:a,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:n},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:a}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:n},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:n.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:n.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>
3312&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},a.inside=e.languages.bash;for(var s=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=n.variable[1].inside,i=0;i<s.length;i++)o[s[i]]=e.languages.bash[s[i]];e.languages.sh=e.languages.bash,e.languages.shell=e.languages.bash}(Prism); 3313!function(e){function n(e,n){return e.replace(/<<(\d+)>>/g,(function(e,s){return"(?:"+n[+s]+")"}))}function s(e,s,a){return RegExp(n(e,s),a||"")}function a(e,n){for(var s=0;s<n;s++)e=e.replace(/<<self>>/g,(function(){return"(?:"+e+")"}));return e.replace(/<<self>>/g,"[^\\s\\S]")}var t="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",r="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var d=l(r),p=RegExp(l(t+" "+r+" "+i+" "+o)),c=l(r+" "+i+" "+o),u=l(t+" "+r+" "+o),g=a("<(?:[^<>;=+\\-*/%&|^]|<<self>>)*>",2),b=a("\\((?:[^()]|<<self>>)*\\)",2),h="@?\\b[A-Za-z_]\\w*\\b",f=n("<<0>>(?:\\s*<<1>>)?",[h,g]),m=n("(?!<<0>>)<<1>>(?:\\s*\\.\\s*<<1>>)*",[c,f]),k="\\[\\s*(?:,\\s*)*\\]",y=n("<<0>>(?:\\s*(?:\\?\\s*)?<<1>>)*(?:\\s*\\?)?",[m,k]),w=n("[^,()<>[\\];=+\\-*/%&|^]|<<0>>|<<1>>|<<2>>",[g,b,k]),v=n("\\(<<0>>+(?:,<<0>>+)+\\)",[w]),x=n("(?:<<0>>|<<1>>)(?:\\s*(?:\\?\\s*)?<<2>>)*(?:\\s*\\?)?",[v,m,k]),$={keyword:p,punctuation:/[<>()?,.:[\]]/},_="'(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'",B='"(?:\\\\.|[^\\\\"\r\n])*"';e.languages.csharp=e.languages.extend("clike",{string:[{pattern:s("(^|[^$\\\\])<<0>>",['@"(?:""|\\\\[^]|[^\\\\"])*"(?!")']),lookbehind:!0,greedy:!0},{pattern:s("(^|[^@$\\\\])<<0>>",[B]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:s("(\\busing\\s+static\\s+)<<0>>(?=\\s*;)",[m]),lookbehind:!0,inside:$},{pattern:s("(\\busing\\s+<<0>>\\s*=\\s*)<<1>>(?=\\s*;)",[h,x]),lookbehind:!0,inside:$},{pattern:s("(\\busing\\s+)<<0>>(?=\\s*=)",[h]),lookbehind:!0},{pattern:s("(\\b<<0>>\\s+)<<1>>",[d,f]),lookbehind:!0,inside:$},{pattern:s("(\\bcatch\\s*\\(\\s*)<<0>>",[m]),lookbehind:!0,inside:$},{pattern:s("(\\bwhere\\s+)<<0>>",[h]),lookbehind:!0},{pattern:s("(\\b(?:is(?:\\s+not)?|as)\\s+)<<0>>",[y]),lookbehind:!0,inside:$},{pattern:s("\\b<<0>>(?=\\s+(?!<<1>>|with\\s*\\{)<<2>>(?:\\s*[=,;:{)\\]]|\\s+(?:in|when)\\b))",[x,u,h]),inside:$}],keyword:p,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:s("([(,]\\s*)<<0>>(?=\\s*:)",[h]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:s("(\\b(?:namespace|using)\\s+)<<0>>(?:\\s*\\.\\s*<<0>>)*(?=\\s*[;{])",[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:s("(\\b(?:default|sizeof|typeof)\\s*\\(\\s*(?!\\s))(?:[^()\\s]|\\s(?!\\s)|<<0>>)*(?=\\s*\\))",[b]),lookbehind:!0,alias:"class-name",inside:$},"return-type":{pattern:s("<<0>>(?=\\s+(?:<<1>>\\s*(?:=>|[({]|\\.\\s*this\\s*\\[)|this\\s*\\[))",[x,m]),inside:$,alias:"class-name"},"constructor-invocation":{pattern:s("(\\bnew\\s+)<<0>>(?=\\s*[[({])",[x]),lookbehind:!0,inside:$,alias:"class-name"},"generic-method":{pattern:s("<<0>>\\s*<<1>>(?=\\s*\\()",[h,g]),inside:{function:s("^<<0>>",[h]),generic:{pattern:RegExp(g),alias:"class-name",inside:$}}},"type-list":{pattern:s("\\b((?:<<0>>\\s+<<1>>|record\\s+<<1>>\\s*<<5>>|where\\s+<<2>>)\\s*:\\s*)(?:<<3>>|<<4>>|<<1>>\\s*<<5>>|<<6>>)(?:\\s*,\\s*(?:<<3>>|<<4>>|<<6>>))*(?=\\s*(?:where|[{;]|=>|$))",[d,f,h,x,p.source,b,"\\bnew\\s*\\(\\s*\\)"]),lookbehind:!0,inside:{"record-arguments":{pattern:s("(^(?!new\\s*\\()<<0>>\\s*)<<1>>",[f,b]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:p,"class-name":{pattern:RegExp(x),greedy:!0,inside:$},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var E=B+"|"+_,R=n("/(?![*/])|//[^\r\n]*[\r\n]|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>",[E]),z=a(n("[^\"'/()]|<<0>>|\\(<<self>>*\\)",[R]),2),S="\\b(?:assembly|event|field|method|module|param|property|return|type)\\b",j=n("<<0>>(?:\\s*\\(<<1>>*\\))?",[m,z]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:s("((?:^|[^\\s\\w>
3313)?])\\s*\\[\\s*)(?:<<0>>\\s*:\\s*)?<<1>>(?:\\s*,\\s*<<1>>)*(?=\\s*\\])",[S,j]),lookbehind:!0,greedy:!0,inside:{target:{pattern:s("^<<0>>(?=\\s*:)",[S]),alias:"keyword"},"attribute-arguments":{pattern:s("\\(<<0>>*\\)",[z]),inside:e.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var A=":[^}\r\n]+",F=a(n("[^\"'/()]|<<0>>|\\(<<self>>*\\)",[R]),2),P=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[F,A]),U=a(n("[^\"'/()]|/(?!\\*)|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>|\\(<<self>>*\\)",[E]),2),Z=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[U,A]);function q(n,a){return{interpolation:{pattern:s("((?:^|[^{])(?:\\{\\{)*)<<0>>",[n]),lookbehind:!0,inside:{"format-string":{pattern:s("(^\\{(?:(?![}:])<<0>>)*)<<1>>(?=\\}$)",[a,A]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:s('(^|[^\\\\])(?:\\$@|@\\$)"(?:""|\\\\[^]|\\{\\{|<<0>>|[^\\\\{"])*"',[P]),lookbehind:!0,greedy:!0,inside:q(P,F)},{pattern:s('(^|[^@\\\\])\\$"(?:\\\\.|\\{\\{|<<0>>|[^\\\\"{])*"',[Z]),lookbehind:!0,greedy:!0,inside:q(Z,U)}],char:{pattern:RegExp(_),greedy:!0}}),e.languages.dotnet=e.languages.cs=e.languages.csharp}(Prism); 3314Prism.languages.elixir={doc:{pattern:/@(?:doc|moduledoc)\s+(?:("""|''')[\s\S]*?\1|("|')(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2)/,inside:{attribute:/^@\w+/,string:/['"][\s\S]+/}},comment:{pattern:/#.*/,greedy:!0},regex:{pattern:/~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,greedy:!0},string:[{pattern:/~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,greedy:!0,inside:{}},{pattern:/("""|''')[\s\S]*?\1/,greedy:!0,inside:{}},{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{}}],atom:{pattern:/(^|[^:]):\w+/,lookbehind:!0,alias:"symbol"},module:{pattern:/\b[A-Z]\w*\b/,alias:"class-name"},"attr-name":/\b\w+\??:(?!:)/,argument:{pattern:/(^|[^&])&\d+/,lookbehind:!0,alias:"variable"},attribute:{pattern:/@\w+/,alias:"variable"},function:/\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|(?=\/\d))/,number:/\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,keyword:/\b(?:after|alias|and|case|catch|cond|def(?:callback|delegate|exception|impl|macro|module|n|np|p|protocol|struct)?|do|else|end|fn|for|if|import|not|or|quote|raise|require|rescue|try|unless|unquote|use|when)\b/,boolean:/\b(?:false|nil|true)\b/,operator:[/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,{pattern:/([^<])<(?!<)/,lookbehind:!0},{pattern:/([^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,%\[\]{}()]/},Prism.languages.elixir.string.forEach((function(e){e.inside={interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:Prism.languages.elixir}}}})); 3315Prism.languages.go=Prism.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),Prism.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete Prism.languages.go["class-name"]; 3316!function(e){var n=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;
vendor: 5,667 bytes, lines 3316-3319
3316?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,t="(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",s={pattern:RegExp("(^|[^\\w.])"+t+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[s,{pattern:RegExp("(^|[^\\w.])"+t+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()]|\\s*(?:\\[[\\s,]*\\]\\s*)?::\\s*new\\b)"),lookbehind:!0,inside:s.inside},{pattern:RegExp("(\\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\\s+)"+t+"[A-Z]\\w*\\b"),lookbehind:!0,inside:s.inside}],keyword:n,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":s,keyword:n,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp("(\\bimport\\s+)"+t+"(?:[A-Z]\\w*|\\*)(?=\\s*;)"),lookbehind:!0,inside:{namespace:s.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp("(\\bimport\\s+static\\s+)"+t+"(?:\\w+|\\*)(?=\\s*;)"),lookbehind:!0,alias:"static",inside:{namespace:s.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!<keyword>)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(/<keyword>/g,(function(){return n.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism); 3317!function(n){n.languages.kotlin=n.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete n.languages.kotlin["class-name"];var e={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:n.languages.kotlin}};n.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:e},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:e},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete n.languages.kotlin.string,n.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),n.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),n.languages.kt=n.languages.kotlin,n.languages.kts=n.languages.kotlin}(Prism); 3318!function(e){function n(e,n){return"___"+e.toUpperCase()+n+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(t,a,r,o){if(t.language===a){var c=t.tokenStack=[];t.code=t.code.replace(r,(function(e){if("function"==typeof o&&!o(e))return e;for(var r,i=c.length;-1!==t.code.indexOf(r=n(a,i));)++i;return c[i]=e,r})),t.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(t,a){if(t.language===a&&t.tokenStack){t.grammar=e.languages[a];var r=0,o=Object.keys(t.tokenStack);!function c(i){for(var u=0;u<i.length&&!(r>=o.length);u++){var g=i[u];if("string"==typeof g||g.content&&"string"==typeof g.content){var l=o[r],s=t.tokenStack[l],f="string"==typeof g?g:g.content,p=n(a,l),k=f.indexOf(p);if(k>-1){++r;var m=f.substring(0,k),d=new e.Token(a,e.tokenize(s,t.grammar),"language-"+a,s),h=f.substring(k+p.length),v=[];m&&v.push.apply(v,c([m])),v.push(d),h&&v.push.apply(v,c([h])),"string"==typeof g?i.splice.apply(i,[u,1].concat(v)):g.content=v}}else g.content&&c(g.content)}return i}(t.tokens)}}}})}(Prism); 3319!function(e){var a=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,t=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0}
vendor: 4,534 bytes, line 3319
3319,/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],i=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,n=/<?=>|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,s=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:a,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:i,operator:n,punctuation:s};var l={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},r=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;
3319|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:l}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:l}}];e.languages.insertBefore("php","variable",{string:r,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:a,string:r,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,number:i,operator:n,punctuation:s}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(a){/<\?/.test(a.code)&&e.languages["markup-templating"].buildPlaceholders(a,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)})),e.hooks.add("after-tokenize",(function(a){e.languages["markup-templating"].tokenizePlaceholders(a,"php")}))}(Prism); 3320Prism.languages.properties={comment:/^[ \t]*[#!].*$/m,value:{pattern:/(^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?: *[=:] *(?! )| ))(?:\\(?:\r\n|[\s\S])|[^\\\r\n])+/m,lookbehind:!0,alias:"attr-value"},key:{pattern:/^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?= *[=:]| )/m,alias:"attr-name"},punctuation:/[=:]/}; 3321Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern://,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python; 3322!function(e){e.languages.ruby=e.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===|<?=>|[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),e.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var n={pattern:/((?:^|[^\\])(?:\\{2}
3322)*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:e.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete e.languages.ruby.function;var t="(?:"+["([^a-zA-Z0-9\\s{(\\[<=])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","\\((?:[^()\\\\]|\\\\[^]|\\((?:[^()\\\\]|\\\\[^])*\\))*\\)","\\{(?:[^{}\\\\]|\\\\[^]|\\{(?:[^{}\\\\]|\\\\[^])*\\})*\\}","\\[(?:[^\\[\\]\\\\]|\\\\[^]|\\[(?:[^\\[\\]\\\\]|\\\\[^])*\\])*\\]","<(?:[^<>\\\\]|\\\\[^]|<(?:[^<>\\\\]|\\\\[^])*>)*>"].join("|")+")",i='(?:"(?:\\\\.|[^"\\\\\r\n])*"|(?:\\b[a-zA-Z_]\\w*|[^\\s\0-\\x7F]+)[?!]?|\\$.)';e.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp("%r"+t+"[egimnosux]{0,6}"),greedy:!0,inside:{interpolation:n,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:n,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp("(^|[^:]):"+i),lookbehind:!0,greedy:!0},{pattern:RegExp("([\r\n{(,][ \t]*)"+i+"(?=:(?!:))"),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),e.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp("%[qQiIwWs]?"+t),greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:n,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp("%x"+t),greedy:!0,inside:{interpolation:n,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:n,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete e.languages.ruby.string,e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),e.languages.rb=e.languages.ruby}(Prism); 3323!function(e){for(var a="/\\*(?:[^*/]|\\*(?!/)|/(?!\\*)|<self>)*\\*/",t=0;t<2;t++)a=a.replace(/<self>/g,(function(){return a}));a=a.replace(/<self>/g,(function(){return"[^\\s\\S]"})),e.languages.rust={comment:[{pattern:RegExp("(^|[^\\\\])"+a),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"}
3323,constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<<?=?|>>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(Prism); 3324!function(e){function n(e){return e.replace(/__/g,(function(){return"(?:[\\w-]+|'[^'\n\r]*'|\"(?:\\\\.|[^\\\\\"\r\n])*\")"}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n("(^[\t ]*\\[\\s*(?:\\[\\s*)?)__(?:\\s*\\.\\s*__)*(?=\\s*\\])"),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n("(^[\t ]*|[{,]\\s*)__(?:\\s*\\.\\s*__)*(?=\\s*=)"),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism); 3325!function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var s=e.languages.extend("typescript",{});delete s["class-name"],e.languages.typescript["class-name"].inside=s,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:s}}}}),e.languages.ts=e.languages.typescript}(Prism); 3326!function(e){var n=/[*&][^\s[\]{},]+/,r=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,t="(?:"+r.source+"(?:[ \t]+"+n.source+")?|"+n.source+"(?:[ \t]+"+r.source+")?)",a="(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-]<PLAIN>)(?:[ \t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*".replace(/<PLAIN>/g,(function(){return"[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]"})),d="\"(?:[^\"\\\\\r\n]|\\\\.)*\"|'(?:[^'\\\\\r\n]|\\\\.)*'";function o(e,n){n=(n||"").replace(/m/g,"")+"m";var r="([:\\-,[{]\\s*(?:\\s<<prop>>[ \t]+)?)(?:<<value>>)(?=[ \t]*(?:$|,|\\]|\\}|(?:[\r\n]\\s*)?#))".replace(/<<prop>>/g,(function(){return t})).replace(/<<value>>/g,(function(){return e}));return RegExp(r,n)}e.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<<prop>>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\\S[^\r\n]*(?:\\2[^\r\n]+)*)".replace(/<<prop>>/g,(function(){return t}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<<prop>>[ \t]+)?)<<key>>(?=\\s*:\\s)".replace(/<<prop>>/g,(function(){return t})).replace(/<<key>>/g,(function(){return"(?:"+a+"|"+d+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:o("false|true","i"),lookbehind:!0,alias:"important"},null:{pattern:o("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:o(d),lookbehind:!0,greedy:!0},number:{pattern:o("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:r,important:n,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism);</script>
3326 3327</div> 3328 3329 3330 3331</div><!-- .entry-content .clear --> 3332 3333 3334 3335</article><!-- #post-## --> 3336 3337 </main><!-- #main --> 3338 3339 3340 </div><!-- #primary --> 3341 3342 3343 </div> <!-- ast-container --> 3344 </div><!-- #content --> 3345<footer 3346class="site-footer" id="colophon" itemtype="https://schema.org/WPFooter" itemscope="itemscope" itemid="#colophon"> 3347 </footer><!-- #colophon --> 3348 </div><!-- #page -->
3349<script type="speculationrules"> 3350{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/astra-child/*","/wp-content/themes/astra/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} 3351</script>
vendor: 1 bytes, line 3351
3351
3352<script type="text/javascript"> 3353_linkedin_partner_id = "6342346"; 3354window._linkedin_data_partner_ids = window._linkedin_data_partner_ids || []; 3355window._linkedin_data_partner_ids.push(_linkedin_partner_id); 3356</script>
3356<script type="text/javascript"> 3357(function(l) { 3358if (!l){window.lintrk = function(a,b){window.lintrk.q.push([a,b])}; 3359window.lintrk.q=[]} 3360var s = document.getElementsByTagName("script")[0]; 3361var b = document.createElement("script"); 3362b.type = "text/javascript";b.async = true; 3363b.src = "https://snap.licdn.com/li.lms-analytics/insight.min.js"; 3364s.parentNode.insertBefore(b, s);})(window.lintrk); 3365</script>
3365 3366<noscript> 3367<img height="1" width="1" style="display:none;" alt="" src="https://px.ads.linkedin.com/collect/?pid=6342346&fmt=gif" /> 3368</noscript><style> 3369.chr-chr-footer{display:flex;flex-direction:column;align-items:center;gap:24px;padding:32px;background-color:#0c0e3e;position:relative;overflow:hidden}.chr-chr-footer::after{content:"";position:absolute;top:-350px;right:-160px;width:572px;height:537px;background-image:url(https://wp-admin.churnsolution.online/wp-content/uploads/2023/10/footer-img-300x282.png);background-size:cover}.chr-chr-footer>*{position:relative;z-index:10}.chr-chr-footer-container{display:grid;align-items:flex-start;justify-content:space-between;grid-template-columns:minmax(0,0.8fr) auto minmax(0,1fr);width:100%;max-width:1400px;gap:32px}.chr-chr-footer-brand-section{display:flex;flex-direction:column;align-items:flex-start;gap:32px;max-width:300px}.chr-chr-footer-brand-content{display:flex;flex-direction:column;align-items:flex-start;gap:16px;color:#fff}.chr-chr-footer-logo{height:45px;aspect-ratio:191/35}.chr-chr-footer-tagline{font-weight:400;font-size:14px;letter-spacing:0;line-height:22.4px;margin:0}.chr-chr-footer-nav-heading,.chr-chr-footer-nav-link{letter-spacing:0;line-height:normal;white-space:nowrap}.chr-chr-footer-badge{width:100%;height:auto;object-fit:contain}.chr-chr-footer-navigation{display:flex;justify-content:center;align-items:start;gap:32px;max-width:100%}.chr-chr-footer-nav-column{display:flex;flex-direction:column;align-items:flex-start;max-width:fit-content;gap:24px}.chr-chr-footer-nav-heading{width:fit-content;margin:0;font-weight:500;color:#efc130;font-size:18px}.chr-chr-footer-nav-list{display:flex;flex-direction:column;align-items:flex-start;gap:12px;list-style:none;margin:0;padding:0}.chr-chr-footer-nav-list li{margin:0;padding:0}.chr-chr-footer-nav-link{display:block;font-weight:300!important;color:#fff!important;font-size:14px;text-decoration:none;cursor:pointer;transition:opacity .2s}.chr-chr-footer-copyright,.chr-chr-footer-stripe-text{margin:0;font-weight:400;font-size:14px;letter-spacing:0;line-height:21px}.chr-chr-footer-nav-link:hover,.chr-chr-footer-social-icon:hover{opacity:.8}.chr-chr-footer-social-group,.chr-chr-footer-social-section{display:flex;flex-direction:column;max-width:fit-content;align-items:flex-start;gap:16px}.chr-chr-footer-social-section{max-width:320px}.chr-chr-footer-stripe-text{color:#fff}.chr-chr-footer-stripe-badge{margin:0}.chr-chr-footer-social-links{display:flex;align-items:center;gap:16px;flex-wrap:wrap;width:100%}.chr-chr-footer-social-icon{width:24px;height:24px;display:inline-block;color:#fff!important;transition:opacity .2s}.chr-chr-footer-social-icon>svg{width:100%;margin-inline:auto}.chr-chr-footer-social-icon img{width:100%;height:100%;display:block}.chr-chr-footer-copyright{width:100%;color:#fff}@media (max-width:1400px){.chr-chr-footer-container{grid-template-columns:minmax(0,1fr);place-items:center}.chr-chr-footer-brand-content,.chr-chr-footer-brand-section,.chr-chr-footer-social-group{flex-direction:row;align-items:center}.chr-chr-footer-brand-section{max-width:none}.chr-chr-footer-social-section{align-items:center;text-align:center;max-width:none}.chr-chr-footer-nav-link{white-space:normal}.chr-chr-footer-brand-content{flex-wrap:wrap}.chr-chr-footer-social-links{justify-content:center}}@media (max-width:768px){.chr-chr-footer{padding:24px 16px}.chr-chr-footer-container{gap:32px}.chr-chr-footer-brand-section{max-width:none;min-width:100%;justify-content:space-between}.chr-chr-footer-brand-content{flex-direction:column;align-items:flex-start}.chr-chr-footer-logo{height:40px}.chr-chr-footer-navigation{gap:24px}.chr-chr-footer-nav-heading{font-size:16px}.chr-chr-footer-nav-link{font-size:12px}.chr-chr-footer-social-section{width:100%;max-width:100%}.chr-chr-footer-copyright{max-width:100%}}@media (max-width:640px){.chr-chr-footer-brand-section{flex-direction:column;align-items:center;text-align:center;min-width:0}.chr-chr-footer-brand-content{align-items:center}.chr-chr-footer-navigation{display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}.chr-chr-footer-nav-column,.chr-chr-footer-nav-list{align-items:center;text-align:center;margin-inline:auto}.chr-chr-footer-social-group{flex-direction:column}}@media (max-width:480px){.chr-chr-footer{padding:20px 16px}.chr-chr-footer-social-links{gap:12px}} 3370</style> 3371<footer class="chr-chr-footer"> 3372 <div class="chr-chr-footer-container"> 3373 <div class="chr-chr-footer-brand-section"> 3374 <div class="chr-chr-footer-brand-content"> 3375 <svg 3376 xmlns="http://www.w3.org/2000/svg" 3377 width="191" 3378 height="35"
3379 viewBox="0 0 191 35" 3380 fill="none" 3381 class="chr-chr-footer-logo" 3382 > 3383 <path 3384 d="M27.6906 25.7173L15.049 34.1841C14.749 34.3854 14.3947 34.4918 14.0327 34.4893C13.6708 34.4868 13.318 34.3756 13.0208 34.1701L0.772539 25.7187C0.534038 25.5543 0.339161 25.3348 0.204614 25.0791C0.070067 24.8234 -0.000140343 24.5391 2.10625e-07 24.2505V4.48388C-0.000130718 4.0875 0.13228 3.70232 0.376393 3.38898C0.620507 3.07565 0.962459 2.85194 1.34843 2.75308L10.2902 0.455122C12.5769 -0.132683 14.974 -0.151396 17.2697 0.40064L27.1147 2.76845C27.5069 2.86249 27.856 3.08501 28.1056 3.40021C28.3553 3.71541 28.4911 4.10497 28.4912 4.50623V24.2338C28.4911 24.5269 28.4186 24.8155 28.28 25.0742C28.1413 25.3329 27.9409 25.5538 27.6962 25.7173" 3385 fill="#EEBD23" 3386 ></path> 3387 <path 3388 d="M27.5474 10.6765H26.7313H26.0641V9.92776C26.0515 9.1371 26.0388 8.34643 26.022 7.55297C26.0091 7.46808 25.9792 7.38663 25.9341 7.31344C25.889 7.24025 25.8295 7.17682 25.7593 7.12691C18.9764 2.27256 9.5978 2.253 2.78401 7.06405C2.67423 7.12797 2.58397 7.22034 2.52287 7.3313C2.46176 7.44226 2.4321 7.56764 2.43707 7.69406C2.41319 10.4586 2.37105 13.2231 2.33594 15.9877C2.33594 16.1343 2.33594 16.2824 2.33594 16.4542H9.88293C9.91443 16.3982 9.9403 16.3393 9.96019 16.2782C10.1262 15.4969 10.5048 14.7759 11.0548 14.1941C11.6047 13.6122 12.3049 13.1918 13.0787 12.9787C13.8526 12.7656 14.6704 12.7681 15.443 12.9859C16.2155 13.2037 16.9131 13.6283 17.4594 14.2136C17.4774 14.233 17.4972 14.2508 17.5184 14.2666H19.9751C19.9091 14.1353 19.8571 14.0306 19.7981 13.9314C17.3077 9.6819 11.1176 9.71124 8.64828 13.9928C8.46989 14.3044 8.40809 14.4008 7.93473 14.4119C7.30547 14.4119 6.67058 14.4035 6.04552 14.4035H4.41757C4.41757 14.2164 4.41757 14.0976 4.41757 13.9775C4.44145 12.2676 4.47376 10.5578 4.47937 8.84653C4.46641 8.70508 4.49627 8.563 4.5651 8.43854C4.63392 8.31409 4.73858 8.21293 4.86564 8.14806C6.62968 7.0557 8.57865 6.29126 10.6175 5.89201C15.2092 5.01334 19.5326 5.7174 23.5597 8.11733C23.7018 8.18377 23.8203 8.29165 23.8993 8.42664C23.9783 8.56163 24.0142 8.71733 24.0021 8.87307C24.0021 9.46817 24.0059 10.0637 24.0134 10.6598H22.5568C22.4885 10.6597 22.4214 10.6775 22.3622 10.7113C22.303 10.7451 22.2537 10.7938 22.2193 10.8525C22.1849 10.9111 22.1666 10.9777 22.1662 11.0457C22.1657 11.1136 22.1832 11.1804 22.2169 11.2395L23.2001 12.9354L23.4628 13.3936L23.8659 14.092L24.7016 15.5462C24.7359 15.6051 24.7852 15.654 24.8445 15.6879C24.9038 15.7219 24.971 15.7398 25.0394 15.7398C25.1079 15.7398 25.1751 15.7219 25.2344 15.6879C25.2937 15.654 25.3429 15.6051 25.3772 15.5462L26.633 13.4019L26.9406 12.8767L27.6204 11.7172L27.8901 11.2576C27.9243 11.1988 27.9423 11.132 27.9424 11.0641C27.9425 10.9961 27.9247 10.9293 27.8907 10.8704C27.8567 10.8114 27.8078 10.7623 27.7488 10.7281C27.6898 10.6938 27.6227 10.6756 27.5544 10.6751" 3389 fill="#0F124D" 3390 ></path> 3391 <path 3392 d="M18.489 18.2004C17.5732 21.553 13.615 22.637 11.119 20.2231C11.0451 20.1454 10.9615 20.0774 10.8704 20.0206H8.48252C8.53168 20.1323 8.55977 20.2036 8.59629 20.272C9.23858 21.4309 10.2262 22.3633 11.4233 22.941C12.6204 23.5186 13.9681 23.713 15.2809 23.4975C17.3105 23.1427 18.8303 22.0573 19.8754 20.2958C19.9624 20.1491 20.0467 19.9605 20.2897 19.9605C21.5539 19.9605 22.8279 19.9451 24.2816 19.9451C24.1412 20.3558 24.0695 20.7107 23.8883 20.9705C21.5117 24.3846 18.3513 26.8614 14.5687 28.5698C14.3494 28.6537 14.1061 28.6507 13.8889 28.5614C10.7875 27.1561 8.08783 25.2367 5.89944 22.6747L6.62001 22.2738L7.08914 22.014C7.14915 21.9806 7.19927 21.9322 7.23448 21.8734C7.26969 21.8147 7.28876 21.7478 7.28975 21.6795C7.29075 21.6111 7.27364 21.5437 7.24016 21.484C7.20667 21.4243 7.15798 21.3744 7.09898 21.3393L6.39667 20.9202L5.10583 20.1533L4.9471 20.0597L2.79383 18.7815C2.73481 18.7464 2.66756 18.7274 2.59883 18.7264C2.5301 18.7254 2.46231 18.7423 2.40226 18.7756C2.34221 18.8089 2.292 18.8573 2.25669 18.9159C2.22138 18.9746 2.2022 19.0414 2.20108 19.1098L2.17158 21.0725V21.6033L2.15895 22.4135L2.13506 24.0982C2.13394 24.1665 2.15094 24.2339 2.18437 24.2936C2.21779 24.3532 2.26645 24.4031 2.32543 24.4381C2.38441 24.4731 2.45163 24.492 2.5203 24.4929C2.58898 24.4938 2.65668 24.4767 2.71658 24.4433L4.06922 23.6931C6.72394 26.8921 10.0655 29.232 13.9858 30.8426C14.1504 30.9027 14.3311 30.9027 14.4957 30.8426C18.739 29.0951 22.318 26.4842 25.123 22.834C25.5298 22.3338 25.8497 21.7696 26.0697 21.1647V17.8833H18.5944C18.5564 17.9936 18.5171 18.0928 18.489 18.1948" 3393 fill="#0F124D" 3394 ></path> 3395 <path 3396 d="M40.4875 18.0027C40.4875 16.6146 40.7975 15.3748 41.4174 14.2832C42.0508 13.1782 42.9065 12.3224 43.9846 11.716C45.0762 11.0961 46.2958 10.7861 47.6435 10.7861C49.2202 10.7861 50.6015 11.1904 51.7874 11.999C52.9733 12.8076 53.8021 13.9261 54.2738 15.3546H51.0193C50.6958 14.6808 50.2376 14.1754 49.6447 13.8385C49.0652 13.5016 48.3914 13.3332 47.6232 13.3332C46.8012 13.3332 46.0667 13.5286 45.4199 13.9194C44.7865 14.2967 44.2879 14.8358 43.924
339615.5365C43.5736 16.2373 43.3984 17.0594 43.3984 18.0027C43.3984 18.9326 43.5736 19.7546 43.924 20.4689C44.2879 21.1696 44.7865 21.7154 45.4199 22.1062C46.0667 22.4836 46.8012 22.6722 47.6232 22.6722C48.3914 22.6722 49.0652 22.5038 49.6447 22.1669C50.2376 21.8165 50.6958 21.3044 51.0193 20.6306H54.2738C53.8021 22.0725 52.9733 23.1978 51.7874 24.0064C50.615 24.8015 49.2337 25.199 47.6435 25.199C46.2958 25.199 45.0762 24.8958 43.9846 24.2894C42.9065 23.6695 42.0508 22.8137 41.4174 21.7222C40.7975 20.6306 40.4875 19.3908 40.4875 18.0027Z" 3397 fill="currentColor" 3398 ></path> 3399 <path 3400 d="M62.9979 13.7172C63.8469 13.7172 64.6016 13.9059 65.2619 14.2832C65.9223 14.6471 66.4344 15.1929 66.7982 15.9206C67.1756 16.6348 67.3642 17.4973 67.3642 18.5081V25.0778H64.5342V18.8921C64.5342 18.0027 64.3118 17.3221 63.8671 16.8505C63.4224 16.3653 62.816 16.1227 62.0478 16.1227C61.2662 16.1227 60.6463 16.3653 60.1881 16.8505C59.7434 17.3221 59.521 18.0027 59.521 18.8921V25.0778H56.691V10.1191H59.521V15.2737C59.8849 14.7886 60.37 14.4113 60.9765 14.1417C61.5829 13.8587 62.2567 13.7172 62.9979 13.7172Z" 3401 fill="currentColor" 3402 ></path> 3403 <path 3404 d="M80.6276 13.8789V25.0778H77.7773V23.6627C77.4135 24.1479 76.9351 24.532 76.3421 24.815C75.7626 25.0845 75.1293 25.2193 74.442 25.2193C73.566 25.2193 72.7911 25.0373 72.1173 24.6735C71.4435 24.2961 70.9112 23.7503 70.5204 23.0361C70.143 22.3084 69.9544 21.4459 69.9544 20.4486V13.8789H72.7844V20.0444C72.7844 20.9338 73.0067 21.6211 73.4515 22.1062C73.8962 22.5779 74.5026 22.8137 75.2708 22.8137C76.0524 22.8137 76.6656 22.5779 77.1103 22.1062C77.555 21.6211 77.7773 20.9338 77.7773 20.0444V13.8789H80.6276Z" 3405 fill="currentColor" 3406 ></path> 3407 <path 3408 d="M86.2499 15.6174C86.6137 15.0244 87.0854 14.5595 87.6649 14.2226C88.2579 13.8857 88.9317 13.7172 89.6863 13.7172V16.6888H88.9384C88.049 16.6888 87.3752 16.8976 86.917 17.3154C86.4722 17.7332 86.2499 18.4609 86.2499 19.4986V25.0778H83.4199V13.8789H86.2499V15.6174Z" 3409 fill="currentColor" 3410 ></path> 3411 <path 3412 d="M97.7983 13.7172C99.1325 13.7172 100.211 14.1417 101.033 14.9907C101.855 15.8263 102.266 16.9987 102.266 18.5081V25.0778H99.4357V18.8921C99.4357 18.0027 99.2133 17.3221 98.7686 16.8505C98.3239 16.3653 97.7175 16.1227 96.9493 16.1227C96.1677 16.1227 95.5478 16.3653 95.0896 16.8505C94.6449 17.3221 94.4225 18.0027 94.4225 18.8921V25.0778H91.5925V13.8789H94.4225V15.2737C94.7999 14.7886 95.2783 14.4113 95.8577 14.1417C96.4507 13.8587 97.0976 13.7172 97.7983 13.7172Z" 3413 fill="currentColor" 3414 ></path> 3415 <path 3416 d="M114.645 25.2193C113.662 25.2193 112.772 25.0508 111.977 24.7139C111.195 24.377 110.575 23.8918 110.117 23.2585C109.659 22.6251 109.423 21.8771 109.41 21.0147H112.442C112.482 21.5941 112.685 22.0523 113.048 22.3892C113.426 22.7261 113.938 22.8946 114.585 22.8946C115.245 22.8946 115.764 22.7396 116.141 22.4297C116.519 22.1062 116.707 21.6885 116.707 21.1764C116.707 20.7586 116.579 20.415 116.323 20.1454C116.067 19.8759 115.744 19.667 115.353 19.5188C114.975 19.3571 114.45 19.1819 113.776 18.9932C112.86 18.7237 112.112 18.4609 111.532 18.2048C110.966 17.9353 110.474 17.5378 110.057 17.0122C109.652 16.4731 109.45 15.7589 109.45 14.8695C109.45 14.0339 109.659 13.3062 110.077 12.6863C110.495 12.0664 111.081 11.5947 111.836 11.2713C112.59 10.9344 113.453 10.7659 114.423 10.7659C115.878 10.7659 117.058 11.123 117.96 11.8373C118.877 12.538 119.382 13.5218 119.477 14.7886H116.364C116.337 14.3034 116.128 13.9059 115.737 13.5959C115.36 13.2725 114.854 13.1108 114.221 13.1108C113.668 13.1108 113.224 13.2523 112.887 13.5353C112.563 13.8183 112.402 14.2293 112.402 14.7684C112.402 15.1457 112.523 15.4624 112.765 15.7185C113.021 15.961 113.331 16.1632 113.695 16.3249C114.073 16.4731 114.598 16.6483 115.272 16.8505C116.188 17.12 116.936 17.3895 117.516 17.659C118.095 17.9286 118.594 18.3329 119.012 18.8719C119.429 19.411 119.638 20.1185 119.638 20.9944C119.638 21.7491 119.443 22.4499 119.052 23.0967C118.661 23.7436 118.089 24.2624 117.334 24.6533C116.579 25.0306 115.683 25.2193 114.645 25.2193Z" 3417 fill="currentColor" 3418 ></path> 3419 <path 3420 d="M127.065 25.2597C125.986 25.2597 125.016 25.0239 124.154 24.5522C123.291 24.067 122.611 23.3865 122.112 22.5105C121.627 21.6346 121.384 20.6238 121.384 19.4784C121.384 18.3329 121.634 17.3221 122.132 16.4462C122.644 15.5702 123.338 14.8964 124.214 14.4247C125.09 13.9396 126.067 13.697 127.145 13.697C128.224 13.697 129.201 13.9396 130.077 14.4247C130.952 14.8964 131.64 15.5702 132.138 16.4462C132.651 17.3221 132.907 18.3329 132.907 19.4784C132.907 20.6238 132.644 21.6346 132.118 22.5105C131.606 23.3865 130.905 24.067 130.016 24.5522C129.14 25.0239 128.156 25.2597 127.065 25.2597ZM127.065 22.7935C127.577 22.7935 128.055 22.6722 128.5 22.4297C128.958 22.1736 129.322 21.7963 129.591 21.2977C129.861 20.799 129.996 20.1926 129.996 19.4784C129.99
34206 18.4137 129.713 17.5984 129.147 17.0324C128.594 16.4529 127.914 16.1632 127.105 16.1632C126.296 16.1632 125.616 16.4529 125.063 17.0324C124.524 17.5984 124.255 18.4137 124.255 19.4784C124.255 20.543 124.518 21.365 125.043 21.9445C125.582 22.5105 126.256 22.7935 127.065 22.7935Z" 3421 fill="currentColor" 3422 ></path> 3423 <path 3424 d="M137.813 10.1191V25.0778H134.982V10.1191H137.813Z" 3425 fill="currentColor" 3426 ></path> 3427 <path 3428 d="M151.181 13.8789V25.0778H148.33V23.6627C147.967 24.1479 147.488 24.532 146.895 24.815C146.316 25.0845 145.682 25.2193 144.995 25.2193C144.119 25.2193 143.344 25.0373 142.67 24.6735C141.997 24.2961 141.464 23.7503 141.074 23.0361C140.696 22.3084 140.508 21.4459 140.508 20.4486V13.8789H143.338V20.0444C143.338 20.9338 143.56 21.6211 144.005 22.1062C144.449 22.5779 145.056 22.8137 145.824 22.8137C146.606 22.8137 147.219 22.5779 147.663 22.1062C148.108 21.6211 148.33 20.9338 148.33 20.0444V13.8789H151.181Z" 3429 fill="currentColor" 3430 ></path> 3431 <path 3432 d="M157.268 16.2036V21.6211C157.268 21.9984 157.356 22.2747 157.531 22.4499C157.719 22.6116 158.029 22.6925 158.461 22.6925H159.775V25.0778H157.996C155.61 25.0778 154.418 23.9188 154.418 21.6009V16.2036H153.084V13.8789H154.418V11.1096H157.268V13.8789H159.775V16.2036H157.268Z" 3433 fill="currentColor" 3434 ></path> 3435 <path 3436 d="M163.245 12.5448C162.747 12.5448 162.329 12.3898 161.992 12.0799C161.669 11.7564 161.507 11.3589 161.507 10.8872C161.507 10.4155 161.669 10.0247 161.992 9.71476C162.329 9.39133 162.747 9.22961 163.245 9.22961C163.744 9.22961 164.155 9.39133 164.478 9.71476C164.815 10.0247 164.984 10.4155 164.984 10.8872C164.984 11.3589 164.815 11.7564 164.478 12.0799C164.155 12.3898 163.744 12.5448 163.245 12.5448ZM164.64 13.8789V25.0778H161.81V13.8789H164.64Z" 3437 fill="currentColor" 3438 ></path> 3439 <path 3440 d="M172.409 25.2597C171.331 25.2597 170.36 25.0239 169.498 24.5522C168.636 24.067 167.955 23.3865 167.456 22.5105C166.971 21.6346 166.729 20.6238 166.729 19.4784C166.729 18.3329 166.978 17.3221 167.477 16.4462C167.989 15.5702 168.683 14.8964 169.559 14.4247C170.435 13.9396 171.412 13.697 172.49 13.697C173.568 13.697 174.545 13.9396 175.421 14.4247C176.297 14.8964 176.984 15.5702 177.483 16.4462C177.995 17.3221 178.251 18.3329 178.251 19.4784C178.251 20.6238 177.988 21.6346 177.463 22.5105C176.95 23.3865 176.25 24.067 175.36 24.5522C174.484 25.0239 173.5 25.2597 172.409 25.2597ZM172.409 22.7935C172.921 22.7935 173.399 22.6722 173.844 22.4297C174.302 22.1736 174.666 21.7963 174.936 21.2977C175.205 20.799 175.34 20.1926 175.34 19.4784C175.34 18.4137 175.057 17.5984 174.491 17.0324C173.938 16.4529 173.258 16.1632 172.449 16.1632C171.641 16.1632 170.96 16.4529 170.408 17.0324C169.869 17.5984 169.599 18.4137 169.599 19.4784C169.599 20.543 169.862 21.365 170.387 21.9445C170.927 22.5105 171.6 22.7935 172.409 22.7935Z" 3441 fill="currentColor" 3442 ></path> 3443 <path 3444 d="M186.533 13.7172C187.867 13.7172 188.945 14.1417 189.767 14.9907C190.589 15.8263 191 16.9987 191 18.5081V25.0778H188.17V18.8921C188.17 18.0027 187.948 17.3221 187.503 16.8505C187.058 16.3653 186.452 16.1227 185.684 16.1227C184.902 16.1227 184.282 16.3653 183.824 16.8505C183.379 17.3221 183.157 18.0027 183.157 18.8921V25.0778H180.327V13.8789H183.157V15.2737C183.534 14.7886 184.013 14.4113 184.592 14.1417C185.185 13.8587 185.832 13.7172 186.533 13.7172Z" 3445 fill="currentColor" 3446 ></path> 3447 </svg> 3448 <p class="chr-chr-footer-tagline"> 3449 Reduce Churn and Retain more subscribers. 3450 </p> 3451 </div> 3452 <img 3453 decoding="async" 3454 src="https://churnsolution.com/wp-content/uploads/2024/03/[email protected]" 3455 alt="Stripe Verified Partner" 3456 class="chr-chr-footer-badge" 3457 style="width: auto; height: 34px" 3458 /> 3459 </div> 3460 <nav class="chr-chr-footer-navigation" aria-label="Footer Navigation"> 3461 <div class="chr-chr-footer-nav-column"> 3462 <h2 class="chr-chr-footer-nav-heading">Products</h2> 3463 <ul class="chr-chr-footer-nav-list"> 3464 <li> 3465 <a 3466 href="/products/cancellation-flows/" 3467 class="chr-chr-footer-nav-link" 3468 > 3469 Cancellation Flows 3470 </a> 3471 </li> 3472 <li> 3473 <a href="/products/reactivation/" class="chr-chr-footer-nav-link"> 3474 Reactivation Campaigns 3475 </a> 3476 </li> 3477 <li> 3478 <a 3479 href="/products/payment-recovery/" 3480 class="chr-chr-footer-nav-link" 3481 > 3482 Dunning Email Automation 3483 </a> 3484 </li> 3485 <li> 3486 <a href="/products/churn-metrics/" class="chr-chr-footer-nav-link"> 3487 Churn Metrics 3488 </a> 3489 </li> 3490 <li> 3491 <a 3492 href="/products/feedback-analysis/" 3493 class="chr-chr-footer-nav-link" 3494 > 3495 AI Feedback Analysis 3496 </a> 3497 </li> 3498 <li> 3499 <a 3500 href="/products/customer-portal/" 3501 class="chr-chr-footer-nav-link" 3502 > 3503 Customer Portal 3504 </a> 3505 </li> 3506 <li> 3507 <a href="/products/smart-retries/" class="chr-chr-footer-nav-link"> 3508 Smart Retries 3509 </a> 3510 </li> 3511 <li> 3512 <a href="/products/mcp-server/" class="chr-chr-footer-nav-link"> 3513 MCP Server 3514 </a> 3515 </li> 3516 </ul> 3517 </div> 3518 <div class="chr-chr-footer-nav-column"> 3519 <h2 class="chr-chr-footer-nav-heading">Features</h2> 3520 <ul class="chr-chr-footer-nav-list"> 3521 <li> 3522 <a href="/products/ab-experiments" class="chr-chr-footer-nav-link"> 3523 A/B Experiments 3524 </a> 3525 </li> 3526 <li> 3527 <a 3528 href="/products/customer-segmentation/" 3529 class="chr-chr-footer-nav-link" 3530 > 3531 Customer Segmentation 3532 </a> 3533 </li> 3534 <li> 3535 <a href="/products/exit-surveys/" class="chr-chr-footer-nav-link"> 3536 Exit Survey 3537 </a> 3538 </li> 3539 <li> 3540 <a 3541 href="/products/session-recording/" 3542 class="chr-chr-footer-nav-link" 3543 > 3544 Session Recording 3545 </a> 3546 </li> 3547 <li> 3548 <a href="/products/dynamic-offers/" class="chr-chr-footer-nav-link"> 3549 Dynamic Offers 3550 </a> 3551 </li> 3552 <li> 3553 <a 3554 href="/products/custom-branding/" 3555 class="chr-chr-footer-nav-link" 3556 > 3557 Custom Branding 3558 </a> 3559 </li> 3560 <li> 3561 <a href="/products/easy-setup/" class="chr-chr-footer-nav-link"> 3562 Easy Setup 3563 </a> 3564 </li> 3565 <li> 3566 <a href="/products/pause-wall/" class="chr-chr-footer-nav-link"> 3567 Pause Wall 3568 </a> 3569 </li> 3570 <li> 3571 <a href="/products/payment-wall/" class="chr-chr-footer-nav-link"> 3572 Payment Wall 3573 </a> 3574 </li> 3575 </ul> 3576 </div> 3577 <div class="chr-chr-footer-nav-column"> 3578 <h2 class="chr-chr-footer-nav-heading">Learn</h2> 3579 <ul class="chr-chr-footer-nav-list"> 3580 <li> 3581 <a 3582 href="/demo/" 3583 target="_blank" 3584 class="chr-chr-footer-nav-link" 3585 data-event-action="book_demo" 3586 data-event-category="cta" 3587 data-event-label="header_book_demo" 3588 data-event-from="WP-footer" 3589 > 3590 Get a demo 3591 </a> 3592 </li> 3593 <li> 3594 <a href="/docs/install/" class="chr-chr-footer-nav-link"> 3595 Developer Docs 3596 </a> 3597 </li> 3598 <li> 3599 <a 3600 href="#" 3601 onclick="goToPage('contact-us')" 3602 class="chr-chr-footer-nav-link" 3603 data-event-action="navigate_to_app" 3604 data-event-category="navigation" 3605 data-event-label="contact-us" 3606 data-event-from="WP-footer" 3607 > 3608 Contact Us 3609 </a> 3610 </li> 3611 <li> 3612 <a href="/how-it-works/" class="chr-chr-footer-nav-link"> 3613 How it works 3614 </a> 3615 </li> 3616 <li> 3617 <a href="/blog/" class="chr-chr-footer-nav-link">Blogs</a> 3618 </li> 3619 </ul> 3620 <h2 class="chr-chr-footer-nav-heading">Explore</h2> 3621 <ul class="chr-chr-footer-nav-list"> 3622 <li> 3623 <a href="/pricing/" class="chr-chr-footer-nav-link">Pricing</a> 3624 </li> 3625 <li> 3626 <a href="/integrations/" class="chr-chr-footer-nav-link"> 3627 Integrations 3628 </a> 3629 </li> 3630 <li> 3631 <a href="/calculator/" class="chr-chr-footer-nav-link"> 3632 ROI Calculator 3633 </a> 3634 </li> 3635 </ul> 3636 </div> 3637 <div class="chr-chr-footer-nav-column"> 3638 <h2 class="chr-chr-footer-nav-heading">Legal</h2> 3639 <ul class="chr-chr-footer-nav-list"> 3640 <li> 3641 <a href="/terms-of-use/" class="chr-chr-footer-nav-link"> 3642 Terms of use 3643 </a> 3644 </li> 3645 <li> 3646 <a href="/privacy-policy/" class="chr-chr-footer-nav-link"> 3647 Privacy policy 3648 </a> 3649 </li> 3650 <li> 3651 <a href="/data-protection/" class="chr-chr-footer-nav-link"> 3652 Data Protection & GDPR 3653 </a> 3654 </li> 3655 </ul> 3656 <h2 class="chr-chr-footer-nav-heading">Case Studies</h2> 3657 <ul class="chr-chr-footer-nav-list"> 3658 <li> 3659 <a href="/case-studies/healthcare/" class="chr-chr-footer-nav-link"> 3660 Healthcare 3661 </a> 3662 </li> 3663 <li> 3664 <a href="/case-studies/edutech/" class="chr-chr-footer-nav-link"> 3665 EduTech 3666 </a> 3667 </li> 3668 <li> 3669 <a 3670 href="/case-studies/digital-marketplace/" 3671 class="chr-chr-footer-nav-link" 3672 > 3673 Digital Marketplace 3674 </a> 3675 </li> 3676 </ul> 3677 </div> 3678 </nav> 3679 <div class="chr-chr-footer-social-section"> 3680 <div class="chr-chr-footer-social-group"> 3681 <p class="chr-chr-footer-stripe-text">
3682 Our Stripe App tracks and reduces churn 3683 </p> 3684 <figure class="chr-chr-footer-stripe-badge"> 3685 <a 3686 href="https://marketplace.stripe.com/apps/churn-solution" 3687 target="_blank" 3688 rel="noreferrer noopener" 3689 data-event-action="stripe_app_view" 3690 data-event-category="cta" 3691 data-event-label="stripe_app_marketplace" 3692 data-event-from="WP-footer" 3693 > 3694 <img 3695 decoding="async" 3696 src="https://churnsolution.com/wp-content/uploads/2024/03/stripe_app_marketplace.png" 3697 alt="Stripe App Marketplace" 3698 class="wp-image-2068" 3699 style="width: auto; height: 45px" 3700 /> 3701 </a> 3702 </figure> 3703 <figure class="chr-chr-footer-stripe-badge"> 3704 <a 3705 href="https://churntools.com/tools/churn-solution?utm_source=churnsolution.com&utm_medium=referral" 3706 target="_blank" 3707 data-event-action="featured" 3708 data-event-category="featured" 3709 data-event-label="featured" 3710 data-event-from="WP-footer" 3711 > 3712 <img 3713 src="https://churntools.com/badge/churn-solution.svg" 3714 alt="Churn Solution on ChurnTools" 3715 /> 3716 </a> 3717 </figure> 3718 </div> 3719 <nav class="chr-chr-footer-social-links" aria-label="Social Media Links"> 3720 <a 3721 href="https://www.facebook.com/churn.solution" 3722 target="_blank" 3723 class="chr-chr-footer-social-icon" 3724 aria-label="Facebook" 3725 data-event-action="social_facebook" 3726 data-event-category="cta" 3727 data-event-label="social_facebook" 3728 data-event-from="WP-footer" 3729 > 3730 <svg 3731 width="22" 3732 height="22"
3733 viewBox="0 0 22 22" 3734 fill="none" 3735 xmlns="http://www.w3.org/2000/svg" 3736 > 3737 <path 3738 fill-rule="evenodd" 3739 clip-rule="evenodd" 3740 d="M0 10.5675C0 15.7922 3.79457 20.1367 8.75737 21.0177V13.4277H6.13016V10.5088H8.75737V8.17326C8.75737 5.54605 10.4502 4.08707 12.8444 4.08707C13.6028 4.08707 14.4208 4.20354 15.1792 4.32001V7.0059H13.8367C12.5519 7.0059 12.2603 7.64781 12.2603 8.46575V10.5088H15.0627L14.5959 13.4277H12.2603V21.0177C17.2231 20.1367 21.0177 15.793 21.0177 10.5675C21.0177 4.75525 16.2887 0 10.5088 0C4.72898 0 0 4.75525 0 10.5675Z" 3741 fill="currentColor" 3742 /> 3743 </svg> 3744 </a> 3745 <a 3746 href="https://www.instagram.com/churnsolution/" 3747 target="_blank" 3748 class="chr-chr-footer-social-icon" 3749 aria-label="Instagram" 3750 data-event-action="social_instagram" 3751 data-event-category="cta" 3752 data-event-label="social_instagram" 3753 data-event-from="WP-footer" 3754 > 3755 <svg 3756 width="22" 3757 height="22"
3758 viewBox="0 0 22 21" 3759 fill="none" 3760 xmlns="http://www.w3.org/2000/svg" 3761 > 3762 <path 3763 d="M10.997 6.99851C8.97722 6.99851 7.32888 8.57195 7.32888 10.5C7.32888 12.4281 8.97722 14.0015 10.997 14.0015C13.0169 14.0015 14.6652 12.4281 14.6652 10.5C14.6652 8.57195 13.0169 6.99851 10.997 6.99851ZM21.9988 10.5C21.9988 9.05002 22.0125 7.61317 21.9272 6.16582C21.8419 4.48469 21.4402 2.99268 20.1523 1.76335C18.8617 0.53139 17.3014 0.150507 15.5403 0.0690774C14.0213 -0.0123526 12.516 0.000781319 10.9998 0.000781319C9.4808 0.000781319 7.97556 -0.0123526 6.45931 0.0690774C4.69815 0.150507 3.13513 0.534016 1.84728 1.76335C0.556684 2.9953 0.157672 4.48469 0.0723655 6.16582C-0.0129406 7.6158 0.000818509 9.05265 0.000818509 10.5C0.000818509 11.9474 -0.0129406 13.3868 0.0723655 14.8342C0.157672 16.5153 0.559436 18.0073 1.84728 19.2367C3.13788 20.4686 4.69815 20.8495 6.45931 20.9309C7.97831 21.0124 9.48355 20.9992 10.9998 20.9992C12.5188 20.9992 14.024 21.0124 15.5403 20.9309C17.3014 20.8495 18.8645 20.466 20.1523 19.2367C21.4429 18.0047 21.8419 16.5153 21.9272 14.8342C22.0153 13.3868 21.9988 11.95 21.9988 10.5ZM10.997 15.8875C7.87374 15.8875 5.35309 13.4814 5.35309 10.5C5.35309 7.51861 7.87374 5.11248 10.997 5.11248C14.1203 5.11248 16.641 7.51861 16.641 10.5C16.641 13.4814 14.1203 15.8875 10.997 15.8875ZM16.8722 6.15006C16.1429 6.15006 15.554 5.58793 15.554 4.89184C15.554 4.19574 16.1429 3.63361 16.8722 3.63361C17.6014 3.63361 18.1903 4.19574 18.1903 4.89184C18.1905 5.05713 18.1565 5.22083 18.0904 5.37358C18.0242 5.52633 17.9271 5.66512 17.8047 5.782C17.6822 5.89888 17.5369 5.99155 17.3768 6.05471C17.2168 6.11787 17.0453 6.15027 16.8722 6.15006Z" 3764 fill="currentColor" 3765 /> 3766 </svg> 3767 </a> 3768 <a 3769 href="https://www.linkedin.com/company/churn-solution" 3770 target="_blank" 3771 class="chr-chr-footer-social-icon" 3772 aria-label="linkedin" 3773 data-event-action="social_linkedin" 3774 data-event-category="cta" 3775 data-event-label="social_linkedin" 3776 data-event-from="WP-footer" 3777 > 3778 <svg 3779 width="24" 3780 height="24"
3781 viewBox="0 0 256 256" 3782 xmlns="http://www.w3.org/2000/svg" 3783 style="scale: 0.916666666667" 3784 > 3785 <path 3786 d="M0 18.338C0 8.216 8.474 0 18.92 0h218.16C247.53 0 256 8.216 256 18.338v219.327C256 247.79 247.53 256 237.08 256H18.92C8.475 256 0 247.791 0 237.668V18.335z" 3787 fill="currentColor" 3788 ></path> 3789 <path 3790 d="M77.796 214.238V98.986H39.488v115.252H77.8zM58.65 83.253c13.356 0 21.671-8.85 21.671-19.91-.25-11.312-8.315-19.915-21.417-19.915-13.111 0-21.674 8.603-21.674 19.914 0 11.06 8.312 19.91 21.169 19.91h.248zM99 214.238h38.305v-64.355c0-3.44.25-6.889 1.262-9.346 2.768-6.885 9.071-14.012 19.656-14.012 13.858 0 19.405 10.568 19.405 26.063v61.65h38.304v-66.082c0-35.399-18.896-51.872-44.099-51.872-20.663 0-29.738 11.549-34.78 19.415h.255V98.99H99.002c.5 10.812-.003 115.252-.003 115.252z" 3791 fill="#0F124D" 3792 ></path> 3793 </svg> 3794 </a> 3795 <a 3796 href="https://www.youtube.com/@ChurnSolution-com" 3797 target="_blank" 3798 class="chr-chr-footer-social-icon" 3799 aria-label="YouTube" 3800 data-event-action="social_youtube" 3801 data-event-category="cta" 3802 data-event-label="social_youtube" 3803 data-event-from="WP-footer" 3804 > 3805 <svg 3806 width="22" 3807 height="23"
3808 viewBox="0 0 22 22" 3809 fill="none" 3810 xmlns="http://www.w3.org/2000/svg" 3811 > 3812 <circle cx="10.7329" cy="11.0903" r="10.7329" fill="currentColor" /> 3813 <path 3814 d="M15.784 10.0646L8.32603 7.07271C8.19085 7.01695 8.04247 6.99262 7.89433 7.00194C7.74618 7.01126 7.60292 7.05392 7.47751 7.12608C7.3521 7.19824 7.24848 7.29762 7.17602 7.41523C7.10356 7.53285 7.06455 7.66499 7.0625 7.79971V14.175C7.06501 14.3131 7.10506 14.4485 7.17911 14.5692C7.25315 14.6898 7.3589 14.7921 7.48696 14.8668C7.61502 14.9415 7.76143 14.9863 7.91318 14.9973C8.06493 15.0083 8.21733 14.9852 8.35685 14.9299L15.784 11.6584C15.9217 11.5932 16.0391 11.4975 16.1252 11.3802C16.2114 11.2629 16.2636 11.1278 16.2771 10.9873C16.2921 10.9134 16.2921 10.8376 16.2771 10.7636C16.288 10.6146 16.246 10.4663 16.1572 10.3405C16.0685 10.2147 15.9377 10.118 15.784 10.0646Z" 3815 fill="#0F124D" 3816 /> 3817 </svg> 3818 </a> 3819 <a href="/cdn-cgi/l/email-protection#40292e262f00232835322e332f2c3534292f2e6e232f2d" class="chr-chr-footer-social-icon" aria-label="Email" data-event-action="social_email" data-event-category="cta" data-event-label="social_email" data-event-from="WP-footer"> 3820 <svg 3821 width="22" 3822 height="23"
3823 viewBox="0 0 22 22" 3824 fill="none" 3825 xmlns="http://www.w3.org/2000/svg" 3826 > 3827 <circle cx="10.7329" cy="11.0903" r="10.7329" fill="white" /> 3828 <g clip-path="url(#clip0_2766_7094)"> 3829 <path 3830 d="M17.7279 7.00033C17.7279 6.26699 17.1279 5.66699 16.3945 5.66699H5.72786C4.99453 5.66699 4.39453 6.26699 4.39453 7.00033M17.7279 7.00033V15.0003C17.7279 15.7337 17.1279 16.3337 16.3945 16.3337H5.72786C4.99453 16.3337 4.39453 15.7337 4.39453 15.0003V7.00033M17.7279 7.00033L11.0612 11.667L4.39453 7.00033" 3831 stroke="#0F124D" 3832 stroke-linecap="round" 3833 stroke-linejoin="round" 3834 /> 3835 </g> 3836 <defs> 3837 <clipPath id="clip0_2766_7094"> 3838 <rect 3839 width="16" 3840 height="16" 3841 fill="currentColor" 3842 transform="translate(3.0625 3)" 3843 /> 3844 </clipPath> 3845 </defs> 3846 </svg> 3847 </a> 3848 </nav> 3849 <p id="chrCopyright" class="chr-chr-footer-copyright"></p> 3850 </div> 3851 </div> 3852</footer>
vendor: 110 bytes, lines 3852-3853
3852 3853<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
3853<script> 3854(()=>{let e=document.getElementById("chrCopyright");e&&(e.innerText=`\xa9 ${new Date().getFullYear()} Churn Solution, LLC. All rights reserved`)})(); 3855</script>
3855
3855<script> 3856 /(trident|msie)/i.test(navigator.userAgent)&&document.getElementById&&window.addEventListener&&window.addEventListener("hashchange",function(){var t,e=location.hash.substring(1);/^[A-z0-9_-]+$/.test(e)&&(t=document.getElementById(e))&&(/^(?:a|select|input|button|textarea)$/i.test(t.tagName)||(t.tabIndex=-1),t.focus())},!1); 3857 </script>
3857 3858
3858<script id="essential-blocks-blocks-localize-js-extra"> 3859var eb_conditional_localize = []; 3860var EssentialBlocksLocalize = {"eb_plugins_url":"https://churnsolution.com/wp-content/plugins/essential-blocks/","image_url":"https://churnsolution.com/wp-content/plugins/essential-blocks/assets/images","eb_wp_version":"7.1","eb_version":"6.0.8","eb_admin_url":"https://churnsolution.com/wp-admin/","rest_rootURL":"https://churnsolution.com/wp-json/","ajax_url":"https://churnsolution.com/wp-admin/admin-ajax.php","nft_nonce":"ec2293f230","post_grid_pagination_nonce":"a61f0de1c2","placeholder_image":"https://churnsolution.com/wp-content/plugins/essential-blocks/assets/images/placeholder.png","is_pro_active":"false","upgrade_pro_url":"https://essential-blocks.com/upgrade","responsiveBreakpoints":{"tablet":1024,"mobile":767},"wp_timezone":"+00:00","gmt_offset":"0"}; 3861//# sourceURL=essential-blocks-blocks-localize-js-extra 3862</script>
vendor: 1 bytes, line 3862
3862
3863<script id="essential-blocks-blocks-localize-js" src="https://churnsolution.com/wp-content/plugins/essential-blocks/assets/js/eb-blocks-localize.js?ver=31d6cfe0d16ae931b73c"></script>
vendor: 1 bytes, line 3863
3863
3864<script id="astra-theme-js-js-extra"> 3865var astra = {"break_point":"921","isRtl":"","is_scroll_to_id":"1","is_scroll_to_top":"","is_header_footer_builder_active":"1"}; 3866//# sourceURL=astra-theme-js-js-extra 3867</script>
vendor: 1 bytes, line 3867
3867
3868<script id="astra-theme-js-js" src="https://churnsolution.com/wp-content/themes/astra/assets/js/minified/frontend.min.js?ver=4.3.0"></script>
3868 3869 </body> 3870</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.