diff --git a/.changeset/eighty-windows-grow.md b/.changeset/eighty-windows-grow.md new file mode 100644 index 00000000000..511a5af10d6 --- /dev/null +++ b/.changeset/eighty-windows-grow.md @@ -0,0 +1,5 @@ +--- +'@clerk/clerk-js': patch +--- + +Retry checkout confirmation if there is another checkout in progress diff --git a/packages/clerk-js/src/core/resources/CommerceCheckout.ts b/packages/clerk-js/src/core/resources/CommerceCheckout.ts index f8f97effea3..eaa3c0afce1 100644 --- a/packages/clerk-js/src/core/resources/CommerceCheckout.ts +++ b/packages/clerk-js/src/core/resources/CommerceCheckout.ts @@ -13,6 +13,7 @@ import { __experimental_CommercePlan, __experimental_CommerceSubscription, BaseResource, + isClerkAPIResponseError, } from './internal'; export class __experimental_CommerceCheckout extends BaseResource implements __experimental_CommerceCheckoutResource { @@ -75,8 +76,16 @@ export class __experimental_CommerceCheckout extends BaseResource implements __e initialDelay: 2 * 1_000, jitter: false, shouldRetry(error: any, iterations: number) { + if (!isClerkAPIResponseError(error) || iterations >= 4) { + return false; + } + const status = error?.status; - return !!status && status >= 500 && iterations <= 4; + const isServerError = status >= 500; + const checkoutAlreadyInProgress = + status === 409 && error.errors?.[0]?.code === 'checkout_already_in_progress'; + + return isServerError || checkoutAlreadyInProgress; }, }, );