Increase revenue with one-click purchases using saved payment methods for post-purchase offers, subscription upgrades, and cross-sells.
Les upsells et downsells vous permettent d’offrir des produits supplémentaires ou des modifications de plan aux clients en utilisant leurs moyens de paiement enregistrés. Cela rend possible des achats en un clic sans collecte de paiement, ce qui améliore considérablement les taux de conversion.
Post-Purchase Upsells
Proposez des produits complémentaires immédiatement après le paiement grâce à un achat en un clic.
Subscription Upgrades
Faites passer les clients à des paliers supérieurs avec attribution automatique et facturation instantanée.
Cross-Sells
Ajoutez des produits connexes aux clients existants sans leur faire ressaisir leurs informations de paiement.
Les upsells et downsells sont des stratégies puissantes d’optimisation des revenus :
Upsells : Proposez un produit de plus grande valeur ou une montée en gamme (par exemple : plan Pro au lieu de Basic)
Downsells : Proposez une alternative moins chère lorsqu’un client décline ou rétrograde
Cross-sells : Suggérez des produits complémentaires (par exemple : extensions, articles associés)
Dodo Payments rend ces flux possibles grâce au paramètre payment_method_id, qui vous permet de facturer le moyen de paiement enregistré d’un client sans lui demander de ressaisir les données de carte.
Avant d’implémenter des upsells et downsells, assurez-vous d’avoir :
1
Customer with Saved Payment Method
Les clients doivent avoir réalisé au moins un achat. Les moyens de paiement sont automatiquement enregistrés lorsque les clients finalisent leur commande.
2
Products Configured
Créez vos produits d’upsell dans le tableau de bord Dodo Payments. Il peut s’agir de paiements uniques, d’abonnements ou d’extensions.
3
Webhook Endpoint
Configurez des webhooks pour gérer les événements payment.succeeded, payment.failed et subscription.plan_changed.
Avant de proposer un upsell, récupérez les moyens de paiement enregistrés du client :
TypeScript
Python
Go
Copier
import DodoPayments from 'dodopayments';const client = new DodoPayments({ bearerToken: process.env.DODO_PAYMENTS_API_KEY, environment: 'live_mode',});async function getPaymentMethods(customerId: string) { const paymentMethods = await client.customers.listPaymentMethods(customerId); // Returns array of saved payment methods // Each has: payment_method_id, type, card (last4, brand, exp_month, exp_year) return paymentMethods;}// Example usageconst methods = await getPaymentMethods('cus_123');console.log('Available payment methods:', methods);// Use the first available method for upsellconst primaryMethod = methods[0]?.payment_method_id;
Copier
import osfrom dodopayments import DodoPaymentsclient = DodoPayments( bearer_token=os.environ.get("DODO_PAYMENTS_API_KEY"), environment="live_mode",)def get_payment_methods(customer_id: str): payment_methods = client.customers.list_payment_methods(customer_id) # Returns list of saved payment methods # Each has: payment_method_id, type, card (last4, brand, exp_month, exp_year) return payment_methods# Example usagemethods = get_payment_methods("cus_123")print("Available payment methods:", methods)# Use the first available method for upsellprimary_method = methods[0].payment_method_id if methods else None
Copier
package mainimport ( "context" "fmt" "github.com/dodopayments/dodopayments-go" "github.com/dodopayments/dodopayments-go/option")func getPaymentMethods(customerID string) ([]dodopayments.PaymentMethod, error) { client := dodopayments.NewClient( option.WithBearerToken(os.Getenv("DODO_PAYMENTS_API_KEY")), ) methods, err := client.Customers.ListPaymentMethods( context.TODO(), customerID, ) if err != nil { return nil, err } return methods, nil}func main() { methods, err := getPaymentMethods("cus_123") if err != nil { panic(err) } fmt.Println("Available payment methods:", methods) // Use the first available method for upsell if len(methods) > 0 { primaryMethod := methods[0].PaymentMethodID fmt.Println("Primary method:", primaryMethod) }}
Les moyens de paiement sont automatiquement enregistrés lorsque les clients finalisent leur commande. Vous n’avez pas besoin de les sauvegarder explicitement.
Proposez des produits supplémentaires immédiatement après un achat réussi. Le client peut accepter d’un simple clic puisqu’il a déjà enregistré son moyen de paiement.
Lorsque vous utilisez payment_method_id, vous devez définir confirm: true et fournir un customer_id existant. Le moyen de paiement doit appartenir à ce client.
Choisissez comment facturer les clients lors d’une montée en gamme :
Mode
Comportement
Idéal pour
difference_immediately
Facture immédiatement la différence de prix (30→80 = 50$)
Montées simples
prorated_immediately
Facture en fonction du temps restant dans le cycle de facturation
Facturation équitable basée sur le temps
full_immediately
Facture le nouveau plan en entier, ignore le temps restant
Réinitialisation du cycle de facturation
Utilisez difference_immediately pour les flux de montée simples. Utilisez prorated_immediately lorsque vous souhaitez tenir compte du temps inutilisé sur le plan actuel.
Le client demande une rétrogradation (Pro → Basic)
Le système calcule la valeur restante du plan actuel
Un crédit est ajouté à l’abonnement pour les prochains renouvellements
Le client passe immédiatement au nouveau plan
TypeScript
Python
Go
Copier
async function downgradeSubscription( subscriptionId: string, newProductId: string) { // Preview the downgrade first const preview = await client.subscriptions.previewChangePlan(subscriptionId, { product_id: newProductId, quantity: 1, proration_billing_mode: 'difference_immediately' }); console.log('Credit to be applied:', preview.credit_amount); // Execute the downgrade const result = await client.subscriptions.changePlan(subscriptionId, { product_id: newProductId, quantity: 1, proration_billing_mode: 'difference_immediately' }); // Credits are automatically applied to future renewals return result;}// Downgrade from Pro ($80) to Basic ($30)// $50 credit added to subscription, auto-applied on next renewalconst downgrade = await downgradeSubscription('sub_123', 'prod_basic_plan');
Copier
def downgrade_subscription(subscription_id: str, new_product_id: str): # Preview the downgrade first preview = client.subscriptions.preview_change_plan( subscription_id=subscription_id, product_id=new_product_id, quantity=1, proration_billing_mode="difference_immediately" ) print(f"Credit to be applied: {preview.credit_amount}") # Execute the downgrade result = client.subscriptions.change_plan( subscription_id=subscription_id, product_id=new_product_id, quantity=1, proration_billing_mode="difference_immediately" ) # Credits are automatically applied to future renewals return result# Downgrade from Pro ($80) to Basic ($30)# $50 credit added to subscription, auto-applied on next renewaldowngrade = downgrade_subscription("sub_123", "prod_basic_plan")
Les crédits issus des rétrogradations utilisant difference_immediately sont liés à l’abonnement et appliqués automatiquement aux futurs renouvellements. Ils sont distincts des Crédits client.
Le meilleur moment pour proposer un upsell est juste après un achat réussi, lorsque les clients sont dans un état d’esprit propice à l’achat. Autres moments efficaces :
Après des jalons d’utilisation des fonctionnalités
Lorsqu’ils approchent des limites du plan
À la fin de l’onboarding
Validate Payment Method Eligibility
Avant d’essayer une charge en un clic, vérifiez le moyen de paiement :
Est compatible avec la devise du produit
N’est pas expiré
Appartient au client
L’API validera ces éléments, mais les vérifier proactivement améliore l’expérience.
Handle Failures Gracefully
Lorsque les charges en un clic échouent :
Revenir au parcours de paiement classique
Informer le client avec un message clair
Proposer de mettre à jour le moyen de paiement
Ne pas retenter plusieurs fois les charges échouées
Provide Clear Value Proposition
Les upsells convertissent mieux lorsque les clients comprennent la valeur :
Montrez ce qu’ils obtiennent par rapport au plan actuel
Mettez en avant la différence de prix, pas le prix total
Utilisez la preuve sociale (ex. : « Montée en gamme la plus populaire »)
Respect Customer Choice
Proposez toujours une manière simple de décliner
Ne pas afficher le même upsell plusieurs fois après un refus
Suivez et analysez quels upsells convertissent pour optimiser les offres