From c1f06fd5faf718d2aa5743217c16b5cc34d5f36a Mon Sep 17 00:00:00 2001 From: Brett Chaldecott Date: Wed, 9 Apr 2025 19:28:47 +0200 Subject: [PATCH 001/755] feat: began modification to documentation to match python sdk update --- src/content/docs/developer-tools/sdks/backend/python-sdk.mdx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/content/docs/developer-tools/sdks/backend/python-sdk.mdx b/src/content/docs/developer-tools/sdks/backend/python-sdk.mdx index c9903843a..333a2d22e 100644 --- a/src/content/docs/developer-tools/sdks/backend/python-sdk.mdx +++ b/src/content/docs/developer-tools/sdks/backend/python-sdk.mdx @@ -14,7 +14,7 @@ The Kinde Python SDK allows developers to quickly and securely integrate a new o ## Before you begin -- Kinde Python SDK supports Python 3.8+ +- Kinde Python SDK supports Python 3.9+ - If you haven’t already got a Kinde account, [register for free here](https://app.kinde.com/register) (no credit card required). Registering gives you a Kinde domain, which you need to get started, e.g. `yourapp.kinde.com`. For new projects, you can also find our [Starter Kit on GitHub](https://github.com/kinde-starter-kits/python-starter-kit). @@ -57,8 +57,7 @@ Create a new instance of the Kinde Auth client object before you initialize your ```python ... -from kinde_sdk import Configuration -from kinde_sdk.kinde_api_client import GrantType, KindeApiClient + ... configuration = Configuration(host=KINDE_HOST) From ac8a8a866f097529b3180bb442f1589fd07a0b4d Mon Sep 17 00:00:00 2001 From: Daniel Rivers Date: Fri, 2 May 2025 10:40:24 +0000 Subject: [PATCH 002/755] feat: refrence the management-api-js from TS SDK --- .../sdks/backend/typescript-sdk.mdx | 36 ++----------------- 1 file changed, 2 insertions(+), 34 deletions(-) diff --git a/src/content/docs/developer-tools/sdks/backend/typescript-sdk.mdx b/src/content/docs/developer-tools/sdks/backend/typescript-sdk.mdx index 864bc9c3a..7b6fd5f8f 100644 --- a/src/content/docs/developer-tools/sdks/backend/typescript-sdk.mdx +++ b/src/content/docs/developer-tools/sdks/backend/typescript-sdk.mdx @@ -482,41 +482,9 @@ After the user has successfully logged in, you will have a JSON Web Token (JWT) const accessToken = await kindeClient.getToken(sessionManager); ``` -## **Kinde Management API** +## Kinde Management API -The sections below relate to how to call the Kinde Management API. You need to [add a machine to machine application](/developer-tools/kinde-api/connect-to-kinde-api/) and [get an access token to connect](/developer-tools/kinde-api/connect-to-kinde-api/): - -```typescript -import { - Configuration, - GrantType, - UsersApi, - createKindeServerClient -} from "@kinde-oss/kinde-typescript-sdk"; - -const kindeApiClient = createKindeServerClient(GrantType.CLIENT_CREDENTIALS, { - authDomain: "https://.kinde.com", - clientId: "", - clientSecret: "", - logoutRedirectURL: "http://localhost:3000", - audience: "https://.kinde.com/api", - scope: "" -}); - -const token = await kindeApiClient.getToken(sessionManager); - -const config = new Configuration({ - basePath: "https://.kinde.com", - accessToken: token, - headers: {Accept: "application/json"} -}); - -const apiInstance = new UsersApi(config); - -const result = await apiInstance.getUsers({ - pageSize: 5 -}); -``` +To use our management API please see [@kinde/management-api-js](https://github.com/kinde-oss/management-api-js) ## **SDK API reference** From 7c55ef974827897bfa0ea40a0d2b33f98a80bab0 Mon Sep 17 00:00:00 2001 From: Daniel Rivers Date: Wed, 14 May 2025 23:40:00 +0000 Subject: [PATCH 003/755] feat(expo): update utility import locations for each expo version --- src/content/docs/developer-tools/sdks/native/expo.mdx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/content/docs/developer-tools/sdks/native/expo.mdx b/src/content/docs/developer-tools/sdks/native/expo.mdx index 653f306e8..bd6077246 100644 --- a/src/content/docs/developer-tools/sdks/native/expo.mdx +++ b/src/content/docs/developer-tools/sdks/native/expo.mdx @@ -115,7 +115,10 @@ Note: The `` is used as an example of local URL Scheme, ## Token Utilities -All utility functions from `@kinde/js-utils` are available through `@kinde/expo/utils` and also through the `useKindeAuth` hook. This allows you to use these utilities directly in your Expo application. +A selction of utility functions are available. + +*Expo 53+*: Importable from from `@kinde/expo/utils` and from `useKindeAuth` hook +*Expo 51 and 52*: Importable from from `@kinde/js-utils` and from `useKindeAuth` hook ```ts import { getUserProfile, getFlag, getRoles } from "@kinde/expo/utils"; From 5de22bab8a0083d6e56ece4cbe2f81c2ca82622b Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Fri, 16 May 2025 15:09:20 +1000 Subject: [PATCH 004/755] Create session-management-per-organization.mdx New topic --- .../session-management-per-organization.mdx | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/content/docs/authenticate/manage-authentication/session-management-per-organization.mdx diff --git a/src/content/docs/authenticate/manage-authentication/session-management-per-organization.mdx b/src/content/docs/authenticate/manage-authentication/session-management-per-organization.mdx new file mode 100644 index 000000000..9f3c2d94a --- /dev/null +++ b/src/content/docs/authenticate/manage-authentication/session-management-per-organization.mdx @@ -0,0 +1,35 @@ +--- +page_id: 6f5b7b0d-3818-4654-a1a1-3247a5e4d52a +title: Session management per organization +sidebar: + order: 8 +relatedArticles: + - 76e2d2d3-830a-43b0-8b7b-8d0b0316b776 + - 5a248c6f-c1ae-480a-95c3-d3c69c81598d + - 4ed081b0-7853-49be-b5fd-22a84a86bdad +--- + +You can change Kinde authenticated session configuration at the organization level as well as the environment level. An authenticated session (or SSO session) is the time during which a user is authenticated via Kinde, regardless of their activity. You can define if a session persists even after a browser is closed, and how long can lapse before making the organization's user re-authenticate. + +These settings only apply to Kinde sessions and not sessions you maintain through your own application. + +## Limitations of Kinde session configuration + +- Session cookies are not destroyed when a tab is closed, the full browser window must be closed. +- Modern browsers usually allow session restoration. Restoring a browser session can also restore a session cookie. + +## Manage SSO session behaviors and policies per organization + +When you change session settings at the organization level, this overrides session settings at the environment level. + +1. In Kinde, go to **Organizations** and open the orgnization who's session settings you want to configure. +2. Select **Sessions** in the side menu. +3. In the **SSO sessions** section, decide on the policy for session cookies. A persistent session leaves the cookie active when the browser is closed. A non-persistent session is terminated when the browser window closes (unless the limitations listed above apply). +4. In the **Session inactivity timeout** section, set how long a session can be inactive before prompting re-authentication. This setting is applied in seconds - where 3,600 seconds is one hour; 86,400 seconds is one day. +5. When you're finished, select **Save**. + +The session settings will now be applied to members of this organization. + +## Manage organization session behavior via API + +Use this endpoint to update session settings [via API](https://docs.kinde.com/kinde-apis/management/#tag/organizations/patch/api/v1/organizations/{org_code}/sessions/). `PATCH /api/v1/organizations/{org_code}/sessions` From afacbaf3f38b75860b7542183472c776605551e7 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Fri, 16 May 2025 15:12:00 +1000 Subject: [PATCH 005/755] Update session-management.mdx Update for session mgmt per org --- .../authenticate/manage-authentication/session-management.mdx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/content/docs/authenticate/manage-authentication/session-management.mdx b/src/content/docs/authenticate/manage-authentication/session-management.mdx index 81bb2fddd..343ac45d8 100644 --- a/src/content/docs/authenticate/manage-authentication/session-management.mdx +++ b/src/content/docs/authenticate/manage-authentication/session-management.mdx @@ -4,14 +4,15 @@ title: Session management sidebar: order: 7 relatedArticles: + - 6f5b7b0d-3818-4654-a1a1-3247a5e4d52a - 5a248c6f-c1ae-480a-95c3-d3c69c81598d - 4ed081b0-7853-49be-b5fd-22a84a86bdad - - 50284476-2442-414c-af20-01ed3ef4ca4e --- You can manage Kinde authenticated sessions via your application settings. An authenticated session (or SSO session) is the time during which a user is authenticated via Kinde, regardless of their activity. You can define if a session persists even after a browser is closed, and how long can lapse before making a user re-authenticate. These settings only apply to Kinde sessions and not sessions you maintain through your own application. +If you want, you can [change session settings for an organization](/authenticate/manage-authentication/session-management-per-organization/), without affecting other organizations. ## Limitations From 9d53e68eae826f77ebb842c7a869771fd601c3cc Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Fri, 16 May 2025 15:14:44 +1000 Subject: [PATCH 006/755] Update session-management-per-organization.mdx --- .../session-management-per-organization.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/authenticate/manage-authentication/session-management-per-organization.mdx b/src/content/docs/authenticate/manage-authentication/session-management-per-organization.mdx index 9f3c2d94a..c1b175784 100644 --- a/src/content/docs/authenticate/manage-authentication/session-management-per-organization.mdx +++ b/src/content/docs/authenticate/manage-authentication/session-management-per-organization.mdx @@ -9,7 +9,7 @@ relatedArticles: - 4ed081b0-7853-49be-b5fd-22a84a86bdad --- -You can change Kinde authenticated session configuration at the organization level as well as the environment level. An authenticated session (or SSO session) is the time during which a user is authenticated via Kinde, regardless of their activity. You can define if a session persists even after a browser is closed, and how long can lapse before making the organization's user re-authenticate. +If you are on the Kinde Scale plan, you can change Kinde authenticated session configuration at the organization level as well as the environment level. An authenticated session (or SSO session) is the time during which a user is authenticated via Kinde, regardless of their activity. You can define if a session persists even after a browser is closed, and how long can lapse before making the organization's user re-authenticate. These settings only apply to Kinde sessions and not sessions you maintain through your own application. From 10a82e464940ec1da7baf5800a48058e149eef7c Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Fri, 16 May 2025 15:34:59 +1000 Subject: [PATCH 007/755] Update src/content/docs/authenticate/manage-authentication/session-management-per-organization.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- .../session-management-per-organization.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/authenticate/manage-authentication/session-management-per-organization.mdx b/src/content/docs/authenticate/manage-authentication/session-management-per-organization.mdx index c1b175784..a3d6ee509 100644 --- a/src/content/docs/authenticate/manage-authentication/session-management-per-organization.mdx +++ b/src/content/docs/authenticate/manage-authentication/session-management-per-organization.mdx @@ -22,7 +22,7 @@ These settings only apply to Kinde sessions and not sessions you maintain throug When you change session settings at the organization level, this overrides session settings at the environment level. -1. In Kinde, go to **Organizations** and open the orgnization who's session settings you want to configure. +1. In Kinde, go to **Organizations** and open the organization whose session settings you want to configure. 2. Select **Sessions** in the side menu. 3. In the **SSO sessions** section, decide on the policy for session cookies. A persistent session leaves the cookie active when the browser is closed. A non-persistent session is terminated when the browser window closes (unless the limitations listed above apply). 4. In the **Session inactivity timeout** section, set how long a session can be inactive before prompting re-authentication. This setting is applied in seconds - where 3,600 seconds is one hour; 86,400 seconds is one day. From 6158c60d91883f8d5b3f0515791891de92745ac1 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Mon, 19 May 2025 19:26:23 +1000 Subject: [PATCH 008/755] Update auth0-to-kinde.mdx Update to refer to connection type in identity array --- .../switch-to-kinde/auth0-to-kinde.mdx | 48 +++++++++++++++++-- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/src/content/docs/get-started/switch-to-kinde/auth0-to-kinde.mdx b/src/content/docs/get-started/switch-to-kinde/auth0-to-kinde.mdx index 02aa817a1..fe63fbbb6 100644 --- a/src/content/docs/get-started/switch-to-kinde/auth0-to-kinde.mdx +++ b/src/content/docs/get-started/switch-to-kinde/auth0-to-kinde.mdx @@ -46,20 +46,60 @@ You'll now see it in your list of installed extensions. The first time you launc File format guidelines: - User details and passwords must be in NDJSON (Newline Delimited JSON) format -- Import file size limit is 5MB. You may need to split the file if the exported size exceeds this. +- Import file size limit is 20MB. You may need to split the file if the exported size exceeds this. ### Supported auth methods Kinde supports migrating the following authentication methods from Auth0: Usernames, Email, Phone, Google, Apple, Microsoft, Facebook, GitHub, Twitch, Bitbucket. If you need to migrate another authentication type from Auth0 please get in touch with support. +Auth methods are shown in the `connection` attribute. These are represented as follows in the identity array: + +- Username-Password-Authentication +- email +- sms +- google-oauth2 +- github +- twitch +- facebook +- bitbucket +- windowslive + +Here's an example of the an identity extracted from Auth0. + +```js +{ + "Id": "auth0|001", + "Given Name": "Joe Bloggs", + "Nickname": "Joey", + "Name": "Joe Bloggs", + "Email": "joe@bloggs.com", + "Email Verified": false, + "Connection": "Username-Password-Authentication", + "Created At": "2022-11-29T09:24:17.907Z", + "Updated At": "2022-11-29T09:24:17.907Z", + "identities": [ + { + "profileData": { + "email": "joe@bloggs.com", + "email_verified": false + }, + "provider": "auth0", + "connection": "Username-Password-Authentication", + "isSocial": false, + "user_id": "001" + } + ] +} +``` + ### Can’t get the passwords from Auth0? -Some Auth0 plans don’t allow password exports, or you might not want to wait 2 weeks for the json file. If this is the case, import the user data you’re able to, and Kinde will ask users to set a new password the next time they sign in. +Some Auth0 plans don’t allow password exports, or you might not want to wait 2 weeks for the file. If this is the case, import the user data you’re able to, and Kinde will ask users to set a new password the next time they sign in. ### Export Auth0 data 1. Launch the extension by selecting **Import / Export Extension.** -2. **E**xport your existing Auth0 users associated with database connections, select **Export**. +2. Export your existing Auth0 users associated with database connections, select **Export**. ![Auth0 export selections screen shot](https://imagedelivery.net/skPPZTHzSlcslvHjesZQcQ/0748f464-d46f-4455-20dc-8f1c677fbb00/public) @@ -87,7 +127,7 @@ Once the password hashes have been imported, your users will be able to sign in ### How Auth0 user identities are treated on import -Social identities without an email can be imported, and are identified by the identity type. You can import users with multiple identities, these will be listed under the user’s profile. +Social identities without an email can be imported, and are identified by the connection type. You can also import users with multiple identities, these will be listed under the user’s profile. ## After the migration From fcb29aa31b60ab1716397e36ab3a40ebbb998a82 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Mon, 19 May 2025 19:27:03 +1000 Subject: [PATCH 009/755] Update auth0-to-kinde.mdx MB update --- src/content/docs/get-started/switch-to-kinde/auth0-to-kinde.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/get-started/switch-to-kinde/auth0-to-kinde.mdx b/src/content/docs/get-started/switch-to-kinde/auth0-to-kinde.mdx index fe63fbbb6..a4f57e5e7 100644 --- a/src/content/docs/get-started/switch-to-kinde/auth0-to-kinde.mdx +++ b/src/content/docs/get-started/switch-to-kinde/auth0-to-kinde.mdx @@ -12,7 +12,7 @@ This guide is designed to help you migrate from Auth0 to Kinde. Switching between providers for any service can be daunting, and especially where user data is involved. We’ll walk you through the process or migrating, to take some of the pain away. -If you’ve got a lot of users (your export file is over 5MB) or are concerned about file size limits, you can contact us to ensure the import goes smoothly. +If you’ve got a lot of users (your export file is over 20MB) or are concerned about file size limits, you can contact us to ensure the import goes smoothly. ## Still not sure about moving to Kinde? From 095a423c19e8b5cba6c00102cdcef595c2c28c80 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Mon, 19 May 2025 19:32:41 +1000 Subject: [PATCH 010/755] Update import-users-in-bulk.mdx Update to NDJSON requirements Added code examples from Auth0 Added info re connection attribute --- .../add-and-edit/import-users-in-bulk.mdx | 204 +++++++++++++++++- 1 file changed, 193 insertions(+), 11 deletions(-) diff --git a/src/content/docs/manage-users/add-and-edit/import-users-in-bulk.mdx b/src/content/docs/manage-users/add-and-edit/import-users-in-bulk.mdx index 84eecff81..56a1714c4 100644 --- a/src/content/docs/manage-users/add-and-edit/import-users-in-bulk.mdx +++ b/src/content/docs/manage-users/add-and-edit/import-users-in-bulk.mdx @@ -12,15 +12,15 @@ app_context: - m: profile --- -You can import users in bulk, from CSV or from other files provided by your previous authentication service, such as Auth0. +You can import users in bulk, from CSV, JSON, or from other files provided by your previous authentication service, such as Auth0. ## File requirements - Non Auth0 data - User details and passwords need to be in UTF-8 encoded CSV format - Auth0 data - User details and passwords need to be in NDJSON (Newline Delimited JSON) format -- File size limit 5MB +- File size up to 20MB supported -If you’ve got large user sets (over 5MB) or are concerned about file size limits, contact us to ensure the import goes smoothly. +If you’ve got large user sets (over 20MB) or are concerned about file size limits, you might consider importing in batches, or contact us for import support. ## Before you import users @@ -36,21 +36,203 @@ Kinde treats usernames as case-insensitive. In other words, we ignore case. We d We are happy to support users choosing an aesthetically pleasing username combination, like `RosyRose` or `BuilderBob`. We just don't also support separate identities for `rosYrosE` and `BUilderbob`. Before importing users, we recommend checking that all usernames are unique in more than just case. -## Prepare JSON data (Auth0 imports) +## Prepare NDJSON data (Auth0 imports) When you export user details from Auth0: - select all the default fields and add the `identities` field to the import list. -- select the JSON file format for export. +- select the NDJSON file format for export. + +`Identities` data distinguishes the type of identity, specifically the `connection` attribute. e.g. username, phone, GitHub, Google, etc. + +Example of the NDJSON file format + +```js +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "User Object", + "type": "object", + "properties": { + "id": { "type": "string" }, + "first_name": { "type": "string" }, + "last_name": { "type": "string" }, + "email": { "type": "string", "format": "email" }, + "email_verified": { "type": "boolean" }, + "created_on": { "type": "string", "format": "date-time" }, + "identities": { + "type": "array", + "items": { + "type": "object", + "properties": { + "identity": { "type": "string" }, + "user_id": { "type": "string" }, + "type": { + "type": "string", + "enum": [ + "oauth2:slack", + "oauth2:github", + "oauth2:twitch", + "oauth2:gitlab", + "oauth2:linkedin", + "oauth2:facebook", + "oauth2:xero", + "oauth2:bitbucket", + "oauth2:stripe", + "wsfed:azure_ad", + "oauth2:discord", + "oauth2:twitter", + "phone", + "username", + "email", + "oauth2:microsoft", + "oauth2:azure_ad", + "oauth2:google", + "oauth2:clever", + "oauth2:apple", + "oauth2:roblox" + ] + }, + "is_verified": { "type": "boolean" } + } + } + }, + "organizations": { + "type": "array", + "items": { + "type": "object", + "properties": { + "external_id": { "type": "string" }, + "roles": { + "type": "array", + "items": { "type": "string" } + }, + "permissions": { + "type": "array", + "items": { "type": "string" } + }, + "scopes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "audience": { "type": "string" }, + "scope": { "type": "string" } + }, + "required": ["audience", "scope"] + } + } + } + } + }, + "feature_flags": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { "type": "string" }, + "value": { + "oneOf": [ + { "type": "string" }, + { "type": "number" }, + { "type": "boolean" }, + { "type": "object" } + ] + } + }, + "required": ["key", "value"] + } + }, + "properties": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { "type": "string" }, + "value": { "type": "string" } + }, + "required": ["key", "value"] + } + }, + "password": { + "type": "object", + "properties": { + "hashed_password": { "type": "string" }, + "hashing_algorithm": { "type": "string" }, + "salt": { "type": "string" }, + "salt_position": { "type": "string", "enum": ["prefix", "suffix", "none"] }, + "salt_format": { "type": "string" } + }, + "required": [ + "hashed_password", + "hashing_algorithm" + ] + } + } +} +``` -`Identities` data distinguishes the type of identity, e.g. username, phone, GitHub, Google, etc. +Example of a single line of user data in NDJSON + +```js +{ + "id": "001", + "first_name": "John", + "last_name": "Snow", + "email": "john@snow.com", + "email_verified": true, + "created_on": "2025-05-08T13:00:23+01:00", + "identities": [ + { + "identity": "john@snow.com", + "type": "email", + "is_verified": true + } + ], + "organizations": [ + { + "external_id": "org_1", + "roles": ["admin", "member"], + "permissions": ["read", "write"], + "scopes": [ + { "audience": "myapi", "scope": "user" } + ] + } + ], + "feature_flags": [ + { "key": "feature_bool", "value": "true" }, + { "key": "feature_int", "value": "1" }, + { "key": "feature_text", "value": "hello world" } + ], + "properties": [ + { "key": "kp_usr_city", "value": "Bristol" }, + { "key": "kp_usr_industry", "value": "Technology" } + ], + "password": { + "hashed_password": "e7bd1e090a921de087269f9ac10336fb", + "hashing_algorithm": "md5", + "salt": "salty", + "salt_position": "prefix", + "salt_format": "hex" + } +} +``` ### How Auth0 user identities are treated on import -Social identities without an email can be imported, and are identified by the identity type. You can import users with multiple identities, these will be listed under the user’s profile. +Social identities without an email can be imported, and are identified by the connection type. You can import users with multiple identities, these will be listed under the user’s profile. + +Kinde supports migrating the following authentication methods from Auth0: Usernames, Email, Phone, Google, Apple, Microsoft, Facebook, GitHub, Twitch, Bitbucket. Auth methods are shown in the `connection` attribute. These are represented as follows in the identity data: + +- Username-Password-Authentication +- email +- sms +- google-oauth2 +- github +- twitch +- facebook +- bitbucket +- windowslive -Kinde supports migrating the following authentication methods from Auth0: Usernames, Email, Phone, Google, Apple, Microsoft, Facebook, GitHub, Twitch, Bitbucket. -If you need to migrate another authentication type from Auth0 please get in touch with support. ### Import options @@ -159,7 +341,7 @@ id,roles,permissions,external_organization_id 0001,"role_3,role_4","permission_3,permission_4","ext_org_id_2" ``` -## **How to import users** +## How to import users 1. In Kinde, go to **Users**, then select **Import users**. 2. Select the option for your situation: @@ -183,7 +365,7 @@ When you import passwords via CSV, Kinde does not check for password strength. H In future, we may add the ability to check password strength and initiate a password change if it's deemed to weak by standard password criteria. -## Re-**importing does not update user info** +## Re-importing does not update user info If you add a user via import and they start authenticating via Kinde, and then you import their records again with changes - for example, a name change or a new email - that information will not be updated in Kinde. From 4de82ed7b85974664cfa96c5f085754195eb59d4 Mon Sep 17 00:00:00 2001 From: sarah_inkeep Date: Mon, 19 May 2025 09:24:14 -0700 Subject: [PATCH 011/755] Only apply inkeep modal animation when modal is not full screen --- public/vendors/inkeep.css | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/public/vendors/inkeep.css b/public/vendors/inkeep.css index 6e051c7c5..13628a944 100644 --- a/public/vendors/inkeep.css +++ b/public/vendors/inkeep.css @@ -6,9 +6,11 @@ background: rgba(0,0,0,0.4); } -.ikp-modal__content { - opacity: 0; - animation: showInkeepModal .4s ease forwards !important; +@media (min-width: 769px) { + .ikp-modal__content { + opacity: 0; + animation: showInkeepModal .4s ease forwards !important; + } } @keyframes showInkeepModal { From df9c8d65b3d85fe3cd0eff36e441c955d8768805 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Tue, 20 May 2025 09:18:48 +1000 Subject: [PATCH 012/755] Update src/content/docs/get-started/switch-to-kinde/auth0-to-kinde.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- .../docs/get-started/switch-to-kinde/auth0-to-kinde.mdx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/content/docs/get-started/switch-to-kinde/auth0-to-kinde.mdx b/src/content/docs/get-started/switch-to-kinde/auth0-to-kinde.mdx index a4f57e5e7..49cef356c 100644 --- a/src/content/docs/get-started/switch-to-kinde/auth0-to-kinde.mdx +++ b/src/content/docs/get-started/switch-to-kinde/auth0-to-kinde.mdx @@ -127,7 +127,8 @@ Once the password hashes have been imported, your users will be able to sign in ### How Auth0 user identities are treated on import -Social identities without an email can be imported, and are identified by the connection type. You can also import users with multiple identities, these will be listed under the user’s profile. +Social identities without an email can be imported and are identified by the `connection` attribute. +You can also import users with multiple identities; these will be listed under the user’s profile. ## After the migration From 7ed2d54ccab469c75d46b976a265e481a76299ee Mon Sep 17 00:00:00 2001 From: Brett Chaldecott Date: Tue, 20 May 2025 14:49:29 +0200 Subject: [PATCH 013/755] docs(python-sdk): major update to SDK documentation with new features and examples - Add comprehensive environment variables documentation - Document Flask and FastAPI framework support - Enhance permissions, feature flags, and claims documentation - Add Management API integration guide - Update code examples with async/await patterns --- .../sdks/backend/python-sdk-v1.mdx | 854 +++++++++++++ .../sdks/backend/python-sdk.mdx | 1064 ++++++++--------- 2 files changed, 1328 insertions(+), 590 deletions(-) create mode 100644 src/content/docs/developer-tools/sdks/backend/python-sdk-v1.mdx diff --git a/src/content/docs/developer-tools/sdks/backend/python-sdk-v1.mdx b/src/content/docs/developer-tools/sdks/backend/python-sdk-v1.mdx new file mode 100644 index 000000000..2b0c141d7 --- /dev/null +++ b/src/content/docs/developer-tools/sdks/backend/python-sdk-v1.mdx @@ -0,0 +1,854 @@ +--- +page_id: 2b425ccb-d328-41ff-afb2-016019f46839 +title: Python SDK v1 +sidebar: + order: -1 + hidden: true +relatedArticles: + - 02d02820-92da-4721-9a91-222c9b095869 +head: + - tag: meta + attrs: + property: "og:image" + content: "https://kinde.com/assets/images/open-graph/DOCS-SSI-SDK_python.png" +--- + +The Kinde Python SDK allows developers to quickly and securely integrate a new or an existing Python application into the Kinde platform. + +## Before you begin + +- Kinde Python SDK supports Python 3.8+ +- If you haven’t already got a Kinde account, [register for free here](https://app.kinde.com/register) (no credit card required). Registering gives you a Kinde domain, which you need to get started, e.g. `yourapp.kinde.com`. + +For new projects, you can also find our [Starter Kit on GitHub](https://github.com/kinde-starter-kits/python-starter-kit). + +## Install + +Install [PIP](https://pip.pypa.io/en/stable/installation/) and then execute the following command: + +```bash +pip install kinde-python-sdk +``` + +### Set callback URLs + +1. In Kinde, go to **Settings > Applications > [Your app] > View details**. +2. Add your callback URLs in the relevant fields. For example: + - Allowed callback URLs (also known as redirect URIs) - for example, `http://localhost:8000/callback` + - Allowed logout redirect URLs - for example, `http://localhost:8000` +3. Select **Save**. + +### Add environments + +Kinde comes with a production environment, but you can set up other environments if you want to. Note that each environment needs to be set up independently, so you need to use the Environment subdomain in the code block above for those new environments. + +## Configure your app + +**Environment variables** + +The following variables need to be replaced in the code snippets below. + +- `KINDE_HOST` - your Kinde domain, e.g. `https://yourdomain.kinde.com` +- `KINDE_CLIENT_ID` - In Kinde, go to **Settings > Applications > [your application] > View details**. +- `KINDE_CLIENT_SECRET` - In Kinde, go to **Settings > Applications > [your application] > View details**. +- `KINDE_REDIRECT_URL` - your callback urls or redirect URIs, e.g. `http://localhost:8000/callback` +- `KINDE_POST_LOGOUT_REDIRECT_URL` - where you want users to be redirected to after signing out, e.g. `http://localhost:8000` + +## Integrate with your app + +Create a new instance of the Kinde Auth client object before you initialize your app. + +```python +... +from kinde_sdk import Configuration +from kinde_sdk.kinde_api_client import GrantType, KindeApiClient +... + +configuration = Configuration(host=KINDE_HOST) +kinde_api_client_params = { + "configuration": configuration, + "domain": KINDE_HOST, + "client_id": KINDE_CLIENT_ID, + "client_secret": KINDE_CLIENT_SECRET, + "grant_type": GRANT_TYPE, # client_credentials | authorization_code | authorization_code_with_pkce + "callback_url": KINDE_REDIRECT_URL +} +kinde_client = KindeApiClient(**kinde_api_client_params) +``` + +With **PKCE** flow, the `code_verifier` is required. + +```python +from authlib.common.security import generate_token +CODE_VERIFIER = generate_token(48) +kinde_api_client_params["code_verifier"] = CODE_VERIFIER +``` + +## Sign in and sign up + +The Kinde client provides methods for easy sign in and sign up. You can add buttons in your HTML as follows: + +```html + +``` + +You will also need to route `/login` and `/register` to the SDK methods: + +```python +@app.route("/login") +def login(): + return app.redirect(kinde_client.get_login_url()) + + +@app.route("/register") +def register(): + return app.redirect(kinde_client.get_register_url()) +``` + +## Manage redirects + +When the user is redirected back to your site from Kinde, this will call your callback URL defined in the `KINDE_REDIRECT_URL` variable. You will need to route `/callback` to call a function to handle this. + +```python +@app.route("/callback") +def callback(): + kinde_client.fetch_token(authorization_response=request.url) + print(configuration.access_token) # Token here +``` + +The code above setups up the Kinde client as a single instance per user session. If you want to setup the Kinde client as a singleton, you can do the following: +```python +@app.route("/callback") +def callback(): + access_token: dict = kinde_client.fetch_token_value(authorization_response=request.url) + print(access_token) # Token here +``` +This logic leaves the Kinde client responsible for managing the access_token, but not for storing them. This is left up to the developer to implement. + +You can also get the current authentication status with `is_authenticated`. + +```python +if kinde_client.is_authenticated(): + # Core here +``` +The code above will check if a user is authenticated by checking its internal state. The down side is that the there will have to be an instance of the Kinde client for each user session. This is costly and not scalable. + +```python +if kinde_client.is_authenticated_token(access_token): + # Core here +``` + + +**Note:** The kinde_client object that is created stores the access_token. This means you need to create a kinde_client object for each unique user that is signing in to your application, so that you can keep track of whether the user is authenticated or not. + +## Logout + +The SDK comes with a logout method that returns a logout URL. + +```python +kinde_client.logout(redirect_to=KINDE_POST_LOGOUT_REDIRECT_URL) + +@app.route("/logout") +def logout(): + return app.redirect( + kinde_client.logout(redirect_to=KINDE_POST_LOGOUT_REDIRECT_URL) + ) +``` + +## Get user information + +To access the user information, use the `get_user_details` helper function: + +```python +kinde_client.get_user_details(); +{ + "given_name":"Dave", + "id":"abcdef", + "family_name":"Smith", + "email":"dave@smith.com", + "picture": "https://link_to_avatar_url.kinde.com" +} +``` + +### View users in Kinde + +Go to the **Users** page in Kinde to see who has registered. + +## User permissions + +After a user signs in and they are verified, the token return includes permissions for that user. [User permissions are set in Kinde](/manage-users/roles-and-permissions/user-permissions/), but you must also configure your application to unlock these functions. + +```python +permissions = [ + "create:todos", + "update:todos", + "read:todos", + "delete:todos", + "create:tasks", + "update:tasks", + "read:tasks", + "delete:tasks", +] +``` + +We provide helper functions to more easily access permissions: + +```python +kinde_client.get_permission("create:todos") + +kinde_client.get_permissions() +``` + +A practical example in code might look something like: + +```python +if kinde_client.get_permission("create:todos").get("is_granted")): +``` + +The code above will check against a session managed through the Kinde client. If you want to check against a specific access token, you can do the following: + +```python +permission: dict = kinde_client.get_permission_token(access_token, "create:todos") +``` + +## Feature Flags + +We have provided a helper to grab any feature flag from `access_token`: + +```python +kinde_client.get_flag("theme"); +{ + "code": "theme", + "type": "string", + "value": "pink", + "is_default": False # whether the fallback value had to be used +} + +kinde_client.get_flag("is_dark_mode"); +{ + "code": "is_dark_mode", + "type": "boolean", + "value": True, + "is_default": False +} + +kinde_client.get_flag("create_competition", default_value = False); +{ + "code": "create_competition", + "type" => "boolean", + "value": False, + "is_default": True # because fallback value had to be used +} + +kinde_client.get_flag("competitions_limit", default_value = 3, flat_type = "s"); + + +kinde_client.get_flag("new_feature"); + +# this will return the flag value for the given access token +kinde_client.get_flag_token(access_token, "new_feature"); +``` + +We also provide wrapper functions which should leverage `getFlag` above. + +**Get boolean flags** + +```python +kinde_client.get_boolean_flag("is_dark_mode"); + +kinde_client.get_boolean_flag("is_dark_mode", False); + +kinde_client.get_boolean_flag("new_feature", False); + +kinde_client.get_boolean_flag("new_feature"); + +kinde_client.get_boolean_flag("theme", False); + +kinde_client.get_boolean_flag_token(access_token, "new_feature"); +``` + +**Get string flags** + +```python +kinde_client.get_string_flag("theme"); + +kinde_client.get_string_flag("theme", False); + +kinde_client.get_string_flag("cta_color", False); + +kinde_client.get_string_flag("cta_color"); + +kinde_client.get_string_flag("is_dark_mode", False); + +kinde_client.get_string_flag_token(access_token, "cta_color"); +``` + +**Get integer flags** + +```python +kinde_client.get_integer_flag("competitions_limit"); + +kinde_client.get_integer_flag("competitions_limit", 3); + +kinde_client.get_integer_flag("team_count", 2); + +kinde_client.get_integer_flag("team_count"); + +kinde_client.get_integer_flag("is_dark_mode", False); + +kinde_client.get_integer_flag_token(access_token, "team_count"); +``` + +## Audience + +An `audience` is the intended recipient of an access token - for example the API for your application. The audience argument can be passed to the Kinde client to request an audience be added to the provided token. + +The audience of a token is the intended recipient of the token. + +```python +kinde_api_client_params["audience"] = "api.yourapp.com" +``` + +For details on how to connect, see [Register an API](/developer-tools/your-apis/register-manage-apis/) + +## Overriding scope + +By default the `KindeSDK` requests the following scopes: + +- profile +- email +- offline +- openid + +You can override this by passing scope into the `KindeSDK`. + +```python +kinde_api_client_params["scope"] = "profile email offline openid" +``` + +### Getting claims + +We have provided a helper to grab any claim from your id or access tokens. The helper defaults to access tokens: + +```python +kinde_client.get_claim("aud") + +kinde_client.get_claim("given_name", "id_token") + +kinde_client.get_claim_token(access_token, "given_name") +``` + +## Organizations + +### Create an organization + +To create a new organization within your application, you will need to run a similar function to below: + +```python +return app.redirect(kinde_client.create_org()) +``` + +### Sign up and sign in to organizations + +Kinde has a unique code for every organization. You’ll have to pass this code through when you register a new user or sign in to a particular organization. Example function below: + +```python +kinde_api_client_params["org_code"] = 'your_org_code' + +@app.route("/login") +def login(): + return app.redirect(kinde_client.get_login_url()) + + +@app.route("/register") +def register(): + return app.redirect(kinde_client.get_register_url()) +``` + +Following authentication, Kinde provides a json web token (jwt) to your application. Along with the standard information we also include the `org_code` and the permissions for that organization (this is important as a user can belong to multiple organizations and have different permissions for each). + +Example of a returned token: + +```python +{ + "aud": [], + "exp": 1658475930, + "iat": 1658472329, + "iss": "https://your_subdomain.kinde.com", + "jti": "123457890", + "org_code": "org_1234", + "permissions": ["read:todos", "create:todos"], + "scp": [ + "openid", + "profile", + "email", + "offline" + ], + "sub": "kp:123457890" +} +``` + +The `id_token` will also contain an array of organizations that a user belongs to - this is useful if you wanted to build out an organization switcher for example. + +```python +{ + ... + "org_codes": ["org_1234", "org_4567"], + ... +}; +``` + +There are two helper functions you can use to extract information: + +```python +kinde_client.get_organization() + +kinde_client.get_user_organizations() +``` + +For more information about how organizations work in Kinde, see [Kinde organizations for developers](/build/organizations/orgs-for-developers/). + +### Token storage + +Once the user has successfully authenticated, you'll get a JWT and possibly a refresh token that should be stored securely. + +## SDK API reference + +### `domain` + +Either your Kinde instance url or your custom domain. e.g. `https://yourapp.kinde.com`. + +Type: `string` + +Required: Yes + +### `callback_url` + +The url that the user will be returned to after authentication. + +Type: `string` + +Required: Yes + +### `client_id` + +The ID of your application in Kinde. + +Type: `string` + +Required: Yes + +### `grant_type` + +Define the grant type when using the SDK. + +Type: `string` + +Required: Yes + +### `client_secret` + +The unique client secret associated with your application in Kinde. + +Type: `string` + +Required: No + +### `code_verifier` + +PKCE works by having the app generate a random value at the beginning of the flow called a Code Verifier. + +Type: `string` + +Required: No, except for PKCE flow + +### `scope` + +The scopes to be requested from Kinde. + +Type: `string` + +Required: No + +Default: `openid profile email offline` + +### `audience` + +The audience claim for the JWT. + +Type: `string` + +Required: No + +### `org_code` + +Additional parameters that will be passed in the authorization request. + +Type: `string` + +Required: No + +## KindeSDK methods + +### `get_login_url` + +Constructs a redirect URL and sends the user to Kinde to sign in. Optional parameters are used for custom sign-up and sign-in and are documented [here](/authenticate/custom-configurations/custom-authentication-pages/). + +Arguments (optional): + +```python +auth_url_params: Optional[Dict[str, Dict[str, str]]] +``` + +Usage: + +```python +kinde_client.get_login_url() + +kinde_client.get_login_url({ + "auth_url_params": { + "connection_id": "conn_6a95dec504d34dc286dc80e8df9f6099" + } +}) + + +``` + +Sample output: + +```python +https://your_host.kinde.com/oauth2/auth?response_type=code&… +``` + +### `get_register_url` + +Constructs a redirect URL and sends the user to Kinde to sign up. Optional parameters are used for custom sign-up and sign-in and are documented [here](/authenticate/custom-configurations/custom-authentication-pages/). + +Arguments (optional): + +```python +auth_url_params: Optional[Dict[str, Dict[str, str]]] +``` + +Usage: + +```python +kinde_client.get_register_url() + +kinde_client.get_register_url({ + "auth_url_params": { + "connection_id": "conn_6a95dec504d34dc286dc80e8df9f6099" + } +}) +``` + +Sample: + +```python +https://your_host.kinde.com/oauth2/auth?response_type=code&… +``` + +### `logout` + +Logs the user out of Kinde. + +Arguments: + +```python +redirect_to: str +``` + +Usage: + +```python +kinde_client.logout(redirect_to="KINDE_POST_LOGOUT_REDIRECT_URL") +``` + +Sample: + +```python +https://your_host.kinde.com/logout?redirect=https://… +``` + +### `fetch_token` + +Returns the raw access token from URL after logged in from Kinde. + +Arguments: + +```python +authorization_response: str +``` + +Usage: + +```python +kinde_client.fetch_token(authorization_response=”[http://localhost:8000?code=42..e9&state=d..t](https://example.com/github?code=42..e9&state=d..t)”) + +token: dict = kinde_client.fetch_token_value(authorization_response=”[http://localhost:8000?code=42..e9&state=d..t](https://example.com/github?code=42..e9&state=d..t)”) +``` + +Sample: + +```python +eyJhbGciOiJIUzI1... +``` + +### `refresh_token` + +Get new access token from Kinde if existed `refresh_token`. + +Usage: + +```python +kinde_client.refresh_token() + +kinde_client._refresh_token_value(refresh_value) +``` + +### `create_org` + +Return the redirect URL to sign up and create a new organization in your business. + +Usage: + +```python +kinde_client.create_org() +``` + +Sample: + +```python +https://your_host.kinde.com/oauth2/auth?response_type=code&… +``` + +### `get_claim` + +Gets a claim from an access or ID token. + +Arguments: + +```python +claim: str, token_name?: str # default: access_token +``` + +Usage: + +```python +kinde_client.get_claim("given_name", "id_token") + +kinde_client.get_claim_token(access_token, "given_name") +``` + +Sample: + +```python +{"name": "given_name", "value": "David"} +``` + +### `get_permission` + +Returns the state of a given permission. + +Arguments: + +```python +key: str +``` + +Usage: + +```python +kinde_client.get_permission(”read:todos”) + +kinde_client.get_permission_token(access_token, "read:todos") +``` + +Sample: + +```python +{”org_code”: "org_b235c067b7e4", is_granted: True} +``` + +### `get_permissions` + +Returns all permissions for the current user for the organization they are signed into. + +Usage: + +```python +kinde_client.get_permissions() + +kinde_client.get_permissions_token(access_token) +``` + +Sample: + +```python +{"org_code": "org_b235c067b7e4", permissions: [ "create:users", "view:users" ]} +``` + +### `get_organization` + +Get details for the organization your user is signed into. + +Usage: + +```python +kinde_client.get_organization() + +kinde_client.get_organization_token(access_token) +``` + +Sample: + +```python +{"org_code": "org_1234"} +``` + +### `get_organizations` + +Gets an array of all organizations the user has access to. + +Usage: + +```python +kinde_client.get_user_organizations() + +kinde_client.get_user_organizations_token(access_token) +``` + +Sample: + +```python +{"org_codes": ["org_1234", "org_abcd"]} +``` + +### `get_user_details` + +Returns the profile for the current user. + +Usage: + +```python +kinde_client.get_user_details() + +kinde_client.get_user_details_token(access_token) +``` + +Sample: + +```python +{ + "given_name":"Dave", + "id":"abcdef", + "family_name":"Smith", + "email":"dave@smith.com", + "picture": "https://link_to_avatar_url.abc.com" +} +``` + +### `get_flag` + +Gets a feature flag from an access token. + +Arguments: + +```python +code: str +default_value?: str +flag_type?: str +``` + +Usage: + +```python +kinde_client.get_flag("theme"); + +kinde_client.get_flag_token(access_token, "theme"); +``` + +Sample: + +```python +{ + "code": "theme", + "type": "string", + "value": "pink", + "is_default": False +} +``` + +### `get_boolean_flag` + +Gets a boolean feature flag from an access token. + +Arguments: + +```python +code: str +default_value?: str +``` + +Usage: + +```python +kinde_client.get_boolean_flag("is_dark_mode"); + +kinde_client.get_boolean_flag_token(access_token, "is_dark_mode"); +``` + +Sample: `True` or `False` + +### `get_string_flag` + +Gets a string feature flag from an access token. + +Arguments: + +```python +code: str +default_value?: str +``` + +Usage: + +```python +kinde_client.get_string_flag("theme"); + +kinde_client.get_string_flag_token(access_token, "theme"); +``` + +Sample: `“pink”` + +### `get_integer_flag` + +Gets a integer feature flag from an access token + +Arguments: + +```python +code: str +default_value?: str +``` + +Usage: + +```python +kinde_client.get_integer_flag("competitions_limit"); + +kinde_client.get_integer_flag_token(access_token, "competitions_limit"); +``` + +Sample: `5` + +### `is_authenticated()` + +To check user authenticated or not. + +Sample: `true` or `false` + +If you need help connecting to Kinde, please contact us at [support@kinde.com](mailto:support@kinde.com). diff --git a/src/content/docs/developer-tools/sdks/backend/python-sdk.mdx b/src/content/docs/developer-tools/sdks/backend/python-sdk.mdx index 333a2d22e..448e59af8 100644 --- a/src/content/docs/developer-tools/sdks/backend/python-sdk.mdx +++ b/src/content/docs/developer-tools/sdks/backend/python-sdk.mdx @@ -10,14 +10,14 @@ head: content: "https://kinde.com/assets/images/open-graph/DOCS-SSI-SDK_python.png" --- -The Kinde Python SDK allows developers to quickly and securely integrate a new or an existing Python application into the Kinde platform. +The Kinde Python SDK allows developers to quickly and securely integrate a new or an existing Python application into the Kinde platform. The SDK supports both Flask and FastAPI frameworks through a single unified interface. ## Before you begin - Kinde Python SDK supports Python 3.9+ -- If you haven’t already got a Kinde account, [register for free here](https://app.kinde.com/register) (no credit card required). Registering gives you a Kinde domain, which you need to get started, e.g. `yourapp.kinde.com`. +- If you haven't already got a Kinde account, [register for free here](https://app.kinde.com/register) (no credit card required). Registering gives you a Kinde domain, which you need to get started, e.g. `yourapp.kinde.com`. -For new projects, you can also find our [Starter Kit on GitHub](https://github.com/kinde-starter-kits/python-starter-kit). +For new projects, you can also find our [Starter Kit on GitHub](https://github.com/kinde-starter-kits/python-starter-kit). ## Install @@ -27,6 +27,51 @@ Install [PIP](https://pip.pypa.io/en/stable/installation/) and then execute the pip install kinde-python-sdk ``` +### Environment Variables + +The Kinde Python SDK v2 uses environment variables for configuration. Here are all the supported variables: + +#### Required Variables +- `KINDE_CLIENT_ID` - Your application's client ID from Kinde +- `KINDE_CLIENT_SECRET` - Your application's client secret from Kinde +- `KINDE_REDIRECT_URI` - The callback URL where Kinde will redirect after authentication +- `KINDE_HOST` - Your Kinde domain (e.g., `https://yourdomain.kinde.com`) +- `KINDE_ISSUER_URL` - Your Kinde issuer URL (typically same as KINDE_HOST) +- `GRANT_TYPE` - The OAuth grant type to use (e.g., `AUTHORIZATION_CODE_WITH_PKCE`) + +#### Optional Variables +- `KINDE_AUDIENCE` - The intended recipient of the access token (for API access) +- `KINDE_CALLBACK_URL` - Alternative name for KINDE_REDIRECT_URI +- `LOGOUT_REDIRECT_URL` - Where users are redirected after logout +- `SITE_HOST` - Your application's host (default: `127.0.0.1`) +- `SITE_PORT` - Your application's port (default: `5000`) +- `SITE_URL` - Your application's base URL +- `CODE_VERIFIER` - Required for PKCE flow (auto-generated if not provided) +- `SECRET_KEY` - Used for session management +- `SESSION_TYPE` - Session storage type (e.g., `filesystem`) +- `SESSION_PERMANENT` - Whether sessions are permanent (default: `False`) +- `TEMPLATES_AUTO_RELOAD` - Whether to auto-reload templates (default: `True`) +- `MGMT_API_CLIENT_ID` - Management API client ID (if using management features) +- `MGMT_API_CLIENT_SECRET` - Management API client secret (if using management features) + +Example `.env` file: +```bash +KINDE_CLIENT_ID=your_client_id +KINDE_CLIENT_SECRET=your_client_secret +KINDE_REDIRECT_URI=http://localhost:5000/api/auth/kinde_callback +KINDE_HOST=https://yourdomain.kinde.com +KINDE_ISSUER_URL=https://yourdomain.kinde.com +GRANT_TYPE=AUTHORIZATION_CODE_WITH_PKCE +SITE_HOST=localhost +SITE_PORT=5000 +SITE_URL=http://localhost:5000 +LOGOUT_REDIRECT_URL=http://localhost:8000 +SECRET_KEY=your_secret_key +SESSION_TYPE=filesystem +SESSION_PERMANENT=False +TEMPLATES_AUTO_RELOAD=True +``` + ### Set callback URLs 1. In Kinde, go to **Settings > Applications > [Your app] > View details**. @@ -41,45 +86,30 @@ Kinde comes with a production environment, but you can set up other environments ## Configure your app -**Environment variables** - -The following variables need to be replaced in the code snippets below. - -- `KINDE_HOST` - your Kinde domain, e.g. `https://yourdomain.kinde.com` -- `KINDE_CLIENT_ID` - In Kinde, go to **Settings > Applications > [your application] > View details**. -- `KINDE_CLIENT_SECRET` - In Kinde, go to **Settings > Applications > [your application] > View details**. -- `KINDE_REDIRECT_URL` - your callback urls or redirect URIs, e.g. `http://localhost:8000/callback` -- `KINDE_POST_LOGOUT_REDIRECT_URL` - where you want users to be redirected to after signing out, e.g. `http://localhost:8000` - -## Integrate with your app - -Create a new instance of the Kinde Auth client object before you initialize your app. +The OAuth client is now automatically configured based on the framework you're using. Simply import the OAuth class from the auth module and create an instance: ```python -... - -... - -configuration = Configuration(host=KINDE_HOST) -kinde_api_client_params = { - "configuration": configuration, - "domain": KINDE_HOST, - "client_id": KINDE_CLIENT_ID, - "client_secret": KINDE_CLIENT_SECRET, - "grant_type": GRANT_TYPE, # client_credentials | authorization_code | authorization_code_with_pkce - "callback_url": KINDE_REDIRECT_URL -} -kinde_client = KindeApiClient(**kinde_api_client_params) -``` +from kinde_sdk.auth.oauth import OAuth -With **PKCE** flow, the `code_verifier` is required. +# For Flask applications +from flask import Flask +app = Flask(__name__) +oauth = OAuth( + framework="flask", + app=app # optional: pass your Flask app instance +) -```python -from authlib.common.security import generate_token -CODE_VERIFIER = generate_token(48) -kinde_api_client_params["code_verifier"] = CODE_VERIFIER +# For FastAPI applications +from fastapi import FastAPI +app = FastAPI() +oauth = OAuth( + framework="fastapi", + app=app # optional: pass your FastAPI app instance +) ``` +The SDK will automatically detect and configure the appropriate framework implementation based on the framework parameter and app instance you provide. + ## Sign in and sign up The Kinde client provides methods for easy sign in and sign up. You can add buttons in your HTML as follows: @@ -91,251 +121,438 @@ The Kinde client provides methods for easy sign in and sign up. You can add butt ``` -You will also need to route `/login` and `/register` to the SDK methods: +### Automatic Route Registration -```python -@app.route("/login") -def login(): - return app.redirect(kinde_client.get_login_url()) +The framework wrapper can automatically register all necessary routes. For Flask: +```python +from kinde_sdk.auth.oauth import OAuth +from flask import Flask -@app.route("/register") -def register(): - return app.redirect(kinde_client.get_register_url()) +app = Flask(__name__) +oauth = OAuth( + framework="flask", + app=app +) ``` -## Manage redirects - -When the user is redirected back to your site from Kinde, this will call your callback URL defined in the `KINDE_REDIRECT_URL` variable. You will need to route `/callback` to call a function to handle this. +For FastAPI: ```python -@app.route("/callback") -def callback(): - kinde_client.fetch_token(authorization_response=request.url) - print(configuration.access_token) # Token here +from kinde_sdk.auth.oauth import OAuth +from fastapi import FastAPI + +app = FastAPI() +oauth = OAuth( + framework="fastapi", + app=app +) ``` -The code above setups up the Kinde client as a single instance per user session. If you want to setup the Kinde client as a singleton, you can do the following: +### Manual Route Implementation + +If you prefer to implement the routes manually, here's how you can do it: + +For Flask: + ```python -@app.route("/callback") +import asyncio +from flask import Flask, request, session, redirect +from kinde_sdk.auth.oauth import OAuth + +app = Flask(__name__) +oauth = OAuth( + framework="flask", + app=app +) + +@app.route('/login') +def login(): + """Redirect to Kinde login page.""" + loop = asyncio.get_event_loop() + login_url = loop.run_until_complete(oauth.login()) + return redirect(login_url) + +@app.route('/register') +def register(): + """Redirect to Kinde registration page.""" + loop = asyncio.get_event_loop() + register_url = loop.run_until_complete(oauth.register()) + return redirect(register_url) + +@app.route('/callback') def callback(): - access_token: dict = kinde_client.fetch_token_value(authorization_response=request.url) - print(access_token) # Token here -``` -This logic leaves the Kinde client responsible for managing the access_token, but not for storing them. This is left up to the developer to implement. + """Handle the OAuth callback from Kinde.""" + try: + code = request.args.get('code') + state = request.args.get('state') + + if not code: + return "Authentication failed: No code provided", 400 + + # Generate a unique user ID for the session + user_id = session.get('user_id') or str(uuid.uuid4()) + + # Use OAuth's handle_redirect method to process the callback + loop = asyncio.get_event_loop() + result = loop.run_until_complete(oauth.handle_redirect(code, user_id, state)) + + # Store user ID in session + session['user_id'] = user_id + + return redirect('/') + except Exception as e: + return f"Authentication failed: {str(e)}", 400 + +@app.route('/logout') +def logout(): + """Logout the user and redirect to Kinde logout page.""" + user_id = session.get('user_id') + session.clear() + loop = asyncio.get_event_loop() + logout_url = loop.run_until_complete(oauth.logout(user_id)) + return redirect(logout_url) + +@app.route('/user') +def get_user(): + """Get the current user's information.""" + try: + if not oauth.is_authenticated(request): + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + try: + login_url = loop.run_until_complete(oauth.login()) + return redirect(login_url) + finally: + loop.close() + + return oauth.get_user_info(request) + except Exception as e: + return f"Failed to get user info: {str(e)}", 400 +``` + +For FastAPI: + +```python +from fastapi import FastAPI, Request +from fastapi.responses import RedirectResponse + +@app.get("/login") +async def login(request: Request): + url = await oauth.login() + return RedirectResponse(url=url) + +@app.get("/register") +async def register(request: Request): + url = await oauth.register() + return RedirectResponse(url=url) + +@app.get("/callback") +async def callback(request: Request, code: str, state: Optional[str] = None): + try: + result = await oauth.handle_redirect(code, state) + return RedirectResponse(url="/") + except Exception as e: + return HTMLResponse(f"Authentication failed: {str(e)}") + +@app.get("/logout") +async def logout(request: Request): + request.session.clear() + return RedirectResponse(url=await oauth.logout()) + +@app.get("/user") +async def get_user(request: Request): + if not oauth.is_authenticated(request): + return RedirectResponse(url=await oauth.login()) + return oauth.get_user_info(request) +``` + +The manual implementation gives you more control over the authentication flow and allows you to add custom logic like session management, error handling, and logging. Note that Flask requires special handling of async methods using `asyncio` since it doesn't natively support async/await like FastAPI does. -You can also get the current authentication status with `is_authenticated`. +## User permissions + +The Kinde Python SDK provides a simple way to check user permissions in your application. First, import the permissions module: ```python -if kinde_client.is_authenticated(): - # Core here +from kinde_sdk.auth import permissions ``` -The code above will check if a user is authenticated by checking its internal state. The down side is that the there will have to be an instance of the Kinde client for each user session. This is costly and not scalable. + +### Checking Permissions + +To check if a user has a specific permission: ```python -if kinde_client.is_authenticated_token(access_token): - # Core here +# Check a single permission +permission = await permissions.get_permission("create:todos") +if permission["isGranted"]: + # User has permission + print(f"User has permission in organization: {permission['orgCode']}") ``` +To get all permissions for the current user: -**Note:** The kinde_client object that is created stores the access_token. This means you need to create a kinde_client object for each unique user that is signing in to your application, so that you can keep track of whether the user is authenticated or not. +```python +# Get all permissions +all_permissions = await permissions.get_permissions() +print(f"User belongs to organization: {all_permissions['orgCode']}") +print("User permissions:", all_permissions["permissions"]) +``` -## Logout +### Practical Examples -The SDK comes with a logout method that returns a logout URL. +Here's how to use permissions in your application: ```python -kinde_client.logout(redirect_to=KINDE_POST_LOGOUT_REDIRECT_URL) +# Example 1: Conditional Feature Access +async def create_todo_button(): + permission = await permissions.get_permission("create:todos") + if permission["isGranted"]: + return "" + return None -@app.route("/logout") -def logout(): - return app.redirect( - kinde_client.logout(redirect_to=KINDE_POST_LOGOUT_REDIRECT_URL) - ) +# Example 2: Permission-Based API Endpoint +@router.post("/todos") +async def create_todo(todo_data: dict): + permission = await permissions.get_permission("create:todos") + if not permission["isGranted"]: + raise HTTPException(status_code=403, detail="Permission denied") + # Create todo logic here... ``` -## Get user information +### Common Permission Patterns -To access the user information, use the `get_user_details` helper function: +Here are some common permission patterns you might use: ```python -kinde_client.get_user_details(); -{ - "given_name":"Dave", - "id":"abcdef", - "family_name":"Smith", - "email":"dave@smith.com", - "picture": "https://link_to_avatar_url.kinde.com" -} -``` +# Resource-based permissions +"create:todos" +"read:todos" +"update:todos" +"delete:todos" -### View users in Kinde +# Feature-based permissions +"can:export_data" +"can:manage_users" +"can:view_analytics" -Go to the **Users** page in Kinde to see who has registered. +# Organization-based permissions +"org:manage_members" +"org:view_billing" +"org:update_settings" +``` -## User permissions +For more information about setting up permissions in Kinde, see [User permissions](/manage-users/roles-and-permissions/user-permissions/). + +## Feature Flags -After a user signs in and they are verified, the token return includes permissions for that user. [User permissions are set in Kinde](/manage-users/roles-and-permissions/user-permissions/), but you must also configure your application to unlock these functions. +The Kinde Python SDK provides a simple way to access feature flags from your application. First, import the feature flags module: ```python -permissions = [ - "create:todos", - "update:todos", - "read:todos", - "delete:todos", - "create:tasks", - "update:tasks", - "read:tasks", - "delete:tasks", -] +from kinde_sdk.auth import feature_flags ``` -We provide helper functions to more easily access permissions: +### Getting Feature Flags + +To get a specific feature flag value: ```python -kinde_client.get_permission("create:todos") +# Get a string feature flag +theme_flag = await feature_flags.get_flag("theme") +print(f"Current theme: {theme_flag.value}") + +# Get a boolean feature flag with default value +dark_mode = await feature_flags.get_flag("is_dark_mode", default_value=False) +if dark_mode.value: + print("Dark mode is enabled") -kinde_client.get_permissions() +# Get a numeric feature flag +competitions_limit = await feature_flags.get_flag("competitions_limit") +print(f"User can create up to {competitions_limit.value} competitions") ``` -A practical example in code might look something like: +To get all feature flags for the current user: ```python -if kinde_client.get_permission("create:todos").get("is_granted")): +# Get all feature flags +all_flags = await feature_flags.get_all_flags() +for code, flag in all_flags.items(): + print(f"- {code}: {flag.value} ({flag.type})") ``` -The code above will check against a session managed through the Kinde client. If you want to check against a specific access token, you can do the following: +### Practical Examples + +Here's how to use feature flags in your application: ```python -permission: dict = kinde_client.get_permission_token(access_token, "create:todos") +# Example 1: Conditional Feature Rendering +async def render_create_competition_button(): + can_create = await feature_flags.get_flag("create_competition", default_value=False) + if can_create.value: + return "" + return None + +# Example 2: Theme Configuration +async def get_user_theme(): + theme = await feature_flags.get_flag("theme", default_value="light") + dark_mode = await feature_flags.get_flag("is_dark_mode", default_value=False) + return { + "theme": theme.value, + "is_dark_mode": dark_mode.value + } + +# Example 3: Feature Limits +@router.post("/competitions") +async def create_competition(competition_data: dict): + limit_flag = await feature_flags.get_flag("competitions_limit", default_value=3) + current_count = await get_user_competition_count() + + if current_count >= limit_flag.value: + raise HTTPException( + status_code=403, + detail=f"Competition limit reached (max: {limit_flag.value})" + ) + # Create competition logic here... ``` -## Feature Flags +### Feature Flag Types -We have provided a helper to grab any feature flag from `access_token`: +The SDK supports the following feature flag types: ```python -kinde_client.get_flag("theme"); +# String flags { - "code": "theme", - "type": "string", - "value": "pink", - "is_default": False # whether the fallback value had to be used + "t": "s", + "v": "pink" } -kinde_client.get_flag("is_dark_mode"); +# Boolean flags { - "code": "is_dark_mode", - "type": "boolean", - "value": True, - "is_default": False + "t": "b", + "v": true } -kinde_client.get_flag("create_competition", default_value = False); +# Integer flags { - "code": "create_competition", - "type" => "boolean", - "value": False, - "is_default": True # because fallback value had to be used + "t": "i", + "v": 5 } - -kinde_client.get_flag("competitions_limit", default_value = 3, flat_type = "s"); - - -kinde_client.get_flag("new_feature"); - -# this will return the flag value for the given access token -kinde_client.get_flag_token(access_token, "new_feature"); ``` -We also provide wrapper functions which should leverage `getFlag` above. - -**Get boolean flags** +### Common Use Cases ```python -kinde_client.get_boolean_flag("is_dark_mode"); - -kinde_client.get_boolean_flag("is_dark_mode", False); +# Feature Toggles +can_use_feature = await feature_flags.get_flag("enable_new_feature", default_value=False) -kinde_client.get_boolean_flag("new_feature", False); +# User Preferences +theme = await feature_flags.get_flag("theme", default_value="light") +dark_mode = await feature_flags.get_flag("is_dark_mode", default_value=False) -kinde_client.get_boolean_flag("new_feature"); +# Usage Limits +max_uploads = await feature_flags.get_flag("max_uploads", default_value=10) -kinde_client.get_boolean_flag("theme", False); - -kinde_client.get_boolean_flag_token(access_token, "new_feature"); +# A/B Testing +test_group = await feature_flags.get_flag("ab_test_group", default_value="control") ``` -**Get string flags** +## Claims -```python -kinde_client.get_string_flag("theme"); +The Kinde Python SDK provides a simple way to access user claims from your application. First, import the claims module: -kinde_client.get_string_flag("theme", False); +```python +from kinde_sdk.auth import claims +``` -kinde_client.get_string_flag("cta_color", False); +### Getting Claims -kinde_client.get_string_flag("cta_color"); +To get a specific claim from the user's tokens: -kinde_client.get_string_flag("is_dark_mode", False); +```python +# Get the audience claim from the access token +claim = await claims.get_claim("aud") +print(f"Token audience: {claim['value']}") -kinde_client.get_string_flag_token(access_token, "cta_color"); +# Get the given_name claim from the ID token +claim = await claims.get_claim("given_name", token_type="id_token") +print(f"User's given name: {claim['value']}") ``` -**Get integer flags** +To get all claims from the user's tokens: ```python -kinde_client.get_integer_flag("competitions_limit"); - -kinde_client.get_integer_flag("competitions_limit", 3); +# Get all claims from the access token +all_claims = await claims.get_all_claims() +for claim_name, claim_value in all_claims.items(): + print(f"- {claim_name}: {claim_value}") -kinde_client.get_integer_flag("team_count", 2); - -kinde_client.get_integer_flag("team_count"); - -kinde_client.get_integer_flag("is_dark_mode", False); - -kinde_client.get_integer_flag_token(access_token, "team_count"); +# Get all claims from the ID token +id_token_claims = await claims.get_all_claims(token_type="id_token") ``` -## Audience +### Practical Examples -An `audience` is the intended recipient of an access token - for example the API for your application. The audience argument can be passed to the Kinde client to request an audience be added to the provided token. - -The audience of a token is the intended recipient of the token. +Here's how to use claims in your application: ```python -kinde_api_client_params["audience"] = "api.yourapp.com" -``` +# Example 1: Accessing User Information +async def get_user_profile(): + given_name = await claims.get_claim("given_name", token_type="id_token") + family_name = await claims.get_claim("family_name", token_type="id_token") + + if given_name["value"] and family_name["value"]: + return { + "name": f"{given_name['value']} {family_name['value']}", + "email": (await claims.get_claim("email", token_type="id_token"))["value"] + } + return None -For details on how to connect, see [Register an API](/developer-tools/your-apis/register-manage-apis/) +# Example 2: Token Validation +@router.get("/api/protected") +async def protected_endpoint(): + aud_claim = await claims.get_claim("aud") + if not aud_claim["value"] or "api.yourapp.com" not in aud_claim["value"]: + raise HTTPException(status_code=401, detail="Invalid token audience") + return {"message": "Access granted"} +``` -## Overriding scope +### Common Claims -By default the `KindeSDK` requests the following scopes: +Here are some common claims you might want to access: -- profile -- email -- offline -- openid +```python +# User Information (ID Token) +"given_name" +"family_name" +"email" +"picture" -You can override this by passing scope into the `KindeSDK`. +# Token Information (Access Token) +"aud" # Audience +"iss" # Issuer +"exp" # Expiration time +"iat" # Issued at time -```python -kinde_api_client_params["scope"] = "profile email offline openid" +# Organization Information +"org_code" +"org_name" +"org_id" ``` -### Getting claims +### Token Types -We have provided a helper to grab any claim from your id or access tokens. The helper defaults to access tokens: +The SDK supports two types of tokens: -```python -kinde_client.get_claim("aud") +1. Access Token (`token_type="access_token"`): + - Contains authorization information + - Used for API access + - Contains permissions and organization context + - Default token type -kinde_client.get_claim("given_name", "id_token") - -kinde_client.get_claim_token(access_token, "given_name") -``` +2. ID Token (`token_type="id_token"`): + - Contains user identity information + - Used for user profile data + - Contains name, email, and other user details + - Must be explicitly requested using `token_type="id_token"` ## Organizations @@ -344,24 +561,24 @@ kinde_client.get_claim_token(access_token, "given_name") To create a new organization within your application, you will need to run a similar function to below: ```python -return app.redirect(kinde_client.create_org()) +return app.redirect(oauth.create_org()) ``` ### Sign up and sign in to organizations -Kinde has a unique code for every organization. You’ll have to pass this code through when you register a new user or sign in to a particular organization. Example function below: +Kinde has a unique code for every organization. You'll have to pass this code through when you register a new user or sign in to a particular organization. Example function below: ```python -kinde_api_client_params["org_code"] = 'your_org_code' +oauth.get_claim("org_code") @app.route("/login") def login(): - return app.redirect(kinde_client.get_login_url()) + return app.redirect(oauth.get_login_url()) @app.route("/register") def register(): - return app.redirect(kinde_client.get_register_url()) + return app.redirect(oauth.get_register_url()) ``` Following authentication, Kinde provides a json web token (jwt) to your application. Along with the standard information we also include the `org_code` and the permissions for that organization (this is important as a user can belong to multiple organizations and have different permissions for each). @@ -400,9 +617,9 @@ The `id_token` will also contain an array of organizations that a user belongs t There are two helper functions you can use to extract information: ```python -kinde_client.get_organization() +oauth.get_organization() -kinde_client.get_user_organizations() +oauth.get_user_organizations() ``` For more information about how organizations work in Kinde, see [Kinde organizations for developers](/build/organizations/orgs-for-developers/). @@ -411,440 +628,107 @@ For more information about how organizations work in Kinde, see [Kinde organizat Once the user has successfully authenticated, you'll get a JWT and possibly a refresh token that should be stored securely. -## SDK API reference - -### `domain` - -Either your Kinde instance url or your custom domain. e.g. `https://yourapp.kinde.com`. - -Type: `string` - -Required: Yes - -### `callback_url` - -The url that the user will be returned to after authentication. - -Type: `string` - -Required: Yes - -### `client_id` - -The ID of your application in Kinde. - -Type: `string` - -Required: Yes - -### `grant_type` - -Define the grant type when using the SDK. - -Type: `string` - -Required: Yes - -### `client_secret` - -The unique client secret associated with your application in Kinde. - -Type: `string` - -Required: No - -### `code_verifier` - -PKCE works by having the app generate a random value at the beginning of the flow called a Code Verifier. - -Type: `string` - -Required: No, except for PKCE flow - -### `scope` - -The scopes to be requested from Kinde. - -Type: `string` - -Required: No - -Default: `openid profile email offline` - -### `audience` - -The audience claim for the JWT. - -Type: `string` - -Required: No - -### `org_code` - -Additional parameters that will be passed in the authorization request. - -Type: `string` - -Required: No - -## KindeSDK methods - -### `get_login_url` - -Constructs a redirect URL and sends the user to Kinde to sign in. Optional parameters are used for custom sign-up and sign-in and are documented [here](/authenticate/custom-configurations/custom-authentication-pages/). - -Arguments (optional): - -```python -auth_url_params: Optional[Dict[str, Dict[str, str]]] -``` - -Usage: - -```python -kinde_client.get_login_url() - -kinde_client.get_login_url({ - "auth_url_params": { - "connection_id": "conn_6a95dec504d34dc286dc80e8df9f6099" - } -}) - - -``` - -Sample output: - -```python -https://your_host.kinde.com/oauth2/auth?response_type=code&… -``` - -### `get_register_url` - -Constructs a redirect URL and sends the user to Kinde to sign up. Optional parameters are used for custom sign-up and sign-in and are documented [here](/authenticate/custom-configurations/custom-authentication-pages/). - -Arguments (optional): - -```python -auth_url_params: Optional[Dict[str, Dict[str, str]]] -``` - -Usage: - -```python -kinde_client.get_register_url() - -kinde_client.get_register_url({ - "auth_url_params": { - "connection_id": "conn_6a95dec504d34dc286dc80e8df9f6099" - } -}) -``` - -Sample: - -```python -https://your_host.kinde.com/oauth2/auth?response_type=code&… -``` - -### `logout` - -Logs the user out of Kinde. - -Arguments: - -```python -redirect_to: str -``` - -Usage: - -```python -kinde_client.logout(redirect_to="KINDE_POST_LOGOUT_REDIRECT_URL") -``` - -Sample: - -```python -https://your_host.kinde.com/logout?redirect=https://… -``` - -### `fetch_token` - -Returns the raw access token from URL after logged in from Kinde. - -Arguments: - -```python -authorization_response: str -``` - -Usage: - -```python -kinde_client.fetch_token(authorization_response=”[http://localhost:8000?code=42..e9&state=d..t](https://example.com/github?code=42..e9&state=d..t)”) - -token: dict = kinde_client.fetch_token_value(authorization_response=”[http://localhost:8000?code=42..e9&state=d..t](https://example.com/github?code=42..e9&state=d..t)”) -``` - -Sample: - -```python -eyJhbGciOiJIUzI1... -``` - -### `refresh_token` - -Get new access token from Kinde if existed `refresh_token`. - -Usage: - -```python -kinde_client.refresh_token() - -kinde_client._refresh_token_value(refresh_value) -``` +## Management API -### `create_org` +The Kinde Python SDK provides a Management API client for interacting with Kinde's management endpoints. This allows you to programmatically manage users, organizations, and other resources. -Return the redirect URL to sign up and create a new organization in your business. +### Getting Started -Usage: +To use the Management API, you'll need to initialize the client with your Kinde credentials: ```python -kinde_client.create_org() -``` - -Sample: +from kinde_sdk.auth.oauth import OAuth -```python -https://your_host.kinde.com/oauth2/auth?response_type=code&… -``` +oauth = OAuth( + framework="flask", + app=app +) -### `get_claim` - -Gets a claim from an access or ID token. - -Arguments: - -```python -claim: str, token_name?: str # default: access_token +# Get the management client +management = oauth.get_management() ``` -Usage: +### Available Endpoints -```python -kinde_client.get_claim("given_name", "id_token") - -kinde_client.get_claim_token(access_token, "given_name") -``` - -Sample: +The Management API provides methods for common operations on resources. Here are some examples: ```python -{"name": "given_name", "value": "David"} -``` +# List users +users = await management.get_users() -### `get_permission` - -Returns the state of a given permission. - -Arguments: - -```python -key: str -``` +# Get a specific user +user = await management.get_user(user_id="user_123") -Usage: +# Create a new user +new_user = await management.create_user( + email="user@example.com", + given_name="John", + family_name="Doe" +) -```python -kinde_client.get_permission(”read:todos”) +# Update a user +updated_user = await management.update_user( + user_id="user_123", + given_name="Johnny" +) -kinde_client.get_permission_token(access_token, "read:todos") +# Delete a user +await management.delete_user(user_id="user_123") ``` -Sample: +### Organization Management ```python -{”org_code”: "org_b235c067b7e4", is_granted: True} -``` +# List organizations +orgs = await management.get_organizations() -### `get_permissions` +# Get a specific organization +org = await management.get_organization(org_id="org_123") -Returns all permissions for the current user for the organization they are signed into. +# Create a new organization +new_org = await management.create_organization( + name="My Organization" +) -Usage: - -```python -kinde_client.get_permissions() +# Update an organization +updated_org = await management.update_organization( + org_id="org_123", + name="Updated Name" +) -kinde_client.get_permissions_token(access_token) -``` - -Sample: - -```python -{"org_code": "org_b235c067b7e4", permissions: [ "create:users", "view:users" ]} +# Delete an organization +await management.delete_organization(org_id="org_123") ``` -### `get_organization` +### Error Handling -Get details for the organization your user is signed into. - -Usage: +The Management API methods will raise exceptions for API errors. It's recommended to handle these appropriately: ```python -kinde_client.get_organization() - -kinde_client.get_organization_token(access_token) +try: + user = await management.get_user(user_id="user_123") +except Exception as e: + # Handle API-specific errors + print(f"Error: {e}") ``` -Sample: - -```python -{"org_code": "org_1234"} -``` +### Token Management -### `get_organizations` - -Gets an array of all organizations the user has access to. - -Usage: - -```python -kinde_client.get_user_organizations() - -kinde_client.get_user_organizations_token(access_token) -``` - -Sample: - -```python -{"org_codes": ["org_1234", "org_abcd"]} -``` - -### `get_user_details` - -Returns the profile for the current user. - -Usage: - -```python -kinde_client.get_user_details() - -kinde_client.get_user_details_token(access_token) -``` - -Sample: - -```python -{ - "given_name":"Dave", - "id":"abcdef", - "family_name":"Smith", - "email":"dave@smith.com", - "picture": "https://link_to_avatar_url.abc.com" -} -``` - -### `get_flag` - -Gets a feature flag from an access token. - -Arguments: - -```python -code: str -default_value?: str -flag_type?: str -``` - -Usage: - -```python -kinde_client.get_flag("theme"); - -kinde_client.get_flag_token(access_token, "theme"); -``` - -Sample: - -```python -{ - "code": "theme", - "type": "string", - "value": "pink", - "is_default": False -} -``` - -### `get_boolean_flag` - -Gets a boolean feature flag from an access token. - -Arguments: - -```python -code: str -default_value?: str -``` - -Usage: - -```python -kinde_client.get_boolean_flag("is_dark_mode"); - -kinde_client.get_boolean_flag_token(access_token, "is_dark_mode"); -``` - -Sample: `True` or `False` - -### `get_string_flag` - -Gets a string feature flag from an access token. - -Arguments: - -```python -code: str -default_value?: str -``` - -Usage: - -```python -kinde_client.get_string_flag("theme"); - -kinde_client.get_string_flag_token(access_token, "theme"); -``` - -Sample: `“pink”` - -### `get_integer_flag` - -Gets a integer feature flag from an access token - -Arguments: - -```python -code: str -default_value?: str -``` - -Usage: - -```python -kinde_client.get_integer_flag("competitions_limit"); - -kinde_client.get_integer_flag_token(access_token, "competitions_limit"); -``` +The Management API client automatically handles token management, including: +- Token acquisition +- Token refresh +- Token storage +- Thread safety -Sample: `5` +You don't need to manage tokens manually - the client handles this for you. -### `is_authenticated()` +### Best Practices -To check user authenticated or not. +1. Always use async/await when calling Management API methods +2. Handle API errors appropriately +3. Cache results when appropriate to reduce API calls +4. Use appropriate error handling for production environments +5. Keep your client credentials secure -Sample: `true` or `false` +For more information about the Management API endpoints and capabilities, see the [Kinde Management API documentation](/api/management/overview/). -If you need help connecting to Kinde, please contact us at [support@kinde.com](mailto:support@kinde.com). From c6846d2de5ead618470fb94f299d90505c34fa25 Mon Sep 17 00:00:00 2001 From: Daniel Rivers Date: Tue, 20 May 2025 17:42:48 +0000 Subject: [PATCH 014/755] chore: fix typos --- src/content/docs/developer-tools/sdks/native/expo.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/content/docs/developer-tools/sdks/native/expo.mdx b/src/content/docs/developer-tools/sdks/native/expo.mdx index bd6077246..337f2b480 100644 --- a/src/content/docs/developer-tools/sdks/native/expo.mdx +++ b/src/content/docs/developer-tools/sdks/native/expo.mdx @@ -115,10 +115,10 @@ Note: The `` is used as an example of local URL Scheme, ## Token Utilities -A selction of utility functions are available. +A selection of utility functions are available. -*Expo 53+*: Importable from from `@kinde/expo/utils` and from `useKindeAuth` hook -*Expo 51 and 52*: Importable from from `@kinde/js-utils` and from `useKindeAuth` hook +*Expo 53+*: Import from `@kinde/expo/utils` and `useKindeAuth` hook +*Expo 51 and 52*: Import from `@kinde/js-utils` and `useKindeAuth` hook ```ts import { getUserProfile, getFlag, getRoles } from "@kinde/expo/utils"; From 4de8b31b5dadfd807a88ff017eed8635bf8ddaa3 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 21 May 2025 15:45:26 +1000 Subject: [PATCH 015/755] Update global-brand-defaults.mdx Update favicon screen shot --- .../docs/design/brand/global-brand-defaults.mdx | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/content/docs/design/brand/global-brand-defaults.mdx b/src/content/docs/design/brand/global-brand-defaults.mdx index bcd2a76c0..f13d40710 100644 --- a/src/content/docs/design/brand/global-brand-defaults.mdx +++ b/src/content/docs/design/brand/global-brand-defaults.mdx @@ -48,15 +48,7 @@ The logo will be automatically linked to the [Redirect URL](/get-started/connec Favicons are small icons that appear on browser tabs. To add them to Kinde, they must measure 48x48px (or multiples of, such as 96x96). - +![image of browsere favicons](https://imagedelivery.net/skPPZTHzSlcslvHjesZQcQ/f4cc6e0f-3f87-46af-f99d-7c4910602600/public) 1. In Kinde, go to **Design > Global > Brand**. 2. In the **Favicon** section: From c6ede9fcb622ce11062fe1f5679ce601d7796e50 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 21 May 2025 17:44:56 +1000 Subject: [PATCH 016/755] Update update-kinde-payment.mdx Update for self-serve portal --- .../profile-and-plan/update-kinde-payment.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/content/docs/manage-your-account/profile-and-plan/update-kinde-payment.mdx b/src/content/docs/manage-your-account/profile-and-plan/update-kinde-payment.mdx index d952012ab..51726c051 100644 --- a/src/content/docs/manage-your-account/profile-and-plan/update-kinde-payment.mdx +++ b/src/content/docs/manage-your-account/profile-and-plan/update-kinde-payment.mdx @@ -15,8 +15,8 @@ Use the procedures below to keep your credit card details up to date. ## Add new payment method -1. Go to **Settings > Plan & payments**. -2. Scroll to the **Payment details** section. If you have already entered payment details when you upgraded plans, the payment method will appear here. +1. Select the account icon in the bottom left of the dashboard and then select **Business Settings**. +2. In the window that opens, select **Payment details**. If you have already entered payment details, they will appear here. 3. Select **Add payment method**. 4. In the window that appears, add your credit card details and follow the prompts to save. @@ -29,7 +29,7 @@ Use the procedures below to keep your credit card details up to date. If you are on a paid plan, add a new payment method before removing the old method. -1. Go to **Settings > Plan & payments**. -2. Scroll to the **Payment details** section. All your payment methods are shown in this section. +1. Select the account icon in the bottom left of the dashboard and then select **Business Settings**. +2. In the window that opens, select **Payment details**. All your payment methods are shown in this section. 3. Select the three dots on the payment method you want to remove, select **Remove**. 4. In the message that appears, confirm that you want to remove the payment method. From 9800cb21710feeb40f3e44845f0a42f43b0f1ada Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 21 May 2025 17:55:40 +1000 Subject: [PATCH 017/755] Update view-kinde-plan.mdx Update for self-serve --- .../profile-and-plan/view-kinde-plan.mdx | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/content/docs/manage-your-account/profile-and-plan/view-kinde-plan.mdx b/src/content/docs/manage-your-account/profile-and-plan/view-kinde-plan.mdx index 8aab999f2..468db11b3 100644 --- a/src/content/docs/manage-your-account/profile-and-plan/view-kinde-plan.mdx +++ b/src/content/docs/manage-your-account/profile-and-plan/view-kinde-plan.mdx @@ -12,26 +12,31 @@ app_context: - m: payments_and_plan --- -Whether you pay us to use Kinde or not, your Kinde account is linked to a plan. A plan describes what features and limits apply to your Kinde account. There are two tiers: Free and Pro, as well as custom plans for enterprises. +Whether you pay us to use Kinde or not, your Kinde account is linked to a plan. A plan describes what features and limits apply to your Kinde account. You'll have [selected a plan](https://kinde.com/pricing/) when you first signed up with us. ## Plan options -We’ve made it so our free plans include a lot, so you can run your business for free if you want. But you will see prompts throughout the Kinde admin area, indicating which features can be extended, included, or made unlimited, by upgrading to Pro. +We’ve made it so our free plan includes a lot, so you can run your business for free if you want. But you will see prompts throughout the Kinde admin area, indicating which features can be extended, included, or made unlimited, by upgrading. You can also view [full plan details and comparisons](https://kinde.com/pricing/) on our website. ## To view your plan -Go to **Settings > Plan & payments**. The page shows details and data related to your Kinde subscription. +1. Select the account icon in the bottom left of the dashboard and then select **Business Settings**. +2. In the window that opens, select **Plan**. ## Subscription details - **Current estimated total** - An estimate of the month to date amount due on your plan -- **Plan type and base price** - the base price is $0.00 for Free plans and $25.00 USD for Pro plans -- **Monthly active users (MAU)** - Included in your plan and the additional metered price for Pro -- **Monthly active organizations (MAO)** - Included in your plan, and the additional unit price for Pro -- **Enterprise connections** - Included in your plan, and additional unit price for Pro -- **Machine to machine tokens** - Included in your plan, and additional metered price for Pro -- **Environments** - Included in your plan, and the additional unit price for Pro -- **Payment details** - You add these when you upgrade to Pro -- **Billing history** - only shown for Pro users after the first billing cycle is complete. +- **Plan type and base price** - the base price is $0.00 for Free plans and $X USD for paid plans +- **Monthly active users (MAU)** - Included in your plan and the additional metered price +- **Monthly active organizations (MAO)** - Included in your plan, and the additional unit price +- **Enterprise connections** - Included in your plan, and additional unit price +- **Machine to machine tokens** - Included in your plan, and additional metered price +- **Environments** - Included in your plan, and the additional unit price +- **Payment details** - You add these when you upgrade +- **Billing history** - only shown for paid plan users after the first billing cycle is complete. + +## Plan upgrade and downgrade + +See [Change your Kinde plan](/manage-your-account/profile-and-plan/change-kinde-plan/). From a0b8ec78024db805def0c2eb37bf33590cbab277 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 21 May 2025 18:03:44 +1000 Subject: [PATCH 018/755] Update change-kinde-plan.mdx Update for self-service --- .../profile-and-plan/change-kinde-plan.mdx | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/content/docs/manage-your-account/profile-and-plan/change-kinde-plan.mdx b/src/content/docs/manage-your-account/profile-and-plan/change-kinde-plan.mdx index e74b7b326..051aeb699 100644 --- a/src/content/docs/manage-your-account/profile-and-plan/change-kinde-plan.mdx +++ b/src/content/docs/manage-your-account/profile-and-plan/change-kinde-plan.mdx @@ -20,33 +20,36 @@ When you decide to upgrade to a higher plan, charges apply, including: - unit costs for expanding feature capacity (e.g. for adding more environments) - other recurring costs -You can upgrade plans at any time. You need to contact us to downgrade plans. +You can upgrade or downgrade plans at any time. ## How plan charges work -When you upgrade, you will be charged the base subscription price for the month ahead. +When you buy a plan or upgrade, you will be immediately charged the base subscription price for the month ahead. On the following invoice (after the first monthly billing cycle), you will be charged for any metered and unit costs for the previous month, plus the monthly base subscription price for the next month. We currently accept credit cards as a means of payment, and use Stripe to process and secure transactions. Custom invoicing arrangements (e.g. by bank transfer, annual, currency) are available to enterprise customers. -## How to upgrade your plan +## How to change your plan -You’ll see multiple upgrade prompts throughout the Kinde interface, with a button for upgrading and choosing a plan. +You’ll see multiple upgrade prompts throughout the Kinde interface, with a button for upgrading and choosing a plan. Click any of these prompts and you will be shown the plan selector and guided through the sign-up process. Or you can do the following: -Click any of these prompts and you will be shown the plan selector and guided through the sign-up process. +1. Select the account icon in the bottom left of the dashboard and then select **Business Settings**. +2. In the window that opens, select **Plan**. +3. At the top of the window, select **Change plan**. The plan selector opens. +4. Select the plan you want to change to. + - If you upgrade, you will be immediately charged the full subscription price. Upgrade features are available immediately. + - If you downgrade, you can still use Kinde until the end of your billing period. Remember to [export your data](https://docs.kinde.com/manage-your-account/your-data/exporting-data/) You’ll be asked to confirm credit card details each time you upgrade, even if it’s from a paid plan to a paid plan. -## How to downgrade your plan +## Refunds for downgrade -It’s not currently possible to downgrade plans in a self-service way. Rest assured we are working on this. +If you downgrade, we can partially refund the monthly base subscription price for unused days. You will still need to pay for anything metered that you use. -For now, you need to contact our support team at support@kinde.com to action this for you. +## Cancelling your Kinde plan -## Refunds for downgrade and cancellation - -If you upgrade and decide the plan is not right, we will happily downgrade you and refund the monthly base subscription price. You will still need to pay for anything metered that you use. +We don't have self-serve for cancelling plans, but you can downgrade to the free plan to avoid further charges, then also delete your business if you want. We want your experience at Kinde to be great, even if you decide to leave us. You can be assured that we will err on the side of crediting back any costs that you should not be charged for. From b7249ce3aa70822237115386c7d6ad7940e585d9 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 21 May 2025 18:25:23 +1000 Subject: [PATCH 019/755] Update import-users-in-bulk.mdx Removed irrelevant code snippets --- .../add-and-edit/import-users-in-bulk.mdx | 173 ------------------ 1 file changed, 173 deletions(-) diff --git a/src/content/docs/manage-users/add-and-edit/import-users-in-bulk.mdx b/src/content/docs/manage-users/add-and-edit/import-users-in-bulk.mdx index 56a1714c4..7bc513509 100644 --- a/src/content/docs/manage-users/add-and-edit/import-users-in-bulk.mdx +++ b/src/content/docs/manage-users/add-and-edit/import-users-in-bulk.mdx @@ -45,178 +45,6 @@ When you export user details from Auth0: `Identities` data distinguishes the type of identity, specifically the `connection` attribute. e.g. username, phone, GitHub, Google, etc. -Example of the NDJSON file format - -```js -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "User Object", - "type": "object", - "properties": { - "id": { "type": "string" }, - "first_name": { "type": "string" }, - "last_name": { "type": "string" }, - "email": { "type": "string", "format": "email" }, - "email_verified": { "type": "boolean" }, - "created_on": { "type": "string", "format": "date-time" }, - "identities": { - "type": "array", - "items": { - "type": "object", - "properties": { - "identity": { "type": "string" }, - "user_id": { "type": "string" }, - "type": { - "type": "string", - "enum": [ - "oauth2:slack", - "oauth2:github", - "oauth2:twitch", - "oauth2:gitlab", - "oauth2:linkedin", - "oauth2:facebook", - "oauth2:xero", - "oauth2:bitbucket", - "oauth2:stripe", - "wsfed:azure_ad", - "oauth2:discord", - "oauth2:twitter", - "phone", - "username", - "email", - "oauth2:microsoft", - "oauth2:azure_ad", - "oauth2:google", - "oauth2:clever", - "oauth2:apple", - "oauth2:roblox" - ] - }, - "is_verified": { "type": "boolean" } - } - } - }, - "organizations": { - "type": "array", - "items": { - "type": "object", - "properties": { - "external_id": { "type": "string" }, - "roles": { - "type": "array", - "items": { "type": "string" } - }, - "permissions": { - "type": "array", - "items": { "type": "string" } - }, - "scopes": { - "type": "array", - "items": { - "type": "object", - "properties": { - "audience": { "type": "string" }, - "scope": { "type": "string" } - }, - "required": ["audience", "scope"] - } - } - } - } - }, - "feature_flags": { - "type": "array", - "items": { - "type": "object", - "properties": { - "key": { "type": "string" }, - "value": { - "oneOf": [ - { "type": "string" }, - { "type": "number" }, - { "type": "boolean" }, - { "type": "object" } - ] - } - }, - "required": ["key", "value"] - } - }, - "properties": { - "type": "array", - "items": { - "type": "object", - "properties": { - "key": { "type": "string" }, - "value": { "type": "string" } - }, - "required": ["key", "value"] - } - }, - "password": { - "type": "object", - "properties": { - "hashed_password": { "type": "string" }, - "hashing_algorithm": { "type": "string" }, - "salt": { "type": "string" }, - "salt_position": { "type": "string", "enum": ["prefix", "suffix", "none"] }, - "salt_format": { "type": "string" } - }, - "required": [ - "hashed_password", - "hashing_algorithm" - ] - } - } -} -``` - -Example of a single line of user data in NDJSON - -```js -{ - "id": "001", - "first_name": "John", - "last_name": "Snow", - "email": "john@snow.com", - "email_verified": true, - "created_on": "2025-05-08T13:00:23+01:00", - "identities": [ - { - "identity": "john@snow.com", - "type": "email", - "is_verified": true - } - ], - "organizations": [ - { - "external_id": "org_1", - "roles": ["admin", "member"], - "permissions": ["read", "write"], - "scopes": [ - { "audience": "myapi", "scope": "user" } - ] - } - ], - "feature_flags": [ - { "key": "feature_bool", "value": "true" }, - { "key": "feature_int", "value": "1" }, - { "key": "feature_text", "value": "hello world" } - ], - "properties": [ - { "key": "kp_usr_city", "value": "Bristol" }, - { "key": "kp_usr_industry", "value": "Technology" } - ], - "password": { - "hashed_password": "e7bd1e090a921de087269f9ac10336fb", - "hashing_algorithm": "md5", - "salt": "salty", - "salt_position": "prefix", - "salt_format": "hex" - } -} -``` - ### How Auth0 user identities are treated on import Social identities without an email can be imported, and are identified by the connection type. You can import users with multiple identities, these will be listed under the user’s profile. @@ -233,7 +61,6 @@ Kinde supports migrating the following authentication methods from Auth0: Userna - bitbucket - windowslive - ### Import options When importing users from Auth0 NDJSON files, you have three options: From 3eb8398786982bc74f9e7df22a022a564105df59 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 21 May 2025 18:26:24 +1000 Subject: [PATCH 020/755] Update auth0-to-kinde.mdx Removed irrelevant code snippet --- .../switch-to-kinde/auth0-to-kinde.mdx | 28 ------------------- 1 file changed, 28 deletions(-) diff --git a/src/content/docs/get-started/switch-to-kinde/auth0-to-kinde.mdx b/src/content/docs/get-started/switch-to-kinde/auth0-to-kinde.mdx index 49cef356c..a43f0ffcd 100644 --- a/src/content/docs/get-started/switch-to-kinde/auth0-to-kinde.mdx +++ b/src/content/docs/get-started/switch-to-kinde/auth0-to-kinde.mdx @@ -64,34 +64,6 @@ Auth methods are shown in the `connection` attribute. These are represented as f - bitbucket - windowslive -Here's an example of the an identity extracted from Auth0. - -```js -{ - "Id": "auth0|001", - "Given Name": "Joe Bloggs", - "Nickname": "Joey", - "Name": "Joe Bloggs", - "Email": "joe@bloggs.com", - "Email Verified": false, - "Connection": "Username-Password-Authentication", - "Created At": "2022-11-29T09:24:17.907Z", - "Updated At": "2022-11-29T09:24:17.907Z", - "identities": [ - { - "profileData": { - "email": "joe@bloggs.com", - "email_verified": false - }, - "provider": "auth0", - "connection": "Username-Password-Authentication", - "isSocial": false, - "user_id": "001" - } - ] -} -``` - ### Can’t get the passwords from Auth0? Some Auth0 plans don’t allow password exports, or you might not want to wait 2 weeks for the file. If this is the case, import the user data you’re able to, and Kinde will ask users to set a new password the next time they sign in. From c0a515510d4eb135e771e5581ecd226141a8ba85 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 21 May 2025 18:32:15 +1000 Subject: [PATCH 021/755] Update update-your-details.mdx Update for self-serve --- .../business-information/update-your-details.mdx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/content/docs/manage-your-account/business-information/update-your-details.mdx b/src/content/docs/manage-your-account/business-information/update-your-details.mdx index 3ec967376..073e9da27 100644 --- a/src/content/docs/manage-your-account/business-information/update-your-details.mdx +++ b/src/content/docs/manage-your-account/business-information/update-your-details.mdx @@ -18,7 +18,7 @@ You can change some business details in Kinde, but you may need to contact suppo ## Change your sign in name 1. On the Kinde home page, go to the bottom-left of screen and select your avatar. -2. In the menu that opens, select **Account details**. +2. In the menu that opens, select **Account**. 3. Make the changes you want and select **Save**. ## Change the email you sign in to Kinde with @@ -32,7 +32,7 @@ You cannot edit the email you sign in to Kinde with, but you can invite a new te ## Change business details -1. In Kinde, go to **Settings > Business > Details.** -2. If you want to change your business name, this will not impact your kinde business URL that was already created. -3. Update your primary email and phone. Note that changing the email here does not impact team sign in. If you need to update your Kinde sign-in email, see the procedure above. -4. Make any other changes and select **Save**. +1. On the Kinde home page, go to the bottom-left of screen and select your avatar. +2. In the menu that opens, select **Business settings**. +3. Select **Business Details**. You can only change your business name, this will not impact your kinde business URL that was already created. +4. Select **Save**. From c8a68d7459bdd9a4546cb93fcfeb597dd91ddde4 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 21 May 2025 18:35:11 +1000 Subject: [PATCH 022/755] Update check-your-mau.mdx Update for self-serve --- .../docs/manage-your-account/your-data/check-your-mau.mdx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/content/docs/manage-your-account/your-data/check-your-mau.mdx b/src/content/docs/manage-your-account/your-data/check-your-mau.mdx index 4741cee35..eff17ac4a 100644 --- a/src/content/docs/manage-your-account/your-data/check-your-mau.mdx +++ b/src/content/docs/manage-your-account/your-data/check-your-mau.mdx @@ -34,9 +34,10 @@ If an organization is created and deleted in the same monthly billing period, it ## To check your MAU and MAO -1. Go to **Settings > Plan & payments**. +1. On the Kinde home page, click on your avatar and select **Business settings**. +2. Select *Plan** in the side menu. 2. In the main **Subscription** area of the window, view your MAU and MAO. -If you’re on a free plan, you’ll be able to see when you’re approaching or exceeding free plan limits. If you’re on the Pro plan, you’ll be able to see how costs are tracking in your current bill cycle. +If you’re on a free plan, you’ll be able to see when you’re approaching or exceeding free plan limits. If you’re on a paid plan, you’ll be able to see how costs are tracking in your current bill cycle. For full details of inclusions and pricing, see [Kinde plan details](https://kinde.com/pricing/). From 6d1d2539bd2db2a98dba380505735a46ccde379c Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 21 May 2025 18:50:17 +1000 Subject: [PATCH 023/755] Update add-team-members.mdx Update for self-serve portal --- .../team-and-account/add-team-members.mdx | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/content/docs/get-started/team-and-account/add-team-members.mdx b/src/content/docs/get-started/team-and-account/add-team-members.mdx index cdeb629d9..4c97bad5a 100644 --- a/src/content/docs/get-started/team-and-account/add-team-members.mdx +++ b/src/content/docs/get-started/team-and-account/add-team-members.mdx @@ -21,11 +21,11 @@ We’ve kept team roles simple. There’s really only two for now: Owners and Admins can add other Admins. -Go to **Settings > Business > Team.** The **Team** page shows a list of all your team members. - -1. Select **Add team member**. -2. In the window that appears, enter the team member’s details. -3. Select **Save**. Your team member will receive an email with an invitation to join your business on Kinde. They can set up an account or sign in to an existing account. +1. On the Kinde home page, select your avatar and then select **Business settings** from the menu. +2. Select **Members** in the side menu. +3. Select **Add member**. +4. In the window that appears, enter the team member’s details. +5. Select **Save**. Your team member will receive an email with an invitation to join your business on Kinde. They can set up an account or sign in to an existing account. ## Promote a team member to an Owner @@ -33,12 +33,16 @@ To promote someone to an Owner role in your business, you will need to contact s ## **Revoke an invitation** -1. Go to **Settings > Business > Team.** The **Team** page shows a list of all your invited members. -2. Find the team member in the **Invited** list, select the three dots, then select **Revoke invitation**. +1. On the Kinde home page, select your avatar and then select **Business settings** from the menu. +2. Select **Members** in the side menu. +3. Find the team member in the list, they will have a tage showing 'invited' next to their name. +4. Select the three dots, then select **Revoke invitation**. ## Delete **team member** -Owners and Admins can delete other Admins. Only Kinde can delete Owners, and only on request. +Owners and Admins can delete other Admins. Only Kinde can delete Owners, and only on request and verification. -1. Go to **Settings > Business > Team.** The **Team** page shows a list of all your team members. -2. Find the team member in the **Members** list, select the three dots, then select **Delete team member**. +1. On the Kinde home page, select your avatar and then select **Business settings** from the menu. +2. Select **Members** in the side menu. +3. Find the team member in the list, select the three dots, then select **Delete team member**. +4. Confirm the deletion when prompted. From 440d0168be64ce5ba6de73cb2f601802357c97dd Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 21 May 2025 18:53:35 +1000 Subject: [PATCH 024/755] Update kinde-referral-program.mdx Update for portal --- .../get-started/team-and-account/kinde-referral-program.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/content/docs/get-started/team-and-account/kinde-referral-program.mdx b/src/content/docs/get-started/team-and-account/kinde-referral-program.mdx index e2ed6cb94..1adaafe49 100644 --- a/src/content/docs/get-started/team-and-account/kinde-referral-program.mdx +++ b/src/content/docs/get-started/team-and-account/kinde-referral-program.mdx @@ -15,10 +15,10 @@ Referring a friend could earn you 20% of what they spend with us in a year, if t - Share it with a friend or colleague - They sign up using the link and that’s it! -## Get your referral code +## Get your Kinde referral link -1. Sign in to Kinde, click on your profile picture, and select **Account details**. -2. Scroll down the page until you see the referral section. +1. Sign in to Kinde, click on your profile picture, and select **Account**. +2. Go to your profile and scroll to the **Kinde referral code** section. 3. Generate your unique code (you only need to do this once). 4. Copy the code and re-use it to refer as many friends as you want. From f34b52c20f78b7a87ae958aa8d487d1e6ae2ed8a Mon Sep 17 00:00:00 2001 From: Dave Berner Date: Wed, 21 May 2025 21:42:15 +1000 Subject: [PATCH 025/755] feat: add banner to point to custom UI --- .../custom-authentication-pages.mdx | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/content/docs/authenticate/custom-configurations/custom-authentication-pages.mdx b/src/content/docs/authenticate/custom-configurations/custom-authentication-pages.mdx index c8f9fda26..1ae9658f0 100644 --- a/src/content/docs/authenticate/custom-configurations/custom-authentication-pages.mdx +++ b/src/content/docs/authenticate/custom-configurations/custom-authentication-pages.mdx @@ -10,9 +10,15 @@ relatedArticles: - 8b9376c4-308c-4eaa-a990-606fb8bbf770 --- -You can bring your own custom sign up and sign in pages to use with Kinde. Integrate your own designs for the initial sign up and sign in page, and still get the security of Kinde’s auth (and verification) process. +You can host your own custom sign up and sign in pages to use with Kinde. Integrate your own designs for the initial sign up and sign in page, and still get the security of Kinde’s auth (and verification) process. -This gives you the best of both worlds: the security of hosted auth, and the ability to customize the sign-up experience for your users. +This gives you the best of both worlds: the security of hosted auth, and the ability to customize the initial sign-up experience for your users. + + ## Custom sign in for social authentication @@ -104,14 +110,14 @@ Here is an example using React. ```jsx ``` From ff407540ce339ff857afbd1283a303e819dcb3a4 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 22 May 2025 18:16:53 +1000 Subject: [PATCH 026/755] Update add-team-members.mdx Update for changed avatar on home screen --- .../team-and-account/add-team-members.mdx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/content/docs/get-started/team-and-account/add-team-members.mdx b/src/content/docs/get-started/team-and-account/add-team-members.mdx index 4c97bad5a..de1e7b982 100644 --- a/src/content/docs/get-started/team-and-account/add-team-members.mdx +++ b/src/content/docs/get-started/team-and-account/add-team-members.mdx @@ -9,19 +9,19 @@ app_context: You can invite other team members and give them access to your business on Kinde. -## Team member roles +## Member roles -We’ve kept team roles simple. There’s really only two for now: +We’ve kept roles simple. There’s really only two for now: **Owner** - The person who creates the business in Kinde is automatically the Owner. They have the highest access level in the Kinde business. Only an owner can approve data export from Kinde. **Admin** - All other team members in Kinde are created as Admins. They have access to all Kinde features, except data export approval. -## Add **a new team member** +## Add a new member** Owners and Admins can add other Admins. -1. On the Kinde home page, select your avatar and then select **Business settings** from the menu. +1. On the Kinde home page, select the avatar menu on the bottom left, and then select **Business settings**. 2. Select **Members** in the side menu. 3. Select **Add member**. 4. In the window that appears, enter the team member’s details. @@ -33,7 +33,7 @@ To promote someone to an Owner role in your business, you will need to contact s ## **Revoke an invitation** -1. On the Kinde home page, select your avatar and then select **Business settings** from the menu. +1. On the Kinde home page, select the avatar menu on the bottom left, and then select **Business settings**. 2. Select **Members** in the side menu. 3. Find the team member in the list, they will have a tage showing 'invited' next to their name. 4. Select the three dots, then select **Revoke invitation**. @@ -42,7 +42,7 @@ To promote someone to an Owner role in your business, you will need to contact s Owners and Admins can delete other Admins. Only Kinde can delete Owners, and only on request and verification. -1. On the Kinde home page, select your avatar and then select **Business settings** from the menu. +1. On the Kinde home page, select the avatar menu on the bottom left and then select **Business settings**. 2. Select **Members** in the side menu. 3. Find the team member in the list, select the three dots, then select **Delete team member**. 4. Confirm the deletion when prompted. From 804d6bbbf7a234f49a1cbe8f4efaaaa972cadea9 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 22 May 2025 18:18:18 +1000 Subject: [PATCH 027/755] Update kinde-referral-program.mdx Update for different avatar --- .../get-started/team-and-account/kinde-referral-program.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/get-started/team-and-account/kinde-referral-program.mdx b/src/content/docs/get-started/team-and-account/kinde-referral-program.mdx index 1adaafe49..1377315b2 100644 --- a/src/content/docs/get-started/team-and-account/kinde-referral-program.mdx +++ b/src/content/docs/get-started/team-and-account/kinde-referral-program.mdx @@ -17,7 +17,7 @@ Referring a friend could earn you 20% of what they spend with us in a year, if t ## Get your Kinde referral link -1. Sign in to Kinde, click on your profile picture, and select **Account**. +1. On the Kinde home page, select the avatar menu at the bottom left and choose **Account**. 2. Go to your profile and scroll to the **Kinde referral code** section. 3. Generate your unique code (you only need to do this once). 4. Copy the code and re-use it to refer as many friends as you want. From 5038d5b615ae48bddc9bd306c492093eb48825fe Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 22 May 2025 18:19:31 +1000 Subject: [PATCH 028/755] Update update-your-details.mdx Update for different avatar --- .../business-information/update-your-details.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content/docs/manage-your-account/business-information/update-your-details.mdx b/src/content/docs/manage-your-account/business-information/update-your-details.mdx index 073e9da27..968d39402 100644 --- a/src/content/docs/manage-your-account/business-information/update-your-details.mdx +++ b/src/content/docs/manage-your-account/business-information/update-your-details.mdx @@ -17,7 +17,7 @@ You can change some business details in Kinde, but you may need to contact suppo ## Change your sign in name -1. On the Kinde home page, go to the bottom-left of screen and select your avatar. +1. On the Kinde home page, select the avatar menu at the bottom left. 2. In the menu that opens, select **Account**. 3. Make the changes you want and select **Save**. @@ -32,7 +32,7 @@ You cannot edit the email you sign in to Kinde with, but you can invite a new te ## Change business details -1. On the Kinde home page, go to the bottom-left of screen and select your avatar. +1. On the Kinde home page, select the avatar menu at the bottom left. 2. In the menu that opens, select **Business settings**. 3. Select **Business Details**. You can only change your business name, this will not impact your kinde business URL that was already created. 4. Select **Save**. From 30c7c1f7d78379eca3fb404ccc13a125d0108f19 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 22 May 2025 18:21:17 +1000 Subject: [PATCH 029/755] Update change-kinde-plan.mdx Avatar change --- .../manage-your-account/profile-and-plan/change-kinde-plan.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/manage-your-account/profile-and-plan/change-kinde-plan.mdx b/src/content/docs/manage-your-account/profile-and-plan/change-kinde-plan.mdx index 051aeb699..0b0974e24 100644 --- a/src/content/docs/manage-your-account/profile-and-plan/change-kinde-plan.mdx +++ b/src/content/docs/manage-your-account/profile-and-plan/change-kinde-plan.mdx @@ -34,7 +34,7 @@ We currently accept credit cards as a means of payment, and use Stripe to proces You’ll see multiple upgrade prompts throughout the Kinde interface, with a button for upgrading and choosing a plan. Click any of these prompts and you will be shown the plan selector and guided through the sign-up process. Or you can do the following: -1. Select the account icon in the bottom left of the dashboard and then select **Business Settings**. +1. On the Kinde home page, select the avatar menu at the bottom left, and then select **Business settings**. 2. In the window that opens, select **Plan**. 3. At the top of the window, select **Change plan**. The plan selector opens. 4. Select the plan you want to change to. From ad54c2ef3c4a14f840da29967981cf4b737c3a32 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 22 May 2025 18:22:14 +1000 Subject: [PATCH 030/755] Update update-kinde-payment.mdx avatar change --- .../profile-and-plan/update-kinde-payment.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content/docs/manage-your-account/profile-and-plan/update-kinde-payment.mdx b/src/content/docs/manage-your-account/profile-and-plan/update-kinde-payment.mdx index 51726c051..1a9e21160 100644 --- a/src/content/docs/manage-your-account/profile-and-plan/update-kinde-payment.mdx +++ b/src/content/docs/manage-your-account/profile-and-plan/update-kinde-payment.mdx @@ -15,7 +15,7 @@ Use the procedures below to keep your credit card details up to date. ## Add new payment method -1. Select the account icon in the bottom left of the dashboard and then select **Business Settings**. +1. On the Kinde home page, select the avatar menu at the bottom left and then select **Business Settings**. 2. In the window that opens, select **Payment details**. If you have already entered payment details, they will appear here. 3. Select **Add payment method**. 4. In the window that appears, add your credit card details and follow the prompts to save. @@ -29,7 +29,7 @@ Use the procedures below to keep your credit card details up to date. If you are on a paid plan, add a new payment method before removing the old method. -1. Select the account icon in the bottom left of the dashboard and then select **Business Settings**. +1. On the Kinde home page, select the avatar menu at the bottom left and then select **Business Settings**. 2. In the window that opens, select **Payment details**. All your payment methods are shown in this section. 3. Select the three dots on the payment method you want to remove, select **Remove**. 4. In the message that appears, confirm that you want to remove the payment method. From 4ae22cfb690980e03aede133872260993db6b347 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 22 May 2025 18:22:54 +1000 Subject: [PATCH 031/755] Update view-kinde-plan.mdx Avatar change --- .../manage-your-account/profile-and-plan/view-kinde-plan.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/manage-your-account/profile-and-plan/view-kinde-plan.mdx b/src/content/docs/manage-your-account/profile-and-plan/view-kinde-plan.mdx index 468db11b3..f427a6280 100644 --- a/src/content/docs/manage-your-account/profile-and-plan/view-kinde-plan.mdx +++ b/src/content/docs/manage-your-account/profile-and-plan/view-kinde-plan.mdx @@ -22,7 +22,7 @@ You can also view [full plan details and comparisons](https://kinde.com/pricing/ ## To view your plan -1. Select the account icon in the bottom left of the dashboard and then select **Business Settings**. +1. On the Kinde home page, select the avatar menu at the bottom left and then select **Business Settings**. 2. In the window that opens, select **Plan**. ## Subscription details From 75594e0b61bc17ea0abaf01cc44891cbd2a2fc5d Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 22 May 2025 18:23:37 +1000 Subject: [PATCH 032/755] Update check-your-mau.mdx Avatar change --- .../docs/manage-your-account/your-data/check-your-mau.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/manage-your-account/your-data/check-your-mau.mdx b/src/content/docs/manage-your-account/your-data/check-your-mau.mdx index eff17ac4a..277b52206 100644 --- a/src/content/docs/manage-your-account/your-data/check-your-mau.mdx +++ b/src/content/docs/manage-your-account/your-data/check-your-mau.mdx @@ -34,7 +34,7 @@ If an organization is created and deleted in the same monthly billing period, it ## To check your MAU and MAO -1. On the Kinde home page, click on your avatar and select **Business settings**. +1. On the Kinde home page, select the avatar menu at the bottom left and then select **Business Settings**. 2. Select *Plan** in the side menu. 2. In the main **Subscription** area of the window, view your MAU and MAO. From 8d20178a997d306bb1f7e4622cab8ce3b8222a9b Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 22 May 2025 18:24:37 +1000 Subject: [PATCH 033/755] Update src/content/docs/manage-users/add-and-edit/import-users-in-bulk.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- .../docs/manage-users/add-and-edit/import-users-in-bulk.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/content/docs/manage-users/add-and-edit/import-users-in-bulk.mdx b/src/content/docs/manage-users/add-and-edit/import-users-in-bulk.mdx index 7bc513509..db94b0c06 100644 --- a/src/content/docs/manage-users/add-and-edit/import-users-in-bulk.mdx +++ b/src/content/docs/manage-users/add-and-edit/import-users-in-bulk.mdx @@ -55,6 +55,8 @@ Kinde supports migrating the following authentication methods from Auth0: Userna - email - sms - google-oauth2 +- apple +- microsoft - github - twitch - facebook From de4fa27698dde928f2a94ef8454f054bd1bf2b14 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Fri, 23 May 2025 08:56:08 +1000 Subject: [PATCH 034/755] Update index.mdx Clarifying filenames in rules --- src/content/docs/workflows/about-workflows/index.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/content/docs/workflows/about-workflows/index.mdx b/src/content/docs/workflows/about-workflows/index.mdx index 65366759f..24004e0b3 100644 --- a/src/content/docs/workflows/about-workflows/index.mdx +++ b/src/content/docs/workflows/about-workflows/index.mdx @@ -34,6 +34,7 @@ We will add more triggers (and allow you to create your own) as we develop the f ## Basic workflow rules - Workflow actions need to be written in TypeScript or plain JavaScript +- Filenames must end in the word 'Workflow' for Kinde to recognize them as containing workflow code. For example, `MFAWorkflow.ts` or `PreauthorizationWorkflow.jsx` - File extensions should be .ts, .js, .tsx or .jsx - Each trigger can only have one workflow - Only Kinde-defined triggers are available (for now) From d29502fdc51f29a68b1d3a3b75e024255ee246d8 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 28 May 2025 15:51:29 +1000 Subject: [PATCH 035/755] Update run-multiple-businesses.mdx Update for self serve --- .../docs/build/set-up-options/run-multiple-businesses.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content/docs/build/set-up-options/run-multiple-businesses.mdx b/src/content/docs/build/set-up-options/run-multiple-businesses.mdx index b7f159415..11d3e2362 100644 --- a/src/content/docs/build/set-up-options/run-multiple-businesses.mdx +++ b/src/content/docs/build/set-up-options/run-multiple-businesses.mdx @@ -16,7 +16,7 @@ You can run multiple businesses on Kinde. This is helpful if you want to create ## **Add a new business** -1. Select your profile in the bottom left of the Kinde home screen. +1. Select your business profile in the bottom left of the Kinde home screen. 2. From the menu, select **Switch business**. A screen showing all your businesses opens. 3. Select **Add business**. 4. Complete the form, including your preferred Kinde domain and data storage region. These details cannot be changed later. @@ -25,7 +25,7 @@ You can run multiple businesses on Kinde. This is helpful if you want to create ## **Switch between businesses** -1. Select your profile in the bottom left of the Kinde home screen. +1. Select your business profile in the bottom left of the Kinde home screen. 2. From the menu, select **Switch business*. A screen showing all your businesses opens. 3. Select the one you want to work in. The business loads. From 1528717b9521eeb473a2f0c2845ad151de1bb4de Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 29 May 2025 18:35:13 +1000 Subject: [PATCH 036/755] Update understand-page-design.mdx Added all pages to custom page list --- .../understand-page-design.mdx | 82 +++++++++++++++++-- 1 file changed, 76 insertions(+), 6 deletions(-) diff --git a/src/content/docs/design/customize-with-code/understand-page-design.mdx b/src/content/docs/design/customize-with-code/understand-page-design.mdx index 64aa7a62b..c914fa076 100644 --- a/src/content/docs/design/customize-with-code/understand-page-design.mdx +++ b/src/content/docs/design/customize-with-code/understand-page-design.mdx @@ -144,7 +144,7 @@ If you are using React for templating, note this code is rendered on the server. -### Page structure in the Git directory +## Page structure in the Git directory The code for your pages must live in a GitHub repository (other git providers to be supported later). Your directory structure in the repo is critical to Kinde being able to run your design code. @@ -162,7 +162,7 @@ myApp/ └── kinde.json ``` -### Kinde.json +## Kinde.json The `kinde.json` file defines the config for all custom code in Kinde, including workflows and custom pages. A typical config file will look as follows: @@ -177,13 +177,19 @@ The `kinde.json` file defines the config for all custom code in Kinde, including `version` - based on the date when the API version was released. Any breaking changes will be released in a new API version. -### Which pages can I customize? +## Which pages can I customize? All Kinde hosted pages can be customized and use url route mapping to determine which template to use. If a specific mapped route does not exist, a special route called `(default)` will be rendered. Set up the `(default)` page to ensure all your pages follow this design unless you have overridden them with custom code. -Available routes: + + +Common routes `(default)` - The page template that will be used for all Kinde hosted pages when a specific one cannot be found. @@ -193,9 +199,73 @@ Available routes: `(index)` - If someone visits the root domain for your business, e.g. `https://.kinde.com` +Errors + +`(account_locked)` + +`(account_not_found)` + +`(error)` + +`(invalid_redirect_url)` + +Authentication & MFA + +`(clickwrap)` + +`(sso_home_realm)` + +`(provide_email)` + +`(mfa_authenticator_app)` + +`(mfa_method_selection)` + +`(mfa_setup_email)` + +`(mfa_setup_phone)` + +`(mfa_use_email_otp)` + +`(mfa_use_phone_otp)` + +`(mfa_use_recovery_code)` + +`(mfa_view_recovery_codes)` + +Passwords + +`(reset_password)` + +`(reset_password_verify_email_otp)` + +`(set_password)` + +`(verify_password)` + +Verify code + +`(sign_in_sign_up_use_phone_otp)` + +`(sign_in_use_email_otp)` + +`(sign_up_use_email_otp)` + +`(subscription_success)` + +Other routes + +`(request_access)` - before you launch and want to collect subscribers + +`(request_access_success)` + +`(choose_plan)` - coming soon, relates to billing + +`(collect_payment_details)` - coming soon, related to billing + If you want specific customization for a page not listed here, reach out and let us know. -### Set the page default export function +## Set the page default export function Your `page.[ext]` file should contain a default export. It doesn’t matter what this is called, but the general convention is to call it `Page`. This is provided a single `event` argument which is an object containing 2 keys `context` and `request`. @@ -225,7 +295,7 @@ The top level `context` key object contains information about the page itself, l - `description` the page description - `logoAlt` the alt text for your company logo -### Page settings +## Page settings Sometimes additional information needs to be passed to Kinde from your page. You can use the page settings object for this. From bac54d072963c69d4fdba468b6cab4c99cfae2b5 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Fri, 30 May 2025 09:44:37 +1000 Subject: [PATCH 037/755] Update understand-page-design.mdx Updated list with Dave's definitions --- .../understand-page-design.mdx | 100 +++++++++--------- 1 file changed, 49 insertions(+), 51 deletions(-) diff --git a/src/content/docs/design/customize-with-code/understand-page-design.mdx b/src/content/docs/design/customize-with-code/understand-page-design.mdx index c914fa076..e6c2eed17 100644 --- a/src/content/docs/design/customize-with-code/understand-page-design.mdx +++ b/src/content/docs/design/customize-with-code/understand-page-design.mdx @@ -189,79 +189,77 @@ Once you start customizing pages, it's on you not to break them. We recommend al -Common routes +### Common pages -`(default)` - The page template that will be used for all Kinde hosted pages when a specific one cannot be found. +These are the most frequently used or fallback pages. -`(register)` - The sign up page +* `(default)` – Fallback template used when a specific page is not found. +* `(register)` – The sign-up page. +* `(login)` – The sign-in page. +* `(index)` – Landing page when visiting the root domain (e.g. `https://.kinde.com`). -`(login)` - The sign in page +### Authentication -`(index)` - If someone visits the root domain for your business, e.g. `https://.kinde.com` +Pages involved in initiating authentication flows. +* `(register)` – The sign-up page. +* `(login)` – The sign-in page. +* `(sso_home_realm)` – Displayed when a user selects “Continue with SSO” to choose their identity provider. +* `(provide_email)` – Shown when using a social login provider that does not return an email address. +* `(clickwrap)` – Displays terms and conditions or agreements that must be accepted. -Errors +### Password flows -`(account_locked)` +Used in password-based authentication and recovery. -`(account_not_found)` +* `(verify_password)` – Shown during sign-in when using a password-based method. +* `(set_password)` – Shown during a password-based sign-up flow. +* `(reset_password_verify_email_otp)` – First step of the reset flow where the user verifies identity using an email OTP. +* `(reset_password)` – Password entry screen shown after verification during the reset flow. -`(error)` +### One-Time Passcode (OTP) verification -`(invalid_redirect_url)` +Used in sign-in and sign-up flows with OTP (email or phone). -Authentication & MFA +* `(sign_in_use_email_otp)` – Sign in with a one-time email code. +* `(sign_up_use_email_otp)` – Sign up with a one-time email code. +* `(sign_in_sign_up_use_phone_otp)` – Sign in or sign up with a one-time phone code. -`(clickwrap)` +### Multi-Factor Authentication (MFA) -`(sso_home_realm)` +Shown after primary authentication when MFA is required or being set up. -`(provide_email)` +* `(mfa_method_selection)` – User selects their preferred MFA method. +* `(mfa_authenticator_app)` – Setup screen for using an authenticator app. +* `(mfa_setup_email)` – Setup screen for email-based MFA. +* `(mfa_setup_phone)` – Setup screen for phone-based MFA. +* `(mfa_use_email_otp)` – Enter a one-time email code for MFA. +* `(mfa_use_phone_otp)` – Enter a one-time phone code for MFA. +* `(mfa_use_recovery_code)` – Enter a recovery code if unable to use other MFA methods. +* `(mfa_view_recovery_codes)` – View and save MFA recovery codes. -`(mfa_authenticator_app)` +### Billing (coming soon) -`(mfa_method_selection)` +Pages related to choosing a plan and making a payment. -`(mfa_setup_email)` +* `(choose_plan)` – User selects a subscription plan. +* `(collect_payment_details)` – User enters billing information. +* `(subscription_success)` – Confirmation page shown after successful subscription. -`(mfa_setup_phone)` +### Early access -`(mfa_use_email_otp)` +Pages for gated access to your product before full launch. -`(mfa_use_phone_otp)` +* `(request_access)` – Request early access to your product. +* `(request_access_success)` – Confirmation page after a request is submitted. -`(mfa_use_recovery_code)` +### Error pages -`(mfa_view_recovery_codes)` +Shown when a user encounters an error state. -Passwords - -`(reset_password)` - -`(reset_password_verify_email_otp)` - -`(set_password)` - -`(verify_password)` - -Verify code - -`(sign_in_sign_up_use_phone_otp)` - -`(sign_in_use_email_otp)` - -`(sign_up_use_email_otp)` - -`(subscription_success)` - -Other routes - -`(request_access)` - before you launch and want to collect subscribers - -`(request_access_success)` - -`(choose_plan)` - coming soon, relates to billing - -`(collect_payment_details)` - coming soon, related to billing +* `(account_locked)` – The user’s account has been locked. +* `(account_not_found)` – No account was found for the entered credentials. +* `(invalid_redirect_url)` – The redirect URL is invalid or not on the allowed list. +* `(error)` – Generic error screen. If you want specific customization for a page not listed here, reach out and let us know. From 020272fd516d95838809c8c0c86d1c3571001370 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Fri, 30 May 2025 15:15:44 +1000 Subject: [PATCH 038/755] Update mfa-for-kinde-access.mdx Added note for limit to paid plans --- .../get-started/team-and-account/mfa-for-kinde-access.mdx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/content/docs/get-started/team-and-account/mfa-for-kinde-access.mdx b/src/content/docs/get-started/team-and-account/mfa-for-kinde-access.mdx index 41a3cf8cc..2c8b08c00 100644 --- a/src/content/docs/get-started/team-and-account/mfa-for-kinde-access.mdx +++ b/src/content/docs/get-started/team-and-account/mfa-for-kinde-access.mdx @@ -6,6 +6,12 @@ sidebar: relatedArticles: - f4b911df-cc23-4eb9-b3ff-56cd2bb7e378 --- + + If you want your team members to use multi-factor authentication (MFA) when they sign in to Kinde, you can contact us to request this. We can set MFA so that it applies to everyone in your team, or only applies to certain roles, e.g. Owners within the business. From aadfccd3ff4c3b61d58104751bb4f0a72e6fa61c Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 2 Jun 2025 09:26:43 +1000 Subject: [PATCH 039/755] Adding Vorombetech Solutions to the wall of fame --- .../docs/trust-center/security/security-wall-of-fame.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/content/docs/trust-center/security/security-wall-of-fame.mdx b/src/content/docs/trust-center/security/security-wall-of-fame.mdx index 2f9d2fea9..7e9d41cb4 100644 --- a/src/content/docs/trust-center/security/security-wall-of-fame.mdx +++ b/src/content/docs/trust-center/security/security-wall-of-fame.mdx @@ -19,6 +19,8 @@ Love your work! ### Disclosures +[Vorombetech Solutions](https://www.vorombetech.com/) + [cyberritzzz](https://www.linkedin.com/in/prerit-yaduvanshi) [Nahid Hasan Limon](https://x.com/nh___limon) From 026fae81b4fe1fe81c6c73a46d85e827ea8d230d Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:08:07 +1000 Subject: [PATCH 040/755] Create index.mdx New page --- src/content/docs/billing/About billing/index.mdx | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/content/docs/billing/About billing/index.mdx diff --git a/src/content/docs/billing/About billing/index.mdx b/src/content/docs/billing/About billing/index.mdx new file mode 100644 index 000000000..18827e378 --- /dev/null +++ b/src/content/docs/billing/About billing/index.mdx @@ -0,0 +1,10 @@ +--- +page_id: 7a522e8a-64b1-49ce-847c-b99b7ce424cb +title: About Kinde billing +sidebar: + order: 1 +relatedArticles: + - +app_context: + - m: +--- From 9d0b826f07962fc06d09957ef58067c5435261e2 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:16:42 +1000 Subject: [PATCH 041/755] Update sidebarData.ts Update to sidebar category name --- src/data/sidebarData.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/sidebarData.ts b/src/data/sidebarData.ts index 3dbb699b8..71817b62d 100644 --- a/src/data/sidebarData.ts +++ b/src/data/sidebarData.ts @@ -139,8 +139,8 @@ const sidebarData = [ ] }, { - label: "Plans and payments", - description: "Build plans and pricing so that your users can pay you", + label: "Billing", + description: "Monetize your product, build plans, and accept payments", icon: "billing", collapsed: true, cardLink: "/billing/about-payments-and-plans/", From 7ab1d885bfd7e6ae47409e77ad1dcc5f6bdadb8b Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:21:02 +1000 Subject: [PATCH 042/755] Create setup-overview.mdx Index topic --- .../docs/billing/get-started/setup-overview.mdx | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/content/docs/billing/get-started/setup-overview.mdx diff --git a/src/content/docs/billing/get-started/setup-overview.mdx b/src/content/docs/billing/get-started/setup-overview.mdx new file mode 100644 index 000000000..34e9343ff --- /dev/null +++ b/src/content/docs/billing/get-started/setup-overview.mdx @@ -0,0 +1,12 @@ +--- +page_id: 100f75f1-a0a4-459f-874f-da127f2d0615 +title: Setup overview +sidebar: + order: 1 +relatedArticles: + - +app_context: + - m: settings + s: applications +--- + From e1d87f2cd2892607d1a8689b125921827454c61a Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:32:52 +1000 Subject: [PATCH 043/755] Create about-plans.mdx index topic --- src/content/docs/billing/manage-plans/about-plans.mdx | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/content/docs/billing/manage-plans/about-plans.mdx diff --git a/src/content/docs/billing/manage-plans/about-plans.mdx b/src/content/docs/billing/manage-plans/about-plans.mdx new file mode 100644 index 000000000..6130f9eb1 --- /dev/null +++ b/src/content/docs/billing/manage-plans/about-plans.mdx @@ -0,0 +1,10 @@ +--- +page_id: 88e1773a-b681-441f-b4c7-d7d339116867 +title: About plans +sidebar: + order: 1 +relatedArticles: + - +app_context: + - +--- From 5d9bcf323eb6db5279948ef79f0899642d7d620c Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:34:40 +1000 Subject: [PATCH 044/755] Create about-billing.mdx New section --- .../docs/billing/about-billing/about-billing.mdx | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/content/docs/billing/about-billing/about-billing.mdx diff --git a/src/content/docs/billing/about-billing/about-billing.mdx b/src/content/docs/billing/about-billing/about-billing.mdx new file mode 100644 index 000000000..5e4ee2480 --- /dev/null +++ b/src/content/docs/billing/about-billing/about-billing.mdx @@ -0,0 +1,10 @@ +--- +page_id: bd6757e3-81d5-48d6-89c8-dd4c222ac647 +title: About billing +sidebar: + order: 1 +relatedArticles: + - +app_context: + - +--- From 75be23501b7d2e0e144d89e064cab864ef58f2aa Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:35:35 +1000 Subject: [PATCH 045/755] Delete src/content/docs/billing/About billing directory delete error section --- src/content/docs/billing/About billing/index.mdx | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 src/content/docs/billing/About billing/index.mdx diff --git a/src/content/docs/billing/About billing/index.mdx b/src/content/docs/billing/About billing/index.mdx deleted file mode 100644 index 18827e378..000000000 --- a/src/content/docs/billing/About billing/index.mdx +++ /dev/null @@ -1,10 +0,0 @@ ---- -page_id: 7a522e8a-64b1-49ce-847c-b99b7ce424cb -title: About Kinde billing -sidebar: - order: 1 -relatedArticles: - - -app_context: - - m: ---- From b79474e570e4d31d95c3a8fe6fe66f73d8ee9f16 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:39:00 +1000 Subject: [PATCH 046/755] Create pricing-models.mdx Index topic --- src/content/docs/billing/pricing/pricing-models.mdx | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/content/docs/billing/pricing/pricing-models.mdx diff --git a/src/content/docs/billing/pricing/pricing-models.mdx b/src/content/docs/billing/pricing/pricing-models.mdx new file mode 100644 index 000000000..990331c31 --- /dev/null +++ b/src/content/docs/billing/pricing/pricing-models.mdx @@ -0,0 +1,10 @@ +--- +page_id: 7f59a705-ac5d-4b07-a44e-1421dcdeffe8 +title: Pricing models +sidebar: + order: 1 +relatedArticles: + - +app_context: + - +--- From 410332687a59114de4154df65915cdeb358c8356 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:46:38 +1000 Subject: [PATCH 047/755] Create plan-selection.mdx Index topic --- .../billing/billing-user-experience/plan-selection.mdx | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/content/docs/billing/billing-user-experience/plan-selection.mdx diff --git a/src/content/docs/billing/billing-user-experience/plan-selection.mdx b/src/content/docs/billing/billing-user-experience/plan-selection.mdx new file mode 100644 index 000000000..16fdcdd8c --- /dev/null +++ b/src/content/docs/billing/billing-user-experience/plan-selection.mdx @@ -0,0 +1,10 @@ +--- +page_id: 37d5ae8e-cfd1-4e5d-8333-387b6967ec23 +title: Build a pricing table +sidebar: + order: 1 +relatedArticles: + - +app_context: + - +--- From 1a7cd275d800ca578cf15c2c0839f0a7d5068a6b Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:48:49 +1000 Subject: [PATCH 048/755] Create payment-gateway.mdx Index topic --- .../billing/payment-management/payment-gateway.mdx | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/content/docs/billing/payment-management/payment-gateway.mdx diff --git a/src/content/docs/billing/payment-management/payment-gateway.mdx b/src/content/docs/billing/payment-management/payment-gateway.mdx new file mode 100644 index 000000000..8f7ddb8df --- /dev/null +++ b/src/content/docs/billing/payment-management/payment-gateway.mdx @@ -0,0 +1,10 @@ +--- +page_id: acdd8b64-d5b7-43ab-b47b-6244d8f5b82e +title: Connect payment gateway +sidebar: + order: 1 +relatedArticles: + - +app_context: + - +--- From 07971ca8ff7fadbb1d5acba4b66bc8c375800187 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:49:39 +1000 Subject: [PATCH 049/755] Delete src/content/docs/billing/about-payments-and-plans directory Delete old index topic --- .../billing/about-payments-and-plans/index.mdx | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 src/content/docs/billing/about-payments-and-plans/index.mdx diff --git a/src/content/docs/billing/about-payments-and-plans/index.mdx b/src/content/docs/billing/about-payments-and-plans/index.mdx deleted file mode 100644 index 712dccced..000000000 --- a/src/content/docs/billing/about-payments-and-plans/index.mdx +++ /dev/null @@ -1,18 +0,0 @@ ---- -page_id: 231570f0-dd9d-401d-a3be-3c2becf15e00 -title: Plans and subscriptions coming soon! -sidebar: - order: 1 ---- - -Our team is working hard to bring you a billing feature, with the ability to manage plans and subscriptions, and accept payments from your customers. - -Here’s what we will bring you to start with: - -- Create and manage plans -- Set up entitlements (product features) -- Apply pricing model to entitlements (metered, fixed, etc.) -- Integrate with Stripe to manage payments -- Manage subscriptions (including upgrades, downgrades, cancellations) - -[**Sign up for early access!**](https://kinde-21631392.hs-sites.com/en-au/billing-interest) From 7821e7799b67fb005a5fa092d1fc2341aa33cd2f Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:52:40 +1000 Subject: [PATCH 050/755] Create add-billing-role.mdx GS step --- .../docs/billing/get-started/add-billing-role.mdx | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/content/docs/billing/get-started/add-billing-role.mdx diff --git a/src/content/docs/billing/get-started/add-billing-role.mdx b/src/content/docs/billing/get-started/add-billing-role.mdx new file mode 100644 index 000000000..cecc661f4 --- /dev/null +++ b/src/content/docs/billing/get-started/add-billing-role.mdx @@ -0,0 +1,10 @@ +--- +page_id: 53fd7d58-13ff-407d-99c2-99759c8a52b3 +title: Step 1: Add billing role (B2B) +sidebar: + order: 2 +relatedArticles: + - +app_context: + - +--- From ea31b67d9397ecd7679bf9b953803be316ec6539 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:54:32 +1000 Subject: [PATCH 051/755] Create default-billing-currency.mdx step topic --- .../billing/get-started/default-billing-currency.mdx | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/content/docs/billing/get-started/default-billing-currency.mdx diff --git a/src/content/docs/billing/get-started/default-billing-currency.mdx b/src/content/docs/billing/get-started/default-billing-currency.mdx new file mode 100644 index 000000000..b53794b85 --- /dev/null +++ b/src/content/docs/billing/get-started/default-billing-currency.mdx @@ -0,0 +1,10 @@ +--- +page_id: 7e1082b4-2b78-4e76-92fd-ee25497a4e2b +title: Set default billing currency +sidebar: + order: 3 +relatedArticles: + - +app_context: + - +--- From 3d1715b30755a7f9a1977adae0baa98c1b9440ac Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:55:37 +1000 Subject: [PATCH 052/755] Create connect-to-stripe.mdx --- .../docs/billing/get-started/connect-to-stripe.mdx | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/content/docs/billing/get-started/connect-to-stripe.mdx diff --git a/src/content/docs/billing/get-started/connect-to-stripe.mdx b/src/content/docs/billing/get-started/connect-to-stripe.mdx new file mode 100644 index 000000000..0145963ed --- /dev/null +++ b/src/content/docs/billing/get-started/connect-to-stripe.mdx @@ -0,0 +1,12 @@ +--- +page_id: d980a089-d9c1-447b-930a-de0f2c00d3bf +title: Connect to Stripe +sidebar: + order: 4 +relatedArticles: + - +app_context: + - +--- + + From dd300918de0df155358899c3fdd2c23fa6f30314 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:56:39 +1000 Subject: [PATCH 053/755] Create build-plans.mdx --- src/content/docs/billing/get-started/build-plans.mdx | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/content/docs/billing/get-started/build-plans.mdx diff --git a/src/content/docs/billing/get-started/build-plans.mdx b/src/content/docs/billing/get-started/build-plans.mdx new file mode 100644 index 000000000..407cf7089 --- /dev/null +++ b/src/content/docs/billing/get-started/build-plans.mdx @@ -0,0 +1,10 @@ +--- +page_id: c4526879-5580-4cd0-a881-91b512438fc0 +title: Step 4: Build plans +sidebar: + order: +relatedArticles: + - +app_context: + - +--- From fe447a6d6e609edeb71f2ec6bf3980600e4dbf92 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:56:56 +1000 Subject: [PATCH 054/755] Update connect-to-stripe.mdx --- src/content/docs/billing/get-started/connect-to-stripe.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/billing/get-started/connect-to-stripe.mdx b/src/content/docs/billing/get-started/connect-to-stripe.mdx index 0145963ed..75172a97d 100644 --- a/src/content/docs/billing/get-started/connect-to-stripe.mdx +++ b/src/content/docs/billing/get-started/connect-to-stripe.mdx @@ -1,6 +1,6 @@ --- page_id: d980a089-d9c1-447b-930a-de0f2c00d3bf -title: Connect to Stripe +title: Step 3: Connect to Stripe sidebar: order: 4 relatedArticles: From 17683c940ddf45478354a66a4c327c9cb656de9e Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:58:21 +1000 Subject: [PATCH 055/755] Update connect-to-stripe.mdx --- src/content/docs/billing/get-started/connect-to-stripe.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/billing/get-started/connect-to-stripe.mdx b/src/content/docs/billing/get-started/connect-to-stripe.mdx index 75172a97d..a05788159 100644 --- a/src/content/docs/billing/get-started/connect-to-stripe.mdx +++ b/src/content/docs/billing/get-started/connect-to-stripe.mdx @@ -1,6 +1,6 @@ --- page_id: d980a089-d9c1-447b-930a-de0f2c00d3bf -title: Step 3: Connect to Stripe +title: Step 3 Connect to Stripe sidebar: order: 4 relatedArticles: From 49f4be3650d85cefb5bedf059c00cce3671fd762 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:58:33 +1000 Subject: [PATCH 056/755] Update build-plans.mdx --- src/content/docs/billing/get-started/build-plans.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/billing/get-started/build-plans.mdx b/src/content/docs/billing/get-started/build-plans.mdx index 407cf7089..8e0208184 100644 --- a/src/content/docs/billing/get-started/build-plans.mdx +++ b/src/content/docs/billing/get-started/build-plans.mdx @@ -1,6 +1,6 @@ --- page_id: c4526879-5580-4cd0-a881-91b512438fc0 -title: Step 4: Build plans +title: Step 4 Build plans sidebar: order: relatedArticles: From 6450f2bfbef6a7a034b6b357e6d9544343a1ad17 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:58:47 +1000 Subject: [PATCH 057/755] Update add-billing-role.mdx --- src/content/docs/billing/get-started/add-billing-role.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/billing/get-started/add-billing-role.mdx b/src/content/docs/billing/get-started/add-billing-role.mdx index cecc661f4..965e7a16e 100644 --- a/src/content/docs/billing/get-started/add-billing-role.mdx +++ b/src/content/docs/billing/get-started/add-billing-role.mdx @@ -1,6 +1,6 @@ --- page_id: 53fd7d58-13ff-407d-99c2-99759c8a52b3 -title: Step 1: Add billing role (B2B) +title: Step 1 Add billing role (B2B) sidebar: order: 2 relatedArticles: From 36bcc358b3f877891d68512d0bb4242e2630cdcd Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:59:45 +1000 Subject: [PATCH 058/755] Create publish-plans.mdx --- src/content/docs/billing/get-started/publish-plans.mdx | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/content/docs/billing/get-started/publish-plans.mdx diff --git a/src/content/docs/billing/get-started/publish-plans.mdx b/src/content/docs/billing/get-started/publish-plans.mdx new file mode 100644 index 000000000..fb7eaffac --- /dev/null +++ b/src/content/docs/billing/get-started/publish-plans.mdx @@ -0,0 +1,10 @@ +--- +page_id: 46241baf-30aa-43c0-ac0c-b2b7e99941f1 +title: Step 5 Publish plans +sidebar: + order: +relatedArticles: + - +app_context: + - +--- From e5e739264237a0098010b6ac31a3deb4ffaad949 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 4 Jun 2025 21:01:47 +1000 Subject: [PATCH 059/755] Create add-pricing-table.mdx --- .../docs/billing/get-started/add-pricing-table.mdx | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/content/docs/billing/get-started/add-pricing-table.mdx diff --git a/src/content/docs/billing/get-started/add-pricing-table.mdx b/src/content/docs/billing/get-started/add-pricing-table.mdx new file mode 100644 index 000000000..55cc97146 --- /dev/null +++ b/src/content/docs/billing/get-started/add-pricing-table.mdx @@ -0,0 +1,10 @@ +--- +page_id: 6babd388-3f74-4e51-9d8e-5fd6f04b20e8 +title: Step 6 Create pricing table +sidebar: + order: 7 +relatedArticles: + - +app_context: + - +--- From 656a96a151fb464d062b6006aa85105d5f56c638 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 4 Jun 2025 21:03:08 +1000 Subject: [PATCH 060/755] Create self-serve-portal-setup.mdx --- .../billing/get-started/self-serve-portal-setup.mdx | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/content/docs/billing/get-started/self-serve-portal-setup.mdx diff --git a/src/content/docs/billing/get-started/self-serve-portal-setup.mdx b/src/content/docs/billing/get-started/self-serve-portal-setup.mdx new file mode 100644 index 000000000..a747daff3 --- /dev/null +++ b/src/content/docs/billing/get-started/self-serve-portal-setup.mdx @@ -0,0 +1,10 @@ +--- +page_id: 590fa6c8-b759-46ba-b1b0-4c6bb09fba12 +title: Step 7 Set up self-serve portal (optional) +sidebar: + order: 8 +relatedArticles: + - +app_context: + - +--- From 555c9c8a556f563dac61c803069feeb4731010fb Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 4 Jun 2025 21:03:35 +1000 Subject: [PATCH 061/755] Update add-pricing-table.mdx --- src/content/docs/billing/get-started/add-pricing-table.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/billing/get-started/add-pricing-table.mdx b/src/content/docs/billing/get-started/add-pricing-table.mdx index 55cc97146..319d24c22 100644 --- a/src/content/docs/billing/get-started/add-pricing-table.mdx +++ b/src/content/docs/billing/get-started/add-pricing-table.mdx @@ -1,6 +1,6 @@ --- page_id: 6babd388-3f74-4e51-9d8e-5fd6f04b20e8 -title: Step 6 Create pricing table +title: Step 6 Create pricing table (optional) sidebar: order: 7 relatedArticles: From 5ec3cb0e29c39e3d353ebba3d01151251c6e3e78 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 4 Jun 2025 23:52:23 +0000 Subject: [PATCH 062/755] Create billing-concepts-terms.mdx New topic --- .../about-billing/billing-concepts-terms.mdx | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 src/content/docs/billing/about-billing/billing-concepts-terms.mdx diff --git a/src/content/docs/billing/about-billing/billing-concepts-terms.mdx b/src/content/docs/billing/about-billing/billing-concepts-terms.mdx new file mode 100644 index 000000000..74199502f --- /dev/null +++ b/src/content/docs/billing/about-billing/billing-concepts-terms.mdx @@ -0,0 +1,40 @@ +--- +page_id: 9d1daf85-1a2c-4cc5-879a-230c950bed12 +title: Billing concepts & terms +sidebar: + order: +relatedArticles: + - +app_context: + - +--- + + + +Billing is the collective term we use to refer to the broad function of plans, pricing, payments, etc. The core concepts that you will come across in Kinde and in the docs might not be familiar to you. + +## Key concepts + +- **Plans and plan groups** - Plans define the specific features, usage limits, and pricing tiers offered to customers in a SaaS product. Plan groups organize multiple plans under a common category, helping segment offerings by use case, customer size, or market. +- **Pricing models** - Pricing models are the different methods of charging customers, such as flat-rate, usage-based, tiered, per-seat pricing, etc. Your pricing model is determined by your product and customer needs. Consider scalability and longevity when deciding this. +- **Payments gateway** - A payments gateway is a service that securely processes customer payments via credit cards, ACH, or other methods - such as Stripe. +- **Pricing table** - A pricing table is a visual representation of your different subscription plans, showcasing features and prices to help users compare options. You can build one in Kinde and embed it on your site using a URL. +- **Self-serve account portal** - Kinde provides a self-serve portal. This allows customers to manage their subscriptions—such as upgrading plans, updating payment information, or cancelling. This reduces support overhead and improves user autonomy. In Kinde, you can decide what your customers can self-manage or remove the functionality completely. + +## Common billing terms + +- **Base price** – The starting cost of a subscription plan, typically the cost for a core set of features or a minimum level of usage. +- **Chargeable / Non-chargeable feature** – + - **Chargeable feature**: Incurs an additional fee when used. Might be metered or per unit price. + - **Non-chargeable feature**: Included in the plan at no extra cost. Add non-chargeable features for anything included in all plans, and that needs to be provisioned. +- **Feature** – A specific function or capability of your SaaS product that you provision for app users. In context with a plan, these are chargeable or non-chargeable features that are provisioned to customers. +- **Fixed charge** – A recurring fee that does not change based on usage, often applied monthly or annually. Use this for a plan’s base price or other flat recurring fees. +- **Metered and unmetered feature** – Metered features are provisioned in units, often with pricing per unit, e.g. MAU. An unmetered feature is like a boolean, and is a basic feature with no pricing attached. +- **Multi-currency** – The ability to set plan prices in different currencies to support global customers. Kinde supports nearly all currencies, but you can currently only pick one as the default for all plans. +- **Plan** – A packaged offering of features, prices, and terms available for subscription, typically tiered across a group (e.g., Basic, Pro, Enterprise). +- **Plan group** – A collection of related plans, often grouped by customer type or usage level, allowing easier management and comparison. +- **Pricing model** – The structure used to determine how features in a plan are priced. E.g. fixed charge, tiered, per-user, or usage-based pricing. Kinde lets you use multiple pricing models within one plan. +- **Subscription** – The ongoing agreement where a customer pays for access to a SaaS product via a recurring plan. +- **Tiered pricing** – This refers to unit pricing that has different unit costs based on the volume of units purchased. E.g. $10 per unit for 1–10 units, $8 per unit for 11–50 units, $5 per unit over 51 units. +- **Unit price** – Where a price is set per unit of usage, e.g. a seat, or feature. Unit prices can also be applied to metered features, e.g. x per unit. Unit prices can also be tiered, e.g. x per unit up to 10 units, then y for 10+ units. +- **Usage-based** **price** – A billing method where charges vary based on the metered consumption of resources or services (e.g., API calls, storage). From 7b8215391104df3d477374ab823dd60142b212b3 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 5 Jun 2025 00:18:15 +0000 Subject: [PATCH 063/755] Update about-billing.mdx Intro topci --- .../billing/about-billing/about-billing.mdx | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/content/docs/billing/about-billing/about-billing.mdx b/src/content/docs/billing/about-billing/about-billing.mdx index 5e4ee2480..e451e3228 100644 --- a/src/content/docs/billing/about-billing/about-billing.mdx +++ b/src/content/docs/billing/about-billing/about-billing.mdx @@ -8,3 +8,35 @@ relatedArticles: app_context: - --- + +Kinde billing gives you the ability to create plans that users can subscribe to, so you can get paid for your services and collect revenue. + +This feature lets you: + +- Create and manage plans, and make them visible to your customers +- Create and customize a pricing table for plan selection +- Implement specific pricing models to suit your product +- Use Stripe for secure handling of payments and invoicing +- Link organizations (B2B) and individual customers (B2C) to a plan +- Handle plan upgrade, downgrade, and cancellation +- Enable self-serve account management for customers +- Customize the pricing table to make the whole experience on-brand + +Billing makes the Kinde platform *the* essential development infrastructure for managing the customer lifecycle across every part of your business. From registration to plan selection, authorization to provisioning, releases to upgrades. + +## This is our first billing release + +Billing is a really complex area of app development, so while this release is tested and ready, we are still treating it like a beta to signal that we are actively working on improvements from day one. + +### How to send feedback + +It would be amazing if you can send any feedback you have via [not sure where] so we can quickly collect and prioritize improvements. + +## Known limitations + +These are current limitations that we are aware of and are working on adding. + +- Support for plan models with free trial periods +- Annual subscriptions. Only monthly is available right now. +- Add-ons and discounts that can be applied to individual subscriptions +- Plan versioning From 355fe71f31d5e7d4c18ccc7658b8e4d142c3d5fc Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 5 Jun 2025 00:20:33 +0000 Subject: [PATCH 064/755] Create kinde-billing-model.mdx Intro --- .../about-billing/kinde-billing-model.mdx | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/content/docs/billing/about-billing/kinde-billing-model.mdx diff --git a/src/content/docs/billing/about-billing/kinde-billing-model.mdx b/src/content/docs/billing/about-billing/kinde-billing-model.mdx new file mode 100644 index 000000000..da86496fa --- /dev/null +++ b/src/content/docs/billing/about-billing/kinde-billing-model.mdx @@ -0,0 +1,43 @@ +--- +page_id: e6dde80d-2977-419f-a05a-62ad0a7ac6de +title: The Kinde billing model +sidebar: + order: 2 +relatedArticles: + - +--- + +In the Kinde model, we host everything except the payment processing part of billing. Kinde integrates with a third-party payment gateway (Stripe) for secure payment processing. + +This involves a continuous sync between Kinde and Stripe, to ensure that products, prices, subscription information, invoice and payments, are accurate in both systems. + +Kinde does not store payment details, such as credit card information. This is exclusively managed by Stripe. + +## Billing for B2B and B2C + +Kinde supports billing models for both B2B and B2C. Depending which you are setting up, you may need to do a few extra tasks. Most of the setup is common to both. We will call out tasks that are only relevant to one or the other. + +- B2B - your customers are companies, organizations, or groups. +- B2C - your customers are individual users. + +## Kinde and Stripe + +Kinde integrates a single payment gateway (only Stripe for now) to handle the financial and payment management side of things. + +Stripe uses the plan data + the customer info to create an agreement in Stripe. The customer is invoiced based on this agreement. Stripe securely stores your customer’s payment details and Kinde never sees credit card or other bank information. + +Here’s what the billing feature looks like as a workflow. + +[IMAGE PLACEHOLDER] + +Stripe is currently the only payment provider supported with Kinde. But we plan to expand to other providers in the near future. + +## Multicurrency support + +Kinde has customers everywhere and almost every global currency is supported. + +What you need to be aware of: + +- When you connect to Stripe in Kinde, we create a Stripe US account by default. We do this because Stripe US supports global functionality. You can change the region during the Stripe connection setup flow. +- Regardless of Stripe account region, you can still select any currency for your plans in Kinde, and Stripe will do the hard part of exchange rate conversion, tax calculations, etc. +- Any fees you incur in Stripe for international transactions are your sole responsibility. From 542433bbe3bf6b45ed6af75d5553edb31c8e0f6a Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 5 Jun 2025 00:58:05 +0000 Subject: [PATCH 065/755] Update kinde-billing-model.mdx --- .../billing/about-billing/kinde-billing-model.mdx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/content/docs/billing/about-billing/kinde-billing-model.mdx b/src/content/docs/billing/about-billing/kinde-billing-model.mdx index da86496fa..baac66924 100644 --- a/src/content/docs/billing/about-billing/kinde-billing-model.mdx +++ b/src/content/docs/billing/about-billing/kinde-billing-model.mdx @@ -36,8 +36,15 @@ Stripe is currently the only payment provider supported with Kinde. But we plan Kinde has customers everywhere and almost every global currency is supported. -What you need to be aware of: +## Transaction data and Stripe region -- When you connect to Stripe in Kinde, we create a Stripe US account by default. We do this because Stripe US supports global functionality. You can change the region during the Stripe connection setup flow. +- When you connect to Stripe in Kinde, we create a Stripe US account by default. We do this because Stripe US more widely supports global functionality. You can change the region during the Stripe connection setup flow. - Regardless of Stripe account region, you can still select any currency for your plans in Kinde, and Stripe will do the hard part of exchange rate conversion, tax calculations, etc. - Any fees you incur in Stripe for international transactions are your sole responsibility. + + + From d1e1d62fa7328a0615ce864ce4c36e93c4c48f4d Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 5 Jun 2025 11:03:58 +1000 Subject: [PATCH 066/755] Update setup-overview.mdx Draft 1 --- .../billing/get-started/setup-overview.mdx | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/src/content/docs/billing/get-started/setup-overview.mdx b/src/content/docs/billing/get-started/setup-overview.mdx index 34e9343ff..55a27ef59 100644 --- a/src/content/docs/billing/get-started/setup-overview.mdx +++ b/src/content/docs/billing/get-started/setup-overview.mdx @@ -4,9 +4,40 @@ title: Setup overview sidebar: order: 1 relatedArticles: - - + - bd6757e3-81d5-48d6-89c8-dd4c222ac647 + - e6dde80d-2977-419f-a05a-62ad0a7ac6de app_context: - - m: settings - s: applications + - m: billing + - s: plans --- +Billing is big step for a business, so it’s a good idea to review the process before you start. + +## Overview of billing setup + +1. Set up billing roles and permissions (B2B) +2. Set currency - you can’t change this once plans are published +3. Connect to Stripe +4. Build plans +5. Publish plans +6. Enable subscription self-serve (optional) + 1. Create a plan selector + 2. Enable self-serve portal +7. Update your code +8. Test the setup and get your first subscriber! + +## ⚠️ Test in a non-production environment + +If you are using billing for the first time, make sure you use a Kinde non-production environment to test out the billing features. + +When you use a non-production environment, Stripe automatically creates a test Stripe environment. This test environment allows you to create customers and billing subscriptions without actually charging customers. You can also use Stripe’s test credit card details. + +## Before setting up billing + +- Make a list of all your app’s features - with names, descriptions, prices, metered rates, limits, inclusions, etc. You might consider doing this in a spreadsheet to make it easier and faster to add features in the Kinde plan builder. Include plan variations for prices, limits, etc. + + ![example of a spreadsheet of plans](https://imagedelivery.net/skPPZTHzSlcslvHjesZQcQ/401ff633-c6c8-45ba-9502-1a29274b4400/public) + +- (B2B) make sure your Kinde business is set up to [create an organization on sign up](https://docs.kinde.com/build/organizations/orgs-for-developers/#new-organization-self-sign-up). + +Follow the numbered steps in this section to set up billing in your business. From 2423cec37f25b962d6bf8be241efad3dc3a5b258 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 5 Jun 2025 11:25:15 +1000 Subject: [PATCH 067/755] Update add-billing-role.mdx Draft 1 --- .../billing/get-started/add-billing-role.mdx | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/content/docs/billing/get-started/add-billing-role.mdx b/src/content/docs/billing/get-started/add-billing-role.mdx index 965e7a16e..f991601e0 100644 --- a/src/content/docs/billing/get-started/add-billing-role.mdx +++ b/src/content/docs/billing/get-started/add-billing-role.mdx @@ -4,7 +4,22 @@ title: Step 1 Add billing role (B2B) sidebar: order: 2 relatedArticles: - - -app_context: - - + - d2d64a2b-1fb7-4c18-88bc-2986723724cb + - 7e1082b4-2b78-4e76-92fd-ee25497a4e2b --- + +Skip this step if you sell your services to individuals (B2C). + +If you are a B2B business, when someone signs up to your service via Kinde auth, an organization is created in your Kinde business. That someone also becomes the account creator, and they need permissions to buy plans and manage payments on behalf of their organization. + +Before you start selling to your business customers, create a default billing role to assign to the account creator when they sign up. + +1. Go to **Settings > Roles** and select **Add role**. The **Add role** window opens. + + ![Roles screen for billing owner](https://imagedelivery.net/skPPZTHzSlcslvHjesZQcQ/96415552-a11b-4be3-e644-d9eaa2af6700/public) + +2. Name the role, for example, `Billing contact` , and enter a description and **Key**. +3. Select the **Assign to the creator** option. +4. In the **System permissions** section, ensure the **org:write:billing** system permission is selected. + +This role will now be automatically assigned to users who create an organization as part of the authentication flow. From 24ce26b450b0da8e12e34eb11f6ad54b2f886bd8 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 5 Jun 2025 11:27:10 +1000 Subject: [PATCH 068/755] Next --- src/content/docs/billing/get-started/add-billing-role.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/content/docs/billing/get-started/add-billing-role.mdx b/src/content/docs/billing/get-started/add-billing-role.mdx index f991601e0..529de53bc 100644 --- a/src/content/docs/billing/get-started/add-billing-role.mdx +++ b/src/content/docs/billing/get-started/add-billing-role.mdx @@ -23,3 +23,5 @@ Before you start selling to your business customers, create a default billing ro 4. In the **System permissions** section, ensure the **org:write:billing** system permission is selected. This role will now be automatically assigned to users who create an organization as part of the authentication flow. + +**Next:** Set the default billing currency From 287fe99bc649604643e064bbe40b0c03190b7d8a Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 5 Jun 2025 11:28:29 +1000 Subject: [PATCH 069/755] Update add-billing-role.mdx --- src/content/docs/billing/get-started/add-billing-role.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/billing/get-started/add-billing-role.mdx b/src/content/docs/billing/get-started/add-billing-role.mdx index 529de53bc..162f66592 100644 --- a/src/content/docs/billing/get-started/add-billing-role.mdx +++ b/src/content/docs/billing/get-started/add-billing-role.mdx @@ -24,4 +24,4 @@ Before you start selling to your business customers, create a default billing ro This role will now be automatically assigned to users who create an organization as part of the authentication flow. -**Next:** Set the default billing currency +**Next:** [Set the default billing currency](/billing/get-started/default-billing-currency/) From 84f393b8a5d99ae85f7842a4cd1fd0cfab032aa6 Mon Sep 17 00:00:00 2001 From: andre selton Date: Thu, 5 Jun 2025 12:51:41 +1000 Subject: [PATCH 070/755] Privacy Policy June 2025 --- .../privacy-and-compliance/privacy-policy.mdx | 224 +++++++++--------- 1 file changed, 113 insertions(+), 111 deletions(-) diff --git a/src/content/docs/trust-center/privacy-and-compliance/privacy-policy.mdx b/src/content/docs/trust-center/privacy-and-compliance/privacy-policy.mdx index b5725e92b..7f902869c 100644 --- a/src/content/docs/trust-center/privacy-and-compliance/privacy-policy.mdx +++ b/src/content/docs/trust-center/privacy-and-compliance/privacy-policy.mdx @@ -13,96 +13,97 @@ This Privacy Policy sets out our commitment to protecting the privacy of persona In this Privacy Policy, we may refer to you as our direct customer (**Customer**) or you as a customer of our customer (**External User**). -Information about Australia’s privacy guidance can be found from the [Office of the Australian Information Commissioner](https://www.oaic.gov.au/) (**OAIC**). +Information about Australia’s privacy guidance can be found from the [Office of the Australian Information Commissioner](https://www.oaic.gov.au/) (**OAIC**). Kinde’s UK Company Reference Number (**CRN**) is [13920496](https://find-and-update.company-information.service.gov.uk/company/13920496). Information about the UK’s privacy guidance can be found with the [Information Commissioner’s Office](https://ico.org.uk/) (**ICO**). -This Privacy Policy takes into account the requirements of the _Privacy Act 1988_ (Cth). In addition to the Australian laws, individuals located in the European Union or European Economic Area (**EU**) may also have rights under the _General Data Protection Regulation 2016/679_ and individuals located in the United Kingdom (**UK**) may have rights under the General Data Protection Regulation (EU) 2016/679) (**UK GDPR**) and the Data Protection Act 2018 (**DPA 2018**) (together, the **GDPR**). +This Privacy Policy takes into account the requirements of the Privacy Act 1988 (Cth). In addition to the Australian laws, individuals located in the European Union or European Economic Area **(EU**) may also have rights under the General Data Protection Regulation 2016/679 and individuals located in the United Kingdom (**UK)** may have rights under the General Data Protection Regulation (**EU**) 2016/679) (**UK GDPR**) and the Data Protection Act 2018 (**DPA 2018**) (together, the **GDPR**). This document also details the additional rights of individuals located in the EU and UK, as well as information on how we process the personal information of individuals located in the EU and UK. ## The information we collect -**Personal Information**: is information or an opinion, whether true or not and whether recorded in a material form or not, about an individual who is identified or reasonably identifiable. +**Personal Information:** is information or an opinion, whether true or not and whether recorded in a material form or not, about an individual who is identified or reasonably identifiable. Where you are a Customer, the types of personal information we may collect about you include: -- **Identity Data** including your first and last name. -- **Contact Data** including your telephone number and email. -- **Financial Data** including bank account and payment card details (through our third party payment processor, who stores such information and we do not have access to that information). -- **Transaction Data** including details about payments to you from us and from you to us and other details of products and services you have purchased from us or we have purchased from you. -- **Technical and Usage Data** when you access any of our websites or platforms, details about your internet protocol (IP) address, login data, browser session and geo-location data, statistics on page views and sessions, device and network information, acquisition sources, search queries and/or browsing behaviour, access and use of our website (including through the use of Internet cookies), and communications with our website. -- **Profile Data** including your username and password for the Kinde platform, purchases or orders you have made with us and support requests you have made. -- **Interaction Data** including information you provide to us when you participate in any interactive features, including surveys, contests, promotions, activities or events. -- **Marketing and Communications Data** including your preferences in receiving marketing from us and our third parties and your communication preferences. -- **Professional data** including where you are a worker of ours or applying for a role with us, your professional history such as your previous positions and professional experience. -- **Sensitive information** is a sub-set of personal information that is given a higher level of protection. Sensitive information means information relating to your racial or ethnic origin, political opinions, religion, trade union or other professional associations or memberships, philosophical beliefs, sexual orientation or practices, criminal records, health information or biometric information. We do not actively request sensitive information about you. If at any time we need to collect sensitive information about you, unless otherwise permitted by law, we will first obtain your consent and we will only use it as required or authorised by law. +* **Identity Data** including your first and last name. +* **Contact Data** including your telephone number and email. +* **Financial Data** including bank account and payment card details (through our third party payment processor, who stores such information and we do not have access to that information. We do not directly store your full payment card details). +* **Billing Data** including details of your billing plans, subscription status, transaction history, and usage metrics related to our billing services. +* **Transaction Data** including details about payments to you from us and from you to us and other details of products and services you have purchased from us or we have purchased from you, and billing-related transactions such as subscription payments and usage-based fees processed through our Billing feature. +* **Technical and Usage Data** when you access any of our websites or platforms, details about your internet protocol (IP) address, login data, browser session and geo-location data, statistics on page views and sessions, device and network information, acquisition sources, search queries and/or browsing behaviour, access and use of our website (including through the use of Internet cookies), and communications with our website. +* **Profile Data** including your username and password for the Kinde platform, purchases or orders you have made with us and support requests you have made. +* **Interaction Data** including information you provide to us when you participate in any interactive features, including surveys, contests, promotions, activities or events. +* **Marketing and Communications Data** including your preferences in receiving marketing from us and our third parties and your communication preferences. +* **Professional data** including where you are a worker of ours or applying for a role with us, your professional history such as your previous positions and professional experience. +* **Sensitive information** is a sub-set of personal information that is given a higher level of protection. Sensitive information means information relating to your racial or ethnic origin, political opinions, religion, trade union or other professional associations or memberships, philosophical beliefs, sexual orientation or practices, criminal records, health information or biometric information. We do not actively request sensitive information about you. If at any time we need to collect sensitive information about you, unless otherwise permitted by law, we will first obtain your consent and we will only use it as required or authorised by law. Where you are an External User -- **Identity Data** including your first and last name. -- **Contact Data** including your telephone number and email. -- **Financial Data** including bank account and payment card details. -- **Transaction Data** including details about payments to you from us and from you to us and other details of products and services you have purchased from us or we have purchased from you. -- **Technical and Usage Data** when you access any of our websites or platforms, details about your internet protocol (IP) address, login data, browser session and geo-location data, statistics on page views and sessions, device and network information, acquisition sources, search queries and/or browsing behaviour, access and use of our website (including through the use of Internet cookies), and communications with our website. -- **Profile Data** including your username and password for the Kinde platform, purchases or orders you have made with us and support requests you have made. +* **Identity Data** including your first and last name. +* **Contact Data** including your telephone number and email. +* **Financial Data** including bank account and payment card details. +* **Transaction Data** including details about payments to you from us and from you to us and other details of products and services you have purchased from us or we have purchased from you. +* **Technical and Usage Data** when you access any of our websites or platforms, details about your internet protocol (IP) address, login data, browser session and geo-location data, statistics on page views and sessions, device and network information, acquisition sources, search queries and/or browsing behaviour, access and use of our website (including through the use of Internet cookies), and communications with our website. +* **Profile Data** including your username and password for the Kinde platform, purchases or orders you have made with us and support requests you have made. ## How we collect personal information We collect personal information in a variety of ways, including: -- when you interact directly with us, including face-to-face, over the phone, over email, or online -- when you complete a form, such as registering for any events or newsletters, or responding to surveys -- when you apply for a job with us -- from third parties, such as details of your use of any website we operate (from our analytics providers and marketing providers) or -- from publicly available sources, such as social media or the Australian Securities and Investment Commission (ASIC). +* when you interact directly with us, including face-to-face, over the phone, over email, or online +* when you complete a form, such as registering for any events or newsletters, or responding to surveys +* when you apply for a job with us +* from third parties, such as details of your use of any website we operate (from our analytics providers and marketing providers) or +* from publicly available sources, such as social media or the Australian Securities and Investment Commission (ASIC). ## Why we collect, hold, use and disclose personal information We have set out below, in a table format, a description of the purposes for which we plan to collect, hold, use and disclose your personal information. -| Purpose of use / disclosure | Type of Personal Information | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------ | -| To enable you to access and use our software, including to provide you with a login. | Identity Data, Contact Data | -| As a Customer, to assess whether to take you on as a new client, including to perform anti-money laundering, anti-terrorism, sanction screening, fraud and other background checks on you. | Identity Data, Contact Data | -| To do business with you, including to deliver our products and services to you, to respond to your requests and to register your attendance at our events. | Identity Data, Contact Data, Financial Data | -| As a Customer, to contact and communicate with you about our business, including in response to any support requests you lodge with us or other enquiries you make with us. | Identity Data, Contact Data, Profile Data | -| To contact and communicate with you about any enquiries you make with us via any website we operate. | Identity Data, Contact Data | -| For internal record keeping, administrative, invoicing and billing purposes. | Identity Data, Contact Data, Financial Data, Transaction Data | -| As a Customer, for analytics, market research and business development, including to operate and improve our business, associated applications and associated social media platforms. | Profile Data, Technical and Usage Data | -| As a Customer, for advertising and marketing, including to send you promotional information about our events and experiences and information that we consider may be of interest to you. | Identity Data, Contact Data, Technical and Usage Data, Profile Data, Marketing and Communications Data | -| As a Customer, to run promotions, competitions and/or offer additional benefits to you. | Identity Data, Contact Data, Profile Data, Interaction Data, Marketing and Communications Data | -| If you have applied for employment with us, to consider your employment application. | Identity Data, Contact Data, Professional Data | -| To comply with our legal obligations or if otherwise required or authorised by law.  | Any relevant Personal Information | +| Purpose of use / disclosure | Type of Personal Information | +| :---- | :---- | +| To enable you to access and use our software, including to provide you with a login. | Identity Data, Contact Data | +| To provide and manage billing services, including processing payments, managing subscriptions, and facilitating transactions through our platform. | Identity Data, Contact Data, Financial Data, Transaction Data, Billing Data | +| To assess whether to take you on as a new client, including to perform anti-money laundering, anti-terrorism, sanction screening, fraud and other background checks on you. | Identity Data, Contact Data | +| To do business with you, including to deliver our products and services to you, to respond to your requests and to register your attendance at our events. | Identity Data, Contact Data, Financial Data | +| As a Customer, to contact and communicate with you about our business, including in response to any support requests you lodge with us or other enquiries you make with us. | Identity Data, Contact Data, Profile Data | +| To contact and communicate with you about any enquiries you make with us via any website we operate. | Identity Data, Contact Data | +| For internal record keeping, administrative, invoicing and billing purposes. | Identity Data, Contact Data, Financial Data, Transaction Data | +| As a Customer, for analytics, market research and business development, including to operate and improve our business, associated applications and associated social media platforms. | Profile Data, Technical and Usage Data | +| As a Customer, for advertising and marketing, including to send you promotional information about our events and experiences and information that we consider may be of interest to you. | Identity Data, Contact Data, Technical and Usage Data, Profile Data, Marketing and Communications Data | +| As a Customer, to run promotions, competitions and/or offer additional benefits to you. | Identity Data, Contact Data, Profile Data, Interaction Data, Marketing and Communications Data | +| If you have applied for employment with us, to consider your employment application. | Identity Data, Contact Data, Professional Data | +| To comply with our legal obligations or if otherwise required or authorised by law. | Any relevant Personal Information | ## Our disclosures of personal information to third parties **Personal information:** - Where you are a Customer, we may disclose personal information to: -- our employees, contractors and/or related entities -- IT service providers, data storage, web-hosting and server providers -- marketing or advertising providers -- professional advisors, bankers, auditors, our insurers and insurance brokers -- payment systems operators or processors -- our existing or potential agents or business partners -- anyone to whom our business or assets (or any part of them) are, or may (in good faith) be, transferred -- courts, tribunals and regulatory authorities, in the event you fail to pay for goods or services we have provided to you -- courts, tribunals, regulatory authorities and law enforcement officers, as required or authorised by law, in connection with any actual or prospective legal proceedings, or in order to establish, exercise or defend our legal rights -- third parties to collect and process data, such as analytics providers and cookies -- any other third parties as required or permitted by law, such as where we receive a subpoena. +* our employees, contractors and/or related entities +* IT service providers, data storage, web-hosting and server providers +* marketing or advertising providers +* professional advisors, bankers, auditors, our insurers and insurance brokers +* payment systems operators or processors, including Stripe, who we use as our payment processing partner for our Billing feature. When you use our Billing services, your personal information may be shared with Stripe to facilitate payment processing. Stripe adheres to the PCI-DSS standards managed by the PCI Security Standards Council; +* our existing or potential agents or business partners +* anyone to whom our business or assets (or any part of them) are, or may (in good faith) be, transferred +* courts, tribunals and regulatory authorities, in the event you fail to pay for goods or services we have provided to you +* courts, tribunals, regulatory authorities and law enforcement officers, as required or authorised by law, in connection with any actual or prospective legal proceedings, or in order to establish, exercise or defend our legal rights +* third parties to collect and process data, such as analytics providers and cookies +* any other third parties as required or permitted by law, such as where we receive a subpoena. Where you are an External User, we may disclose personal information to: -- our employees, contractors and/or related entities -- IT service providers, data storage, web-hosting and server providers -- professional advisors, bankers, auditors, our insurers and insurance brokers -- payment systems operators or processors -- anyone to whom our business or assets (or any part of them) are, or may (in good faith) be, transferred and -- courts, tribunals, regulatory authorities and law enforcement officers, as required or authorised by law, in connection with any actual or prospective legal proceedings, or in order to establish, exercise or defend our legal rights. +* our employees, contractors and/or related entities +* IT service providers, data storage, web-hosting and server providers +* professional advisors, bankers, auditors, our insurers and insurance brokers +* payment systems operators or processors +* anyone to whom our business or assets (or any part of them) are, or may (in good faith) be, transferred and +* courts, tribunals, regulatory authorities and law enforcement officers, as required or authorised by law, in connection with any actual or prospective legal proceedings, or in order to establish, exercise or defend our legal rights. -**Third-Party Analytics**: We have enabled analytics advertising features and use third-party analytics, such as Plausible. You can access Plausible’s Privacy Policy [here](https://plausible.io/privacy). +**Third-Party Analytics:** We have enabled analytics advertising features and use third-party analytics. We and third-party vendors may use first-party cookies or other first-party identifiers, and third-party cookies or other third-party identifiers together. These cookies and identifiers may collect Technical and Usage Data about you. @@ -114,7 +115,7 @@ While we collect and display your payment methods and, if chosen, your payment c The payment processors we work with are: -**Stripe:** Their Privacy Policy can be viewed at: [https://stripe.com/au/privacy](https://stripe.com/au/privacy) +**Stripe**: Their Privacy Policy can be viewed at: [https://stripe.com/au/privacy](https://stripe.com/au/privacy) ## Overseas disclosure @@ -122,17 +123,17 @@ We may store personal information in Australia and overseas, including in Irelan ## Your rights and controlling your personal information -**Your choice**: Please read this Privacy Policy carefully. If you provide personal information to us, you understand we will collect, hold, use and disclose your personal information in accordance with this Privacy Policy. You do not have to provide personal information to us, however, if you do not, it may affect our ability to do business with you. +**Your choice:** Please read this Privacy Policy carefully. If you provide personal information to us, you understand we will collect, hold, use and disclose your personal information in accordance with this Privacy Policy. You do not have to provide personal information to us, however, if you do not, it may affect our ability to do business with you. -**Information from third parties**: If we receive personal information about you from a third party, we will protect it as set out in this Privacy Policy. If you are a third party providing personal information about somebody else, you represent and warrant that you have such person’s consent to provide the personal information to us. +**Information from third parties:** If we receive personal information about you from a third party, we will protect it as set out in this Privacy Policy. If you are a third party providing personal information about somebody else, you represent and warrant that you have such person’s consent to provide the personal information to us. **Restrict and unsubscribe:** To object to processing for direct marketing/unsubscribe from our email database or opt-out of communications (including marketing communications), please contact us using the details below or opt-out using the opt-out facilities provided in the communication. -**Access**: You may request access to the personal information that we hold about you. An administrative fee may be payable for the provision of such information. Please note, in some situations, we may be legally permitted to withhold access to your personal information. If we cannot provide access to your information, we will advise you as soon as reasonably possible and provide you with the reasons for our refusal and any mechanism available to complain about the refusal. If we can provide access to your information in another form that still meets your needs, then we will take reasonable steps to give you such access. +**Access:** You may request access to the personal information that we hold about you. An administrative fee may be payable for the provision of such information. Please note, in some situations, we may be legally permitted to withhold access to your personal information. If we cannot provide access to your information, we will advise you as soon as reasonably possible and provide you with the reasons for our refusal and any mechanism available to complain about the refusal. If we can provide access to your information in another form that still meets your needs, then we will take reasonable steps to give you such access. **Correction:** If you believe that any information we hold about you is inaccurate, out of date, incomplete, irrelevant or misleading, please contact us using the details below. We will take reasonable steps to promptly correct any information found to be inaccurate, out of date, incomplete, irrelevant or misleading. Please note, in some situations, we may be legally permitted to not correct your personal information. If we cannot correct your information, we will advise you as soon as reasonably possible and provide you with the reasons for our refusal and any mechanism available to complain about the refusal. -**Complaints**: If you wish to make a complaint, please contact us using the details below and provide us with full details of the complaint. We will promptly investigate your complaint and respond to you, in writing, setting out the outcome of our investigation and the steps we will take in response to your complaint. If you are not satisfied with our response, you may contact the [Office of the Australian Information Commissioner](https://www.oaic.gov.au/). +**Complaints:** If you wish to make a complaint, please contact us using the details below and provide us with full details of the complaint. We will promptly investigate your complaint and respond to you, in writing, setting out the outcome of our investigation and the steps we will take in response to your complaint. If you are not satisfied with our response, you may contact the [Office of the Australian Information Commissioner.](https://www.oaic.gov.au/) ## Storage and security @@ -144,7 +145,7 @@ If you are a client of ours, we may keep your personal data for as long as we ha ## Cookies -We may use cookies on our website from time to time. Cookies are text files placed in your computer's browser to store your preferences. Cookies, by themselves, do not tell us your email address or other personally identifiable information. +We may use cookies on our website from time to time. Cookies are text files placed in your computer’s browser to store your preferences. Cookies, by themselves, do not tell us your email address or other personally identifiable information. You can block cookies by activating the setting on your browser that allows you to refuse the setting of all or some cookies. However, if you use your browser settings to block all cookies (including essential cookies) you may not be able to access all or parts of our website. @@ -152,16 +153,17 @@ For more information about the cookies we use, please see our Cookie Policy belo We use the following cookies: -- **Strictly necessary cookies.** These are cookies that are required for the operation of our online Services. They include, for example, cookies that enable you to log into secure areas of our online Services, use a shopping cart or make use of online payment services. -- **Social media cookies.** These cookies are used when you share information using a social media sharing button or “like” button on our websites or you link your account or engage with our content on or through a social media site. The social network will record that you have done this. This information may be linked to targeting/advertising activities. -- **Targeting cookies.** These cookies may be set through our site by our advertising partners. They may be used by those companies to build a profile of your interests and show you relevant adverts on other sites. If you do not allow these cookies, you will experience less targeted advertising. -- **Anonymized analytical cookies.** These cookies ensure that anonymous data about your surfing behavior is collected every time you visit the website. This way we can see how visitors use the website and improve on that basis. We use anonymized analytical cookies for: - - tracking the number of visitors to our web pages; - - tracking the amount of time each visitor spends on our web pages; - - keeping track of the order in which a visitor visits the different pages of our website; - - assessing which parts of our site need updating; - - measuring and optimizing the performance of our marketing campaigns; - - redirecting traffic from different channels. +* Strictly necessary cookies. These are cookies that are required for the operation of our online Services. They include, for example, cookies that enable you to log into secure areas of our online Services, use a shopping cart or make use of online payment services. +* Social media cookies. These cookies are used when you share information using a social media sharing button or “like” button on our websites or you link your account or engage with our content on or through a social media site. The social network will record that you have done this. This information may be linked to targeting/advertising activities. +* Targeting cookies. These cookies may be set through our site by our advertising partners. They may be used by those companies to build a profile of your interests and show you relevant adverts on other sites. If you do not allow these cookies, you will experience less targeted advertising. +* Anonymized analytical cookies. These cookies ensure that anonymous data about your surfing behavior is collected every time you visit the website. This way we can see how visitors use the website and improve on that basis. We use anonymized analytical cookies for: + * tracking the number of visitors to our web pages; + * tracking the amount of time each visitor spends on our web pages; + * keeping track of the order in which a visitor visits the different pages of our website; + * assessing which parts of our site need updating; + * measuring and optimizing the performance of our marketing campaigns; + * redirecting traffic from different channels. +* Billing functionality cookies. These cookies are used to support our Billing feature, including remembering your billing preferences and facilitating smooth transaction processes. ## Use of web beacons and other technologies @@ -171,49 +173,49 @@ Some of our websites, applications and electronic communications contain electro Our website may contain links to other party’s websites. We do not have any control over those websites and we are not responsible for the protection and privacy of any personal information which you provide whilst visiting those websites. Those websites are not governed by this Privacy Policy. -## Additional rights and information for individuals located in the EU or UK +## Additional rights and information for individual located in the EU or UK -Under the GDPR individuals located in the EU and the UK have extra rights which apply to their personal information. Personal information under the GDPR is often referred to as personal data and is defined as information relating to an identified or identifiable natural person (individual). This "Additional rights and information for individual located in the EU or UK" section sets out the additional rights we give to individuals located in the EU and UK, as well as information on how we process the personal information of individuals located in the EU and UK. Please read the Privacy Policy above and this "Additional rights and information for individual located in the EU or UK" section carefully and contact us at the details at the end of the Privacy Policy if you have any questions. +Under the GDPR individuals located in the EU and the UK have extra rights which apply to their personal information. Personal information under the GDPR is often referred to as personal data and is defined as information relating to an identified or identifiable natural person (individual). This ’Additional rights and information for individual located in the EU or UK’ section sets out the additional rights we give to individuals located in the EU and UK, as well as information on how we process the personal information of individuals located in the EU and UK. Please read the Privacy Policy above and this ‘Additional rights and information for individual located in the EU or UK’ section carefully and contact us at the details at the end of the Privacy Policy if you have any questions. ## What personal information is relevant? -This "Additional rights and information for individual located in the EU or UK" section applies to the personal information set out in the Privacy Policy above. This includes any Sensitive Information also listed in the Privacy Policy above which is known as ‘special categories of data’ under the GDPR. +This ‘Additional rights and information for individual located in the EU or UK’ section applies to the personal information set out in the Privacy Policy above. This includes any Sensitive Information also listed in the Privacy Policy above which is known as ‘special categories of data’ under the GDPR. ## Purposes and legal bases for processing We collect and process personal information about you only where we have legal bases for doing so under applicable laws. We have set out below, in a table format, a description of all the ways we plan to use your personal information, and which of the legal bases we rely on to do so. We have also identified what our legitimate interests are where appropriate. Note that we may process your personal information for more than one lawful ground depending on the specific purpose for which we are using your data. Please reach out to us if you need further details about the specific legal ground, we are relying on to process your personal information where more than one ground has been set out in the table below. -| Purpose of use / disclosure | Type of Data | Legal Basis for processing | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| To enable you to access and use our software, including to provide you with a login. | Identity Data, Contact Data  | Performance of a contract with you | -| To do business with you, including to deliver our products and services to you, to respond to your requests and to register your attendance at our events. | Identity Data, Contact Data | Performance of a contract with you | -| To contact and communicate with you about our business including in response to any support requests you lodge with us or other enquiries you make with us. | Identity Data, Contact Data, Profile Data | Performance of a contract with you | -| To contact and communicate with you about any enquiries you make with us via our website. | Identity Data, Contact Data | Legitimate interests: to ensure we provide the best client experience we can offer by answering all of your questions. | -| For internal record keeping, administrative, invoicing and billing purposes. | Identity Data, Contact Data, Financial Data , Transaction Data | Performance of a contract with youTo comply with a legal obligationLegitimate interests: to recover debts due to us and ensure we can notify you about changes to our [terms of business] and any other administrative points. | -| As a Customer, for analytics including profiling on our website, market research and business development, including to operate and improve our business, associated applications and associated social media platforms. | Profile Data, Technical and Usage Data | Legitimate interests: to keep our website updated and relevant, to develop our business, improve our business and to inform our marketing strategy | -| As a Customer, for advertising and marketing, including to send you promotional information about our events and experiences and information that we consider may be of interest to you. | Identity Data, Contact Data, Technical and Usage Data, Profile Data, Marketing and, Communications Data  | Legitimate interests: to develop and grow our business | -| As a Customer, to run promotions, competitions and/or offer additional benefits to you. | Identity Data, Contact Data, Profile Data, Interaction Data, Marketing and Communications Data | Legitimate interests: to facilitate engagement with our business and grow our business | -| If you have applied for employment with us, to consider your employment application. | Identity Data, Contact Data, Professional Data | Legitimate interests: to consider your employment application | -| To comply with our legal obligations or if otherwise required or authorised by law.  | | To comply with a legal obligation | - -If you have consented to our use of data about you for a specific purpose, you have the right to change your mind at any time, but this will not affect any processing that has already taken place. Where we are using your data because we or a third party have a legitimate interest to do so, you have the right to object to that use though, in some cases, this may mean no longer doing business with us. Further information about your rights is available below. +| Purpose of use / disclosure | Type of Data | Legal Basis for processing | +| :---- | :---- | :---- | +| To enable you to access and use our software, including to provide you with a login. | Identity Data, Contact Data | Performance of a contract with you | +| To provide and manage billing services | Identity Data, Contact Data, Financial Data, Billing Data, Transaction Data | Performance of a contract with you | +| To do business with you, including to deliver our products and services to you, to respond to your requests and to register your attendance at our events. | Identity Data, Contact Data | Performance of a contract with you | +| To contact and communicate with you about our business including in response to any support requests you lodge with us or other enquiries you make with us. | Identity Data, Contact Data, Profile Data | Performance of a contract with you | +| To contact and communicate with you about any enquiries you make with us via our website. | Identity Data, Contact Data | Legitimate interests: to ensure we provide the best client experience we can offer by answering all of your questions. | +| For internal record keeping, administrative, invoicing and billing purposes. | Identity Data, Contact Data, Financial Data , Transaction Data | Performance of a contract with you, To comply with a legal obligation, Legitimate interests: to recover debts due to us and ensure we can notify you about changes to our terms of business and any other administrative points. | +| As a Customer, for analytics including profiling on our website, market research and business development, including to operate and improve our business, associated applications and associated social media platforms. | Profile Data, Technical and Usage Data | Legitimate interests: to keep our website updated and relevant, to develop our business, improve our business and to inform our marketing strategy | +| As a Customer, for advertising and marketing, including to send you promotional information about our events and experiences and information that we consider may be of interest to you. | Identity Data, Contact Data, Technical and Usage Data, Profile Data, Marketing and, Communications Data | Legitimate interests: to develop and grow our business | +| As a Customer, to run promotions, competitions and/or offer additional benefits to you. | Identity Data, Contact Data, Profile Data, Interaction Data, Marketing and Communications Data | Legitimate interests: to facilitate engagement with our business and grow our business | +| If you have applied for employment with us, to consider your employment application. | Identity Data, Contact Data, Professional Data | Legitimate interests: to consider your employment application | +| To comply with our legal obligations or if otherwise required or authorised by law. | | To comply with a legal obligation | + +If you have consented to our use of data about you for a specific purpose, you have the right to change your mind at any time, but this will not affect any processing that has already taken place. Where we are using your data because we or a third party have a legitimate interest to do so, you have the right to object to that use though, in some cases, this may mean no longer doing business with us. Further information about your rights is available below. ## Data Transfers -The countries to which we send data for the purposes listed above may be less comprehensive that is what is offered in the country in which you initially provided the information. Where we transfer your personal information outside of the country where you are based, we will perform those transfers using appropriate safeguards in accordance with the requirements of applicable data protection laws and we will protect the transferred personal information in accordance with this Privacy Policy and this "Additional rights and information for individual located in the EU or UK" section. This includes: +The countries to which we send data for the purposes listed above may be less comprehensive that is what is offered in the country in which you initially provided the information. Where we transfer your personal information outside of the country where you are based, we will perform those transfers using appropriate safeguards in accordance with the requirements of applicable data protection laws and we will protect the transferred personal information in accordance with this Privacy Policy and this ‘Additional rights and information for individual located in the EU or UK’ section. This includes: -- only transferring your personal information to countries that have been deemed by applicable data protection laws to provide an adequate level of protection for personal information -- standard contractual clauses in our agreements with third parties that are overseas. +* only transferring your personal information to countries that have been deemed by applicable data protection laws to provide an adequate level of protection for personal information +* standard contractual clauses in our agreements with third parties that are overseas. ## Data retention We will only retain your personal information for as long as reasonably necessary to fulfil the purposes we collected it for, including for the purposes of satisfying any legal, regulatory, tax, accounting or reporting requirements. We may retain your personal information for a longer period in the event of a complaint or if we reasonably believe there is a prospect of litigation in respect to our relationship with you. To determine the appropriate retention period for personal information, we consider the amount, nature and sensitivity of the personal information, the potential risk of harm from unauthorised use or disclosure of your personal information, the purposes for which we process your personal information and whether we can achieve those purposes through other means, and the applicable legal, regulatory, tax, accounting or other requirements. +Extra rights for EU and UK individuals -## Extra rights for EU and UK individuals - -You may request details of the personal information that we hold about you and how we are process it (commonly known as a “data subject request”). You may also have a right in accordance with applicable data protection law to have your personal information rectified or deleted, to restrict our processing of that information, to object to decisions being made based on automated processing where the decision will produce a legal effect or a similarly significant effect on you, to stop unauthorised transfers of your personal information to a third party and, in some circumstances, to have personal information relating to you transferred to you or another organisation. +You may request details of the personal information that we hold about you and how we process it (commonly known as a “data subject request”). You may also have a right in accordance with applicable data protection law to have your personal information rectified or deleted, to restrict our processing of that information, to object to decisions being made based on automated processing where the decision will produce a legal effect or a similarly significant effect on you, to stop unauthorised transfers of your personal information to a third party and, in some circumstances, to have personal information relating to you transferred to you or another organisation. If you are not happy with how we are processing your personal information, you have the right to make a complaint at any time to the relevant Data Protection Authority based on where you live. We would, however, appreciate the chance to deal with your concerns before you approach the Data Protection Authority, so please contact us in the first instance using the details set out below. @@ -221,33 +223,33 @@ If you are not happy with how we are processing your personal information, you h Pursuant to Article 27 of the General Data Protection Regulation (GDPR), Kinde Australia Pty Ltd has appointed European Data Protection Office (EDPO) as its GDPR Representative in the EU. You can contact EDPO regarding matters pertaining to the GDPR: -- by using EDPO’s online request form: https://edpo.com/gdpr-data-request/ -- by writing to EDPO at Ground Floor, 71 Lower Baggot Street, Dublin, D02 P593, Ireland +* by using EDPO’s online request form: [https://edpo.com/gdpr-data-request/](https://edpo.com/gdpr-data-request/) +* by writing to EDPO at Ground Floor, 71 Lower Baggot Street, Dublin, D02 P593, Ireland -For any other questions or feedback, please contact us at privacy@kinde.com. +For any other questions or feedback, please contact us at [privacy@kinde.com](mailto:privacy@kinde.com). ## Additional rights and information for individuals located in California Under the California Consumer Privacy Act of 2018 (CCPA) and the California Privacy Rights Act of 2020 (CPRA), individuals located in California have extra rights which apply to their personal information. The table below sets out the additional rights we give to individuals located in California. -| Rights | Legal basis | -| ----------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Disclosure of Personal Information We Collect About You | You have the right to know:
  • The categories of Personal Information we have collected about you;
  • The categories of sources from which the Personal Information is collected;
  • Our business or commercial purpose for collecting or selling Personal Information;
  • The categories of third parties with whom we share Personal Information, if any;
  • and The specific pieces of Personal Information we have collected about you.

Please note that we are not required to:
  • Retain any personal information about you that was collected for a single one-time transaction if, in the ordinary course of business, that information about you is not retained;
  • Reidentify or otherwise link any data that, in the ordinary course of business, is not maintained in a manner that would be considered personal information;
  • or Provide the personal information to you more than twice in a 12-month period.
| -| Personal Information Sold or Used for a Business Purpose | In connection with any Personal Information we may sell or disclose to a third party for a business purpose, you have the right to know:
  • The categories of Personal Information about you that we sold and the categories of third parties to whom the Personal Information was sold; and
  • The categories of Personal Information that we disclosed about you for a business purpose.

You have the right under the CCPA and the CPRA, as well as certain other privacy and data protection laws, as applicable, to opt-out of the sale or disclosure of your Personal Information.

If you exercise your right to opt-out of the sale or disclosure of your Personal Information, we will refrain from selling your Personal Information, unless you subsequently provide express authorization for the sale of your Personal Information.

To opt-out of the sale or disclosure of your personal information, please contact us at privacy@kinde.com.

| -| Right to Deletion | Subject to certain exceptions set out below, on receipt of a verifiable request from you, we will:
  • Delete your Personal Information from our records; and
  • Direct any service providers to delete your Personal Information from their records.

Please note that we may not delete your Personal Information if it is necessary to:

  • Complete the transaction for which the personal information was collected, fulfill the terms of a written warranty or product recall conducted in accordance with federal law, provide a good or service requested by you, or reasonably anticipated within the context of our ongoing business relationship with you, or otherwise perform a contract between you and us;
  • Detect security incidents, protect against malicious, deceptive, fraudulent, or illegal activity; or prosecute those responsible for that activity;
  • Debug to identify and repair errors that impair existing intended functionality;
  • Exercise free speech, ensure the right of another consumer to exercise his or her right of free speech, or exercise another right provided for by law;
  • Comply with the California Electronic Communications Privacy Act;
  • Engage in public or peer-reviewed scientific, historical, or statistical research in the public interest that adheres to all other applicable ethics and privacy laws, when our deletion of the information is likely to render impossible or seriously impair the achievement of such research, provided we have obtained your informed consent;
  • Enable solely internal uses that are reasonably aligned with your expectations based on your relationship with us;
  • Comply with an existing legal obligation; or
  • Otherwise use your personal information, internally, in a lawful manner that is compatible with the context in which you provided the information.
| -| Right to Correction | You have the right to request the correction of inaccurate personal information maintained by us. | -| Right to Know About Automated Decision-Making | You have the right to know about and opt-out of automated decision-making, including profiling. | -| Right to Access Information about Automated Decision-Making | You have the right to request information about the logic involved in automated decision-making processes and the potential consequences of those processes. | -| Expanded Right to Access | You have the right to access personal information collected beyond the previous 12-month period, provided that doing so would not involve a disproportionate effort. | -| Right to Limit Use of Sensitive Personal Information | You have the right to limit the use and disclosure of sensitive personal information to that which is necessary to perform the services or provide the goods reasonably expected by an average consumer. | -| Protection Against Discrimination | You have the right to not be discriminated against by us because you exercised any of your rights under the CCPA or CPRA. This means we cannot, among other things:
  • Deny goods or services to you;
  • Charge different prices or rates for goods or services, including through the use of discounts or other benefits or imposing penalties;
  • Provide a different level or quality of goods or services to you; or
  • Suggest that you will receive a different price or rate for goods or services or a different level or quality of goods or services.

Please note that we may charge a different price or rate or provide a different level or quality of goods or services to you, if that difference is reasonably related to the value provided to our business by your Personal Information.

| +| Rights | Legal basis | +| :---- | :---- | +| Disclosure of Personal Information We Collect About You | You have the right to know: The categories of Personal Information we have collected about you; The categories of sources from which the Personal Information is collected; Our business or commercial purpose for collecting or selling Personal Information; The categories of third parties with whom we share Personal Information, if any; and The specific pieces of Personal Information we have collected about you. Please note that we are not required to: Retain any personal information about you that was collected for a single one-time transaction if, in the ordinary course of business, that information about you is not retained; Reidentify or otherwise link any data that, in the ordinary course of business, is not maintained in a manner that would be considered personal information; or Provide the personal information to you more than twice in a 12-month period. | +| Personal Information Sold or Used for a Business Purpose | In connection with any Personal Information we may sell or disclose to a third party for a business purpose, you have the right to know: The categories of Personal Information about you that we sold and the categories of third parties to whom the Personal Information was sold; and The categories of Personal Information that we disclosed about you for a business purpose. You have the right under the CCPA and the CPRA, as well as certain other privacy and data protection laws, as applicable, to opt-out of the sale or disclosure of your Personal Information. If you exercise your right to opt-out of the sale or disclosure of your Personal Information, we will refrain from selling your Personal Information, unless you subsequently provide express authorization for the sale of your Personal Information. To opt-out of the sale or disclosure of your personal information, please contact us at privacy@kinde.com. | +| Right to Deletion | Subject to certain exceptions set out below, on receipt of a verifiable request from you, we will: Delete your Personal Information from our records; and Direct any service providers to delete your Personal Information from their records. Please note that we may not delete your Personal Information if it is necessary to: Complete the transaction for which the personal information was collected, fulfill the terms of a written warranty or product recall conducted in accordance with federal law, provide a good or service requested by you, or reasonably anticipated within the context of our ongoing business relationship with you, or otherwise perform a contract between you and us; Detect security incidents, protect against malicious, deceptive, fraudulent, or illegal activity; or prosecute those responsible for that activity; Debug to identify and repair errors that impair existing intended functionality; Exercise free speech, ensure the right of another consumer to exercise his or her right of free speech, or exercise another right provided for by law; Comply with the California Electronic Communications Privacy Act; Engage in public or peer-reviewed scientific, historical, or statistical research in the public interest that adheres to all other applicable ethics and privacy laws, when our deletion of the information is likely to render impossible or seriously impair the achievement of such research, provided we have obtained your informed consent; Enable solely internal uses that are reasonably aligned with your expectations based on your relationship with us; Comply with an existing legal obligation; or Otherwise use your personal information, internally, in a lawful manner that is compatible with the context in which you provided the information. | +| Right to Correction | You have the right to request the correction of inaccurate personal information maintained by us. | +| Right to Know About Automated Decision-Making | You have the right to know about and opt-out of automated decision-making, including profiling. | +| Right to Access Information about Automated Decision-Making | You have the right to request information about the logic involved in automated decision-making processes and the potential consequences of those processes. | +| Expanded Right to Access | You have the right to access personal information collected beyond the previous 12-month period, provided that doing so would not involve a disproportionate effort. | +| Right to Limit Use of Sensitive Personal Information | You have the right to limit the use and disclosure of sensitive personal information to that which is necessary to perform the services or provide the goods reasonably expected by an average consumer. | +| Protection Against Discrimination | You have the right to not be discriminated against by us because you exercised any of your rights under the CCPA or CPRA. This means we cannot, among other things: Deny goods or services to you; Charge different prices or rates for goods or services, including through the use of discounts or other benefits or imposing penalties; Provide a different level or quality of goods or services to you; or Suggest that you will receive a different price or rate for goods or services or a different level or quality of goods or services. Please note that we may charge a different price or rate or provide a different level or quality of goods or services to you, if that difference is reasonably related to the value provided to our business by your Personal Information. | ## Amendments We may, at any time and at our discretion, vary this Privacy Policy by publishing the amended Privacy Policy on our website. We recommend you check our website regularly to ensure you are aware of our current Privacy Policy. -For any questions or notices, please contact us at privacy@kinde.com. +For any questions or notices, please contact us at [privacy@kinde.com](mailto:privacy@kinde.com). -Last updated May 7, 2025. +Last updated June 5, 2025. Kinde Australia Pty Ltd ([ABN 11 655 096 263](https://abr.business.gov.au/ABN/View?abn=11655096263)) From 8a616811d0560c93d6dbdf28e6cf0d47c398539f Mon Sep 17 00:00:00 2001 From: andre selton Date: Thu, 5 Jun 2025 13:01:24 +1000 Subject: [PATCH 071/755] Terms of Service June 2025 --- .../agreements/terms-of-service.mdx | 100 +++++++++++------- 1 file changed, 59 insertions(+), 41 deletions(-) diff --git a/src/content/docs/trust-center/agreements/terms-of-service.mdx b/src/content/docs/trust-center/agreements/terms-of-service.mdx index 0dbc1a676..35d94febe 100644 --- a/src/content/docs/trust-center/agreements/terms-of-service.mdx +++ b/src/content/docs/trust-center/agreements/terms-of-service.mdx @@ -7,12 +7,29 @@ sidebar: Welcome to Kinde - a beautifully simple dev-acceleration infrastructure software platform for SaaS teams. We’re excited to help you build, launch, and get to market faster and with more confidence. -1. **Our Disclosures** - Our complete terms of service are contained below, but some important points for you to know before you become a customer are set out below: 1. We may amend these Terms, the features of the Platform or your Subscription at any time, by providing written notice to you; 2. Unless your Subscription is suspended or terminated in accordance with these Terms, your Subscription will roll over on an ongoing basis; 3. We will handle your personal information in accordance with our privacy policy, available on our website; 4. To the maximum extent permitted by law, the Fees are non-refundable; 5. You are responsible and liable for the actions of your Authorized Users; 6. Our liability under these Terms is limited to us resupplying the Platform to you or, in our sole discretion, to us repaying you the amount of the Fees paid by you to us during the term of your Subscription, and we will not be liable for Consequential Loss, any loss that is a result of a Third Party Service, or any loss or corruption of data; 7. We may terminate your Subscription at any time by giving 15 days’ written notice to you; and 8. We may receive a benefit (which may include a referral fee or a commission) should you visit certain third-party websites via a link on the Platform or for featuring certain products or services on the Platform. 9. Nothing in these terms limit your rights under the Australian Consumer Law. +1. **Our Disclosures** Our complete terms of service are contained below, but some important points for you to know before you become a customer are set out below: + + 1. We may amend these Terms, the features of the Platform or your Subscription at any time, by providing written notice to you; + + 2. Unless your Subscription is suspended or terminated in accordance with these Terms, your Subscription will roll over on an ongoing basis; + + 3. We will handle your personal information in accordance with our privacy policy, available on our website; + + 4. To the maximum extent permitted by law, the Fees are non-refundable; + + 5. You are responsible and liable for the actions of your Authorized Users; + + 6. Our liability under these Terms is limited to us resupplying the Platform to you or, in our sole discretion, to us repaying you the amount of the Fees paid by you to us during the term of your Subscription, and we will not be liable for Consequential Loss, any loss that is a result of a Third Party Service, or any loss or corruption of data; + + 7. We may terminate your Subscription at any time by giving 15 days’ written notice to you; and + + 8. We may receive a benefit (which may include a referral fee or a commission) should you visit certain third-party websites via a link on the Platform or for featuring certain products or services on the Platform. + + 9. Nothing in these terms limit your rights under the Australian Consumer Law. 2. **Introduction** - 1. These terms of service (**Terms**) are entered into between Kinde Australia Pty Ltd ACN 655 096 263 (**we**, **us** or **our**) and you, together the Parties and each a Party. - 2. We provide a cloud-based, software as a service platform where we help you build authentication, authorisation, user management, feature management, experimentation, billing and other back-office features for running and managing your business (**Platform**). As part of your use of the Platform you may use the Platform to facilitate transactions between you and your customer, and other Platform functions. - 3. In these Terms, **you** means the person or entity registered with us as an Account holder. + 1. These terms of service (Terms) are entered into between Kinde Australia Pty Ltd ACN 655 096 263 (we, us or our) and you, together the Parties and each a Party. + 2. We provide a cloud-based, software as a service platform where we help you build authentication, authorisation, user management, feature management, experimentation, billing and other back-office features for running and managing your business (Platform). Our Platform supports both B2B and B2C use cases, allowing you to manage subscriptions and assign plans at both the organisation and individual user level. As part of your use of the Platform you may use the Platform, you may facilitate transactions between you and your customers, set up subscription plans, process payments, control feature access for your end users, and utilise other Platform functions to streamline your business operations. + 3. In these Terms, you means the person or entity registered with us as an Account holder. 4. If you are using the Platform on behalf of your employer or a business entity, you, in your individual capacity, represent and warrant that you are authorized to act on behalf of your employer or the business entity and to bind the entity and the entity’s personnel to these Terms. 3. **Acceptance and Platform Licence** 1. You accept these Terms by registering on the Platform or using the Platform. @@ -30,8 +47,8 @@ Welcome to Kinde - a beautifully simple dev-acceleration infrastructure software 4. **Kinde Services** 1. In consideration for your payment of the Fees, we agree to provide you and your Authorized Users with access to the Platform, the support services as detailed in this section, and any other services we agree to provide as set out in your Account. 2. We agree to use our best endeavours to make the Platform available at all times. However, from time to time we may perform reasonable scheduled and emergency maintenance, and the Platform may be unavailable during the times we are performing such maintenance. - 3. Should you be unable to access the Platform, or should you have any other questions or issuing impacting on your use and enjoyment of the Platform, you and your Authorized Users must place a request via our support channels which can be found on our website's support page. We will endeavour to respond to any support requests in a reasonable period. We may require access to your Account to provide support services. - 4. You acknowledge and agree that the Platform may be reliant on, or interface with third party systems that are not provided by us (for example, cloud storage providers, email clients, tracking and internet providers) (**Third Party Services**). To the maximum extent permitted by law, we shall have no Liability for any Third Party Services, or any unavailability of the Platform due to a failure of the Third Party Services. + 3. Should you be unable to access the Platform, or should you have any other questions or issuing impacting on your use and enjoyment of the Platform, you and your Authorized Users must place a request via our support channels which can be found on our website’s support page. We will endeavour to respond to any support requests in a reasonable period. We may require access to your Account to provide support services. + 4. You acknowledge and agree that the Platform may be reliant on, or interface with third party systems that are not provided by us (for example, cloud storage providers, email clients, tracking and internet providers) (Third Party Services). To the maximum extent permitted by law, we shall have no Liability for any Third Party Services, or any unavailability of the Platform due to a failure of the Third Party Services. 5. You acknowledge and agree that data loss is an unavoidable risk when using any software. To the extent you input any data into the Platform, you agree to maintain a backup copy of any data you input into the Platform. 6. To the maximum extent permitted by law, we shall have no Liability to you for any loss or corruption of data, or any scheduled or emergency maintenance that causes the Platform to be unavailable. 5. **Accounts** @@ -53,16 +70,18 @@ Welcome to Kinde - a beautifully simple dev-acceleration infrastructure software 4. Each Authorized User must agree to our End User Licence Agreement (as available on our website) in order to access the Platform. 8. **Subscriptions** 1. Your Subscription will last for the period specified in your Account. We will charge your chosen payment method for the Subscription you have chosen and its corresponding Subscription fee (**Subscription Fees**) and usage fee (**Usage Fee**) on the day set out in your Account (**Payment Date**), or as communicated in writing to you. - 2. The fee structure for our Platform consists of three distinct components: a Subscription Fee, a Usage Fee and a Transaction Fee. The Subscription Fee is a fixed charge applicable to all users for access to our Platform. This Subscription Fee is charged separately and is independent of the Usage Fee. The Usage Fee is a variable charge that is based on the actual utilisation of specific features or services on our platform. The calculation of the Usage Fee depends on the nature and extent of your activity, such as the number of transactions performed, the volume of data processed, the number of users added, or the duration and frequency of use of certain services. The Transaction Fee is a charge to users of the Platform billing product that facilitates end customer transactions. We may bill the Transaction Fee either: (i) on a monthly basis; or (ii) at the time the end customer transaction is made, depending on our billing provider. - 3. Unless your Subscription is suspended or terminated in accordance with these Terms, your Subscription will roll over on an ongoing monthly basis, and you will be charged the same Subscription Fees on an ongoing monthly basis from the Payment Date. Without limiting your rights under the Australian Consumer Law, you can cancel your Subscription at any time in accordance with the “Cancellation of Subscriptions” clause of these Terms but the cancellation will only have effect from expiry of the monthly period for which you have paid the Subscription Fees and Usage Fees. - 4. The payment methods we offer for the Subscription Fees and Usage Fees are set out on the Platform. We may offer payment through a third-party provider. You acknowledge and agree that we have no control over the actions of the third-party provider, and your use of the third-party payment method may be subject to additional terms and conditions. - 5. You must not pay, or attempt to pay, the Subscription Fees and Usage Fees by fraudulent or unlawful means. If you make a payment by debit card or credit card, you warrant that you are authorized to use the debit card or credit card to make the payment. - 6. You agree that we may set-off or deduct from any monies payable to you under these Terms, any amounts which are payable by you to us (whether under these Terms or otherwise). - 7. Changes to your Subscription: If you wish to suspend or change your Subscription (for example, by upgrading to a different Subscription tier), you must provide notice to us through support channels or via email that you wish to suspend or vary your Subscription at least 7 days before the next Payment Date. If you vary your Subscription and the Subscription Fees increase, the increased Subscription Fees will apply on the next Payment Date, and you will have access to the additional Subscription features on the next Payment Date. If you vary your Subscription and the Subscription Fees decrease, the decreased Fees will apply on the next Payment Date, and you will lose access to the additional Subscription features on the next Payment Date. - 8. Our pricing model does not incorporate any charges based on the number of team members or users associated with your Subscription and fees associated with usage are charged separately from the Subscription Fee as a Usage Fee, subject to clause 8(c). - 9. To the extent permitted by law, the Subscription Fees and Usage Fees are non-refundable and non-cancellable once paid to cover our estimated losses resulting from the cost of resources spent in providing your our Platform and support services. - 10. We may need to change what is available as part of your Subscription (for example, any plan change or feature removal) from time to time. If we change what is available as part of your Subscription, we will provide you with 30 days’ notice of the change. After 30 days, we will apply the changes to your Subscription. If the changes substantially and adversely affect your enjoyment of the Subscription, you may cancel your Subscription in accordance with the ‘Cancelling Subscriptions’ clause. If the changes are to your benefit, we will be deploying those new features and adjustments continuously at our discretion. - 11. We may need to change the Subscription Fees from time to time. If we change the Subscription Fees, we will provide you with 30 days’ notice of the change. After 30 days, we may apply the updated Subscription Fee to your Subscription. If the updated Subscription Fee is not acceptable to you, you may cancel your Subscription in accordance with the ‘Cancelling Subscriptions’ clause. + 2. The fee structure for our Platform is as set out on our website. The fees are charged based on your access to and use of the Platform. For transactions processed through our billing product, fees are deducted before funds are sent to your account. We may bill certain fees monthly or at the time the end customer transaction is made, depending on our billing provider. + 3. To use our billing feature, you must have an account with one of our designated payment processors. You are responsible for setting up and managing these accounts independently, and for complying with the payment processor’s policies and fees. + 4. Unless your Subscription is suspended or terminated in accordance with these Terms, your Subscription will roll over on an ongoing monthly basis, and you will be charged the same Subscription Fees on an ongoing monthly basis from the Payment Date. Without limiting your rights under the Australian Consumer Law, you can cancel your Subscription at any time in accordance with the “Cancellation of Subscriptions” clause of these Terms but the cancellation will only have effect from expiry of the monthly period for which you have paid the Subscription Fees and Usage Fees. + 5. We support transactions in multiple currencies. For a full list of supported currencies, please refer to our documentation. + 6. The payment methods we offer for the Subscription Fees and Usage Fees are set out on the Platform. We may offer payment through a third-party provider. You acknowledge and agree that we have no control over the actions of the third-party provider, and your use of the third-party payment method may be subject to additional terms and conditions. + 7. You must not pay, or attempt to pay, the Subscription Fees and Usage Fees by fraudulent or unlawful means. If you make a payment by debit card or credit card, you warrant that you are authorized to use the debit card or credit card to make the payment. + 8. You agree that we may set-off or deduct from any monies payable to you under these Terms, any amounts which are payable by you to us (whether under these Terms or otherwise). + 9. Changes to your Subscription: If you wish to suspend or change your Subscription (for example, by upgrading to a different Subscription tier), you must provide notice to us through support channels or via email that you wish to suspend or vary your Subscription at least 7 days before the next Payment Date. If you vary your Subscription and the Subscription Fees increase, the increased Subscription Fees will apply on the next Payment Date, and you will have access to the additional Subscription features on the next Payment Date. If you vary your Subscription and the Subscription Fees decrease, the decreased Fees will apply on the next Payment Date, and you will lose access to the additional Subscription features on the next Payment Date. + 10. Our pricing model does not incorporate any charges based on the number of team members or users associated with your Subscription and fees associated with usage are charged separately from the Subscription Fee as a Usage Fee, subject to clause 8(c). + 11. To the extent permitted by law, the Subscription Fees and Usage Fees are non-refundable and non-cancellable once paid to cover our estimated losses resulting from the cost of resources spent in providing your our Platform and support services. + 12. We may need to change what is available as part of your Subscription (for example, any plan change or feature removal) from time to time. If we change what is available as part of your Subscription, we will provide you with 30 days’ notice of the change. After 30 days, we will apply the changes to your Subscription. If the changes substantially and adversely affect your enjoyment of the Subscription, you may cancel your Subscription in accordance with the ‘Cancelling Subscriptions’ clause. If the changes are to your benefit, we will be deploying those new features and adjustments continuously at our discretion. + 13. We may need to change the Subscription Fees from time to time. If we change the Subscription Fees, we will provide you with 30 days’ notice of the change. After 30 days, we may apply the updated Subscription Fee to your Subscription. If the updated Subscription Fee is not acceptable to you, you may cancel your Subscription in accordance with the ‘Cancelling Subscriptions’ clause. 9. **Beta Services** 1. For the purposes of this clause: 1. “**Beta Services**” means any services, software or functionality provided by us that are not generally available to customers and which are designated as beta, pilot, limited release, developer preview, non-production, evaluation, or by a similar description. @@ -82,17 +101,17 @@ Welcome to Kinde - a beautifully simple dev-acceleration infrastructure software 11. **Payments** 1. Upon receipt of the fees from your customers, our third party payment processor, will hold and will pay the fees (minus any of the third party payment processor’s transaction fees) to you. You acknowledge and agree that we will charge our Transaction Fee for each end customer transaction, in accordance with clause 8(b). 12. **Local Taxes** -13. We reserve the right to charge any applicable local taxes in addition to the Fee, in compliance with the prevailing local tax laws and regulations of your jurisdiction. -14. The local taxes may include but are not limited to sales tax, value-added tax (**VAT**), goods and services tax (**GST**), or any other similar taxes, levies or duties which are applicable in your location. The amount of these taxes will be calculated based on the Fee and will be added to the total amount payable by you. When you use our Platform to bill and charge your own customers, you should include any applicable taxes in the total amount payable by your customers, in accordance with your local tax laws and regulations. -15. **Our Intellectual Property** - 1. You acknowledge and agree that any Intellectual Property or content (including copyright and trademarks) available on the Platform, the Platform itself, and any algorithms or machine learning models used on the Platform (**Our Intellectual Property**) will at all times vest, or remain vested, in us. + 1. We reserve the right to charge any applicable local taxes in addition to the Fee, in compliance with the prevailing local tax laws and regulations of your jurisdiction. + 2. The local taxes may include but are not limited to sales tax, value-added tax (VAT), goods and services tax (GST), or any other similar taxes, levies or duties which are applicable in your location. The amount of these taxes will be calculated based on the Fee and will be added to the total amount payable by you. When you use our Platform to bill and charge your own customers, you should include any applicable taxes in the total amount payable by your customers, in accordance with your local tax laws and regulations. +13. **Our Intellectual Property** + 1. You acknowledge and agree that any Intellectual Property or content (including copyright and trademarks) available on the Platform, the Platform itself, and any algorithms or machine learning models used on the Platform **(Our Intellectual Property**) will at all times vest, or remain vested, in us. 2. We authorize you to use Our Intellectual Property solely for your limited commercial use. You must not exploit Our Intellectual Property for any other purpose, nor allow, aid or facilitate such use by any third party. Use must be limited to Authorized Users on devices that are controlled or approved by you. 3. You must not, without our prior written consent: 1. copy, in whole or in part, any of Our Intellectual Property; 2. reproduce, retransmit, distribute, disseminate, sell, publish, broadcast or circulate any of Our Intellectual Property to any third party; or 3. breach any intellectual property rights connected with the Platform, including (without limitation) altering or modifying any of Our Intellectual Property, downloading Our Intellectual Property, causing any of Our Intellectual Property to be framed or embedded in another website, or creating derivative works from any of Our Intellectual Property. 4. This clause will survive the termination or expiry of your Subscription. -16. **Your Data** +14. **Your Data** 1. You own all data, information or content you and your Authorized Users upload into the Platform (**Your Data**), as well as any data or information output from the Platform using Your Data as input (**Output Data**). Note that Output Data does not include the Analytics (as described below). 2. You grant us a limited licence to copy, transmit, store, backup and/or otherwise access or use Your Data and the Output Data to: 1. communicate with you (including to send you information we believe may be of interest to you); @@ -115,37 +134,36 @@ Welcome to Kinde - a beautifully simple dev-acceleration infrastructure software 6. We do not endorse or approve, and are not responsible for, any of Your Data. 7. You acknowledge and agree that the Platform and the integrity and accuracy of the Output Data is reliant on the accuracy and completeness of Your Data, and the provision by you of Your Data that is inaccurate or incomplete may affect the use, output and operation of the Platform. 8. This clause will survive the termination or expiry of your Subscription. -17. **PCI DSS** - 1. We acknowledge that we are responsible for complying with the Payment Card Industry Data Security Standards 4.0 (as amended and updated from time to time) (**PCI DSS**) when we store, process, transmit or access your credit card details. We confirm that we are compliant with the PCI DSS. +15. **PCI DSS** + 1. We acknowledge that we are responsible for complying with the Payment Card Industry Data Security Standards (as amended and updated from time to time) (**PCI DSS**) when we store, process, transmit or access your credit card details. We confirm that we are compliant with the PCI DSS. 2. We will notify you of any actual or potential contravention by us of any PCI DSS as soon as possible. - 3. If requested by you in writing, we will provide you with evidence of our compliance in the form of a current attestation of compliance signed by a PCI Qualified Security Assessor (**QSA**). If we are unable to provide a current attestation of compliance, we will allow your appointed QSA to assess our compliance at our cost. - 4. We will create and maintain reasonably detailed and complete documentation which conforms with the PCI DSS, describing the systems, processes, security controls, etc. used by us to receive, transmit, store and secure credit card details that we hold. Such documentation and the persons responsible for implementing such processes, systems, etc. will be made available to you, your QSA and any other relevant third parties retained by you to assess our compliance. -18. **Sanctions** -19. We reserve the right to suspend or terminate your access to our Platform, without notice and at our sole discretion, if we determine that you are subject to or associated with any sanctions, restrictions, or penalties imposed by any governmental authority, including but not limited to, any applicable national, international or other regulatory authorities (**Sanctions**). -20. **Warranties** + 3. We will create and maintain reasonably detailed and complete documentation which conforms with the PCI DSS, describing the systems, processes, security controls, etc. used by us to receive, transmit, store and secure credit card details that we hold. +16. **Sanctions** + 1. We reserve the right to suspend or terminate your access to our Platform, without notice and at our sole discretion, if we determine that you are subject to or associated with any sanctions, restrictions, or penalties imposed by any governmental authority, including but not limited to, any applicable national, international or other regulatory authorities (**Sanctions**). +17. **Warranties** 1. You represent, warrant and agree that: 1. you will not use our Platform, including Our Intellectual Property, in any way that competes with our business; 2. there are no legal restrictions preventing you from entering into these Terms; 3. your use of the Platform is compliant with all laws; 4. all information and documentation that you provide to us in connection with these Terms is true, correct and complete; and 5. you have not relied on any representations or warranties made by us in relation to the Platform (including as to whether the Platform is or will be fit or suitable for your particular purposes), unless expressly stipulated in these Terms. -21. **Australian Consumer Law** +18. **Australian Consumer Law** 1. Certain legislation, including the Australian Consumer Law (**ACL**) in the Competition and Consumer Act 2010 (Cth), and similar consumer protection laws and regulations, may confer you with rights, warranties, guarantees and remedies relating to the provision of the Platform by us to you which cannot be excluded, restricted or modified (**Consumer Law Rights**). 2. If the ACL applies to you as a consumer, nothing in these Terms excludes your Consumer Law Rights as a consumer under the ACL. You agree that our Liability for the Platform provided to an entity defined as a consumer under the ACL is governed solely by the ACL and these Terms. 3. Subject to your Consumer Law Rights, we exclude all express and implied warranties, and all material, work and services (including the Platform) are provided to you without warranties of any kind, either express or implied, whether in statute, at law or on any other basis. 4. This clause will survive the termination or expiry of your Subscription. -22. **Liability** +19. **Liability** 1. Despite anything to the contrary, to the maximum extent permitted by law: 1. you agree to indemnify us for any Liability we incur due to your breach of the Acceptance and Platform Licence clause, and the Intellectual Property clause of these Terms and your breach of any law; 2. neither Party will be liable for Consequential Loss; 3. each Party’s liability for any Liability under these Terms will be reduced proportionately to the extent the relevant Liability was caused or contributed to by the acts or omissions of the other Party or any of that Party’s personnel (including a Party’s Authorized Users), including any failure by that Party to mitigate its losses; and 4. our aggregate liability for any Liability arising from or in connection with these Terms will be limited to us resupplying the Platform to you or, in our sole discretion, to us repaying you the amount of the Fees paid by you to us during the term of your Subscription. 2. This clause will survive the termination or expiry of your Subscription. -23. **Termination** +20. **Termination** 1. Cancellation of Subscription: You may request to cancel your Subscription at any time by notifying us via email. As we bill in arrears, your cancellation will take effect at the end of the current billing period for which you have been billed. No further charges will be made after the receipt of your cancellation request, except for any Usage Fees incurred during the current billing period up until the cancellation takes effect. If you cancel your Subscription due to us implementing changes to the Subscription inclusions, which have a substantial and adverse impact on you, or because of changes to the Subscription Fees, then the termination of the Subscription will be immediate. Any Subscription Fees incurred for services used during the current billing period up until the point of cancellation will still apply. No charges will apply for services not used after the cancellation has taken effect. 2. We may terminate your Subscription at any time by giving 15 days’ written notice to you (**Termination for Convenience**). 3. A Subscription will terminate immediately upon written notice by a Party (**Non-Defaulting Party**) if: - 1. the other Party **(Defaulting Party**) breaches a material term of these Terms that breach has not been remedied within 10 Business Days of the Defaulting Party being notified of the breach by the Non-Defaulting Party; or + 1. the other Party (**Defaulting Party**) breaches a material term of these Terms that breach has not been remedied within 10 Business Days of the Defaulting Party being notified of the breach by the Non-Defaulting Party; or 2. the Defaulting Party is unable to pay its debts as they fall due. 4. Should we suspect that you are in breach of these Terms, we may suspend your access to the Platform while we investigate the suspected breach. 5. Upon expiry or termination of your Subscription: @@ -155,7 +173,7 @@ Welcome to Kinde - a beautifully simple dev-acceleration infrastructure software 6. Where termination is due to our Termination for Convenience or our breach of these Terms, we agree to refund you for any prepaid unused Fees on a pro-rata basis. 7. Termination of a Subscription will not affect any rights or liabilities that a Party has accrued under these Terms. 8. This clause will survive the termination or expiry of your Subscription. -24. **Modern Slavery** +21. **Modern Slavery** 1. You represent, warrant and undertake that, as at the date of your acceptance of these Terms, neither you, nor any entity that you own or control or, to the best of your knowledge, any subcontractor of yours, has been convicted of a Modern Slavery offence under Modern Slavery Laws. 2. You must: 1. take reasonable steps to ensure that Modern Slavery is not occurring in your operations and supply chains or in the operations and supply chains of any entity you own or control; @@ -164,9 +182,9 @@ Welcome to Kinde - a beautifully simple dev-acceleration infrastructure software 4. notify us in writing as soon as you become aware of any material change to any of the information it has provided to us in relation to Modern Slavery, or any actual or suspected occurrence of Modern Slavery your operations or supply chains (or those of any entity that you own or control). 3. In respect of any subcontracts that relate to your business, you must take reasonable steps to ensure that those subcontracts contain: 1. in relation to subcontracts that relate exclusively to you, provisions in relation to Modern Slavery that are substantially the same provisions as this clause 21; and - 2. in all other cases, Modern Slavery provisions that are reasonably consistent with the provisions in this clause 21. + 2. in all other cases, Modern Slavery provisions that are reasonably consistent with the provisions in this clause 21\. 4. If you become aware of any actual or suspected occurrence of Modern Slavery in your operations or supply chains (or in those of any entity that you own or control), you must take reasonable steps to respond to the occurrence in accordance with any of your internal Modern Slavery strategy and procedures and any relevant policies, codes and standards (including any code of practice or conduct) or other guidance issued by any relevant Authority. -25. **General** +22. **General** 1. Assignment: Subject to the below clause, a Party must not assign or deal with the whole or any part of its rights or obligations under these Terms without the prior written consent of the other Party (such consent is not to be unreasonably withheld). 2. Assignment of Debt: You agree that we may assign or transfer any debt owed by you to us, arising under or in connection with these Terms, to a debt collector, debt collection agency, or other third party. 3. Disputes: A Party may not commence court proceedings relating to a dispute without first meeting with the other Party to seek (in good faith) to resolve the dispute, failing which the Parties agree to engage a mediator to attempt to resolve the dispute. The costs of the mediation will be shared equally between the Parties. Nothing in this clause will operate to prevent a Party from seeking urgent injunctive or equitable relief from a court of appropriate jurisdiction. @@ -178,21 +196,21 @@ Welcome to Kinde - a beautifully simple dev-acceleration infrastructure software 9. Publicity: You agree that we may advertise or publicize the fact that you are a user of our Platform, including on our website or in our promotional material. You grant us a non-exclusive, royalty-free, revocable, worldwide, sublicensable and non-transferable right and licence, for the duration of the Term, to use any marketing or promotional material that you provide to us, including your logo, solely for the purposes for which they were developed and solely for us to exercise our rights as set out in this clause. 10. Severance: If a provision of these Terms is held to be void, invalid, illegal or unenforceable, that provision is to be read down as narrowly as necessary to allow it to be valid or enforceable, failing which, that provision (or that part of that provision) will be severed from these Terms without affecting the validity or enforceability of the remainder of that provision or the other provisions in these Terms. 11. Third party sites: The Platform may contain links to websites operated by third parties. Unless we tell you otherwise, we do not control, endorse or approve, and are not responsible for, the content on those websites. We recommend that you make your own investigations with respect to the suitability of those websites. If you purchase goods or services from a third party website linked from the Platform, such third party provides the goods and services to you, not us. We may receive a benefit (which may include a referral fee or a commission) should you visit certain third-party websites via a link on the Platform (**Affiliate Link**) or for featuring certain products or services on the Platform. We will make it clear by notice to you which (if any) products or services we receive a benefit to feature on the Platform, or which (if any) third party links are Affiliate Links. -26. **Definitions** +23. **Definitions** 1. Authority includes any governmental or semi-governmental or local government authority, administrative, regulatory or judicial body or tribunal, department, commission, public authority, agency, Minister, statutory corporation or instrumentality. 2. Consequential Loss includes any consequential loss, indirect loss, real or anticipated loss of profit, loss of benefit, loss of revenue, loss of business, loss of goodwill, loss of opportunity, loss of savings, loss of reputation, loss of use and/or loss or corruption of data, whether under statute, contract, equity, tort (including negligence), indemnity or otherwise. 3. Intellectual Property means any domain names, know-how, inventions, processes, trade secrets or confidential information; or circuit layouts, software, computer programs, databases or source codes, including any application, or right to apply, for registration of, and any improvements, enhancements or modifications of, the foregoing. 4. Liability means any expense, cost (including legal costs and expenses), liability, loss, damage, claim, notice, entitlement, investigation, demand, proceeding or judgment (whether under statute, contract, equity, tort (including negligence), indemnity or otherwise), howsoever arising, whether direct or indirect and/or whether present, unascertained, future or contingent and whether involving a third party or a party to these Terms or otherwise. 5. Limited Payment Collection Agent Fee means a fee for collection of payments from third parties on a customer’s behalf. 6. Modern Slavery has the same meaning as in the Modern Slavery Laws and includes slavery, servitude, forced labour, human trafficking, debt bondage, organ trafficking, forced marriage and the exploitation of children. - 7. Modern Slavery Laws means the _Modern Slavery Act 2018_ (Cth) and any other applicable legislation addressing similar subject matter. + 7. Modern Slavery Laws means the *Modern Slavery Act 2018* (Cth) and any other applicable legislation addressing similar subject matter. 8. Transaction Fee means the fee we charge you for facilitating the transaction between you and your customers. The Transaction Fee is calculated as a percentage of each end customer transaction processed through the Platform billing product. 9. Support Services mean a range of technical services that help customers to effectively use, manage, and maintain the Platform including but not limited to helpdesk or technical support and maintenance services. **For any questions or notices, please contact us at:** -Kinde Australia Pty Ltd ABN 11655096263 +Kinde Australia Pty Ltd ([ABN 11655096263](https://abr.business.gov.au/ABN/View?abn=11655096263)) -**Email**: [support@kinde.com](mailto:support@kinde.com) +**Email**: [support@kinde.com](mailto:support@kinde.com) -**Last update:** 22 March 2024 +**Last update:** 5 June 2025 From 2d635dbf747eb4bbf4a6e18c4eb609d525a19198 Mon Sep 17 00:00:00 2001 From: andre selton Date: Thu, 5 Jun 2025 13:05:38 +1000 Subject: [PATCH 072/755] Update EULA June 2025 --- .../agreements/end-user-licence-agreement.mdx | 63 ++++++++++++------- 1 file changed, 42 insertions(+), 21 deletions(-) diff --git a/src/content/docs/trust-center/agreements/end-user-licence-agreement.mdx b/src/content/docs/trust-center/agreements/end-user-licence-agreement.mdx index 728c91143..8f0eaa4f8 100644 --- a/src/content/docs/trust-center/agreements/end-user-licence-agreement.mdx +++ b/src/content/docs/trust-center/agreements/end-user-licence-agreement.mdx @@ -5,20 +5,22 @@ sidebar: order: 2 --- -1. **Our Disclosures** +1. ## **Our Disclosures** Our complete terms and conditions are contained below, but some important points for you to know before you access the Platform - 1. We may amend these Terms, or the features of the Platform at any time, by providing written notice to you; 2. We will handle your personal information in accordance with our privacy policy, available on our Website; 3. Our liability under these Terms is limited to us resupplying the Platform to you, and we will not be liable for Consequential Loss, any loss that is a result of a Third Party Service, or any loss or corruption of data; and 4. We may receive a benefit (which may include a referral fee or a commission) should you visit certain third-party websites via a link on the Platform or for featuring certain products or services on the Platform. -2. **Introduction** +2. ## Introduction + 1. These terms and conditions (**Terms**) are entered into between Kinde Australia Pty Ltd ABN 11 655 096 263 (**we**, **us** or **our**) and you, together the **Parties** and each a **Party**. - 2. We provide a cloud-based, software as a service platform where we help our customers with user management, feature management, experimentation and other back-office features for running and managing their businesses (**Platform**). + 2. We provide a cloud-based, software as a service platform where we help our customers with, authentication, authorisation user management, feature management, experimentation, advanced billing features and other back-office features for running and managing their businesses (**Platform**). 3. In these Terms, **you** means the person or entity using the Platform. If you are agreeing to these Terms not as an individual but on behalf of your company, government, or other entity for which you are acting (for example, as an employee or governmental official), then you means your entity and you are binding your entity to these Terms. -3. **Acceptance and Platform Licence** + +3. ## Acceptance and Platform Licence + 1. You accept these Terms by registering on the Platform, or using the Platform. 2. You must be at least 16 years old to use the Platform. 3. We may amend these Terms at any time, by providing written notice to you. By continuing to use the Platform after the notice or 30 days after notification (whichever date is earlier), you agree to the amended Terms. If you do not agree to the amendment, you may cease accessing the Platform. @@ -29,46 +31,63 @@ sidebar: 3. tampering with or modifying the Platform (including by transmitting viruses and using trojan horses); 4. using data mining, robots, screen scraping or similar data gathering and extraction tools on the Platform; or 5. facilitating or assisting a third party to do any of the above acts. -4. **Kinde Services** + +4. ## Kinde Services + 1. We agree to use our best endeavours to make the Platform available at all times. However, from time to time we may perform reasonable scheduled and emergency maintenance, and the Platform may be unavailable during the times we are performing such maintenance. 2. You acknowledge and agree that the Platform may be reliant on, or interface with third party systems that are not provided by us (for example, cloud storage providers, email clients, and internet providers) (**Third Party Services**). To the maximum extent permitted by law, we shall have no Liability for any Third Party Services, or any unavailability of the Platform due to a failure of the Third Party Services. - 3. You acknowledge and agree that data loss is an unavoidable risk when using any software. To the extent you input any data into the Platform, you agree to maintain a backup copy of any data you input into the Platform. - 4. To the maximum extent permitted by law, we shall have no Liability to you for any loss or corruption of data, or any scheduled or emergency maintenance that causes the Platform to be unavailable. -5. **Access to the Platform** + 3. Without limiting clause 4.3, to enjoy Kinde Services, including the billing feature, you must have your own account with our designated payment processor. You acknowledge and agree that you are responsible for setting up and managing this account independently, and for complying with the payment processor’s policies and fees. + 4. You acknowledge and agree that data loss is an unavoidable risk when using any software. To the extent you input any data into the Platform, you agree to maintain a backup copy of any data you input into the Platform. + 5. To the maximum extent permitted by law, we shall have no Liability to you for any loss or corruption of data, or any scheduled or emergency maintenance that causes the Platform to be unavailable. + +5. ## Access to the Platform + 1. You must register on the Platform to access the Platform’s features. You will be invited to access the Platform via an email with a link provided by the entity you are involved with or you may also sign up on the Platform. 2. You must provide basic information when registering for the Platform including your contact name and email address and you may be asked to choose a password. 3. All personal information you provide to us will be treated in accordance with our Privacy Policy. 4. You agree not to share your login details with any other person. Your login is personal and you must not transfer or provide it to others. 5. You are responsible for keeping your login details and your username and password confidential and you will be liable for all activity via your login. You agree to immediately notify us of any unauthorized use of your login. -6. **PCI DSS** - 1. We acknowledge that we are responsible for complying with the Payment Card Industry Data Security Standards 4.0 (as amended and updated from time to time) (**PCI DSS**) when we store, process, transmit or access your credit card details. We confirm that we are compliant with the PCI DSS. - 2. We will notify you of any actual or potential contravention by us of any PCI DSS as soon as possible. + +6. ## PCI DSS + + 1. We acknowledge that we are responsible for complying with the Payment Card Industry Data Security Standards (as amended and updated from time to time) (PCI DSS) when we store, process, transmit or access your credit card details. We confirm that we are compliant with the PCI DSS. + 2. We will notify you should we become aware of any actual or potential non-compliance of PCI DSS requirements. 3. If requested by you in writing, we will provide you with evidence of our compliance in the form of a current attestation of compliance. 4. We will create and maintain reasonably detailed and complete documentation which conforms with the PCI DSS, describing the systems, processes, security controls, etc. used by us to receive, transmit, store and secure credit card details that we hold. Such documentation and the persons responsible for implementing such processes, systems, etc. will be made available to you, your QSA and any other relevant third parties retained by you to assess our compliance. -7. **Our Intellectual Property** + +7. ## Our Intellectual Property + 1. You acknowledge and agree that any Intellectual Property or content (including copyright and trademarks) available on the Platform, the Platform itself, and any algorithms or machine learning models used on the Platform (**Our Intellectual Property**) will at all times vest, or remain vested, in us. 2. We authorize you to use Our Intellectual Property solely for your limited commercial use. You must not exploit Our Intellectual Property for any other purpose, nor allow, aid or facilitate such use by any third party. 3. You must not, without our prior written consent: 1. copy, in whole or in part, any of Our Intellectual Property; 2. reproduce, retransmit, distribute, disseminate, sell, publish, broadcast or circulate any of Our Intellectual Property to any third party; or 3. breach any intellectual property rights connected with the Platform, including (without limitation) altering or modifying any of Our Intellectual Property, downloading Our Intellectual Property, causing any of Our Intellectual Property to be framed or embedded in another website, or creating derivative works from any of Our Intellectual Property. -8. **Warranties** + +8. ## Warranties + 1. You represent, warrant and agree that: 1. you will not use our Platform, including Our Intellectual Property, in any way that competes with our business; 2. if you are agreeing to these Terms not as an individual but on behalf of your company, government, or other entity for which you are acting (for example, as an employee or governmental official), then you access and use the Platform on behalf of that entity; 3. there are no legal restrictions preventing you from entering into these Terms; 4. all information and documentation that you provide to us in connection with these Terms is true, correct and complete; and 5. you have not relied on any representations or warranties made by us in relation to the Platform (including as to whether the Platform is or will be fit or suitable for your particular purposes), unless expressly stipulated in these Terms. -9. **Liability** + +9. ## Liability + 1. Despite anything to the contrary, to the maximum extent permitted by law: 1. you agree to indemnify us for any Liability we incur due to your breach of the Acceptance and Platform Licence clause and the Intellectual Property clause of these Terms; 2. neither Party will be liable for Consequential Loss; 3. each Party’s liability for any Liability under these Terms will be reduced proportionately to the extent the relevant Liability was caused or contributed to by the acts or omissions of the other Party or any of that Party’s personnel, including any failure by that Party to mitigate its losses; and 4. our aggregate liability for any Liability arising from or in connection with these Terms will be limited to us resupplying the Platform to you. -10. **Access** + +10. ## Access + 1. We may revoke your access to the Platform at any time by giving 15 days’ written notice to you. 2. Should we suspect that you are in breach of these Terms, we may suspend your access to the Platform while we investigate the suspected breach. Should we determine that you are in breach of these Terms, your access to the Platform will be terminated immediately. -11. **General** + +11. ## General + 1. **Assignment:** You must not assign or deal with the whole or any part of your rights or obligations under these Terms without our prior written consent. 2. **Disputes:** A Party may not commence court proceedings relating to a dispute without first meeting with the other Party to seek (in good faith) to resolve the dispute, failing which the Parties agree to engage a mediator to attempt to resolve the dispute. The costs of the mediation will be shared equally between the Parties. Nothing in this clause will operate to prevent a Party from seeking urgent injunctive or equitable relief from a court of appropriate jurisdiction. 3. **Entire Terms:** These Terms contains the entire understanding between the Parties and the Parties agree that no representation or statement has been made to, or relied upon by, either of the Parties, except as expressly stipulated in these Terms, and these Terms supersedes all previous discussions, communications, negotiations, understandings, representations, warranties, commitments and agreements, in respect of its subject matter. @@ -78,7 +97,9 @@ sidebar: 7. **Privacy:** We agree to comply with the legal requirements of the Australian Privacy Principles as set out in the Privacy Act 1988 (Cth) and any other applicable legislation or privacy guidelines. 8. **Severance:** If a provision of these Terms is held to be void, invalid, illegal or unenforceable, that provision is to be read down as narrowly as necessary to allow it to be valid or enforceable, failing which, that provision (or that part of that provision) will be severed from these Terms without affecting the validity or enforceability of the remainder of that provision or the other provisions in these Terms. 9. **Third party sites:** The Platform may contain links to websites operated by third parties. Unless we tell you otherwise, we do not control, endorse or approve, and are not responsible for, the content on those websites. We recommend that you make your own investigations with respect to the suitability of those websites. If you purchase goods or services from a third party website linked from the Platform, such third party provides the goods and services to you, not us. We may receive a benefit (which may include a referral fee or a commission) should you visit certain third-party websites via a link on the Platform (Affiliate Link) or for featuring certain products or services on the Platform. We will make it clear by notice to you which (if any) products or services we receive a benefit to feature on the Platform, or which (if any) third party links are Affiliate Links. -12. **Definitions** + +12. ## Definitions + 1. **Consequential Loss** includes any consequential loss, indirect loss, real or anticipated loss of profit, loss of benefit, loss of revenue, loss of business, loss of goodwill, loss of opportunity, loss of savings, loss of reputation, loss of use and/or loss or corruption of data, whether under statute, contract, equity, tort (including negligence), indemnity or otherwise. 2. **Intellectual Property** means any domain names, know-how, inventions, processes, trade secrets or confidential information; or circuit layouts, software, computer programs, databases or source codes, including any application, or right to apply, for registration of, and any improvements, enhancements or modifications of, the foregoing. 3. **Liability** means any expense, cost, liability, loss, damage, claim, notice, entitlement, investigation, demand, proceeding or judgment (whether under statute, contract, equity, tort (including negligence), indemnity or otherwise), howsoever arising, whether direct or indirect and/or whether present, unascertained, future or contingent and whether involving a third party or a party to these Terms or otherwise. @@ -87,8 +108,8 @@ sidebar: **For any questions or notices, please contact us at:** -Kinde Australia Pty Ltd ABN 11 655 096 263 +Kinde Australia Pty Ltd ([ABN 11 655 096 263](https://abr.business.gov.au/ABN/View?abn=11655096263)) -**Email**: [support@kinde.com](mailto:support@kinde.com) +Email: support@kinde.com -**Last update:** 2 November 2023 +Last update: 5 June 2025 From 130176aabec52600a4fecb4825bb4d1ad41edfb9 Mon Sep 17 00:00:00 2001 From: andre selton Date: Thu, 5 Jun 2025 13:33:52 +1000 Subject: [PATCH 073/755] update heading --- .../trust-center/privacy-and-compliance/privacy-policy.mdx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/content/docs/trust-center/privacy-and-compliance/privacy-policy.mdx b/src/content/docs/trust-center/privacy-and-compliance/privacy-policy.mdx index 7f902869c..f2a9756da 100644 --- a/src/content/docs/trust-center/privacy-and-compliance/privacy-policy.mdx +++ b/src/content/docs/trust-center/privacy-and-compliance/privacy-policy.mdx @@ -213,7 +213,8 @@ The countries to which we send data for the purposes listed above may be less co We will only retain your personal information for as long as reasonably necessary to fulfil the purposes we collected it for, including for the purposes of satisfying any legal, regulatory, tax, accounting or reporting requirements. We may retain your personal information for a longer period in the event of a complaint or if we reasonably believe there is a prospect of litigation in respect to our relationship with you. To determine the appropriate retention period for personal information, we consider the amount, nature and sensitivity of the personal information, the potential risk of harm from unauthorised use or disclosure of your personal information, the purposes for which we process your personal information and whether we can achieve those purposes through other means, and the applicable legal, regulatory, tax, accounting or other requirements. -Extra rights for EU and UK individuals + +##Extra rights for EU and UK individuals## You may request details of the personal information that we hold about you and how we process it (commonly known as a “data subject request”). You may also have a right in accordance with applicable data protection law to have your personal information rectified or deleted, to restrict our processing of that information, to object to decisions being made based on automated processing where the decision will produce a legal effect or a similarly significant effect on you, to stop unauthorised transfers of your personal information to a third party and, in some circumstances, to have personal information relating to you transferred to you or another organisation. From 2eda9843d36fc77e26146c72d3ff972537517a52 Mon Sep 17 00:00:00 2001 From: andre selton Date: Thu, 5 Jun 2025 13:36:54 +1000 Subject: [PATCH 074/755] update formatting --- src/content/docs/trust-center/agreements/terms-of-service.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content/docs/trust-center/agreements/terms-of-service.mdx b/src/content/docs/trust-center/agreements/terms-of-service.mdx index 35d94febe..c96f57e2d 100644 --- a/src/content/docs/trust-center/agreements/terms-of-service.mdx +++ b/src/content/docs/trust-center/agreements/terms-of-service.mdx @@ -104,7 +104,7 @@ Welcome to Kinde - a beautifully simple dev-acceleration infrastructure software 1. We reserve the right to charge any applicable local taxes in addition to the Fee, in compliance with the prevailing local tax laws and regulations of your jurisdiction. 2. The local taxes may include but are not limited to sales tax, value-added tax (VAT), goods and services tax (GST), or any other similar taxes, levies or duties which are applicable in your location. The amount of these taxes will be calculated based on the Fee and will be added to the total amount payable by you. When you use our Platform to bill and charge your own customers, you should include any applicable taxes in the total amount payable by your customers, in accordance with your local tax laws and regulations. 13. **Our Intellectual Property** - 1. You acknowledge and agree that any Intellectual Property or content (including copyright and trademarks) available on the Platform, the Platform itself, and any algorithms or machine learning models used on the Platform **(Our Intellectual Property**) will at all times vest, or remain vested, in us. + 1. You acknowledge and agree that any Intellectual Property or content (including copyright and trademarks) available on the Platform, the Platform itself, and any algorithms or machine learning models used on the Platform **(Our Intellectual Property)** will at all times vest, or remain vested, in us. 2. We authorize you to use Our Intellectual Property solely for your limited commercial use. You must not exploit Our Intellectual Property for any other purpose, nor allow, aid or facilitate such use by any third party. Use must be limited to Authorized Users on devices that are controlled or approved by you. 3. You must not, without our prior written consent: 1. copy, in whole or in part, any of Our Intellectual Property; @@ -182,7 +182,7 @@ Welcome to Kinde - a beautifully simple dev-acceleration infrastructure software 4. notify us in writing as soon as you become aware of any material change to any of the information it has provided to us in relation to Modern Slavery, or any actual or suspected occurrence of Modern Slavery your operations or supply chains (or those of any entity that you own or control). 3. In respect of any subcontracts that relate to your business, you must take reasonable steps to ensure that those subcontracts contain: 1. in relation to subcontracts that relate exclusively to you, provisions in relation to Modern Slavery that are substantially the same provisions as this clause 21; and - 2. in all other cases, Modern Slavery provisions that are reasonably consistent with the provisions in this clause 21\. + 2. in all other cases, Modern Slavery provisions that are reasonably consistent with the provisions in this clause 21. 4. If you become aware of any actual or suspected occurrence of Modern Slavery in your operations or supply chains (or in those of any entity that you own or control), you must take reasonable steps to respond to the occurrence in accordance with any of your internal Modern Slavery strategy and procedures and any relevant policies, codes and standards (including any code of practice or conduct) or other guidance issued by any relevant Authority. 22. **General** 1. Assignment: Subject to the below clause, a Party must not assign or deal with the whole or any part of its rights or obligations under these Terms without the prior written consent of the other Party (such consent is not to be unreasonably withheld). From 578fba17875174ed230826416d24d6e76948b098 Mon Sep 17 00:00:00 2001 From: andre selton Date: Thu, 5 Jun 2025 13:40:28 +1000 Subject: [PATCH 075/755] Update clause reference --- .../docs/trust-center/agreements/end-user-licence-agreement.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/trust-center/agreements/end-user-licence-agreement.mdx b/src/content/docs/trust-center/agreements/end-user-licence-agreement.mdx index 8f0eaa4f8..b6daefbf4 100644 --- a/src/content/docs/trust-center/agreements/end-user-licence-agreement.mdx +++ b/src/content/docs/trust-center/agreements/end-user-licence-agreement.mdx @@ -36,7 +36,7 @@ sidebar: 1. We agree to use our best endeavours to make the Platform available at all times. However, from time to time we may perform reasonable scheduled and emergency maintenance, and the Platform may be unavailable during the times we are performing such maintenance. 2. You acknowledge and agree that the Platform may be reliant on, or interface with third party systems that are not provided by us (for example, cloud storage providers, email clients, and internet providers) (**Third Party Services**). To the maximum extent permitted by law, we shall have no Liability for any Third Party Services, or any unavailability of the Platform due to a failure of the Third Party Services. - 3. Without limiting clause 4.3, to enjoy Kinde Services, including the billing feature, you must have your own account with our designated payment processor. You acknowledge and agree that you are responsible for setting up and managing this account independently, and for complying with the payment processor’s policies and fees. + 3. Without limiting clause 4.2, to enjoy Kinde Services, including the billing feature, you must have your own account with our designated payment processor. You acknowledge and agree that you are responsible for setting up and managing this account independently, and for complying with the payment processor’s policies and fees. 4. You acknowledge and agree that data loss is an unavoidable risk when using any software. To the extent you input any data into the Platform, you agree to maintain a backup copy of any data you input into the Platform. 5. To the maximum extent permitted by law, we shall have no Liability to you for any loss or corruption of data, or any scheduled or emergency maintenance that causes the Platform to be unavailable. From 3165bbd94744dfd614aae339205e13060b9c90a9 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 5 Jun 2025 14:20:34 +1000 Subject: [PATCH 076/755] Correction --- src/content/docs/billing/get-started/add-billing-role.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/billing/get-started/add-billing-role.mdx b/src/content/docs/billing/get-started/add-billing-role.mdx index 162f66592..729f520e9 100644 --- a/src/content/docs/billing/get-started/add-billing-role.mdx +++ b/src/content/docs/billing/get-started/add-billing-role.mdx @@ -18,7 +18,7 @@ Before you start selling to your business customers, create a default billing ro ![Roles screen for billing owner](https://imagedelivery.net/skPPZTHzSlcslvHjesZQcQ/96415552-a11b-4be3-e644-d9eaa2af6700/public) -2. Name the role, for example, `Billing contact` , and enter a description and **Key**. +2. Name the role, for example, `Billing Admin` , and enter a description and **Key**. 3. Select the **Assign to the creator** option. 4. In the **System permissions** section, ensure the **org:write:billing** system permission is selected. From e91d1291d3b1b6e74704fb820e2d846151982717 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 5 Jun 2025 14:25:58 +1000 Subject: [PATCH 077/755] Update default-billing-currency.mdx Draft 1 --- .../get-started/default-billing-currency.mdx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/content/docs/billing/get-started/default-billing-currency.mdx b/src/content/docs/billing/get-started/default-billing-currency.mdx index b53794b85..91f09707f 100644 --- a/src/content/docs/billing/get-started/default-billing-currency.mdx +++ b/src/content/docs/billing/get-started/default-billing-currency.mdx @@ -4,7 +4,14 @@ title: Set default billing currency sidebar: order: 3 relatedArticles: - - -app_context: - - + - 2aa551b8-06c0-4947-bd4b-d643c77ed224 + - e6dde80d-2977-419f-a05a-62ad0a7ac6de --- + +The currency you select here cannot be changed after a plan is published. For now, the default billing currency will be used in all plans you create. + +1. Go to **Settings > Environment > Billing**. +2. Select a default currency. +3. Select **Save**. + +Next: [Step 3 Connect to Stripe](/billing/get-started/connect-to-stripe/) From b96b6b57426c98d5f66085010ae2fc2eba09f731 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 5 Jun 2025 14:39:16 +1000 Subject: [PATCH 078/755] Create manage-stripe-connection.mdx --- .../payment-management/manage-stripe-connection.mdx | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/content/docs/billing/payment-management/manage-stripe-connection.mdx diff --git a/src/content/docs/billing/payment-management/manage-stripe-connection.mdx b/src/content/docs/billing/payment-management/manage-stripe-connection.mdx new file mode 100644 index 000000000..c4b00a516 --- /dev/null +++ b/src/content/docs/billing/payment-management/manage-stripe-connection.mdx @@ -0,0 +1,9 @@ +--- +page_id: 8770ef89-e805-475f-b4f5-a86c1e1eccc1 +title: Manage Stripe connection +sidebar: + order: +relatedArticles: + - +--- + From ff94c15e956be582f1a8794aa62c3bebbf2a8aab Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 5 Jun 2025 14:40:25 +1000 Subject: [PATCH 079/755] Update connect-to-stripe.mdx --- .../billing/get-started/connect-to-stripe.mdx | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/content/docs/billing/get-started/connect-to-stripe.mdx b/src/content/docs/billing/get-started/connect-to-stripe.mdx index a05788159..0d0c70ad6 100644 --- a/src/content/docs/billing/get-started/connect-to-stripe.mdx +++ b/src/content/docs/billing/get-started/connect-to-stripe.mdx @@ -9,4 +9,51 @@ app_context: - --- +Kinde’s billing feature comes with a dependency on [Stripe](https://stripe.com), which is a known and reliable payments processing platform. A new Stripe account is automatically created for you when you set up billing in Kinde. + + +1. If you are testing billing, switch to your non-production environment. +2. Go to **Settings > Environment > Billing**. +3. Select **Connect Stripe account**. Kinde initiates the connection and adds the connection card. + + ![Stripe card connection in Kinde](https://imagedelivery.net/skPPZTHzSlcslvHjesZQcQ/f3797997-6681-41c8-a297-4a962d5d0500/public) + +4. Select **Update Stripe information**. This kicks off a Stripe onboarding flow. You will see a Stripe-generated screen to enter details. + + ![Kinde Stripe onboarding flow start screen](https://imagedelivery.net/skPPZTHzSlcslvHjesZQcQ/71b08393-f43d-4f91-3268-7501e08d3f00/public) + + + +5. Enter the email that will be associated with the Stripe account and select **Submit**. Here’s what happens next, depending if you have a Stripe account already associated with your email address. + 1. **If you are in the test environment**, you’ll be prompted through a flow. You can continue or select **Return to Kinde**. + 2. **If you are in a production environment,** you will be asked if you want to use details from an existing Stripe account or make a new one: + 1. If you select existing, account details from the existing account will be used, but no other data will come across. + 2. If you select to make a new one, you will be prompted to enter all your business details. This can take a while. + 3. Follow the prompts as far as you want. Select **Return to Kinde**. + + + +6. When you complete the Stripe onboarding, or opt out by selecting **Return to Kinde**, the connection card on the Kinde **Billing** page shows the connection status. + + ![Connection status on Kinde stripe card](https://imagedelivery.net/skPPZTHzSlcslvHjesZQcQ/f4eb395b-069e-42c3-ab4f-d78cc52e8800/public) + + - `Connecting` means Stripe is still sending information to Kinde about the account status. It should not take long to sync. + - `In progress` indicates that Stripe has connected to Kinde, but still requires some additional details from you in order to fully set up the account. Select **Update Stripe information** to complete the Stripe onboarding. You need to do this before plans can be made available to your customers. + - `Connected` means Stripe is successfully syncing data with Kinde and you’re ready to publish plans. + +For more information, see [Manage the Stripe connection](/billing/payment-management/manage-stripe-connection/). + +**Next:** [Step 4 Build plans](/billing/get-started/build-plans/) From e671141650f2710916a4efdce06d4cf9a4491505 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 5 Jun 2025 14:44:51 +1000 Subject: [PATCH 080/755] Create create-plans.mdx --- .../docs/billing/manage-plans/create-plans.mdx | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/content/docs/billing/manage-plans/create-plans.mdx diff --git a/src/content/docs/billing/manage-plans/create-plans.mdx b/src/content/docs/billing/manage-plans/create-plans.mdx new file mode 100644 index 000000000..7c0d3a868 --- /dev/null +++ b/src/content/docs/billing/manage-plans/create-plans.mdx @@ -0,0 +1,11 @@ +--- +page_id: fe9fea0c-274c-4d6b-9cc5-eccdbaad85b7 +title: Create plans +sidebar: + order: 2 +relatedArticles: + - +app_context: + - m: billing + - s: plans +--- From 4373c95d966199feef8f9a0f9f53d00773cee6b0 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 5 Jun 2025 14:50:17 +1000 Subject: [PATCH 081/755] Update build-plans.mdx --- .../docs/billing/get-started/build-plans.mdx | 33 +++++++++++++++++-- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/src/content/docs/billing/get-started/build-plans.mdx b/src/content/docs/billing/get-started/build-plans.mdx index 8e0208184..6c7ce43b0 100644 --- a/src/content/docs/billing/get-started/build-plans.mdx +++ b/src/content/docs/billing/get-started/build-plans.mdx @@ -4,7 +4,34 @@ title: Step 4 Build plans sidebar: order: relatedArticles: - - -app_context: - - + - fe9fea0c-274c-4d6b-9cc5-eccdbaad85b7 + - 88e1773a-b681-441f-b4c7-d7d339116867 +app_context: + - m: billing + - s: plans --- + +Whether you currently charge for services or are just starting out, building plans is the more complex part of the billing setup process. We recommend you define a strategy before adding plans in Kinde. + +- [Learn more about how plans work in Kinde](/billing/manage-plans/about-plans/) +- [Skip to creating plans](/billing/manage-plans/create-plans) + +## Develop a plan strategy + +If you have not created plans before, here’s a list of tasks to help you prepare. These will give you a strategy for creating the plans you need in Kinde. + +1. Are you creating B2B or B2C plans? B2B plan types are for business customers (organizations), and B2C plan types are for individual users. Kinde supports both plan types. +2. Decide how many plans you want and the name of each plan. E.g. `Free, Pro, Plus` or `Solo, Team, Enterprise`. +3. Make a list of each [plan’s features][link to doc]. For each feature, decide on: + - the [pricing model][link to doc] that applies + - limits and inclusions for a feature + + Anything you ‘gate’ access to, or put limits on in your product, should be on this list. + + Tip: Create a spreadsheet to keep track of everything. + + [example spreadsheet for plan planning](https://imagedelivery.net/skPPZTHzSlcslvHjesZQcQ/401ff633-c6c8-45ba-9502-1a29274b4400/public) + +4. Identify which features are common across plans. You don’t need to add a new feature every time, you can [re-use features][link to doc] across plans and change the details. + +**See [Create plans](/billing/manage-plans/create-plans)** for step-by-step instructions. From 36ce374d8c438756b4dadc23d3bc6e46cc9dc6b3 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 5 Jun 2025 15:02:16 +1000 Subject: [PATCH 082/755] Update publish-plans.mdx --- .../docs/billing/get-started/publish-plans.mdx | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/content/docs/billing/get-started/publish-plans.mdx b/src/content/docs/billing/get-started/publish-plans.mdx index fb7eaffac..811aebf43 100644 --- a/src/content/docs/billing/get-started/publish-plans.mdx +++ b/src/content/docs/billing/get-started/publish-plans.mdx @@ -2,9 +2,21 @@ page_id: 46241baf-30aa-43c0-ac0c-b2b7e99941f1 title: Step 5 Publish plans sidebar: - order: + order: 6 relatedArticles: - - + - 37d5ae8e-cfd1-4e5d-8333-387b6967ec23 + - 88e1773a-b681-441f-b4c7-d7d339116867 app_context: - - + - m: plan + - s: details --- + +When you publish a plan, all of the plan features and charges are synced to Stripe where they are transformed into products that users can buy. + +We recommend testing, reviewing, and making all changes before publishing plans. + +When you are ready, open the plan and select **Publish plan** in the top right of the plan window. Do this for each plan you want users to subscribe to. + +Learn more about [draft and published plans](/billing/manage-plans/about-plans/) + +**Next:** [Step 6 Create pricing tables](/billing/get-started/add-pricing-table/) From 8d57010f6ea520ebe2156ed89ecbfe9c24836a0a Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 5 Jun 2025 15:10:03 +1000 Subject: [PATCH 083/755] Update add-pricing-table.mdx --- .../docs/billing/get-started/add-pricing-table.mdx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/content/docs/billing/get-started/add-pricing-table.mdx b/src/content/docs/billing/get-started/add-pricing-table.mdx index 319d24c22..37eeadd86 100644 --- a/src/content/docs/billing/get-started/add-pricing-table.mdx +++ b/src/content/docs/billing/get-started/add-pricing-table.mdx @@ -4,7 +4,16 @@ title: Step 6 Create pricing table (optional) sidebar: order: 7 relatedArticles: - - + - 37d5ae8e-cfd1-4e5d-8333-387b6967ec23 app_context: - - + - m: billing + - s: pricing_tables --- + +Kinde lets you create pricing tables based on your plans. The tables can be integrated into the auth flow so that plan selection becomes part of registration. Pricing tables are also used in plan upgrade and downgrade flows. + +[pricing table example](https://imagedelivery.net/skPPZTHzSlcslvHjesZQcQ/8514b968-262d-4aec-24bd-02070669e300/public) + +Go to [Pricing tables](/billing/billing-user-experience/plan-selection/). + +If you have your own screen flows for plan display and selection, you do not have to use Kinde’s pricing tables. Here's how to use your own, and not Kinde's [Link to topic] From ee2f73d951a7e83b618d9415ee26c43486c4ae6b Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 5 Jun 2025 15:10:27 +1000 Subject: [PATCH 084/755] Update add-pricing-table.mdx --- src/content/docs/billing/get-started/add-pricing-table.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/billing/get-started/add-pricing-table.mdx b/src/content/docs/billing/get-started/add-pricing-table.mdx index 37eeadd86..7f8a8e7b5 100644 --- a/src/content/docs/billing/get-started/add-pricing-table.mdx +++ b/src/content/docs/billing/get-started/add-pricing-table.mdx @@ -12,7 +12,7 @@ app_context: Kinde lets you create pricing tables based on your plans. The tables can be integrated into the auth flow so that plan selection becomes part of registration. Pricing tables are also used in plan upgrade and downgrade flows. -[pricing table example](https://imagedelivery.net/skPPZTHzSlcslvHjesZQcQ/8514b968-262d-4aec-24bd-02070669e300/public) +![pricing table example](https://imagedelivery.net/skPPZTHzSlcslvHjesZQcQ/8514b968-262d-4aec-24bd-02070669e300/public) Go to [Pricing tables](/billing/billing-user-experience/plan-selection/). From 5b267710abb47223bfee0812887baca78af708de Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 5 Jun 2025 15:13:24 +1000 Subject: [PATCH 085/755] Update add-pricing-table.mdx --- src/content/docs/billing/get-started/add-pricing-table.mdx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/content/docs/billing/get-started/add-pricing-table.mdx b/src/content/docs/billing/get-started/add-pricing-table.mdx index 7f8a8e7b5..681cdb802 100644 --- a/src/content/docs/billing/get-started/add-pricing-table.mdx +++ b/src/content/docs/billing/get-started/add-pricing-table.mdx @@ -10,10 +10,12 @@ app_context: - s: pricing_tables --- -Kinde lets you create pricing tables based on your plans. The tables can be integrated into the auth flow so that plan selection becomes part of registration. Pricing tables are also used in plan upgrade and downgrade flows. +Kinde lets you create pricing tables based on your plans. The tables can be integrated into the auth flow so that plan selection becomes part of registration. Pricing tables are also used in plan upgrade and downgrade flows. It might look something like this. ![pricing table example](https://imagedelivery.net/skPPZTHzSlcslvHjesZQcQ/8514b968-262d-4aec-24bd-02070669e300/public) -Go to [Pricing tables](/billing/billing-user-experience/plan-selection/). +To create your own, go to [Build a pricing table](/billing/billing-user-experience/plan-selection/). If you have your own screen flows for plan display and selection, you do not have to use Kinde’s pricing tables. Here's how to use your own, and not Kinde's [Link to topic] + +**Next:** [Step 7 Set up self-serve portal (optional)](/billing/get-started/self-serve-portal-setup/) From faff09b95cbfe8d1a83e112c8c1baf4f182c7f01 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 5 Jun 2025 15:13:47 +1000 Subject: [PATCH 086/755] Update build-plans.mdx --- src/content/docs/billing/get-started/build-plans.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/billing/get-started/build-plans.mdx b/src/content/docs/billing/get-started/build-plans.mdx index 6c7ce43b0..35dd9df83 100644 --- a/src/content/docs/billing/get-started/build-plans.mdx +++ b/src/content/docs/billing/get-started/build-plans.mdx @@ -2,7 +2,7 @@ page_id: c4526879-5580-4cd0-a881-91b512438fc0 title: Step 4 Build plans sidebar: - order: + order: 5 relatedArticles: - fe9fea0c-274c-4d6b-9cc5-eccdbaad85b7 - 88e1773a-b681-441f-b4c7-d7d339116867 From 981222b8b3f334eaa4de80348b06c377b8d81f65 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 5 Jun 2025 15:30:17 +1000 Subject: [PATCH 087/755] Update kinde-billing-model.mdx --- .../docs/billing/about-billing/kinde-billing-model.mdx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/content/docs/billing/about-billing/kinde-billing-model.mdx b/src/content/docs/billing/about-billing/kinde-billing-model.mdx index baac66924..1ec2ea8c7 100644 --- a/src/content/docs/billing/about-billing/kinde-billing-model.mdx +++ b/src/content/docs/billing/about-billing/kinde-billing-model.mdx @@ -48,3 +48,10 @@ The region in Stripe indicates where the transaction information is held, so if +## Billing and invoice cycles + +Default behavior for invoices and charging is as follows. This cannot currently be changed. + +- Billing cycles are monthly and are processed on the sign up anniversary +- Invoices include fixed charges in advance, e.g. a monthly subscription is payable each month in advance. +- Invoices include metered charges in arrears, e.g. MAU is metered throughout a month and then charges for the previous month appear on the next invoice. From 1853601eaac5f6bffd51aa1bad8fbd9f8bce67a6 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 5 Jun 2025 15:31:19 +1000 Subject: [PATCH 088/755] Update about-billing.mdx --- src/content/docs/billing/about-billing/about-billing.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/content/docs/billing/about-billing/about-billing.mdx b/src/content/docs/billing/about-billing/about-billing.mdx index e451e3228..478e2ce2b 100644 --- a/src/content/docs/billing/about-billing/about-billing.mdx +++ b/src/content/docs/billing/about-billing/about-billing.mdx @@ -38,5 +38,6 @@ These are current limitations that we are aware of and are working on adding. - Support for plan models with free trial periods - Annual subscriptions. Only monthly is available right now. +- Changes to the billing cycle (e.g. choose billing anniversaries, etc.) - Add-ons and discounts that can be applied to individual subscriptions - Plan versioning From 9f592b37277917cbd92ce406331cba5226831d2f Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 5 Jun 2025 15:53:31 +1000 Subject: [PATCH 089/755] Create self-serve-portal-for-orgs.mdx --- .../set-up-options/self-serve-portal-for-orgs.mdx | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/content/docs/build/set-up-options/self-serve-portal-for-orgs.mdx diff --git a/src/content/docs/build/set-up-options/self-serve-portal-for-orgs.mdx b/src/content/docs/build/set-up-options/self-serve-portal-for-orgs.mdx new file mode 100644 index 000000000..7d91bd7fa --- /dev/null +++ b/src/content/docs/build/set-up-options/self-serve-portal-for-orgs.mdx @@ -0,0 +1,10 @@ +--- +page_id: a2668524-5842-4c68-ab50-30b7e8c3e842 +title: Enable self-serve portal for orgs +sidebar: + order: 7 +relatedArticles: + - +--- + + From 85ac661c586ec72ca7227be87aa99135d9766c6c Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 5 Jun 2025 15:55:15 +1000 Subject: [PATCH 090/755] Update self-serve-portal-setup.mdx --- .../billing/get-started/self-serve-portal-setup.mdx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/content/docs/billing/get-started/self-serve-portal-setup.mdx b/src/content/docs/billing/get-started/self-serve-portal-setup.mdx index a747daff3..6dbff7d4d 100644 --- a/src/content/docs/billing/get-started/self-serve-portal-setup.mdx +++ b/src/content/docs/billing/get-started/self-serve-portal-setup.mdx @@ -4,7 +4,11 @@ title: Step 7 Set up self-serve portal (optional) sidebar: order: 8 relatedArticles: - - -app_context: - - + - a2668524-5842-4c68-ab50-30b7e8c3e842 --- + +If you want your customers (organizations or individual users) to manage their own plans, including upgrades and downgrades, payment information, team members, etc., set up the self-service portal to allow this. + +Aside from account management, the self serve portal is for orgs to self manage teams and business information, and individuals to manage their user profile. + +See [Self-serve portal](/build/set-up-options/self-serve-portal-for-orgs/) for information on setting it up. From 5301bc5c2628a94b4a330f844f4b85dcb369d6d0 Mon Sep 17 00:00:00 2001 From: andre selton Date: Thu, 5 Jun 2025 16:21:00 +1000 Subject: [PATCH 091/755] action formatting feedback --- .../trust-center/privacy-and-compliance/privacy-policy.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content/docs/trust-center/privacy-and-compliance/privacy-policy.mdx b/src/content/docs/trust-center/privacy-and-compliance/privacy-policy.mdx index f2a9756da..bd53cf690 100644 --- a/src/content/docs/trust-center/privacy-and-compliance/privacy-policy.mdx +++ b/src/content/docs/trust-center/privacy-and-compliance/privacy-policy.mdx @@ -17,7 +17,7 @@ Information about Australia’s privacy guidance can be found from the [Office o Kinde’s UK Company Reference Number (**CRN**) is [13920496](https://find-and-update.company-information.service.gov.uk/company/13920496). Information about the UK’s privacy guidance can be found with the [Information Commissioner’s Office](https://ico.org.uk/) (**ICO**). -This Privacy Policy takes into account the requirements of the Privacy Act 1988 (Cth). In addition to the Australian laws, individuals located in the European Union or European Economic Area **(EU**) may also have rights under the General Data Protection Regulation 2016/679 and individuals located in the United Kingdom (**UK)** may have rights under the General Data Protection Regulation (**EU**) 2016/679) (**UK GDPR**) and the Data Protection Act 2018 (**DPA 2018**) (together, the **GDPR**). +This Privacy Policy takes into account the requirements of the Privacy Act 1988 (Cth). In addition to the Australian laws, individuals located in the European Union or European Economic Area (**EU**) may also have rights under the General Data Protection Regulation 2016/679 and individuals located in the United Kingdom (**UK**) may have rights under the General Data Protection Regulation (**EU**) 2016/679) (**UK GDPR**) and the Data Protection Act 2018 (**DPA 2018**) (together, the **GDPR**). This document also details the additional rights of individuals located in the EU and UK, as well as information on how we process the personal information of individuals located in the EU and UK. @@ -214,7 +214,7 @@ We will only retain your personal information for as long as reasonably necessar To determine the appropriate retention period for personal information, we consider the amount, nature and sensitivity of the personal information, the potential risk of harm from unauthorised use or disclosure of your personal information, the purposes for which we process your personal information and whether we can achieve those purposes through other means, and the applicable legal, regulatory, tax, accounting or other requirements. -##Extra rights for EU and UK individuals## +##Extra rights for EU and UK individuals You may request details of the personal information that we hold about you and how we process it (commonly known as a “data subject request”). You may also have a right in accordance with applicable data protection law to have your personal information rectified or deleted, to restrict our processing of that information, to object to decisions being made based on automated processing where the decision will produce a legal effect or a similarly significant effect on you, to stop unauthorised transfers of your personal information to a third party and, in some circumstances, to have personal information relating to you transferred to you or another organisation. From 287829fd56bce5a8c1a44bf09f2a0f75389d9f5a Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 5 Jun 2025 18:48:12 +1000 Subject: [PATCH 092/755] Update about-plans.mdx Draft 1 --- .../docs/billing/manage-plans/about-plans.mdx | 76 ++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git a/src/content/docs/billing/manage-plans/about-plans.mdx b/src/content/docs/billing/manage-plans/about-plans.mdx index 6130f9eb1..00df1aad8 100644 --- a/src/content/docs/billing/manage-plans/about-plans.mdx +++ b/src/content/docs/billing/manage-plans/about-plans.mdx @@ -6,5 +6,79 @@ sidebar: relatedArticles: - app_context: - - + - m: billing + - s: plans --- +Plans enable you to structure your app features and charge your customers for using your services. It’s common to support both basic and more advanced plans for SaaS services. Here’s some examples: + +- A simple subscription plan: $10 per month for x features +- A more complex plan: $20 per month for x features, plus x amount per GB storage, plus MAU charges (up to x free per month). + +We recommend creating your basic or simplest plan first (e.g. your Free plan), then work through to more complex plans. + +## Current limitations + +These are known limitations that we are actively working on to add. + +- Support for plan models with free trial periods. +- Annual subscriptions. Only monthly is available right now. +- No alterations to billing cycle or invoice methods. +- Add-ons and discounts that can be applied to individual subscriptions. + +## Parts of a plan + +There are a number of concepts and elements involved in building a plan. + +### Plan profile + +This is the name of the plan, description, code key, etc. You need to enter these details and save them before you move on to adding charges and features. + +The plan name appears on the pricing table that you can generate to share with customers. We recommend keeping it short. Use the description fields to explain differences in plans for internal use. + +### Plan feature pricing + +Depending how you manage plans and feature provisioning in your application, plan pricing might be simple or complex in your business. + +When you set up a plan, you can include a mixture of any of these options: + +- **Fixed charges** - a recurring charge that does not change and is invoiced in advance, e.g. a monthly subscription charge. +- **Metered features** - usage-based entitlements that define what and how much users’ access, and what they pay to access it. These might be per unit, per tier, or non-chargeable. Such as included and additional MAU. +- **Unmetered features** - things included in a plan that users don’t pay for separately. Unmetered features are generally used to gate feature access. E.g. X feature is not available on the Free plan, but is on a higher tier plan. + +## Example plan features + +| Feature | Price | Pricing model | +| --- | --- | --- | +| Access to x feature | 0.00 | Unmetered | +| Subscription | $ 20 / month for access | Fixed charge | +| Interaction | $x per interaction | Metered / tiered | +| Storage/Usage | $x per GB | Metered / units or tiered | +| MAU | x included | Metered / non-chargeable | +| MAU | Additional $x per MAU over n | Metered / tiered | + +A plan is complete when it includes all the features needed to provide the access and charge the right price. + +## How to use and re-use features and charges + +Kinde structures plans so that they can share a pool of features and charges that you define at a high level. When you add the feature in a plan, you add the price, limits, and other differences uniquely in each plan. + +For example, you only need to define the item ‘Base price’ once, and then you define the price when you add it to each individual plan. + +Similarly, features that are inclusions, such as support hours included, just create one metered feature. Then set the limits of the feature differently for each plan level. E.g. Free plan one hour, Pro plan gets 2 hours, etc. + +![Model of how you can use the same feature or charge across plans](https://imagedelivery.net/skPPZTHzSlcslvHjesZQcQ/190e7ba8-ba26-4fb6-57b4-a4d6b9fec700/public) + +## Draft and published plans, and plan versioning + +Plans can be in two states: + +**Draft** - these plans are being developed and are not available for subscribers yet. + +**Published** - these plans are synced to Stripe and (if made available to users) can be signed up to. + +When a plan is published, Stripe creates entities like products and prices, as well as subscription (agreement) for when someone signs up to a plan. + +- Once a plan has a subscriber, the plan cannot be changed, only versioned. +- Only published plans can be included in a pricing table. + +Plan versioning is being worked on, but is not currently available. From 0f89c8bb5f4dbf1768ac80105ccaf2577f0ac679 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 5 Jun 2025 21:25:39 +1000 Subject: [PATCH 093/755] Update plan-selection.mdx --- .../plan-selection.mdx | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/src/content/docs/billing/billing-user-experience/plan-selection.mdx b/src/content/docs/billing/billing-user-experience/plan-selection.mdx index 16fdcdd8c..7c9cc4234 100644 --- a/src/content/docs/billing/billing-user-experience/plan-selection.mdx +++ b/src/content/docs/billing/billing-user-experience/plan-selection.mdx @@ -8,3 +8,105 @@ relatedArticles: app_context: - --- + +You can build a pricing table to enable your customers to select plans and go through a payment flow as part signing up to your app or site. + +Kinde's pricing table builder can generate a pricing table from published plans, or you can start with a blank one. + +You can also add and edit information and content in your preferred languages. You can create as many pricing tables as you want. + +![image.png](attachment:9e883e3d-bb80-4866-82b0-a35f14b38fa5:image.png) + +## Create a pricing table + +A pricing table can only have 4 plans. If your plans group + +1. Go to **Billing > Pricing tables**. +2. Select **Add pricing table**. +3. Choose an option: + 1. **Generate** a pricing table from a plan group - this pre-populates the pricing table with basic details and the plans based on the plan group you select. Up to 4 plans can be included on a pricing table. If your plan group contains more, you may want to create a new pricing table. + 2. **Create new** pricing table. Manually build the pricing table and add plans from a plan group. This gives you a blank slate to start in. +4. Select **Next**. + 1. **Generated** - select the group and then **Save**. + 2. **New** - complete the details in the window and **Save**. + +## Edit the pricing table + +You can edit a pricing table, but they are not versioned. Whatever content you override, it cannot be reverted or recovered. + +You cannot edit a plan price. This is inherited from the plan itself. + +## Change what plans show on a pricing table + +You can add and remove plans from the pricing table when it is being worked on. + +1. Open the pricing table. +2. Scroll to the **Plans** section. +3. To remove a plan: + 1. Select the three dots on the plan card and select **Remove from pricing table**. + 2. Confirm you want to remove the plan. This removes all custom content you have added, in all languages you have added content in, on the pricing table. The plan is removed. + 3. Select **Save**. +4. To add a plan, select **Add plan**. + 1. In the window that opens, select an available plan. Only plans from the same plan group are shown. + 2. Complete the details in the window for this plan. At minimum, you must enter a **Display name** and the **CTA button** content. This will be displayed in the pricing table. + 3. Select **Save**. The plan is added to the pricing table. + +## Change the order of plans on a pricing table + +The display order of plans from left to right corresponds to the position listed in the **Plans** section of the pricing table. + +1. Open the pricing table. +2. Scroll to the **Plans** section. +3. Select the three dots menu on the plan you want to move. +4. Select **Move up** or **Move down**, depending on the plan position. +5. Select **Save**. + +## Add a features list to a plan on the pricing table + +1. Open the pricing table. +2. Scroll to the **Plans** section. +3. Select the three dots menu on the plan and select **Edit content**. +4. In the top of the window, select the language you want to add features in. +5. Add a **Features list heading**. This sits directly above the list. +6. Add a list of features in the large text **Features list** field. Features will appear in the order they are listed. +7. Select **Save**. + +## Highlight a plan on a pricing table + +It’s common to want to call out or highlight something about a plan on the pricing table, for example, to highlight which plan is most popular. + +1. Open the pricing table. +2. Scroll to the **Plans** section. +3. Select the three dots menu on the plan and select **Edit content.** +4. In the top of the window, select the language you want to add highlight content. +5. Add a **Highlight label** and select **Save**. + +## Edit and translate pricing table content + +If you want to display pricing tables in multiple languages, you can change add content translations to the plans on the pricing table. + +1. Open the pricing table. +2. Scroll to the **Plans** section. +3. Select the three dots menu on the plan and select **Edit content.** +4. In the top of the window, select the language you want to add or edit content for. + + ![image.png](attachment:9aa6aaec-71d3-43fe-9a35-1b6c34f14c8d:image.png) + +5. Enter or edit all the content you want in the chosen language. +6. Select **Save**. + +## Make the pricing table live to customers + +We recommend only doing this after your plans are finalized and published. + +1. Open the pricing table. +2. Select **Make live**. +3. Select **Save**. If a user passes the pricing table code in a URL, they will be able to sign up using it. + +## Set pricing table to show as default in register flow + +You can set a pricing table to show by default, even if the code key is not passed in the URL during the normal sign up flow. + +1. Open the pricing table. +2. Select **Show by default**. +3. Select **Save**. If a user goes through the registration flow without a pricing table code key in the URL, this is the pricing table they will see. From fe20ff5d0800cafa9ee2036fc1eb19f32288cd66 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Thu, 5 Jun 2025 21:29:57 +1000 Subject: [PATCH 094/755] Update plan-selection.mdx --- .../billing/billing-user-experience/plan-selection.mdx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/content/docs/billing/billing-user-experience/plan-selection.mdx b/src/content/docs/billing/billing-user-experience/plan-selection.mdx index 7c9cc4234..162d620c3 100644 --- a/src/content/docs/billing/billing-user-experience/plan-selection.mdx +++ b/src/content/docs/billing/billing-user-experience/plan-selection.mdx @@ -4,7 +4,8 @@ title: Build a pricing table sidebar: order: 1 relatedArticles: - - + - 88e1773a-b681-441f-b4c7-d7d339116867 + - e6dde80d-2977-419f-a05a-62ad0a7ac6de app_context: - --- @@ -15,7 +16,7 @@ Kinde's pricing table builder can generate a pricing table from published plans, You can also add and edit information and content in your preferred languages. You can create as many pricing tables as you want. -![image.png](attachment:9e883e3d-bb80-4866-82b0-a35f14b38fa5:image.png) +![parts of a pricing table](https://imagedelivery.net/skPPZTHzSlcslvHjesZQcQ/7ec898d2-e5ae-4966-66d0-83d8a9f1b500/public) ## Create a pricing table @@ -90,7 +91,7 @@ If you want to display pricing tables in multiple languages, you can change add 3. Select the three dots menu on the plan and select **Edit content.** 4. In the top of the window, select the language you want to add or edit content for. - ![image.png](attachment:9aa6aaec-71d3-43fe-9a35-1b6c34f14c8d:image.png) + ![image.png](https://imagedelivery.net/skPPZTHzSlcslvHjesZQcQ/58587ad1-0077-47d7-faca-ea3dd6345d00/public) 5. Enter or edit all the content you want in the chosen language. 6. Select **Save**. From 9c91d3d5fc57b09ac348641d690c33a2cf7296ac Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Fri, 6 Jun 2025 09:13:19 +1000 Subject: [PATCH 095/755] Update sidebarData.ts Billing docs nav --- src/data/sidebarData.ts | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/data/sidebarData.ts b/src/data/sidebarData.ts index 71817b62d..3092c8962 100644 --- a/src/data/sidebarData.ts +++ b/src/data/sidebarData.ts @@ -146,8 +146,33 @@ const sidebarData = [ cardLink: "/billing/about-payments-and-plans/", items: [ { - label: "About payments and plans", - autogenerate: {directory: "billing/about-payments-and-plans"}, + label: "About billing", + autogenerate: {directory: "billing/about-billing"}, + collapsed: false + } + { + label: "Get started", + autogenerate: {directory: "billing/get-started"}, + collapsed: false + } + { + label: "Manage plans", + autogenerate: {directory: "billing/mange-plans"}, + collapsed: false + } + { + label: "Payment management", + autogenerate: {directory: "billing/payment-management"}, + collapsed: false + } + { + label: "Pricing", + autogenerate: {directory: "billing/pricing"}, + collapsed: false + } + { + label: "Billing user experience", + autogenerate: {directory: "billing/billing-user-experience"}, collapsed: false } ] From e8fb12290845eaf8888dc58cf541b3c118fea699 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Fri, 6 Jun 2025 10:07:27 +1000 Subject: [PATCH 096/755] Update self-serve-portal-for-orgs.mdx New topic to go with billing --- .../set-up-options/self-serve-portal-for-orgs.mdx | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/content/docs/build/set-up-options/self-serve-portal-for-orgs.mdx b/src/content/docs/build/set-up-options/self-serve-portal-for-orgs.mdx index 7d91bd7fa..2bff32c22 100644 --- a/src/content/docs/build/set-up-options/self-serve-portal-for-orgs.mdx +++ b/src/content/docs/build/set-up-options/self-serve-portal-for-orgs.mdx @@ -7,4 +7,18 @@ relatedArticles: - --- +You can configure a self-serve portal to enable authorized organization members to be able to self-manage functions provided by Kinde. For example, you can allow them to update their business details, payment details (if you have billing set up), multi-factor auth settings, and team members. +A self-serve portal means your customers can make basic account changes without contacting you for support. This can save time and money. + +## Configure the self-serve portal + +1. Go to **Settings > Environment > Self-serve portal**. +2. Enter the **Return URL** that you want users to land on when they exit the portal, e.g. your app dashboard. +3. Add an **Organization alias** to represent how your customers are referred to in your business, e.g. Account, Partner, Workspace, etc. This will be visible in the interface in the portal. +4. In the **Organization profile** section, select the functions you want organization admins to be able to manage. +5. Select **Save**. + +## Give an organization access to the portal + +TBC From 5b8e7de9c029737b0e998ffba389a005ca35cf4f Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Fri, 6 Jun 2025 11:01:50 +1000 Subject: [PATCH 097/755] Update create-plans.mdx Draft --- .../billing/manage-plans/create-plans.mdx | 97 ++++++++++++++++++- 1 file changed, 96 insertions(+), 1 deletion(-) diff --git a/src/content/docs/billing/manage-plans/create-plans.mdx b/src/content/docs/billing/manage-plans/create-plans.mdx index 7c0d3a868..3b9fa8854 100644 --- a/src/content/docs/billing/manage-plans/create-plans.mdx +++ b/src/content/docs/billing/manage-plans/create-plans.mdx @@ -4,8 +4,103 @@ title: Create plans sidebar: order: 2 relatedArticles: - - + - 88e1773a-b681-441f-b4c7-d7d339116867 + - e6dde80d-2977-419f-a05a-62ad0a7ac6de + - 46241baf-30aa-43c0-ac0c-b2b7e99941f1 app_context: - m: billing - s: plans --- + +Once you’ve got a list of plans, their features, prices, and details, you’re ready to create them in Kinde. + + + +### Add a plan + +1. Go to **Billing > Plans**. +2. If this is the first plan, select **Add plan** on the empty page. +3. If you already have plans, select **Add plan** under the group you want to add to. The **Add plan** window opens. + + ![Add plas window](https://imagedelivery.net/skPPZTHzSlcslvHjesZQcQ/92cf723a-f99c-465c-26cc-3f60c817b200/public) + + + +4. Give the plan a **Name** (e.g. `Free`), a **Description**, and a **Key** for referencing the plan in your code. This is the name that will also appear in the pricing table (if you use one). +5. Select the **Group** the plan belongs to (only if you have multiple plan groups). Otherwise the plan is added to the default group. +6. Select **Save draft**. + +### Add a subscription fee or fixed charge to a plan + +A fixed charge is a recurring monthly charge such as base price or subscription fee. + + + +1. Select **Add charge**. + 1. If the charge exists, select **Use existing feature** then select it from the list. + + + + 2. If this is a new charge, give the charge a name, e.g. `Base subscription fee`. If you plan to use this charge for other plans, make the name generic. +2. Add a **Line item description**. This appears on the customer invoice, so might be more specific than the name, e.g. `Base subscription - Pro plan`. +3. Set the price. (You may be asked to set a default currency if you haven’t already). +4. Select **Save**. +5. Select **Save draft**. +6. Repeat from step 1 for each fixed charge you want to add, or start adding features. + +### Add features (entitlements) to a plan + +Features describe the individual functions or entitlements that users get with their plan. These can be metered (chargeable) or unmetered (included). + +1. Select **Add feature**. + + ![Add feature window](https://imagedelivery.net/skPPZTHzSlcslvHjesZQcQ/ceb95ba9-1c03-4ae7-89f9-275ab3185100/public) + +2. To add a new feature, select **New unmetered** or **New metered**, then select **Next**. The **Add feature** window opens. +3. Enter a **Feature name**. Be sure to use something generic if you plan to use this feature again, e.g. `Included seats`. +4. Enter a **Description**. +5. Enter a **Key** for referencing the feature. +6. If you selected a unmetered feature, select **Save**. You’re done. Repeat from step 1 to add more features. +7. If you selected a metered feature, complete the rest of the details: + + ![Add feature window, select units](https://imagedelivery.net/skPPZTHzSlcslvHjesZQcQ/de016f2c-2477-4abd-9a2d-00e7c3e99300/public) + +8. Enter the **Maximum units** allowed on the plan. Leave blank if there is no limit. +9. Enter the **Unit measurement** name, e.g. `license`, `MAU` +10. If the item is separately chargeable, select a **Pricing model**. + + ![Add feature window, tiered prices](https://imagedelivery.net/skPPZTHzSlcslvHjesZQcQ/80ea9a38-e6ac-479f-9697-f04e237d4d00/publicg) + +11. Add a **Line item description**. This appears on the customer invoice, so might be more specific than the name, e.g. `Additional licenses for Pro (5)`. +12. For a flat unit price, enter the price and select **Save**. You’re finished. +13. For tiered pricing, select **Tiered - Graduated** and define each tier with unit numbers and add the price per unit. +14. Select **Add tier** to add a different price for higher unit tiers. For example, a unit might be $10 each if you use 1-10, but is $9 per unit if you use 11 or more. + + + +15. Select **Save.** +16. In the **Plan** window, select **Save** to commit your changes. +17. Repeat for each feature you want to add to the plan. Then repeat this procedure for each plan. + +**Next:** [Step 5 Publish plans](/billing/get-started/publish-plans/) + From 48005fcf98596232605254bda64ad9bdf7ce66bd Mon Sep 17 00:00:00 2001 From: Dave Berner Date: Sat, 7 Jun 2025 20:19:36 +1000 Subject: [PATCH 098/755] feat: add customize page --- .../customize-billing-pages.mdx | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 src/content/docs/billing/billing-user-experience/customize-billing-pages.mdx diff --git a/src/content/docs/billing/billing-user-experience/customize-billing-pages.mdx b/src/content/docs/billing/billing-user-experience/customize-billing-pages.mdx new file mode 100644 index 000000000..b2750b831 --- /dev/null +++ b/src/content/docs/billing/billing-user-experience/customize-billing-pages.mdx @@ -0,0 +1,69 @@ +--- +page_id: 961c2bf6-2683-4339-b42a-928e328ce74b +title: Customize billing pages +sidebar: + order: 2 +relatedArticles: + - 37d5ae8e-cfd1-4e5d-8333-387b6967ec23 + - 88e1773a-b681-441f-b4c7-d7d339116867 + - e6dde80d-2977-419f-a05a-62ad0a7ac6de +--- + +# Signing Up a Customer to a Plan + +When signing up a customer to a plan, you have three main options depending on how much control you want over the experience: + +--- + +## Option 1: Use Your Own Plan Selection Screen + +Display a plan selection screen in your own app or website. Once the user selects a plan, redirect them to Kinde to complete the payment flow. +To pre-select a plan, pass the `plan_interest` query parameter in the Kinde authentication URL. + +--- + +## Option 2: Use Kinde’s Built-in Plan Selection + +Let Kinde handle plan selection as part of the authentication flow. +To enable this: + +- Create a **Pricing Table** in Kinde +- Add and publish your plans +- Set the table to **Live** + +Kinde will then display the plan selection screen during signup. + +--- + +## Option 3: Assign a Plan via the Management API + +Use the Kinde Management API to assign a customer to a specific plan. +The next time the customer signs in, Kinde will automatically prompt them for payment details. + +This is ideal for: + +- Migrating customers from another system +- Assigning a plan without user input + +--- + +## Authentication Flow Screens + +Depending on the option you choose, users will see different screens during the authentication flow. There are three customizable screens: + +1. **Plan Selection** + Displayed when a user signs up for the first time and multiple plans are available. + +2. **Payment Details** + Shown after a user selects a plan—or if a plan was pre-selected before redirecting to Kinde. + +3. **Success** + Shown when signup and payment are successfully completed. + +--- + +## Customizing the Experience + +By default, all screens will inherit branding and styling from your Kinde [Design](/design/brand/global-brand-defaults/) settings. + +If you want more control, you can fully customize these screens using your own **HTML, CSS, and JavaScript** with the [Kinde Custom UI feature](/design/customize-with-code/customize-with-css-html/). From e28a34b4d591c9a36e9b6e425079a9cc38dd0ddb Mon Sep 17 00:00:00 2001 From: Dave Berner Date: Sun, 8 Jun 2025 07:02:01 +1000 Subject: [PATCH 099/755] feat: add workflow docs --- .../plan-cancellation-request-workflow.mdx | 56 +++++++++++++++++ .../plan-selection-workflow.mdx | 62 +++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 src/content/docs/workflows/example-workflows/plan-cancellation-request-workflow.mdx create mode 100644 src/content/docs/workflows/example-workflows/plan-selection-workflow.mdx diff --git a/src/content/docs/workflows/example-workflows/plan-cancellation-request-workflow.mdx b/src/content/docs/workflows/example-workflows/plan-cancellation-request-workflow.mdx new file mode 100644 index 000000000..c3670a8f2 --- /dev/null +++ b/src/content/docs/workflows/example-workflows/plan-cancellation-request-workflow.mdx @@ -0,0 +1,56 @@ +--- +page_id: f197d00e-1fc8-46ed-8290-35773532cd2d +title: Plan cancellation request workflow +sidebar: + order: 10 +relatedArticles: + - 54e9d131-96a6-4d09-8355-0b748a4cd106 + - d672fca7-6c6a-49f8-85c9-6e86ce99f440 +--- + +Trigger: `user:plan_cancellation_request` + +This trigger fires when a plan cancellation request is made. This can be initiated by the user through the Kinde self-serve portal or via the Kinde Management API. + +This is not a deprovisioning workflow, this occurs before a cancellation request is processed.. + +## Example use cases + +### Check if customer is eligible to cancel + +You may want to check if the customer is eligible to cancel their plan based on certain criteria, such as outstanding payments or minimum contract periods. If they are not eligible, you can prevent the cancellation and notify them. + +## Workflow code + +### M2M token binding + +The [kinde.planCancellationRequest](/workflows/bindings/m2m-token-binding/) binding is used to prevent cancellation requests. + +### Sample event object + +The main argument provided to your code is the Kinde workflow `event` object which has two keys `request` and `context`. This gives you access to the reason the workflow was triggered. Here's an example: + +```json +{ + "request": { + "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:135.0) Gecko/20100101 Firefox/135.0", + "ip": "192.168.0.1" + }, + "context": { + "domains": { + "kindeDomain": "https://example.kinde.com" // Your Kinde domain + }, + "billing": { + "currentPlanCode": "pro", + "agreementId": "agreement_01971a7c5c7bf2d05888a8d6c77d08ce" // the subscription ID in Kinde + }, + "workflow": { + "trigger": "user:plan_cancellation_request" + } + } +} +``` + +### Example workflows + +Coming soon. diff --git a/src/content/docs/workflows/example-workflows/plan-selection-workflow.mdx b/src/content/docs/workflows/example-workflows/plan-selection-workflow.mdx new file mode 100644 index 000000000..ceff22301 --- /dev/null +++ b/src/content/docs/workflows/example-workflows/plan-selection-workflow.mdx @@ -0,0 +1,62 @@ +--- +page_id: 54e9d131-96a6-4d09-8355-0b748a4cd106 +title: Plan cancellation request workflow +sidebar: + order: 9 +relatedArticles: + - f197d00e-1fc8-46ed-8290-35773532cd2d + - d672fca7-6c6a-49f8-85c9-6e86ce99f440 +--- + +Trigger: `user:plan_selection` + +This trigger fires when a plan selection request is made. This can be initiated by the user through the Kinde self-serve portal or via the Kinde Management API. + +This is not a provisioning workflow, this occurs before plan selection or any payments are processed. + +## Example use cases + +### Check if customer is eligible to change plan + +You may want to check if the customer is eligible to change their plan based on certain criteria. For example, if they are trying to downgrade to a plan with a lower usage usage allowance that their current plan but they are already breaching the limits. + +## Workflow code + +### Plan selection binding + +The [kinde.planSelection](/workflows/bindings/plan-selection/) binding is used to prevent plan change requests. + +### Sample event object + +The main argument provided to your code is the Kinde workflow `event` object which has two keys `request` and `context`. This gives you access to the reason the workflow was triggered. Here's an example: + +```json +{ + "request": { + "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:135.0) Gecko/20100101 Firefox/135.0", + "ip": "192.168.0.1" + }, + "context": { + "domains": { + "kindeDomain": "https://example.kinde.com" // Your Kinde domain + }, + "billing": { + "currentPlanCode": "professional", // plan they are changing from + "requestedPlanCode": "free" // plan they are changing to + }, + "user": { + "id": "kp_1234566" // the user ID + }, + "organization": { + "code": "org_123456" // the organization code if applicable + }, + "workflow": { + "trigger": "user:plan_selection" + } + } +} +``` + +### Example workflows + +Coming soon. From 480202ec0925e188fe069d91a3cc95937be21112 Mon Sep 17 00:00:00 2001 From: Dave Berner Date: Sun, 8 Jun 2025 07:10:44 +1000 Subject: [PATCH 100/755] feat: bindings --- .../plan-cancellation-request-binding.mdx | 56 +++++++++++++++++++ .../bindings/plan-selection-binding.mdx | 56 +++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 src/content/docs/workflows/bindings/plan-cancellation-request-binding.mdx create mode 100644 src/content/docs/workflows/bindings/plan-selection-binding.mdx diff --git a/src/content/docs/workflows/bindings/plan-cancellation-request-binding.mdx b/src/content/docs/workflows/bindings/plan-cancellation-request-binding.mdx new file mode 100644 index 000000000..6f517e694 --- /dev/null +++ b/src/content/docs/workflows/bindings/plan-cancellation-request-binding.mdx @@ -0,0 +1,56 @@ +--- +page_id: 4b477e97-8a76-4419-b796-9193e4e73771 +title: kinde.planCancellationRequest +sidebar: + order: 12 +relatedArticles: + - af03409d-465f-4beb-8f9e-47eb97cfbf41 + - 5917da0f-24f0-48df-a387-aca03ce1fe7a +--- + +The `kinde.planCancellationRequest` binding provides methods to use when a plan cancellation request is initiated. + +## Methods + +### `deny(reason: string): void` + +Prevent the user from cancelling their plan. + +## Available in workflows + +- [user:plan_cancellation_request](/workflows/example-workflows/plan-cancellation-request-workflow/) + +## Configuration + +```js +export const workflowSettings = { + // ...other settings + bindings: {"kinde.planCancellationRequest": {}} +}; +``` + +## Usage + +### Using the Kinde infrastructure library (recommended) + +The [Kinde infrastructure library](https://github.com/kinde-oss/infrastructure) provides a type-safe helper: + +```js +import { denyPlanCancellation } from "@kinde/infrastructure"; + +export default async function (event: onPlanCancellationRequestedEvent) { + if (!canCancelPlan()) { + denyPlanCancellation("You are not allowed to cancel your plan as you have outstanding payments"); + } +} +``` + +### Using the low-level API + +If you're not using the infrastructure library, you can call the underlying API directly: + +```js +kinde.planCancellationRequest.deny( + "You are not allowed to cancel your plan as you have outstanding payments" +); +``` diff --git a/src/content/docs/workflows/bindings/plan-selection-binding.mdx b/src/content/docs/workflows/bindings/plan-selection-binding.mdx new file mode 100644 index 000000000..0bb1e16c6 --- /dev/null +++ b/src/content/docs/workflows/bindings/plan-selection-binding.mdx @@ -0,0 +1,56 @@ +--- +page_id: af03409d-465f-4beb-8f9e-47eb97cfbf41 +title: kinde.planSelection +sidebar: + order: 11 +relatedArticles: + - 4b477e97-8a76-4419-b796-9193e4e73771 + - 5917da0f-24f0-48df-a387-aca03ce1fe7a +--- + +The `kinde.planSelection` binding provides methods to use when a plan selection is made. + +## Methods + +### `deny(reason: string): void` + +Prevent the user from changing their plan. + +## Available in workflows + +- [user:plan_selection](/workflows/example-workflows/plan-selection-workflow/) + +## Configuration + +```js +export const workflowSettings = { + // ...other settings + bindings: {"kinde.planSelection": {}} +}; +``` + +## Usage + +### Using the Kinde infrastructure library (recommended) + +The [Kinde infrastructure library](https://github.com/kinde-oss/infrastructure) provides a type-safe helper: + +```js +import { denyPlanSelection } from "@kinde/infrastructure"; + +export default async function (event: onplanSelectionedEvent) { + if (!canCancelPlan()) { + denyPlanSelection("You are not allowed to change your plan as you have outstanding payments"); + } +} +``` + +### Using the low-level API + +If you're not using the infrastructure library, you can call the underlying API directly: + +```js +kinde.planSelection.deny( + "You are not allowed to change your plan as you have outstanding payments" +); +``` From b951aec442e73f6de6bacec63b33f847989db13f Mon Sep 17 00:00:00 2001 From: Dave Berner Date: Mon, 9 Jun 2025 05:51:41 +1000 Subject: [PATCH 101/755] feat: add bindings to directory --- src/content/docs/workflows/bindings/index.mdx | 2 ++ src/content/docs/workflows/configuration/bindings.mdx | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/content/docs/workflows/bindings/index.mdx b/src/content/docs/workflows/bindings/index.mdx index 88395f321..b36f56eb7 100644 --- a/src/content/docs/workflows/bindings/index.mdx +++ b/src/content/docs/workflows/bindings/index.mdx @@ -24,6 +24,8 @@ The following bindings are available. Only some are available within specific wo - [kinde.idToken](/workflows/bindings/id-token-binding/) - [kinde.m2mToken](/workflows/bindings/m2m-token-binding/) - [kinde.mfa](/workflows/bindings/mfa-binding/) +- [kinde.planCancellationRequest](/workflows/bindings/plan-cancellation-request-binding/) +- [kinde.planSelection](/workflows/bindings/plan-selection-binding/) - [kinde.secureFetch](/workflows/bindings/secure-fetch-binding/) ### Native bindings diff --git a/src/content/docs/workflows/configuration/bindings.mdx b/src/content/docs/workflows/configuration/bindings.mdx index fae059d0b..c06051171 100644 --- a/src/content/docs/workflows/configuration/bindings.mdx +++ b/src/content/docs/workflows/configuration/bindings.mdx @@ -37,6 +37,8 @@ The following bindings available, but only within certain workflow contexts. Che - [kinde.idToken](/workflows/bindings/id-token-binding/) - [kinde.m2mToken](/workflows/bindings/m2m-token-binding/) - [kinde.mfa](/workflows/bindings/mfa-binding/) +- [kinde.planCancellationRequest](/workflows/bindings/plan-cancellation-request-binding/) +- [kinde.planSelection](/workflows/bindings/plan-selection-binding/) - [kinde.secureFetch](/workflows/bindings/secure-fetch-binding/) ### Native bindings From b27dd72e7bd52ca8b3c019a6a105d55e211509e0 Mon Sep 17 00:00:00 2001 From: Dave Berner Date: Mon, 9 Jun 2025 06:29:21 +1000 Subject: [PATCH 102/755] feat: org portal access --- .../self-serve-portal-for-orgs.mdx | 76 ++++++++++++++++++- 1 file changed, 72 insertions(+), 4 deletions(-) diff --git a/src/content/docs/build/set-up-options/self-serve-portal-for-orgs.mdx b/src/content/docs/build/set-up-options/self-serve-portal-for-orgs.mdx index 2bff32c22..0ab1ae474 100644 --- a/src/content/docs/build/set-up-options/self-serve-portal-for-orgs.mdx +++ b/src/content/docs/build/set-up-options/self-serve-portal-for-orgs.mdx @@ -4,10 +4,10 @@ title: Enable self-serve portal for orgs sidebar: order: 7 relatedArticles: - - + - --- -You can configure a self-serve portal to enable authorized organization members to be able to self-manage functions provided by Kinde. For example, you can allow them to update their business details, payment details (if you have billing set up), multi-factor auth settings, and team members. +You can configure a self-serve portal to enable authorized organization members to be able to self-manage functions provided by Kinde. For example, you can allow them to update their business details, payment details (if you have billing set up), multi-factor auth settings, and manage organization members. A self-serve portal means your customers can make basic account changes without contacting you for support. This can save time and money. @@ -19,6 +19,74 @@ A self-serve portal means your customers can make basic account changes without 4. In the **Organization profile** section, select the functions you want organization admins to be able to manage. 5. Select **Save**. -## Give an organization access to the portal +## Portal Access Control with System Permissions -TBC +Each core function within the self-serve portal is governed by a corresponding system permission. For example, the `org:write:billing` permission allows users to update billing details. + +These permissions can be included in your custom roles and assigned to organization members. + +We recommend creating custom roles with varying levels of portal access, which you can then assign as needed. For instance, you might create a role that allows members to view billing details but not update them. + +When configuring a role, you can specify whether it should be: + +- Automatically assigned to all new organization members. +- Automatically assigned to the organization creator. + +## Generating the Self-Serve Portal Link + +Access to the portal is granted via a one-time link. There are two main ways to generate this link: + +- **Using the user's access token** (recommended) +- **Using the Kinde Management API** + +### Using the User's Access Token + +This method is ideal when you want to generate the portal link on the fly—for example, when a user clicks an "Account" button in your app. + +#### With a Kinde SDK + +If you're using the Kinde React SDK, you can use the `` component, which both generates the link and redirects the user: + +```jsx +import {PortalLink} from "@kinde-oss/kinde-auth-react"; + +Account; +``` + +#### Without a Kinde SDK + +If you're not using a Kinde SDK, you can manually call the Account API: + +```js +const response = await fetch("/api/v1/account_api/portal_link", { + headers: { + Authorization: `Bearer ${userAccessToken}` + } +}); +const data = await response.json(); +window.location = data.url; +``` + +Optional parameters: + +- `return_url` – where to redirect the user after exiting the portal. +- `sub_nav` – specify the portal section to open (e.g., `organization_billing`, `profile`). + +### Using the Kinde Management API + +This option is useful for server-side applications or if you're using Kinde Billing without Kinde Auth. + +Make a request to the `POST /api/v1/portal/generate_url` endpoint using an M2M token. + +#### Request Body + +```json +{ + "user_id": "kp_1234567890", // The ID of the user for whom you want to generate the portal link + "organization_code": "org_123456789", // Optional: the organization code for which the portal link is generated + "return_url": "https://yourapp.com/dashboard", // Optional: where to redirect the user after exiting the portal + "sub_nav": "profile" // Optional: specify the portal section to open (e.g., `organization_billing`, `profile`) +} +``` + +This will return a one-time portal link for the specified user. From 5702972e4134a95e6da56657c77d4b1356baba0a Mon Sep 17 00:00:00 2001 From: Dave Berner Date: Mon, 9 Jun 2025 08:04:50 +1000 Subject: [PATCH 103/755] chore: update bindings to latest --- src/content/docs/workflows/bindings/index.mdx | 3 +- .../docs/workflows/bindings/plan-binding.mdx | 87 +++++++++++++++++++ .../plan-cancellation-request-binding.mdx | 56 ------------ .../bindings/plan-selection-binding.mdx | 56 ------------ .../docs/workflows/configuration/bindings.mdx | 3 +- 5 files changed, 89 insertions(+), 116 deletions(-) create mode 100644 src/content/docs/workflows/bindings/plan-binding.mdx delete mode 100644 src/content/docs/workflows/bindings/plan-cancellation-request-binding.mdx delete mode 100644 src/content/docs/workflows/bindings/plan-selection-binding.mdx diff --git a/src/content/docs/workflows/bindings/index.mdx b/src/content/docs/workflows/bindings/index.mdx index b36f56eb7..7d1a1294a 100644 --- a/src/content/docs/workflows/bindings/index.mdx +++ b/src/content/docs/workflows/bindings/index.mdx @@ -24,8 +24,7 @@ The following bindings are available. Only some are available within specific wo - [kinde.idToken](/workflows/bindings/id-token-binding/) - [kinde.m2mToken](/workflows/bindings/m2m-token-binding/) - [kinde.mfa](/workflows/bindings/mfa-binding/) -- [kinde.planCancellationRequest](/workflows/bindings/plan-cancellation-request-binding/) -- [kinde.planSelection](/workflows/bindings/plan-selection-binding/) +- [kinde.plan](/workflows/bindings/plan-binding/) - [kinde.secureFetch](/workflows/bindings/secure-fetch-binding/) ### Native bindings diff --git a/src/content/docs/workflows/bindings/plan-binding.mdx b/src/content/docs/workflows/bindings/plan-binding.mdx new file mode 100644 index 000000000..59ecfe2c7 --- /dev/null +++ b/src/content/docs/workflows/bindings/plan-binding.mdx @@ -0,0 +1,87 @@ +--- +page_id: af03409d-465f-4beb-8f9e-47eb97cfbf41 +title: kinde.plan +sidebar: + order: 11 +relatedArticles: + - 4b477e97-8a76-4419-b796-9193e4e73771 + - 5917da0f-24f0-48df-a387-aca03ce1fe7a +--- + +The `kinde.plan` binding provides methods to use for various plan related events such as when a customer requests to cancel or change their plan. + +## Available in workflows + +- [user:plan_cancellation_request](/workflows/example-workflows/plan-cancellation-request-workflow/) +- [user:plan_selection](/workflows/example-workflows/plan-selection-workflow/) + +## Configuration + +```js +export const workflowSettings = { + // ...other settings + bindings: {"kinde.plan": {}} +}; +``` + +## Methods + +### `denySelection(reason: string, suggestions: string[]): void` + +Prevent the user from changing their plan. + +#### Usage + +### Using the Kinde infrastructure library (recommended) + +The [Kinde infrastructure library](https://github.com/kinde-oss/infrastructure) provides a type-safe helper: + +```js +import { denyPlanSelection } from "@kinde/infrastructure"; + +export default async function (event: onPlanSelectionEvent) { + if (!canChangePlan()) { + denyPlanSelection("You are not allowed to change your plan as you have outstanding payments"); + } +} +``` + +#### Using the low-level API + +If you're not using the infrastructure library, you can call the underlying API directly: + +```js +kinde.plan.denySelection( + "You are not allowed to change your plan as you have outstanding payments" +); +``` + +### `denyCancellation(reason: string): void` + +Prevent the user from cancelling their plan. + +#### Usage + +### Using the Kinde infrastructure library (recommended) + +The [Kinde infrastructure library](https://github.com/kinde-oss/infrastructure) provides a type-safe helper: + +```js +import { denyPlanCancellation } from "@kinde/infrastructure"; + +export default async function (event: onPlanCancellationRequestEvent) { + if (!canChangePlan()) { + denyPlanCancellation("You are not allowed to change your plan as you have outstanding payments"); + } +} +``` + +#### Using the low-level API + +If you're not using the infrastructure library, you can call the underlying API directly: + +```js +kinde.plan.denyCancellation( + "You are not allowed to cancel your plan as you have outstanding payments" +); +``` diff --git a/src/content/docs/workflows/bindings/plan-cancellation-request-binding.mdx b/src/content/docs/workflows/bindings/plan-cancellation-request-binding.mdx deleted file mode 100644 index 6f517e694..000000000 --- a/src/content/docs/workflows/bindings/plan-cancellation-request-binding.mdx +++ /dev/null @@ -1,56 +0,0 @@ ---- -page_id: 4b477e97-8a76-4419-b796-9193e4e73771 -title: kinde.planCancellationRequest -sidebar: - order: 12 -relatedArticles: - - af03409d-465f-4beb-8f9e-47eb97cfbf41 - - 5917da0f-24f0-48df-a387-aca03ce1fe7a ---- - -The `kinde.planCancellationRequest` binding provides methods to use when a plan cancellation request is initiated. - -## Methods - -### `deny(reason: string): void` - -Prevent the user from cancelling their plan. - -## Available in workflows - -- [user:plan_cancellation_request](/workflows/example-workflows/plan-cancellation-request-workflow/) - -## Configuration - -```js -export const workflowSettings = { - // ...other settings - bindings: {"kinde.planCancellationRequest": {}} -}; -``` - -## Usage - -### Using the Kinde infrastructure library (recommended) - -The [Kinde infrastructure library](https://github.com/kinde-oss/infrastructure) provides a type-safe helper: - -```js -import { denyPlanCancellation } from "@kinde/infrastructure"; - -export default async function (event: onPlanCancellationRequestedEvent) { - if (!canCancelPlan()) { - denyPlanCancellation("You are not allowed to cancel your plan as you have outstanding payments"); - } -} -``` - -### Using the low-level API - -If you're not using the infrastructure library, you can call the underlying API directly: - -```js -kinde.planCancellationRequest.deny( - "You are not allowed to cancel your plan as you have outstanding payments" -); -``` diff --git a/src/content/docs/workflows/bindings/plan-selection-binding.mdx b/src/content/docs/workflows/bindings/plan-selection-binding.mdx deleted file mode 100644 index 0bb1e16c6..000000000 --- a/src/content/docs/workflows/bindings/plan-selection-binding.mdx +++ /dev/null @@ -1,56 +0,0 @@ ---- -page_id: af03409d-465f-4beb-8f9e-47eb97cfbf41 -title: kinde.planSelection -sidebar: - order: 11 -relatedArticles: - - 4b477e97-8a76-4419-b796-9193e4e73771 - - 5917da0f-24f0-48df-a387-aca03ce1fe7a ---- - -The `kinde.planSelection` binding provides methods to use when a plan selection is made. - -## Methods - -### `deny(reason: string): void` - -Prevent the user from changing their plan. - -## Available in workflows - -- [user:plan_selection](/workflows/example-workflows/plan-selection-workflow/) - -## Configuration - -```js -export const workflowSettings = { - // ...other settings - bindings: {"kinde.planSelection": {}} -}; -``` - -## Usage - -### Using the Kinde infrastructure library (recommended) - -The [Kinde infrastructure library](https://github.com/kinde-oss/infrastructure) provides a type-safe helper: - -```js -import { denyPlanSelection } from "@kinde/infrastructure"; - -export default async function (event: onplanSelectionedEvent) { - if (!canCancelPlan()) { - denyPlanSelection("You are not allowed to change your plan as you have outstanding payments"); - } -} -``` - -### Using the low-level API - -If you're not using the infrastructure library, you can call the underlying API directly: - -```js -kinde.planSelection.deny( - "You are not allowed to change your plan as you have outstanding payments" -); -``` diff --git a/src/content/docs/workflows/configuration/bindings.mdx b/src/content/docs/workflows/configuration/bindings.mdx index c06051171..c7b4e3394 100644 --- a/src/content/docs/workflows/configuration/bindings.mdx +++ b/src/content/docs/workflows/configuration/bindings.mdx @@ -37,8 +37,7 @@ The following bindings available, but only within certain workflow contexts. Che - [kinde.idToken](/workflows/bindings/id-token-binding/) - [kinde.m2mToken](/workflows/bindings/m2m-token-binding/) - [kinde.mfa](/workflows/bindings/mfa-binding/) -- [kinde.planCancellationRequest](/workflows/bindings/plan-cancellation-request-binding/) -- [kinde.planSelection](/workflows/bindings/plan-selection-binding/) +- [kinde.plan](/workflows/bindings/plan-binding/) - [kinde.secureFetch](/workflows/bindings/secure-fetch-binding/) ### Native bindings From fee68a4a6516d5de56fb39ecf24778233ced8b60 Mon Sep 17 00:00:00 2001 From: Dave Berner Date: Mon, 9 Jun 2025 12:48:51 +1000 Subject: [PATCH 104/755] feat: add trigger details and examples --- .../plan-cancellation-request-workflow.mdx | 15 +++++++++++---- .../example-workflows/plan-selection-workflow.mdx | 15 ++++++++++++--- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/content/docs/workflows/example-workflows/plan-cancellation-request-workflow.mdx b/src/content/docs/workflows/example-workflows/plan-cancellation-request-workflow.mdx index c3670a8f2..2e2d8477a 100644 --- a/src/content/docs/workflows/example-workflows/plan-cancellation-request-workflow.mdx +++ b/src/content/docs/workflows/example-workflows/plan-cancellation-request-workflow.mdx @@ -12,7 +12,12 @@ Trigger: `user:plan_cancellation_request` This trigger fires when a plan cancellation request is made. This can be initiated by the user through the Kinde self-serve portal or via the Kinde Management API. -This is not a deprovisioning workflow, this occurs before a cancellation request is processed.. +This is not a deprovisioning workflow, this occurs before a cancellation request is processed. + +This event is triggered when: + +- the user asks to cancel their plan in the Kinde self-serve portal +- plan cancellation is initiated via the Kinde Management API ## Example use cases @@ -22,9 +27,9 @@ You may want to check if the customer is eligible to cancel their plan based on ## Workflow code -### M2M token binding +### Plan binding -The [kinde.planCancellationRequest](/workflows/bindings/m2m-token-binding/) binding is used to prevent cancellation requests. +The [kinde.plan](/workflows/bindings/plan-binding/) binding is used for plan related actions, such as denying a cancellation request. ### Sample event object @@ -53,4 +58,6 @@ The main argument provided to your code is the Kinde workflow `event` object whi ### Example workflows -Coming soon. +See examples on GitHub: + +[Deny cancellation request](https://github.com/kinde-starter-kits/workflow-examples/blob/main/planCancellationRequest/denyPlanCancellation.ts) - Deny a plan cancellation request from a user. diff --git a/src/content/docs/workflows/example-workflows/plan-selection-workflow.mdx b/src/content/docs/workflows/example-workflows/plan-selection-workflow.mdx index ceff22301..fb11c50c4 100644 --- a/src/content/docs/workflows/example-workflows/plan-selection-workflow.mdx +++ b/src/content/docs/workflows/example-workflows/plan-selection-workflow.mdx @@ -14,6 +14,13 @@ This trigger fires when a plan selection request is made. This can be initiated This is not a provisioning workflow, this occurs before plan selection or any payments are processed. +This event is triggered when: + +- the user selects a new plan in the Kinde self-serve portal +- changing a customers plan via the Kinde Management API + +It does not trigger when a plan is automatically assigned to a customer, such as when they sign up for the first time. + ## Example use cases ### Check if customer is eligible to change plan @@ -22,9 +29,9 @@ You may want to check if the customer is eligible to change their plan based on ## Workflow code -### Plan selection binding +### Plan binding -The [kinde.planSelection](/workflows/bindings/plan-selection/) binding is used to prevent plan change requests. +The [kinde.plan](/workflows/bindings/plan-binding/) binding is used for various plan related events such as to prevent plan change requests. ### Sample event object @@ -59,4 +66,6 @@ The main argument provided to your code is the Kinde workflow `event` object whi ### Example workflows -Coming soon. +See examples on GitHub: + +[Deny plan change request](https://github.com/kinde-starter-kits/workflow-examples/blob/main/planSelection/denyPlanChangeWorkflow.ts) - Deny a plan change request from a user and return the reasons for rejecting the request. From 7182d54b71ed897a14fa679d74c2a0760de680a6 Mon Sep 17 00:00:00 2001 From: Dave Berner Date: Mon, 9 Jun 2025 12:56:11 +1000 Subject: [PATCH 105/755] feat: fix missing columns --- src/data/sidebarData.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/data/sidebarData.ts b/src/data/sidebarData.ts index 3092c8962..b4891a22c 100644 --- a/src/data/sidebarData.ts +++ b/src/data/sidebarData.ts @@ -149,27 +149,27 @@ const sidebarData = [ label: "About billing", autogenerate: {directory: "billing/about-billing"}, collapsed: false - } + }, { label: "Get started", autogenerate: {directory: "billing/get-started"}, collapsed: false - } + }, { label: "Manage plans", autogenerate: {directory: "billing/mange-plans"}, collapsed: false - } + }, { label: "Payment management", autogenerate: {directory: "billing/payment-management"}, collapsed: false - } + }, { label: "Pricing", autogenerate: {directory: "billing/pricing"}, collapsed: false - } + }, { label: "Billing user experience", autogenerate: {directory: "billing/billing-user-experience"}, From d6ee28b397a6019e28018d92dc84882bbd87c654 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 11 Jun 2025 09:24:44 +1000 Subject: [PATCH 106/755] Update about-billing.mdx Frontmatter cleanup --- src/content/docs/billing/about-billing/about-billing.mdx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/content/docs/billing/about-billing/about-billing.mdx b/src/content/docs/billing/about-billing/about-billing.mdx index 478e2ce2b..9f447a088 100644 --- a/src/content/docs/billing/about-billing/about-billing.mdx +++ b/src/content/docs/billing/about-billing/about-billing.mdx @@ -4,9 +4,7 @@ title: About billing sidebar: order: 1 relatedArticles: - - -app_context: - - + - 100f75f1-a0a4-459f-874f-da127f2d0615 --- Kinde billing gives you the ability to create plans that users can subscribe to, so you can get paid for your services and collect revenue. From b73f8a74580afb391e1f189db489ac19a25136c0 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 11 Jun 2025 09:25:20 +1000 Subject: [PATCH 107/755] Update about-billing.mdx --- src/content/docs/billing/about-billing/about-billing.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/billing/about-billing/about-billing.mdx b/src/content/docs/billing/about-billing/about-billing.mdx index 9f447a088..3a0be6233 100644 --- a/src/content/docs/billing/about-billing/about-billing.mdx +++ b/src/content/docs/billing/about-billing/about-billing.mdx @@ -28,7 +28,7 @@ Billing is a really complex area of app development, so while this release is te ### How to send feedback -It would be amazing if you can send any feedback you have via [not sure where] so we can quickly collect and prioritize improvements. +It would be amazing if you can send any feedback you have support@kinde.com so we can quickly collect and prioritize improvements. ## Known limitations From d8207bb72b2fb96c09a216c6b016c9dd9fb0cb9f Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 11 Jun 2025 09:26:43 +1000 Subject: [PATCH 108/755] Update billing-concepts-terms.mdx --- .../docs/billing/about-billing/billing-concepts-terms.mdx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/content/docs/billing/about-billing/billing-concepts-terms.mdx b/src/content/docs/billing/about-billing/billing-concepts-terms.mdx index 74199502f..d89fa0880 100644 --- a/src/content/docs/billing/about-billing/billing-concepts-terms.mdx +++ b/src/content/docs/billing/about-billing/billing-concepts-terms.mdx @@ -4,9 +4,8 @@ title: Billing concepts & terms sidebar: order: relatedArticles: - - -app_context: - - + - 100f75f1-a0a4-459f-874f-da127f2d0615 + - bd6757e3-81d5-48d6-89c8-dd4c222ac647 --- From 3f05b0f253649edacf086773bdd89ccfd87a3146 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 11 Jun 2025 09:27:23 +1000 Subject: [PATCH 109/755] Update kinde-billing-model.mdx --- src/content/docs/billing/about-billing/kinde-billing-model.mdx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/content/docs/billing/about-billing/kinde-billing-model.mdx b/src/content/docs/billing/about-billing/kinde-billing-model.mdx index 1ec2ea8c7..84955798e 100644 --- a/src/content/docs/billing/about-billing/kinde-billing-model.mdx +++ b/src/content/docs/billing/about-billing/kinde-billing-model.mdx @@ -4,7 +4,8 @@ title: The Kinde billing model sidebar: order: 2 relatedArticles: - - + - bd6757e3-81d5-48d6-89c8-dd4c222ac647 + - 9d1daf85-1a2c-4cc5-879a-230c950bed12 --- In the Kinde model, we host everything except the payment processing part of billing. Kinde integrates with a third-party payment gateway (Stripe) for secure payment processing. From 89646662e897e5ae84bf875a5cd11fe55cb7a132 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 11 Jun 2025 09:27:58 +1000 Subject: [PATCH 110/755] Update plan-selection.mdx --- .../docs/billing/billing-user-experience/plan-selection.mdx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/content/docs/billing/billing-user-experience/plan-selection.mdx b/src/content/docs/billing/billing-user-experience/plan-selection.mdx index 162d620c3..38c317a59 100644 --- a/src/content/docs/billing/billing-user-experience/plan-selection.mdx +++ b/src/content/docs/billing/billing-user-experience/plan-selection.mdx @@ -6,8 +6,6 @@ sidebar: relatedArticles: - 88e1773a-b681-441f-b4c7-d7d339116867 - e6dde80d-2977-419f-a05a-62ad0a7ac6de -app_context: - - --- You can build a pricing table to enable your customers to select plans and go through a payment flow as part signing up to your app or site. From 02cec5d453660e4da6a6f467bf5af905076d7adb Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 11 Jun 2025 09:28:42 +1000 Subject: [PATCH 111/755] Update plan-selection.mdx --- .../docs/billing/billing-user-experience/plan-selection.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/billing/billing-user-experience/plan-selection.mdx b/src/content/docs/billing/billing-user-experience/plan-selection.mdx index 38c317a59..2325a3fdc 100644 --- a/src/content/docs/billing/billing-user-experience/plan-selection.mdx +++ b/src/content/docs/billing/billing-user-experience/plan-selection.mdx @@ -18,7 +18,7 @@ You can also add and edit information and content in your preferred languages. Y ## Create a pricing table -A pricing table can only have 4 plans. If your plans group +A pricing table can only have 4 plans. 1. Go to **Billing > Pricing tables**. 2. Select **Add pricing table**. From e93d77b91748da8d10d3772b668fcb231b20a91c Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 11 Jun 2025 09:29:44 +1000 Subject: [PATCH 112/755] Update add-pricing-table.mdx --- src/content/docs/billing/get-started/add-pricing-table.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/billing/get-started/add-pricing-table.mdx b/src/content/docs/billing/get-started/add-pricing-table.mdx index 681cdb802..0f20fbd72 100644 --- a/src/content/docs/billing/get-started/add-pricing-table.mdx +++ b/src/content/docs/billing/get-started/add-pricing-table.mdx @@ -16,6 +16,6 @@ Kinde lets you create pricing tables based on your plans. The tables can be inte To create your own, go to [Build a pricing table](/billing/billing-user-experience/plan-selection/). -If you have your own screen flows for plan display and selection, you do not have to use Kinde’s pricing tables. Here's how to use your own, and not Kinde's [Link to topic] +If you have your own screen flows for plan display and selection, you do not have to use Kinde’s pricing tables. **Next:** [Step 7 Set up self-serve portal (optional)](/billing/get-started/self-serve-portal-setup/) From 4cea58cf5672ccc39b2fe676fcf47b02cafd39bb Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 11 Jun 2025 09:30:40 +1000 Subject: [PATCH 113/755] Update connect-to-stripe.mdx --- src/content/docs/billing/get-started/connect-to-stripe.mdx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/content/docs/billing/get-started/connect-to-stripe.mdx b/src/content/docs/billing/get-started/connect-to-stripe.mdx index 0d0c70ad6..75d4fa88b 100644 --- a/src/content/docs/billing/get-started/connect-to-stripe.mdx +++ b/src/content/docs/billing/get-started/connect-to-stripe.mdx @@ -4,9 +4,7 @@ title: Step 3 Connect to Stripe sidebar: order: 4 relatedArticles: - - -app_context: - - + - 8770ef89-e805-475f-b4f5-a86c1e1eccc1 --- Kinde’s billing feature comes with a dependency on [Stripe](https://stripe.com), which is a known and reliable payments processing platform. A new Stripe account is automatically created for you when you set up billing in Kinde. From 4775e095033283395e1b99860f8c80c8658e8d45 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 11 Jun 2025 09:31:30 +1000 Subject: [PATCH 114/755] Update connect-to-stripe.mdx --- src/content/docs/billing/get-started/connect-to-stripe.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/content/docs/billing/get-started/connect-to-stripe.mdx b/src/content/docs/billing/get-started/connect-to-stripe.mdx index 75d4fa88b..35025891e 100644 --- a/src/content/docs/billing/get-started/connect-to-stripe.mdx +++ b/src/content/docs/billing/get-started/connect-to-stripe.mdx @@ -4,6 +4,7 @@ title: Step 3 Connect to Stripe sidebar: order: 4 relatedArticles: + - 46241baf-30aa-43c0-ac0c-b2b7e99941f1 - 8770ef89-e805-475f-b4f5-a86c1e1eccc1 --- From 6b3a8dafedac2eccccd2dddd0c37526dc3632eb7 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 11 Jun 2025 09:32:38 +1000 Subject: [PATCH 115/755] Update about-plans.mdx --- src/content/docs/billing/manage-plans/about-plans.mdx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/content/docs/billing/manage-plans/about-plans.mdx b/src/content/docs/billing/manage-plans/about-plans.mdx index 00df1aad8..3db384ce2 100644 --- a/src/content/docs/billing/manage-plans/about-plans.mdx +++ b/src/content/docs/billing/manage-plans/about-plans.mdx @@ -4,7 +4,8 @@ title: About plans sidebar: order: 1 relatedArticles: - - + - bd6757e3-81d5-48d6-89c8-dd4c222ac647 + - 100f75f1-a0a4-459f-874f-da127f2d0615 app_context: - m: billing - s: plans From 9e6201a6baae6102b3085291adf682c070aa5327 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 11 Jun 2025 09:33:19 +1000 Subject: [PATCH 116/755] Update create-plans.mdx --- src/content/docs/billing/manage-plans/create-plans.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/billing/manage-plans/create-plans.mdx b/src/content/docs/billing/manage-plans/create-plans.mdx index 3b9fa8854..70a83ef17 100644 --- a/src/content/docs/billing/manage-plans/create-plans.mdx +++ b/src/content/docs/billing/manage-plans/create-plans.mdx @@ -85,7 +85,7 @@ Features describe the individual functions or entitlements that users get with t 9. Enter the **Unit measurement** name, e.g. `license`, `MAU` 10. If the item is separately chargeable, select a **Pricing model**. - ![Add feature window, tiered prices](https://imagedelivery.net/skPPZTHzSlcslvHjesZQcQ/80ea9a38-e6ac-479f-9697-f04e237d4d00/publicg) + ![Add feature window, tiered prices](https://imagedelivery.net/skPPZTHzSlcslvHjesZQcQ/80ea9a38-e6ac-479f-9697-f04e237d4d00/public) 11. Add a **Line item description**. This appears on the customer invoice, so might be more specific than the name, e.g. `Additional licenses for Pro (5)`. 12. For a flat unit price, enter the price and select **Save**. You’re finished. From fb39dd90ef2610e13f10ae5376b5494e2e3eedae Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 11 Jun 2025 09:39:18 +1000 Subject: [PATCH 117/755] Update src/data/sidebarData.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- src/data/sidebarData.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/data/sidebarData.ts b/src/data/sidebarData.ts index 3092c8962..2cb8a80e7 100644 --- a/src/data/sidebarData.ts +++ b/src/data/sidebarData.ts @@ -145,31 +145,32 @@ const sidebarData = [ collapsed: true, cardLink: "/billing/about-payments-and-plans/", items: [ + { { label: "About billing", autogenerate: {directory: "billing/about-billing"}, collapsed: false - } + }, { label: "Get started", autogenerate: {directory: "billing/get-started"}, collapsed: false - } + }, { label: "Manage plans", - autogenerate: {directory: "billing/mange-plans"}, + autogenerate: {directory: "billing/manage-plans"}, collapsed: false - } + }, { label: "Payment management", autogenerate: {directory: "billing/payment-management"}, collapsed: false - } + }, { label: "Pricing", autogenerate: {directory: "billing/pricing"}, collapsed: false - } + }, { label: "Billing user experience", autogenerate: {directory: "billing/billing-user-experience"}, From 23d3f6d39d8b93ca0cca5a0fa83fb1d1ee291532 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 11 Jun 2025 10:11:22 +1000 Subject: [PATCH 118/755] Update payment-gateway.mdx Draft --- .../payment-management/payment-gateway.mdx | 51 +++++++++++++++++-- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/src/content/docs/billing/payment-management/payment-gateway.mdx b/src/content/docs/billing/payment-management/payment-gateway.mdx index 8f7ddb8df..76a3c0e80 100644 --- a/src/content/docs/billing/payment-management/payment-gateway.mdx +++ b/src/content/docs/billing/payment-management/payment-gateway.mdx @@ -4,7 +4,52 @@ title: Connect payment gateway sidebar: order: 1 relatedArticles: - - -app_context: - - + - d980a089-d9c1-447b-930a-de0f2c00d3bf --- + +Kinde’s billing feature comes with a dependency on third party payment gateways. These services hold credit card details, process payments, apply tax, and generally handle all the financial side of billing. + +For now, only [Stripe](https://stripe.com), a known and reliable payments processing platform, is supported. A new Stripe account is automatically created for you when you set up billing in Kinde. + + + +1. If you are testing billing, switch to your non-production environment. +2. Go to **Settings > Environment > Billing**. +3. Select **Connect Stripe account**. Kinde initiates the connection and adds the connection card. + + ![Stripe card connection in Kinde](https://imagedelivery.net/skPPZTHzSlcslvHjesZQcQ/f3797997-6681-41c8-a297-4a962d5d0500/public) + +4. Select **Update Stripe information**. This kicks off a Stripe onboarding flow. You will see a Stripe-generated screen to enter details. + + ![Kinde Stripe onboarding flow start screen](https://imagedelivery.net/skPPZTHzSlcslvHjesZQcQ/71b08393-f43d-4f91-3268-7501e08d3f00/public) + + + +5. Enter the email that will be associated with the Stripe account and select **Submit**. Here’s what happens next, depending if you have a Stripe account already associated with your email address. + 1. **If you are in the test environment**, you’ll be prompted through a flow. You can continue or select **Return to Kinde**. + 2. **If you are in a production environment,** you will be asked if you want to use details from an existing Stripe account or make a new one: + 1. If you select existing, account details from the existing account will be used, but no other data will come across. + 2. If you select to make a new one, you will be prompted to enter all your business details. This can take a while. + 3. Follow the prompts as far as you want. Select **Return to Kinde**. + + + +6. When you complete the Stripe onboarding, or opt out by selecting **Return to Kinde**, the connection card on the Kinde **Billing** page shows the connection status. + + ![Connection status on Kinde stripe card](https://imagedelivery.net/skPPZTHzSlcslvHjesZQcQ/f4eb395b-069e-42c3-ab4f-d78cc52e8800/public) + + - `Connecting` means Stripe is still sending information to Kinde about the account status. It should not take long to sync. + - `In progress` indicates that Stripe has connected to Kinde, but still requires some additional details from you in order to fully set up the account. Select **Update Stripe information** to complete the Stripe onboarding. You need to do this before plans can be made available to your customers. + - `Connected` means Stripe is successfully syncing data with Kinde and you’re ready to publish plans. From f59c018f27ba2b8d118fc9e64657cc90b0d572b4 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 11 Jun 2025 12:38:28 +1000 Subject: [PATCH 119/755] Update manage-stripe-connection.mdx --- .../manage-stripe-connection.mdx | 40 ++++++++++++++++++- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/src/content/docs/billing/payment-management/manage-stripe-connection.mdx b/src/content/docs/billing/payment-management/manage-stripe-connection.mdx index c4b00a516..c30d6aedb 100644 --- a/src/content/docs/billing/payment-management/manage-stripe-connection.mdx +++ b/src/content/docs/billing/payment-management/manage-stripe-connection.mdx @@ -2,8 +2,44 @@ page_id: 8770ef89-e805-475f-b4f5-a86c1e1eccc1 title: Manage Stripe connection sidebar: - order: + order: 2 relatedArticles: - - + - acdd8b64-d5b7-43ab-b47b-6244d8f5b82e + - d980a089-d9c1-447b-930a-de0f2c00d3bf --- +When you connect to Stripe as part of Kinde's billing feature, a new Stripe account is created for you. You cannot connect an existing Stripe account. + +When you first connect Stripe as part of the setup flow, you need to set up the new Stripe account with all your business and other details to make the connection active. To connect, follow [this process](/billing/get-started/connect-to-stripe/). You can then manage the connection in **Settings > Billing**. + +![Stripe connection card in Kinde](https://imagedelivery.net/skPPZTHzSlcslvHjesZQcQ/efd6c8bf-8000-4607-0da3-ff87d1143600/public) + +## Manage the Stripe connection + +The Stripe connection status (see below) lets you know if Stripe is connected or if you need to take action. Statuses include: + + - `Connecting` means Stripe is still sending information to Kinde about the account status. It should not take long to sync. + - `In progress` indicates that Stripe has connected to Kinde, but still requires some additional details from you in order to fully set up the account. Select **Update Stripe information** to complete the Stripe onboarding. You need to do this before plans can be made available to your customers. + - `Connected` means Stripe is successfully syncing data with Kinde and you’re ready to publish plans. + +You may also see an error and message, letting you know what action is needed. + +To add and edit Stripe business information, select **Update Stripe connection**. + +## Disconnect Stripe + +This action is not reversible. + +1. Go to **Settings > Environment > Billing**. +2. On the Stripe connection card, select the three dots, then select **Disconnect**. +3. In the confirmation window, select **Disconnect billing connection**. + +## Troubleshoot Stripe issues + +Stripe requires that your account is set up properly before connecting successfully. Here's some common reasons why the Stripe connection status remains **In progress**. + +- Incomplete business information - contact, tax, or other business details +- Identity verification - where you need to upload a copy of your ID + +To add details in Stripe, select the **Update Stripe information** option. + From 2c7041aa7029fba9320688e1d8e1e979d6cc7ba9 Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 11 Jun 2025 15:13:11 +1000 Subject: [PATCH 120/755] Update src/data/sidebarData.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- src/data/sidebarData.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/sidebarData.ts b/src/data/sidebarData.ts index 2cb8a80e7..9b75f8e4b 100644 --- a/src/data/sidebarData.ts +++ b/src/data/sidebarData.ts @@ -143,7 +143,7 @@ const sidebarData = [ description: "Monetize your product, build plans, and accept payments", icon: "billing", collapsed: true, - cardLink: "/billing/about-payments-and-plans/", + cardLink: "/billing/about-billing/", items: [ { { From a7cb22f11b9b4216013bf3020699ec0ed151457d Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 11 Jun 2025 15:15:06 +1000 Subject: [PATCH 121/755] Update billing-concepts-terms.mdx --- .../docs/billing/about-billing/billing-concepts-terms.mdx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/content/docs/billing/about-billing/billing-concepts-terms.mdx b/src/content/docs/billing/about-billing/billing-concepts-terms.mdx index d89fa0880..f7b9bce53 100644 --- a/src/content/docs/billing/about-billing/billing-concepts-terms.mdx +++ b/src/content/docs/billing/about-billing/billing-concepts-terms.mdx @@ -2,15 +2,13 @@ page_id: 9d1daf85-1a2c-4cc5-879a-230c950bed12 title: Billing concepts & terms sidebar: - order: + order: 3 relatedArticles: - 100f75f1-a0a4-459f-874f-da127f2d0615 - bd6757e3-81d5-48d6-89c8-dd4c222ac647 --- - - -Billing is the collective term we use to refer to the broad function of plans, pricing, payments, etc. The core concepts that you will come across in Kinde and in the docs might not be familiar to you. +Billing is the collective term we use to refer to the broad function of plans, pricing, payments, etc. The billing concepts that you will come across in Kinde and in the docs might not be familiar to you. ## Key concepts From e9bfaab52211aced7b416e46af445e8c8c2b716f Mon Sep 17 00:00:00 2001 From: ClaireM <127452294+clairekinde11@users.noreply.github.com> Date: Wed, 11 Jun 2025 15:44:21 +1000 Subject: [PATCH 122/755] Update customize-billing-pages.mdx --- .../customize-billing-pages.mdx | 52 ++++++------------- 1 file changed, 17 insertions(+), 35 deletions(-) diff --git a/src/content/docs/billing/billing-user-experience/customize-billing-pages.mdx b/src/content/docs/billing/billing-user-experience/customize-billing-pages.mdx index b2750b831..7eaa1477c 100644 --- a/src/content/docs/billing/billing-user-experience/customize-billing-pages.mdx +++ b/src/content/docs/billing/billing-user-experience/customize-billing-pages.mdx @@ -1,6 +1,6 @@ --- -page_id: 961c2bf6-2683-4339-b42a-928e328ce74b -title: Customize billing pages +page_id: 06bb544c-1b84-4660-ac55-ac80b50ae5be +title: Customize the plan sign-up experience sidebar: order: 2 relatedArticles: @@ -9,35 +9,26 @@ relatedArticles: - e6dde80d-2977-419f-a05a-62ad0a7ac6de --- -# Signing Up a Customer to a Plan +There are three ways you can allow customers to sign up to a plan. -When signing up a customer to a plan, you have three main options depending on how much control you want over the experience: - ---- - -## Option 1: Use Your Own Plan Selection Screen +## Option 1: Use your own plan selection screen Display a plan selection screen in your own app or website. Once the user selects a plan, redirect them to Kinde to complete the payment flow. To pre-select a plan, pass the `plan_interest` query parameter in the Kinde authentication URL. ---- - -## Option 2: Use Kinde’s Built-in Plan Selection +## Option 2: Use Kinde’s built-in plan selection -Let Kinde handle plan selection as part of the authentication flow. -To enable this: +Let Kinde handle plan selection as part of the authentication flow. To enable this: -- Create a **Pricing Table** in Kinde -- Add and publish your plans +- [Create a pricing Table](/billing/billing-user-experience/plan-selection/) in Kinde +- [Add and publish plans](/billing/manage-plans/create-plans/) - Set the table to **Live** Kinde will then display the plan selection screen during signup. ---- - -## Option 3: Assign a Plan via the Management API +## Option 3: Assign a plan via the Kinde Management API -Use the Kinde Management API to assign a customer to a specific plan. +Use the [Kinde Management API](https://docs.kinde.com/kinde-apis/management/#tag/billing-agreements/get/api/v1/billing/agreements) to assign a customer to a specific plan. The next time the customer signs in, Kinde will automatically prompt them for payment details. This is ideal for: @@ -45,25 +36,16 @@ This is ideal for: - Migrating customers from another system - Assigning a plan without user input ---- - -## Authentication Flow Screens +## Customize billing screens in the authentication flow -Depending on the option you choose, users will see different screens during the authentication flow. There are three customizable screens: +Depending on how you choose to onboard customers, users will see three different billing screens during the authentication flow. These screens can be customized: -1. **Plan Selection** - Displayed when a user signs up for the first time and multiple plans are available. +1. **Plan selection** - Displayed when a user signs up for the first time and multiple plans are available. -2. **Payment Details** - Shown after a user selects a plan—or if a plan was pre-selected before redirecting to Kinde. - -3. **Success** - Shown when signup and payment are successfully completed. - ---- +2. **Payment details** - Shown after a user selects a plan—or if a plan was pre-selected before redirecting to Kinde. -## Customizing the Experience +3. **Success** - Shown when sign up and payment are successfully completed. -By default, all screens will inherit branding and styling from your Kinde [Design](/design/brand/global-brand-defaults/) settings. +By default, all screens will inherit branding and styling from the global Kinde [Design](/design/brand/global-brand-defaults/) settings. -If you want more control, you can fully customize these screens using your own **HTML, CSS, and JavaScript** with the [Kinde Custom UI feature](/design/customize-with-code/customize-with-css-html/). +If you want more control, you can [fully customize these screens using your own **HTML, CSS, and JavaScript**](/design/customize-with-code/customize-with-css-html/). From 4fe270a4671a91da104befd090cde5933dec35a3 Mon Sep 17 00:00:00 2001 From: Dave Berner Date: Wed, 11 Jun 2025 15:48:30 +1000 Subject: [PATCH 123/755] feat: fix build --- .../billing/about-billing/about-billing.mdx | 14 ++-- .../about-billing/billing-concepts-terms.mdx | 21 +++--- .../about-billing/kinde-billing-model.mdx | 35 ++++----- .../billing/get-started/connect-to-stripe.mdx | 71 ++++++++++--------- .../docs/billing/manage-plans/about-plans.mdx | 33 +++++---- .../manage-stripe-connection.mdx | 5 +- .../payment-management/payment-gateway.mdx | 6 +- .../docs/billing/pricing/pricing-models.mdx | 4 +- .../self-serve-portal-for-orgs.mdx | 2 +- src/data/sidebarData.ts | 2 +- 10 files changed, 95 insertions(+), 98 deletions(-) diff --git a/src/content/docs/billing/about-billing/about-billing.mdx b/src/content/docs/billing/about-billing/about-billing.mdx index 478e2ce2b..b0d583162 100644 --- a/src/content/docs/billing/about-billing/about-billing.mdx +++ b/src/content/docs/billing/about-billing/about-billing.mdx @@ -4,12 +4,11 @@ title: About billing sidebar: order: 1 relatedArticles: - - -app_context: - - + - 9d1daf85-1a2c-4cc5-879a-230c950bed12 + - e6dde80d-2977-419f-a05a-62ad0a7ac6de --- -Kinde billing gives you the ability to create plans that users can subscribe to, so you can get paid for your services and collect revenue. +Kinde billing gives you the ability to create plans that customers can subscribe to, so you can get paid for your services and collect revenue. This feature lets you: @@ -22,15 +21,15 @@ This feature lets you: - Enable self-serve account management for customers - Customize the pricing table to make the whole experience on-brand -Billing makes the Kinde platform *the* essential development infrastructure for managing the customer lifecycle across every part of your business. From registration to plan selection, authorization to provisioning, releases to upgrades. +Billing makes the Kinde platform _the_ essential development infrastructure for managing the customer lifecycle across every part of your business. From registration to plan selection, authorization to provisioning, releases to upgrades. ## This is our first billing release -Billing is a really complex area of app development, so while this release is tested and ready, we are still treating it like a beta to signal that we are actively working on improvements from day one. +Billing is a really complex area of app development, so while this release is tested and ready, we are still treating it like a beta to signal that we are actively working on improvements from day one. ### How to send feedback -It would be amazing if you can send any feedback you have via [not sure where] so we can quickly collect and prioritize improvements. +It would be amazing if you can send any feedback you have via [not sure where] so we can quickly collect and prioritize improvements. ## Known limitations @@ -40,4 +39,3 @@ These are current limitations that we are aware of and are working on adding. - Annual subscriptions. Only monthly is available right now. - Changes to the billing cycle (e.g. choose billing anniversaries, etc.) - Add-ons and discounts that can be applied to individual subscriptions -- Plan versioning diff --git a/src/content/docs/billing/about-billing/billing-concepts-terms.mdx b/src/content/docs/billing/about-billing/billing-concepts-terms.mdx index 74199502f..0ed9ef2a3 100644 --- a/src/content/docs/billing/about-billing/billing-concepts-terms.mdx +++ b/src/content/docs/billing/about-billing/billing-concepts-terms.mdx @@ -2,20 +2,19 @@ page_id: 9d1daf85-1a2c-4cc5-879a-230c950bed12 title: Billing concepts & terms sidebar: - order: + order: 3 relatedArticles: - - -app_context: - - + - bd6757e3-81d5-48d6-89c8-dd4c222ac647 + - e6dde80d-2977-419f-a05a-62ad0a7ac6de --- - - -Billing is the collective term we use to refer to the broad function of plans, pricing, payments, etc. The core concepts that you will come across in Kinde and in the docs might not be familiar to you. +Billing is the collective term we use to refer to the broad function of plans, pricing, payments, etc. The core concepts that you will come across in Kinde and in the docs might not be familiar to you. ## Key concepts -- **Plans and plan groups** - Plans define the specific features, usage limits, and pricing tiers offered to customers in a SaaS product. Plan groups organize multiple plans under a common category, helping segment offerings by use case, customer size, or market. +- **Plan groups** - Plan groups organize multiple plans under a common category, helping segment offerings by use case, customer size, or market. A group is scoped to either organizations (B2B) or individual customers (B2C). You can have multiple plan groups, but each plan must belong to a group. +- **Plans** - Plans define the specific features, usage limits, and pricing tiers offered to customers in a SaaS product. +- **Features** - Plan features are the specific capabilities or entitlements included in a plan. They can be chargeable (incurring additional fees) or non-chargeable (included at no extra cost). Features can be metered (usage-based) or unmetered (fixed access). - **Pricing models** - Pricing models are the different methods of charging customers, such as flat-rate, usage-based, tiered, per-seat pricing, etc. Your pricing model is determined by your product and customer needs. Consider scalability and longevity when deciding this. - **Payments gateway** - A payments gateway is a service that securely processes customer payments via credit cards, ACH, or other methods - such as Stripe. - **Pricing table** - A pricing table is a visual representation of your different subscription plans, showcasing features and prices to help users compare options. You can build one in Kinde and embed it on your site using a URL. @@ -25,11 +24,11 @@ Billing is the collective term we use to refer to the broad function of plans, p - **Base price** – The starting cost of a subscription plan, typically the cost for a core set of features or a minimum level of usage. - **Chargeable / Non-chargeable feature** – - - **Chargeable feature**: Incurs an additional fee when used. Might be metered or per unit price. - - **Non-chargeable feature**: Included in the plan at no extra cost. Add non-chargeable features for anything included in all plans, and that needs to be provisioned. + - **Chargeable feature**: Incurs an additional fee when used. Might be metered or per unit price. + - **Non-chargeable feature**: Included in the plan at no extra cost. Add non-chargeable features for anything included in all plans, and that needs to be provisioned. - **Feature** – A specific function or capability of your SaaS product that you provision for app users. In context with a plan, these are chargeable or non-chargeable features that are provisioned to customers. - **Fixed charge** – A recurring fee that does not change based on usage, often applied monthly or annually. Use this for a plan’s base price or other flat recurring fees. -- **Metered and unmetered feature** – Metered features are provisioned in units, often with pricing per unit, e.g. MAU. An unmetered feature is like a boolean, and is a basic feature with no pricing attached. +- **Metered and unmetered feature** – Metered features are provisioned in units, often with pricing per unit, e.g. MAU. An unmetered feature is like a boolean, and is a basic feature with no pricing attached. - **Multi-currency** – The ability to set plan prices in different currencies to support global customers. Kinde supports nearly all currencies, but you can currently only pick one as the default for all plans. - **Plan** – A packaged offering of features, prices, and terms available for subscription, typically tiered across a group (e.g., Basic, Pro, Enterprise). - **Plan group** – A collection of related plans, often grouped by customer type or usage level, allowing easier management and comparison. diff --git a/src/content/docs/billing/about-billing/kinde-billing-model.mdx b/src/content/docs/billing/about-billing/kinde-billing-model.mdx index 1ec2ea8c7..7d9867453 100644 --- a/src/content/docs/billing/about-billing/kinde-billing-model.mdx +++ b/src/content/docs/billing/about-billing/kinde-billing-model.mdx @@ -4,19 +4,21 @@ title: The Kinde billing model sidebar: order: 2 relatedArticles: - - + - bd6757e3-81d5-48d6-89c8-dd4c222ac647 + - 9d1daf85-1a2c-4cc5-879a-230c950bed12 --- -In the Kinde model, we host everything except the payment processing part of billing. Kinde integrates with a third-party payment gateway (Stripe) for secure payment processing. +In the Kinde model, we handle everything except the payment processing part of billing. Kinde integrates with a third-party payment gateway (Stripe) for secure payment processing. -This involves a continuous sync between Kinde and Stripe, to ensure that products, prices, subscription information, invoice and payments, are accurate in both systems. +This involves a continuous sync between Kinde and Stripe, to ensure that products, prices, subscription information, invoice and payments, are accurate in both systems. Kinde does not store payment details, such as credit card information. This is exclusively managed by Stripe. -## Billing for B2B and B2C +## Billing for B2B, B2C and B2B2C -Kinde supports billing models for both B2B and B2C. Depending which you are setting up, you may need to do a few extra tasks. Most of the setup is common to both. We will call out tasks that are only relevant to one or the other. +Kinde supports billing models for B2B, B2C and even B2B2C. Depending which you are setting up, you may need to do a few extra tasks. Most of the setup is common to both. We will call out tasks that are only relevant to one or the other. +- B2B2C - this is the platform model, where you have a customer who is an organization, and then users who are customers of that organization. - B2B - your customers are companies, organizations, or groups. - B2C - your customers are individual users. @@ -34,24 +36,23 @@ Stripe is currently the only payment provider supported with Kinde. But we plan ## Multicurrency support -Kinde has customers everywhere and almost every global currency is supported. +Kinde has customers everywhere and almost every global currency is supported. ## Transaction data and Stripe region -- When you connect to Stripe in Kinde, we create a Stripe US account by default. We do this because Stripe US more widely supports global functionality. You can change the region during the Stripe connection setup flow. -- Regardless of Stripe account region, you can still select any currency for your plans in Kinde, and Stripe will do the hard part of exchange rate conversion, tax calculations, etc. +- When you connect your Stripe account to Kinde, you connect to our Stripe US account. We do this because Stripe US more widely supports global functionality. +- Regardless of your own Stripe account region, you can still select any currency for your plans in Kinde, and Stripe will do the hard part of exchange rate conversion, tax calculations, etc. - Any fees you incur in Stripe for international transactions are your sole responsibility. - +By default, Kinde uses the following billing behavior, though some aspects can be customized depending on how you configure cancellations. -## Billing and invoice cycles +- Billing cycles are monthly, based on the customer's original sign-up date. +- Fixed charges (e.g. monthly subscription fees) are billed in advance, customers pay at the start of their billing period. +- Metered (usage-based) charges are billed in arrears, usage is tracked throughout the billing period, and charges appear on the next invoice. -Default behavior for invoices and charging is as follows. This cannot currently be changed. +You can control what happens when a customer cancels: -- Billing cycles are monthly and are processed on the sign up anniversary -- Invoices include fixed charges in advance, e.g. a monthly subscription is payable each month in advance. -- Invoices include metered charges in arrears, e.g. MAU is metered throughout a month and then charges for the previous month appear on the next invoice. +- Whether unbilled usage is charged immediately (charge for usage on cancellation) +- Whether fixed fees are prorated and refunded for the unused time (prorate fixed charges on cancellation) diff --git a/src/content/docs/billing/get-started/connect-to-stripe.mdx b/src/content/docs/billing/get-started/connect-to-stripe.mdx index 0d0c70ad6..1c27c23ff 100644 --- a/src/content/docs/billing/get-started/connect-to-stripe.mdx +++ b/src/content/docs/billing/get-started/connect-to-stripe.mdx @@ -4,12 +4,11 @@ title: Step 3 Connect to Stripe sidebar: order: 4 relatedArticles: - - -app_context: - - + - fe9fea0c-274c-4d6b-9cc5-eccdbaad85b7 + - 88e1773a-b681-441f-b4c7-d7d339116867 --- -Kinde’s billing feature comes with a dependency on [Stripe](https://stripe.com), which is a known and reliable payments processing platform. A new Stripe account is automatically created for you when you set up billing in Kinde. +Kinde’s billing feature comes with a dependency on [Stripe](https://stripe.com), which is a known and reliable payments processing platform. A new Stripe account is automatically created for you when you set up billing in Kinde.