Cancel Flows

Multi-Language Support

Support multiple languages.

A 5-minute video on internationalization and multi-language support:

Pre-Built Translations

In addition to English, we have pre-built support for French, Spanish, and German. You can simply pass in an i18n parameter with lang set to one of 'fr', 'de', 'sp', 'en' and all of the buttons and pre-set text will be switched to the specified language.

💡
Note that these pre-built translations are just for all of the Churnkey generated text, such as buttons and step labels. For the text within the cancel flow, you can customize this following the directions below in (II).
window.churnkey.init('show', {
  customerId: 'CUSTOMER_ID',
  ..., // additional Churnkey parameters
  i18n: {
    lang: 'fr', // 'fr', 'de', 'sp', 'en'
    // specific overrides under messages (optional); all i18n phrases can be found in (III) below
    messages: {
      fr: {
        next: 'Prochain',
        back: 'Retour',
        ...
        weReadEveryAnswer: 'Nous lisons chaque réponse'
      }
    }
  }
})

Overriding Built-in Buttons and Offer Text

You can optionally pass in translations and overrides for some of Churnkey’s hard-coded text. This can be done by passing an i18n object when initializing Churnkey or by changing these translations within Churnkey | Cancel Flows | Settings. Please note that i18n messages that are passed in JavaScript while initializing the Churnkey cancel flow embed take priority over those declared within the cancel flow settings.

Using cancel flow settings to override default English phrases

Text overrides

Using the i18n parameter for overriding default English phrases

window.churnkey.init('show', {
  i18n: {
    messages: {
      en: {
        goToAccount: 'Return to Billing', // english override
      },
    },
  },
});

Using i18n for translating into non-English languages

For complete translation, all phrases from the global list below (all i18n phrases) must be provided.

window.churnkey.init('show', {
  i18n: {
    lang: 'fr',
    messages: {
      fr: {
        next: 'Prochain',
        back: 'Retour',
        ...
        weReadEveryAnswer: 'Nous lisons chaque réponse'
      }
    }
  }
})

Creating Customer Segments for Different Languages

  1. Head to the Churnkey | Cancel Flows | Advanced Settings and create a custom attribute called “language”.

Custom cancel flow attributes

b. For each language that you offer your app in, create a segmented cancel flow to be shown to those customers. For instance, below is how you would create a segment for French users.

Custom cancel flow attributes

c. For each segment you create, translate the text in the cancel flow into the target language.

d. When initializing Churnkey in your web app, pass in the custom language attribute as applicable. This will ensure that the customer is shown the translated cancel flow that matches the segmented flow conditions.

window.churnkey.init('show', {
  customerAttributes: {
    language: 'fr',
  },
  i18n: {
    lang: 'fr',
  },
});

All i18n Phrases

Below are all phrases that can be supplied. By default, Churnkey provides English, German, French, and Spanish translations.

en: {
    next: 'Next',
    back: 'Back',
    nevermind: 'Go Back',
    goToAccount: 'Go to Account',
    getHelp: 'Something Wrong? Contact Us...',
    declineOffer: 'Decline Offer',
    confirmAndCancel: 'Confirm & Cancel',
    pauseSubscription: 'Pause Subscription',
    cancelSubscription: 'Cancel',
    discountSubscription: 'Accept This Offer', // button to accept discount offer
    claimOffer: 'Claim your limited-time offer', // shown above discount offers
    discountOff: 'off', // e.g. "10% _off_"
    discountFor: 'for', // e.g. "20% off _for_ 2 months"
    discountForever: 'for life', // e.g. "10% off _for life_"
    discountOneTime: 'your next renewal', // e.g. "10% off _your next renewal_"
    day: 'Day | Days', // e.g. "1 day" "2 days"
    month: 'month | months', // e.g. "1 month" "2 months"
    year: 'year | years', // e.g. "1 year" "2 years"
    error: 'Sorry, something went wrong', // generic error message
    genericErrorDescription: 'Please contact us.', // generic error message
    cancelNow: 'Cancel Subscription →', // button to cancel subscription immediately
    applyingDiscount: 'Applying discount...', // shown while applying discount
    applyingCancel: 'Cancelling subscription...', // shown while cancelling subscription
    applyingResume: 'Resuming subscription...', // shown while resuming a paused subscription
    applyingPause: 'Pausing subscription...', // shown while pausing subscription
    discountApplied: 'Discount applied.', // shown when discount is applied
    discountAppliedMessage: "We're so happy you're still here", // shown when discount is applied
    pauseApplied: 'Subscription paused.', // shown when subscription is paused
    pauseAppliedMessage: "You won't be billed until your subscription resumes", // shown when subscription is paused
    pauseAppliedResumeMessage: 'Your subscription will resume on', // shown when subscription is paused
    pauseScheduledMessage: 'Your subscription will be paused beginning', // shown when subscription is scheduled in the future
    until: 'until',
    cancelApplied: 'Subscription cancelled.', // shown when subscription is canceled
    cancelAppliedMessage: "You won't be billed again", // shown when subscription is canceled
    cancelAppliedDateMessage: 'Your subscription will end on', // shown when subscription is canceled
    howLongToPausePrompt: 'Choose how long you want to pause...', // shown above the pause subscription prompt
    whatCouldWeHaveDone: 'What could we have done better?', // shown above the feedback prompt
    weReadEveryAnswer: 'We read every answer...', // shown as placeholder in the feedback prompt
    applyingCustomerAction: 'This will just take a second.', // shown while applying customer action
    loading: 'Loading...', // shown while loading
    pauseWallCardPunch: 'Want access?',
    pauseWallCta: 'Resume Subscription Now',
    pauseWallCardHeading: 'Resume your subscription',
    scheduledToReactivate: "It's scheduled to reactivate on",
    resumeApplied: 'Subscription resumed', // shown when subscription is paused
    resumeAppliedMessage: 'You will be billed at your next subscription renewal period.', // shown when subscription is paused
    resumeNextChargeMessage: "Upon reactivation, you'll be charged at your original rate of ",
    resumeNextChargeMessageWithoutAmount: "Upon reactivation, you'll be charged at your usual rate.",
    resumeAccountDataInfo: 'Your account data is being kept safe for when your subscription resumes.',
    subscriptionPauseNotice: 'Looks like your subscription is still paused',
    failedPaymentNotice: 'Your account access is limited right now',
    chargedMultipleTimeNotice:
      "We've tried a number of times to charge your card on file, but it just hasn't worked out. You're not someone we want to lose, though 👇",
    failedPaymentCardPunch: 'Update your card to restore access.',
    resumeHey: 'Hey',
    invoicePaidTitle: 'Invoice paid successfully',
    logout: 'Logout →', // used on failed payment and pause wall
    // ex You have a 20% off for 3 months discount valid until October 15. Your existing discount will be overridden upon accepting a new offer.
    note: 'Note:', // shown before the discount note
    discount: 'discount',
    discountNoticeHeadline: "Note: you'll also lose an active discount.",
    discountNoticePrepend: "If you cancel now, you'll lose your current",
    discountOverride: "if you take this offer, you'll lose your current",
    discountValidUntil: "It's good until", // shown on active discount
    updateBilling: 'Update Card',
    // Trial Extension
    extendTrialCTA: 'Extend Trial By ',
    extendTrialPunch: 'Your trial ends on ',
    extendTrialOfferTitle: 'Trial Extension',
    trialExtended: 'Trial extended.',
    trialExtendedMessage: 'Your trial has been extended successfully',
    applyingTrialExtension: 'Extending your trial',
    // Plan Change
    switchPlanCTA: 'Switch Plan',
    changePlanHighlights: 'Highlights',
    changePlanOfferPunch: 'Discounted Secret Plans',
    planChanged: 'Plan changed.',
    planChangedMessage: 'Your new plan is now in effect',
    applyingPlanChange: 'Changing your plan...',
    // Left Theme Step Tags
    surveyStepTag: 'Your Feedback',
    freeFormStepTag: 'Your Feedback',
    finalConfirmation: 'Final Confirmation',
    offerDiscountTag: 'Special Offer',
    offerChangePlanTag: 'Consider Other Plans',
    offerExtendTrialTag: 'Extend Your Trial',
    offerRedirectTag: 'Let Us Help',
    offerContactTag: 'Let Us Help',
    offerPauseTag: 'Subscription Pause',
    completeTag: 'Subscription Cancelled',
    errorTag: 'An Error Occurred',
    offerAccepted: 'Offer Accepted',
  }