Le WordPress d'aujourd'hui, décodé pour les développeurs

Extensions

Paddle pour facturer une extension freemium vendue à l’international

Gérer soi-même la TVA et les taxes de vente dans des dizaines de pays, ou déléguer cette charge à un revendeur officiel : voici ce que Paddle prend réellement en charge à la place d'une intégration maison.

Par WordPress Développement • 27 août 2023 • 4 min de lecture • Aucun commentaire
Paddle pour facturer une extension freemium vendue à l'international

Gérer soi-même la TVA et les taxes de vente dans des dizaines de pays, ou confier cette charge à un revendeur officiel qui s’en occupe à la place de l’éditeur : c’est le choix auquel fait face tout développeur qui vend la version premium de son extension WordPress hors de la seule zone euro. Une passerelle de paiement classique encaisse l’argent, mais laisse à l’éditeur la responsabilité de calculer, déclarer et reverser la TVA selon le pays de l’acheteur. Paddle fonctionne différemment : il agit comme revendeur officiel (« merchant of record »), ce qui change la nature de l’intégration à mettre en place.

Le problème posé

Un éditeur d’extension freemium vend des licences annuelles à des clients situés aussi bien dans l’Union européenne qu’aux États-Unis, au Canada ou en Australie. Chaque juridiction applique ses propres règles de taxe sur les logiciels vendus en ligne, avec des taux et des seuils différents. Construire et maintenir ce calcul en interne représente une charge disproportionnée pour une petite structure, sans même évoquer les obligations déclaratives qui en découlent.

Ce que Paddle prend en charge à la place d’une intégration maison

L'essentiel à retenir : Paddle agit comme revendeur officiel, pas comme simple passerelle de paiement ; La TVA et les taxes locales sont calculées et reversées automatiquement ; Les webhooks Paddle restent nécessaires pour activer la licence côté extension

En agissant comme revendeur officiel, Paddle facture le client final en son propre nom, calcule automatiquement la taxe applicable selon la localisation de l’acheteur, l’inclut dans le prix affiché, et reverse ensuite à l’éditeur le montant net de sa commission. L’éditeur ne reçoit jamais directement une TVA à déclarer : Paddle s’en charge en tant qu’entité facturante.

ResponsabilitéIntégration de paiement classiquePaddle
Encaissement du paiementÀ la charge de l’éditeurPris en charge par Paddle
Calcul de la TVA/taxe localeÀ développer et maintenir soi-mêmeCalculé automatiquement selon le pays
Déclaration fiscaleÀ la charge de l’éditeurAssurée par Paddle en tant que revendeur
Facture émise au clientAu nom de l’éditeurAu nom de Paddle
Activation de la licenceDéveloppée sur mesureToujours à développer, via webhook

Ce qui reste à développer côté extension

Paddle ne gère ni le stockage des licences, ni leur vérification côté extension : cette partie reste entièrement à la charge de l’éditeur, via les webhooks envoyés par Paddle à chaque événement de paiement. Un point de terminaison REST personnalisé reçoit ces événements et active la licence correspondante :

add_action( 'rest_api_init', function() {
    register_rest_route( 'licences/v1', '/paddle-webhook', array(
        'methods'             => 'POST',
        'callback'            => 'licences_traiter_webhook_paddle',
        'permission_callback' => '__return_true',
    ) );
} );

function licences_traiter_webhook_paddle( WP_REST_Request $request ) {
    $corps = $request->get_json_params();

    if ( ! licences_verifier_signature_paddle( $request ) ) {
        return new WP_REST_Response( null, 403 );
    }

    if ( 'transaction.completed' === $corps['event_type'] ) {
        $email = $corps['data']['customer']['email'] ?? '';
        $cle   = wp_generate_password( 24, false );

        update_option( 'licence_' . md5( $email ), array(
            'cle'    => $cle,
            'statut' => 'active',
        ) );

        wp_mail( $email, 'Votre licence', 'Voici votre clé : ' . $cle );
    }

    return new WP_REST_Response( null, 200 );
}

La vérification de signature, propre à Paddle, reste indispensable pour s’assurer que la notification provient bien de Paddle et non d’un tiers malveillant tentant de forger une activation de licence gratuite.

Variantes

Gérer les remboursements et rétrofacturations

Les événements transaction.payment_failed et les remboursements initiés côté Paddle doivent désactiver la licence correspondante avec la même logique de webhook, en retrouvant la licence via l’email ou l’identifiant de transaction transmis par Paddle plutôt qu’en dupliquant une logique de calcul de taxe côté extension.

Distinguer abonnement et achat unique

Paddle propose aussi bien la facturation récurrente que le paiement ponctuel. Pour une licence annuelle, l’événement subscription.updated permet de suivre les renouvellements et d’étendre automatiquement la date d’expiration stockée côté extension.

Afficher un prix TTC cohérent avant paiement

L’API Paddle de calcul de prix (« Pricing Preview ») peut être interrogée côté page de vente pour afficher un prix TTC déjà localisé selon le pays détecté du visiteur, évitant la surprise d’un montant différent au moment du paiement final.

Notre verdict

Pour un éditeur qui vend son extension freemium à l’international, Paddle déplace la complexité fiscale hors du périmètre de développement, au prix d’une commission sur chaque vente et d’une facture émise au nom de Paddle plutôt qu’au nom de l’éditeur. La partie technique restant à développer, l’activation de licence par webhook, reste comparable quel que soit le prestataire de paiement choisi.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi