Aller au contenu

Analyser les données financières NetSuite — de la connexion au compte de résultat

~45 minutes · une connexion NetSuite active, un grand livre importé, un compte de résultat mensuel, une balance âgée des créances clients et une actualisation planifiée

Voici le parcours du premier jour pour un contrôleur de gestion ou un analyste FP&A : à la fin, vous aurez récupéré votre grand livre directement depuis NetSuite, l’aurez transformé en un compte de résultat mensuel que vous pouvez lire comme un état financier, aurez créé une balance âgée des créances clients, aurez placé les deux sur un tableau de bord et aurez configuré l’ensemble pour qu’il s’actualise tout seul. Pas d’export vers un tableur, pas de ressaisie manuelle — les chiffres proviennent de NetSuite et restent à jour.

Vous vous connecterez une fois, récupérerez les données une fois, puis vous ferez ce qui compte vraiment : transformer des lignes brutes du grand livre en synthèses qu’un décideur lit le lundi matin.

NetSuiteRequête SuiteQLTable du GLRegrouper et sommerRésultat
Connectez-vous, récupérez le grand livre une fois, puis transformez-le en états lisibles — le tout peut être réexécuté selon une planification.
  • Un espace de travail PlaidCloud et un projet dans lequel travailler (démarrez un essai si besoin).
  • Une connexion NetSuite fonctionnelle. Suivez d’abord Se connecter à NetSuite — vous avez besoin d’OAuth 2.0 et des services web REST activés dans NetSuite, de l’ID client de l’intégration, d’un ID de certificat, de l’ID de votre compte et de la clé privée au format PEM. Vérifiez que Envoyer une requête de test est au vert avant de commencer ici.
  • Aucun SQL n’est nécessaire pour transformer les données — vous le ferez avec des étapes de transformation standard. Le seul texte de requête est la récupération depuis NetSuite, et toutes les requêtes de récupération sont fournies. Gardez Exemples de requêtes SuiteQL pour NetSuite ouvert dans un onglet ; ce tutoriel s’en inspire.

Le workflow est le pipeline qui récupère et transforme les données.

  1. Ouvrez votre projet et passez à l’onglet Workflows.
  2. Cliquez sur Nouveau workflow, donnez-lui un nom tel que NetSuite Financials, puis ouvrez-le.

Une seule requête SuiteQL vous donne un an d’activité comptabilisée — chaque compte, chaque mois — ce qui suffit pour construire un compte de résultat et, plus tard, d’autres états.

  1. Ajoutez une étape Requête REST. Dans l’onglet Requête, définissez Connexion sur votre connexion NetSuite, Méthode sur POST et Point de terminaison sur /services/rest/query/v1/suiteql.

  2. Dans le Corps, placez ce SuiteQL encapsulé sous la forme {"q": "…"} :

    SELECT
    TO_CHAR(t.trandate, 'YYYY-MM') AS period,
    a.accttype AS account_type,
    a.acctnumber AS account_number,
    BUILTIN.DF(a.id) AS account_name,
    tal.amount AS amount
    FROM transactionaccountingline tal
    JOIN transaction t ON t.id = tal.transaction
    JOIN account a ON a.id = tal.account
    WHERE tal.posting = 'T'
    AND tal.accountingbook = 1
    AND t.trandate BETWEEN TO_DATE('2026-01-01', 'YYYY-MM-DD')
    AND TO_DATE('2026-12-31', 'YYYY-MM-DD')
    ORDER BY period, a.acctnumber
  3. Dans l’onglet Réponse, définissez la destination sur Table — nommez-la netsuite_gl — et définissez les types de colonnes : amount → Devise, toutes les autres → Texte. (SuiteQL renvoie les nombres et les dates sous forme de texte ; c’est le type qui permet à amount de s’additionner.)

  4. Cliquez sur Envoyer une requête de test pour vérifier qu’elle s’exécute, puis exécutez l’étape. Vous disposez maintenant d’une table netsuite_gl : une ligne par compte et par mois, avec un montant comptabilisé signé.

Étape 3 : transformer le grand livre en compte de résultat

Section intitulée « Étape 3 : transformer le grand livre en compte de résultat »

Place à l’analyse, réalisée avec une seule transformation en pointer-cliquer — sans SQL. Un compte de résultat n’est que le grand livre agrégé : les comptes de produits et de charges, regroupés en quelques lignes, avec le signe inversé pour que les revenus soient positifs. Une étape Table Extract fait tout cela dans ses onglets Sélection des données de la table et Filtres de données.

  1. Ajoutez une étape Table Extract. Définissez sa Source sur netsuite_gl et sa Cible sur une nouvelle table, netsuite_pnl.

  2. Dans l’onglet Filtres de données, ne conservez que les comptes de produits et de charges (excluez les comptes de bilan) : ajoutez un filtre où account_type est l’une de Income, OthIncome, COGS, Expense, OthExpense.

  3. Dans l’onglet Sélection des données de la table, cliquez sur Résumer pour activer l’agrégation, puis configurez trois colonnes cibles :

    • period — mappée directement depuis la source. Résumer : Regrouper par.
    • pnl_line — une expression (ci-dessous) qui transforme chaque type de compte en ligne d’état. Résumer : Regrouper par.
    • amount — une expression netsuite_gl.amount * -1 (l’inversion du signe). Résumer : Somme.

    Pour pnl_line, double-cliquez sur sa cellule expression et saisissez ce qui suit (l’éditeur vous permet de sélectionner les colonnes et la fonction case du groupe Conditions en pointer-cliquer) :

    case(
    (netsuite_gl.account_type.in_(['Income', 'OthIncome']), '1 - Revenue'),
    (netsuite_gl.account_type == 'COGS', '2 - Cost of Goods Sold'),
    (netsuite_gl.account_type.in_(['Expense', 'OthExpense']), '3 - Operating Expenses'),
    )
  4. Exécutez l’étape.

L’expression amount * -1 est la seule manipulation comptable : inverser le montant positif au débit rend les revenus positifs et les coûts négatifs, de sorte que les trois lignes de chaque mois s’additionnent pour donner le résultat net. Ensuite, Somme avec Regrouper par sur period et pnl_line regroupe tous les comptes en ces trois lignes par mois. Les expressions utilisent l’éditeur en pointer-cliquer de PlaidCloud — consultez Utilisation avancée du Data Mapper et la référence des expressions.

Ouvrez la table netsuite_pnl. Pour chaque mois, vous avez trois chiffres :

period pnl_line amount
2026-01 1 - Revenue 486,200.00
2026-01 2 - Cost of Goods Sold -190,540.00
2026-01 3 - Operating Expenses -212,880.00

Lisez directement à partir de la table :

  • Marge brute = revenus + coût des ventes (ce dernier est déjà négatif) → 486,200 − 190,540 = 295,660.
  • Résultat net = somme des trois lignes → 82,780.
  • Taux de marge brute = marge brute ÷ revenus → environ 61 %.

La première chose à faire est de rapprocher les chiffres : exécutez le compte de résultat natif de NetSuite pour le même mois et vérifiez que les revenus et le résultat net concordent. Si ce n’est pas le cas, il s’agit presque toujours d’une différence de périmètre — un filtre de filiale ou de devise, ou un décalage entre la période comptable et la date de transaction (consultez la remarque sur les périodes). Ne faites confiance au pipeline qu’une fois les chiffres rapprochés.

Étape 5 : créer une balance âgée des créances clients

Section intitulée « Étape 5 : créer une balance âgée des créances clients »

Le deuxième gain du premier jour, qui suit le même schéma connexion, récupération, transformation. Partez de la requête sur les créances ouvertes, puis répartissez-les par tranche selon le retard de chaque facture.

  1. Ajoutez une autre étape Requête REST (même connexion, POST, le point de terminaison suiteql) avec ce corps :

    SELECT
    t.tranid AS invoice_number,
    BUILTIN.DF(t.entity) AS customer,
    TO_CHAR(t.trandate, 'YYYY-MM-DD') AS invoice_date,
    TO_CHAR(t.duedate, 'YYYY-MM-DD') AS due_date,
    t.foreigntotal AS invoice_total,
    t.foreignamountunpaid AS amount_unpaid
    FROM transaction t
    WHERE t.type = 'CustInvc'
    AND t.foreignamountunpaid <> 0
    ORDER BY t.tranid

    Importez-la sous le nom netsuite_open_ar, avec invoice_total et amount_unpaid → Devise, invoice_date et due_date → Date, les autres → Texte.

  2. Ajoutez une étape Table Extract qui lit netsuite_open_ar vers une nouvelle table netsuite_ar_aging. Dans l’onglet Sélection des données de la table, cliquez sur Résumer et configurez trois colonnes cibles :

    • aging_bucket — une expression (ci-dessous) qui étiquette chaque facture selon son retard. Résumer : Regrouper par.
    • invoices — n’importe quelle colonne, par exemple invoice_number. Résumer : Nombre.
    • balance — mappée depuis amount_unpaid. Résumer : Somme.

    Pour aging_bucket, saisissez cette expression — elle mesure le nombre de jours de retard (une date moins une date donne des jours) et étiquette la tranche :

    case(
    ((func.today() - netsuite_open_ar.due_date) <= 0, '0 - Current'),
    ((func.today() - netsuite_open_ar.due_date) <= 30, '1 - 1-30 days'),
    ((func.today() - netsuite_open_ar.due_date) <= 60, '2 - 31-60 days'),
    ((func.today() - netsuite_open_ar.due_date) <= 90, '3 - 61-90 days'),
    else_='4 - Over 90 days',
    )
  3. Exécutez-la. netsuite_ar_aging vous indique désormais, en cinq lignes, quelle part est à jour et quelle part est en retard de 30, 60 ou plus de 90 jours — la vue de recouvrement qu’un décideur consulte en premier. (due_date doit être typée Date pour que la soustraction de dates fonctionne — vous l’avez défini dans l’onglet Réponse de l’étape Requête REST ci-dessus.)

Des chiffres dans une table, c’est bien ; un graphique, c’est ce que l’on envoie au directeur financier. Publiez netsuite_pnl et netsuite_ar_aging, puis suivez Créer un tableau de bord pour ajouter :

  • un histogramme du résultat net (ou des revenus) par period, et
  • un graphique en secteurs ou en barres du balance des créances par aging_bucket.

Vous obtenez un tableau de bord financier NetSuite en direct — sans export, actualisé à chaque exécution du workflow.

  1. Exécutez une fois le workflow complet, de haut en bas, pour vérifier que chaque étape est au vert.
  2. Planifiez le workflow — mensuellement selon le rythme de clôture, ou chaque nuit si vous voulez une balance âgée à jour chaque matin.

Comme chaque récupération remplace intégralement la table, chaque exécution réextrait la tranche définie par sa clause WHERE — limitez-la à la fenêtre dont vous avez besoin (l’année en cours, uniquement les factures ouvertes) plutôt qu’à tout l’historique.

En partant d’un workflow vide, vous avez récupéré le grand livre et les créances NetSuite en direct, les avez transformés en un compte de résultat mensuel et une balance âgée des créances clients avec deux étapes de transformation standard — sans SQL —, les avez placés sur un tableau de bord et avez configuré leur actualisation — la boucle de reporting essentielle d’une équipe financière, désormais automatisée.