ExoConnect pour Acomba
Latest
  • Latest
  • 2.2.0
  • 2.3.2
  • 2.4.0
AccueilGuidesRéférence de l'APIRecettes
AccueilGuidesRéférence de l'APIRecettes
Contactez-nous
Latest
  • Latest
  • 2.2.0
  • 2.3.2
  • 2.4.0
Latest
  • Latest
  • 2.2.0
  • 2.3.2
  • 2.4.0
  1. Recettes
  • États de compte automatisés
  • Relances de recouvrement
  • Bons de commande, réceptions et rapprochement
  • Commande en ligne, facture et paiement
  • Lot de paiements fournisseurs
  • Synchronisation CRM
  • Import de feuilles de temps
  • Rapport de trésorerie
  • Vérification des DAS
  • Power BI et Excel
  • Rapport mensuel CCQ
  • Embaucher un travailleur de la construction
  1. Recettes

Power BI et Excel

Chaque début de mois, quelqu'un exporte des rapports d'Acomba, les colle dans Excel, refait les mêmes tableaux croisés et envoie le fichier. Le tableau de bord est déjà vieux quand il arrive, et une colonne mal collée suffit à fausser un mois entier.
Dans cette recette, nous allons brancher Power BI et Excel directement sur vos données Acomba : ventes par mois, meilleurs clients, ventes et marge par produit, âge des comptes clients. Un clic sur « Actualiser » remplace le copier-coller, et Power BI peut actualiser le rapport tout seul chaque matin.
Ce que vous allez apprendre
appeler l'API depuis Power Query, le moteur commun à Power BI et Excel ;
transformer une réponse en table typée, prête pour les visuels ;
lire une liste longue page par page ;
publier le rapport dans Power BI et l'actualiser automatiquement.
Avant de commencer
Power BI Desktop, ou Excel pour Microsoft 365 (onglet Données) ;
une clé API en lecture : un rapport n'écrit jamais dans Acomba ;
l'adresse de votre relais ExoConnect (https://relay.exoconnect.app/VOTRE_CHEMIN).

Les données que nous allons charger#

Avant d'ouvrir Power BI, choisissons nos sources. Les routes d'analyse renvoient des données déjà agrégées et gardées en cache : elles conviennent mieux à un tableau de bord que les listes de factures.
TableRouteListe à développer
Ventes par moisGET /api/sales/summary?group_by=monthseries
Meilleurs clientsGET /api/sales/top-customersitems
Ventes et marge par produitGET /api/products/analytics?group_by=productbuckets, page par page
Âge des comptes clientsGET /api/customers/agingitems
Les montants de ventes sont nets des notes de crédit : une facture annulée par un crédit ne compte plus.

Étape 1 : préparer la connexion#

Commençons par deux paramètres, pour ne jamais recopier l'adresse ni la clé dans chaque requête. Dans Power BI : Accueil › Transformer les données › Gérer les paramètres › Nouveau paramètre. Dans Excel : Données › Obtenir des données › Lancer l'éditeur Power Query, puis Gérer les paramètres.
ParamètreTypeValeur
UrlRelaisTextehttps://relay.exoconnect.app/VOTRE_CHEMIN
CleApiTextevotre clé API en lecture
Ajoutez ensuite une requête vide nommée Appel (Nouvelle source › Requête vide › Éditeur avancé). C'est la fonction que toutes les autres requêtes utiliseront :
// Appel : GET sur l'API ExoConnect, réponse JSON décodée.
(chemin as text, optional parametres as record) as any =>
    Json.Document(
        Web.Contents(
            UrlRelais,
            [
                RelativePath = chemin,
                Query = if parametres = null then [] else parametres,
                Headers = [#"x-api-key" = CleApi, Accept = "application/json"],
                Timeout = #duration(0, 0, 5, 0)
            ]
        )
    )
RelativePath et Query gardent l'adresse de base fixe : c'est ce qui permet au service Power BI d'actualiser le rapport (étape 4). Les valeurs de Query sont toujours du texte.

Étape 2 : charger les ventes par mois#

La connexion est prête ; chargeons notre première table. La synthèse des ventes renvoie un élément par mois dans series.
Power Query
cURL (même appel)
Réponse 200 (extrait)
let
    Reponse = Appel("api/sales/summary", [from = "2025-01-01", to = "2025-12-31", group_by = "month"]),
    Table = Table.FromRecords(Reponse[series]),
    Colonnes = Table.SelectColumns(Table, {"bucket", "from", "to", "revenue_net", "subtotal", "taxes", "invoices_count", "active_customers_count"}),
    Types = Table.TransformColumnTypes(Colonnes, {
        {"from", type date}, {"to", type date},
        {"revenue_net", Currency.Type}, {"subtotal", Currency.Type}, {"taxes", Currency.Type},
        {"invoices_count", Int64.Type}, {"active_customers_count", Int64.Type}})
in
    Types
revenue_net : ventes taxes comprises, nettes des crédits. subtotal : ventes avant taxes, nettes des crédits ; c'est le chiffre d'affaires à comparer à vos états financiers.
group_by accepte aussi day, week, quarter et year.
Renommez la requête Ventes par mois, puis Fermer et appliquer (Power BI) ou Fermer et charger (Excel).

Étape 3 : ajouter les clients, les produits et l'âge des comptes#

Une table ne fait pas un tableau de bord ; ajoutons les trois autres. Chaque requête suit le même modèle : appeler, développer la liste, typer les colonnes.
Meilleurs clients : les 50 premiers clients de l'année, avec leur part des ventes.
let
    Reponse = Appel("api/sales/top-customers", [from = "2025-01-01", to = "2025-12-31", limit = "50"]),
    Table = Table.FromRecords(Reponse[items]),
    Client = Table.ExpandRecordColumn(Table, "customer", {"code", "name"}, {"client_code", "client_nom"}),
    Colonnes = Table.SelectColumns(Client, {"rank", "client_code", "client_nom", "revenue", "invoices_count", "share_pct", "last_invoice_date"}),
    Types = Table.TransformColumnTypes(Colonnes, {
        {"rank", Int64.Type}, {"revenue", Currency.Type}, {"invoices_count", Int64.Type},
        {"share_pct", type number}, {"last_invoice_date", type date}})
in
    Types
Ventes et marge par produit : la liste peut être longue ; nous la lisons page par page, en suivant metadata.next_offset tant que metadata.has_more est vrai.
let
    Page = (decalage as number) =>
        Appel("api/products/analytics", [from = "2025-01-01", to = "2025-12-31", group_by = "product",
                                         limit = "200", offset = Number.ToText(decalage)]),
    Pages = List.Generate(
        () => Page(0),
        each _ <> null,
        each if _[metadata][has_more] then Page(_[metadata][next_offset]) else null,
        each _[buckets]),
    Table = Table.FromRecords(List.Combine(Pages)),
    Produit = Table.ExpandRecordColumn(Table, "ref", {"code", "name"}, {"produit_code", "produit_nom"}),
    Colonnes = Table.SelectColumns(Produit, {"produit_code", "produit_nom", "revenue", "cost", "margin", "margin_pct", "qty", "abc_class"}),
    Types = Table.TransformColumnTypes(Colonnes, {
        {"revenue", Currency.Type}, {"cost", Currency.Type}, {"margin", Currency.Type},
        {"margin_pct", type number}, {"qty", type number}})
in
    Types
Âge des comptes clients : le solde de chaque client et sa répartition par tranche de retard.
let
    Reponse = Appel("api/customers/aging"),
    Table = Table.FromRecords(Reponse[items]),
    Client = Table.ExpandRecordColumn(Table, "customer", {"code", "name"}, {"client_code", "client_nom"}),
    Tranches = Table.ExpandRecordColumn(Client, "aging", {"days_0_30", "days_30_60", "days_60_90", "days_over_90"}),
    Colonnes = Table.SelectColumns(Tranches, {"client_code", "client_nom", "balance_total", "days_most_overdue",
                                              "days_0_30", "days_30_60", "days_60_90", "days_over_90"}),
    Types = Table.TransformColumnTypes(Colonnes, {
        {"balance_total", Currency.Type}, {"days_most_overdue", Int64.Type},
        {"days_0_30", Currency.Type}, {"days_30_60", Currency.Type}, {"days_60_90", Currency.Type},
        {"days_over_90", Currency.Type}})
in
    Types
cURL (mêmes appels)
Réponse 200 (extrait, produits)
La ligne de produit sans rattachement (ref vide) regroupe les ventes sans produit, par exemple des lignes de texte avec montant.
abc_class classe les produits : A pour ceux qui font 80 % des ventes, puis B et C.
Une marge n'est calculée que si le produit a un coûtant ; summary.lines_without_cost compte les lignes sans coûtant.

Étape 4 : publier et actualiser automatiquement#

Le rapport est prêt ; faisons-le vivre sans vous. Dans Power BI Desktop, Publier, puis dans le service Power BI :
1.
Ouvrez le jeu de données, Paramètres › Informations d'identification de la source de données.
2.
Pour la source https://relay.exoconnect.app/…, choisissez l'authentification Anonyme : la clé passe par l'en-tête x-api-key de la fonction Appel. Niveau de confidentialité : Organisationnel.
3.
Actualisation planifiée : une fois par jour, tôt le matin, suffit. Aucune passerelle n'est nécessaire, le relais étant accessible sur Internet.
Dans Excel, Données › Actualiser tout relance toutes les requêtes ; Propriétés de la requête permet de les actualiser à l'ouverture du classeur.

Bon à savoir#

Protégez la clé. Elle est enregistrée dans le fichier .pbix ou .xlsx : utilisez une clé en lecture seule, propre au rapport, et ne partagez pas le fichier source.
Une requête à la fois. Acomba traite une opération à la fois ; ExoConnect met les appels en file. Si l'actualisation est lente, réduisez dans Power BI Options › Chargement des données › Nombre maximal d'évaluations simultanées.
Les résultats sont gardés en cache : 4 heures pour une période qui touche aujourd'hui, 24 heures pour une période passée. Une actualisation par jour reste donc légère pour Acomba.
Les dates arrivent en ISO avec le décalage horaire (2026-10-11T09:12:40-04:00) ; typez-les en date ou en datetimezone selon le visuel.
Plusieurs années : appelez la synthèse année par année et combinez les tables (Table.Combine) plutôt qu'un seul intervalle de dix ans.
Codes d'erreur : une actualisation qui échoue en 401 signale une clé invalide ; voir Codes d'erreur.

Et voilà#

Votre tableau de bord se nourrit maintenant directement d'Acomba : ventes par mois, meilleurs clients, marge par produit et âge des comptes, actualisés d'un clic dans Excel ou chaque matin dans Power BI. Vous savez appeler l'API depuis Power Query, transformer une réponse en table typée, lire une longue liste page par page et publier un rapport qui s'actualise seul.
Pour aller plus loin
Rapport de trésorerie : ajoutez une page trésorerie avec l'encaisse et la prévision.
Relances de recouvrement : passez de l'âge des comptes à l'action.
Tableaux de bord et analyses : toutes les routes d'analyse et leurs conventions.
Modified at 2026-10-11 16:51:01
Previous
Vérification des DAS
Next
Rapport mensuel CCQ
Built with