Action, Internal, Query and Mutation
the hook (for some reason), given below runs twice and in the process it generates 2 stripe customers which should ideally be impossible considering I check for
if(!user.stripeId)
this which surprisingly is true
both the times which means stripeId
is ""
. Surprisingly when I check the logs on convex dashboard, the log statement runMutation
prints first and before the log statement of storeStripeCustomerId
. Would really appreciate someone's help here as I am very confused!3 Replies
I am running the above in a hook like this on the client side
in dev mode, React runs useEffects twice (there are lots of blog posts and memes about this 😛). And convex doesn't have transactionality guarantees for Actions, which explains why the action is running twice and why getUserInternalQuery is returning a user with no stripeId in both actions.
To fix this, don't call an action from the client. Instead call a mutation, write a document into the database to track the state, and schedule an action to call stripe. You might want to use https://stack.convex.dev/retry-actions to make sure the stripe action succeeds.
Automatically Retry Actions
Learn how to automatically retry actions in Convex while also learning a little about scheduling, system tables, and function references.