Votre instance expose deux interfaces. L'une est dédiée aux articles et tient en deux appels ; l'autre ouvre le modèle complet.
L'interface articles répond à la question qu'on pose le plus souvent : que sait Goodstock de cette référence, et comment lui transmettre ce que j'en sais. Un appel pour lire, un pour écrire. Un jeton, du JSON.
L'accès au modèle se fait par clé d'API. Tout ce que vous voyez à l'écran s'y lit et s'y écrit, avec les droits de l'utilisateur dont la clé est employée : commandes fournisseurs, attendus de réception, historiques de statuts, coûts de revient.
Le jeton de l'interface articles vous est remis par nos soins. La clé d'API, elle, se crée depuis votre profil. Écrivez-nous à contact@very-goodstock.com en indiquant ce que vous comptez faire — cela nous évite de vous ouvrir plus de droits que nécessaire.
Deux appels, un jeton
Deux portes, selon ce que vous avez à faire
Lire et écrire une fiche produit : coûts, fournisseur, points de mesure de stock, relations de remplacement. Deux appels et un jeton, en JSON. Le détail.
Tout le reste : commandes fournisseurs et leurs lignes, attendus de réception, historiques journaliers, coûts de revient, fermetures fournisseurs. Le détail.
L'adresse de votre instance vous a été communiquée à l'ouverture du compte,
sous la forme https://votre-instance.very-goodstock.com. Chaque
requête porte deux en-têtes :
| En-tête | Valeur |
|---|---|
X-Auth-Key | le jeton fourni par Goodstock |
Content-Type | application/json |
POST /api/v1/get_product
Renvoie ce que Goodstock sait d'une référence : ses coûts, son fournisseur principal, les autres fournisseurs connus, et les commandes d'achat planifiées qui la concernent.
POST /api/v1/get_product
X-Auth-Key: token_xxxxxxxxxxxxxxxxx
Content-Type: application/json
{ "product_code": "123456" }
{
"id": 22112,
"name": "Savon de Marseille 300 g",
"real_cost": 4.15,
"average_cost": 4.15,
"main_supplier": {
"id": 156,
"name": "Savonnerie du Midi",
"currency": "EUR",
"purchase_price": 4.36,
"currency_for_conversion": "EUR",
"converted_purchase_price": 4.36,
"lead_time": 45,
"main_supplier_end_date": false
},
"suppliers": [ ... ],
"purchases": [
{
"line_id": 88431,
"order": { "id": 4148, "name": "4148", "supplier_name": "Savonnerie du Midi" },
"date_planned": "2027-02-08",
"quantity": 144,
"quantity_received": 0,
"supplier": { ... }
}
]
}
Les champs de la réponse
| Champ | Type | Description |
|---|---|---|
id | int | Identifiant de l'article dans Goodstock |
name | string | Désignation, informations de variante comprises |
real_cost | float | Coût de revient actuel |
average_cost | float | Coût moyen pondéré |
main_supplier | object | Fournisseur principal |
…name | string | Nom du fournisseur |
…currency | string | Devise du fournisseur |
…purchase_price | float | Prix d'achat dans la devise du fournisseur |
…currency_for_conversion | string | Devise de la société utilisatrice |
…converted_purchase_price | float | Prix d'achat converti dans cette devise |
…lead_time | int | Délai d'approvisionnement, en jours |
…main_supplier_end_date | date | Fin de validité du statut de fournisseur principal |
suppliers | array | Les autres fournisseurs, mêmes champs que ci-dessus |
purchases | array | Les lignes de commande d'achat planifiées |
…line_id | int | Identifiant de la ligne |
…order | object | Commande porteuse : id, name, supplier_name |
…date_planned | string | Date de réception prévue |
…quantity | int | Quantité commandée |
…quantity_received | int | Quantité déjà reçue |
out_of_stock_date | date | Date de rupture prévue ; si l'article est déjà en rupture, dernier jour où il restait du stock |
out_of_stock_date_infinite | bool | Rupture trop lointaine pour être datée |
Codes de retour
| Code | Signification |
|---|---|
401 | Jeton absent ou invalide |
400 | Requête malformée — product_code manquant, ou paramètre du planning invalide, par exemple |
403 | Article introuvable |
500 | Erreur interne : signalez-la nous, elle est tracée de notre côté |
import requests URL = "https://votre-instance.very-goodstock.com" ENTETES = {"X-Auth-Key": "token_xxxxxxxxxxxxxxxxx", "Content-Type": "application/json"} reponse = requests.post( f"{URL}/api/v1/get_product", headers=ENTETES, json={"product_code": "123456"}, timeout=30, ) reponse.raise_for_status() article = reponse.json() print(article["real_cost"], article["main_supplier"]["lead_time"])
Afficher le planning prévisionnel du stock sur votre site marchand
Certains e-commerçants aiment afficher, sur la page produit, l'écoulement
prévisionnel du stock et les réceptions à venir. Ajoutez
"stock_planning": "html" à la requête : la réponse contient alors
stock_planning_html, un bloc prêt à insérer dans la page, SVG et styles
compris, sans JavaScript, adapté au mobile. Avec "data", vous recevez
plutôt les points de la courbe et les réceptions, pour la dessiner vous-même.
POST /api/v1/get_product
{ "product_code": "HJKL_8956452", "stock_planning": "html" }
- Stock
- 180 29 j de stock
- Rupture
- 7 nov. dans 29 jours
- Réappro
- 25 nov. +500 unités
Article fictif, tel qu'affichable sur votre page produit si vous le souhaitez, à vos couleurs.
{
"id": 22112,
"name": "Vis à tête fraisée de 12x56mm",
…
"out_of_stock_date": "2026-11-07",
"out_of_stock_date_infinite": false,
"stock_planning": {
"as_of": "2026-10-09",
"computed_at": "2026-10-09",
"horizon_days": 120,
"out_of_stock_date": "2026-11-07",
"out_of_stock_date_infinite": false,
"points": [
{ "date": "2026-10-09", "qty": 180.0 },
{ "date": "2026-10-10", "qty": 173.8 },
… un point par jour jusqu'à l'horizon …
],
"receipts": [ { "date": "2026-11-25", "qty": 500.0 } ],
"purchased_for_stock": true,
"supplier_lead_time_days": 60
},
"stock_planning_html": "le bloc ci-dessous"
}
Contenu de stock_planning_html, à insérer tel quel dans la page :
<section class="gs-sp" data-status="soon">
<style>
.gs-sp {
--_accent: var(--gs-sp-accent, #3b74d8);
--_alert: var(--gs-sp-alert, #d64545);
--_warn: var(--gs-sp-warn, #d9822b);
--_ok: var(--gs-sp-ok, #3f9d4b);
--_text: var(--gs-sp-text, #1f2933);
--_muted: var(--gs-sp-muted, #6b7280);
--_border: var(--gs-sp-border, #e4e2dc);
--_grid: var(--gs-sp-grid, #ecebe7);
--_status: var(--_ok);
box-sizing: border-box;
width: 100%;
max-width: var(--gs-sp-max-width, 720px);
margin: 0;
padding: 16px 18px 12px;
border: 1px solid var(--_border);
border-radius: var(--gs-sp-radius, 12px);
background: var(--gs-sp-bg, #fff);
color: var(--_text);
font-family: var(--gs-sp-font, inherit);
font-size: var(--gs-sp-font-size, 14px);
line-height: 1.3;
text-align: left;
}
.gs-sp[data-status="out"] { --_status: var(--_alert); }
.gs-sp[data-status="soon"] { --_status: var(--_warn); }
.gs-sp[data-status="later"], .gs-sp[data-status="order"] { --_status: var(--_accent); }
.gs-sp *, .gs-sp *::before, .gs-sp *::after { box-sizing: border-box; }
.gs-sp .gs-sp-head {
display: flex; flex-wrap: wrap; align-items: flex-start; justify-content: space-between;
gap: 6px 12px; margin: 0 0 14px;
}
.gs-sp .gs-sp-product { min-width: 0; flex: 1 1 10em; }
.gs-sp .gs-sp-code {
display: block; margin: 0 0 2px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
font-size: .8em; letter-spacing: .03em; color: var(--_muted);
}
.gs-sp .gs-sp-name { display: block; margin: 0; font-size: 1.15em; font-weight: 600; overflow-wrap: anywhere; }
.gs-sp .gs-sp-badge {
position: relative; isolation: isolate; display: inline-flex; align-items: center; gap: 6px;
padding: 3px 10px; border-radius: 999px; font-size: .8em; font-weight: 600;
color: var(--_text); white-space: nowrap;
}
.gs-sp .gs-sp-badge::after {
content: ""; position: absolute; inset: 0; z-index: -1; border-radius: inherit;
background: var(--_status); opacity: .14;
}
.gs-sp .gs-sp-badge::before {
content: ""; width: 8px; height: 8px; border-radius: 50%; background: var(--_status);
}
.gs-sp .gs-sp-kpis {
display: grid; grid-template-columns: repeat(auto-fit, minmax(6.5em, 1fr)); gap: 10px 12px;
margin: 0 0 14px; padding: 0;
}
.gs-sp .gs-sp-kpi { margin: 0; padding: 0; min-width: 0; }
.gs-sp .gs-sp-kpi dt {
display: flex; align-items: center; gap: 6px; margin: 0 0 2px; font-size: .75em; font-weight: 500;
text-transform: uppercase; letter-spacing: .05em; color: var(--_muted);
}
.gs-sp .gs-sp-kpi dt::before {
content: ""; flex: none; width: 8px; height: 8px; border-radius: 50%; background: var(--_accent);
}
.gs-sp .gs-sp-kpi--rupture dt::before {
width: 12px; height: 4px; border-radius: 1px; background: var(--_alert);
}
.gs-sp .gs-sp-kpi--receipt dt::before { background: var(--_ok); }
.gs-sp .gs-sp-kpi dd {
margin: 0; padding: 0; font-size: 1.3em; font-weight: 700; line-height: 1.2;
overflow-wrap: anywhere;
}
.gs-sp[data-status="out"] .gs-sp-kpi--rupture dd,
.gs-sp[data-status="soon"] .gs-sp-kpi--rupture dd { color: var(--_status); }
.gs-sp .gs-sp-note {
display: block; margin-top: 2px; font-size: .6em; font-weight: 400; line-height: 1.3;
color: var(--_muted);
}
.gs-sp .gs-sp-order { margin: 0 0 4px; font-size: 1.15em; font-weight: 600; }
.gs-sp .gs-sp-chart { position: relative; margin: 0; padding: 20px 0 0 34px; }
.gs-sp .gs-sp-plot {
position: relative; height: var(--gs-sp-chart-height, 160px);
border-bottom: 1px solid var(--_muted);
}
.gs-sp .gs-sp-plot svg {
position: absolute; top: 0; left: 0; width: 100%; height: 100%;
display: block; overflow: visible;
}
.gs-sp .gs-sp-area { fill: var(--_accent); opacity: .12; }
.gs-sp .gs-sp-line {
fill: none; stroke: var(--_accent); stroke-width: 2;
stroke-linejoin: round; vector-effect: non-scaling-stroke;
}
.gs-sp .gs-sp-out { fill: var(--_alert); opacity: .14; }
.gs-sp .gs-sp-grid {
position: absolute; left: 0; right: 0; height: 0; border-top: 1px solid var(--_grid);
}
.gs-sp .gs-sp-vgrid {
position: absolute; top: 0; bottom: 0; width: 0; border-left: 1px solid var(--_grid);
}
.gs-sp .gs-sp-ylabel {
position: absolute; left: -34px; width: 28px; transform: translateY(50%);
text-align: right; font-size: .75em; color: var(--_muted);
font-variant-numeric: tabular-nums;
}
.gs-sp .gs-sp-start {
position: absolute; left: 0; width: 9px; height: 9px; border-radius: 50%;
background: var(--_accent); transform: translate(-50%, 50%);
}
.gs-sp .gs-sp-start-label {
position: absolute; left: 12px; bottom: 4px; font-size: .8em; font-weight: 700;
white-space: nowrap;
}
.gs-sp .gs-sp-receipt {
position: absolute; top: 0; bottom: 0; width: 0;
border-left: 2px dashed var(--_ok);
}
.gs-sp .gs-sp-receipt-label {
position: absolute; top: -20px; left: 0; transform: translateX(-50%);
font-size: .75em; font-weight: 700; color: var(--_ok); white-space: nowrap;
}
.gs-sp .gs-sp-receipt-label.is-start { transform: translateX(-2px); }
.gs-sp .gs-sp-receipt-label.is-end { transform: translateX(-100%); }
.gs-sp .gs-sp-xaxis { position: relative; height: 20px; font-size: .75em; color: var(--_muted); }
.gs-sp .gs-sp-xlabel { position: absolute; top: 4px; transform: translateX(-50%); white-space: nowrap; }
.gs-sp .gs-sp-xlabel.is-today { left: 0; transform: none; font-weight: 700; color: var(--_text); }
.gs-sp .gs-sp-empty {
margin: 0; padding: 24px 8px; border: 1px dashed var(--_border); border-radius: 8px;
text-align: center; color: var(--_muted);
}
.gs-sp .gs-sp-foot { margin: 10px 0 0; font-size: .8em; text-align: right; }
/* Pastille aux couleurs de Goodstock (jaune #FFD601 et noir) : non habillable par le site, et
protégée des styles larges du site hôte (liens, svg, figures) par !important. */
.gs-sp .gs-sp-credit {
display: inline-flex !important; align-items: center; gap: 6px; padding: 3px 10px 3px
4px !important;
border: 0 !important; border-radius: 999px !important; background: #ffd601 !important;
color: #000 !important; font-size: .9em; font-weight: 600; line-height: 1.2;
text-decoration: none !important; box-shadow: none !important;
}
.gs-sp .gs-sp-credit:hover, .gs-sp .gs-sp-credit:focus {
background: #000 !important; color: #ffd601 !important;
}
.gs-sp .gs-sp-logo {
display: block !important; flex: none; width: 18px !important; height: 18px !important;
min-width: 0 !important; max-width: none !important; margin: 0 !important;
}
</style>
<header class="gs-sp-head">
<div class="gs-sp-product">
<span class="gs-sp-code">HJKL_8956452</span>
<span class="gs-sp-name">Vis à tête fraisée de 12x56mm</span>
</div>
<span class="gs-sp-badge">Rupture dans 29 j</span>
</header>
<dl class="gs-sp-kpis">
<div class="gs-sp-kpi gs-sp-kpi--stock">
<dt>Stock</dt>
<dd>
180
<span class="gs-sp-note">29 j de stock</span>
</dd>
</div>
<div class="gs-sp-kpi gs-sp-kpi--rupture">
<dt>Rupture</dt>
<dd>
7 nov.
<span class="gs-sp-note">dans 29 jours</span>
</dd>
</div>
<div class="gs-sp-kpi gs-sp-kpi--receipt">
<dt>Réappro</dt>
<dd>
25 nov.
<span class="gs-sp-note">+500 unités</span>
</dd>
</div>
</dl>
<figure class="gs-sp-chart" role="img" aria-label="Stock prévu sur 120 jours. Rupture : 7 nov. dans 29 jours. Prochaine arrivée : 25 nov. +500 unités.">
<div class="gs-sp-plot">
<span class="gs-sp-grid" style="bottom: 0%"></span>
<span class="gs-sp-ylabel" style="bottom: 0%">0</span>
<span class="gs-sp-grid" style="bottom: 50%"></span>
<span class="gs-sp-ylabel" style="bottom: 50%">300</span>
<span class="gs-sp-grid" style="bottom: 100%"></span>
<span class="gs-sp-ylabel" style="bottom: 100%">600</span>
<span class="gs-sp-vgrid" style="left: 19.17%"></span><span class="gs-sp-vgrid" style="left: 44.17%"></span><span class="gs-sp-vgrid" style="left: 70.00%"></span><span class="gs-sp-vgrid" style="left: 95.83%"></span>
<svg preserveAspectRatio="none" aria-hidden="true" focusable="false" viewBox="0 0 1000 100">
<rect class="gs-sp-out" y="0" x="241.7" width="150.0" height="100"></rect>
<path class="gs-sp-area" d="M0.0,70.00 L8.3,71.03 L16.7,72.07 L25.0,73.10 L33.3,74.13 L41.7,75.17 L50.0,76.20 L58.3,77.23 L66.7,78.27 L75.0,79.30 L83.3,80.33 L91.7,81.37 L100.0,82.40 L108.3,83.43 L116.7,84.47 L125.0,85.50 L133.3,86.53 L141.7,87.57 L150.0,88.60 L158.3,89.63 L166.7,90.67 L175.0,91.70 L183.3,92.73 L191.7,93.77 L200.0,94.80 L208.3,95.83 L216.7,96.87 L225.0,97.90 L233.3,98.93 L241.7,99.97 L250.0,100.00 L258.3,100.00 L266.7,100.00 L275.0,100.00 L283.3,100.00 L291.7,100.00 L300.0,100.00 L308.3,100.00 L316.7,100.00 L325.0,100.00 L333.3,100.00 L341.7,100.00 L350.0,100.00 L358.3,100.00 L366.7,100.00 L375.0,100.00 L383.3,100.00 L391.7,16.67 L400.0,17.70 L408.3,18.73 L416.7,19.77 L425.0,20.80 L433.3,21.83 L441.7,22.87 L450.0,23.90 L458.3,24.93 L466.7,25.97 L475.0,27.00 L483.3,28.03 L491.7,29.07 L500.0,30.10 L508.3,31.13 L516.7,32.17 L525.0,33.20 L533.3,34.23 L541.7,35.27 L550.0,36.30 L558.3,37.33 L566.7,38.37 L575.0,39.40 L583.3,40.43 L591.7,41.47 L600.0,42.50 L608.3,43.53 L616.7,44.57 L625.0,45.60 L633.3,46.63 L641.7,47.67 L650.0,48.70 L658.3,49.73 L666.7,50.77 L675.0,51.80 L683.3,52.83 L691.7,53.87 L700.0,54.90 L708.3,55.93 L716.7,56.97 L725.0,58.00 L733.3,59.03 L741.7,60.07 L750.0,61.10 L758.3,62.13 L766.7,63.17 L775.0,64.20 L783.3,65.23 L791.7,66.27 L800.0,67.30 L808.3,68.33 L816.7,69.37 L825.0,70.40 L833.3,71.43 L841.7,72.47 L850.0,73.50 L858.3,74.53 L866.7,75.57 L875.0,76.60 L883.3,77.63 L891.7,78.67 L900.0,79.70 L908.3,80.73 L916.7,81.77 L925.0,82.80 L933.3,83.83 L941.7,84.87 L950.0,85.90 L958.3,86.93 L966.7,87.97 L975.0,89.00 L983.3,90.03 L991.7,91.07 L1000.0,92.10 L1000.0,100 L0,100 Z"></path>
<path class="gs-sp-line" d="M0.0,70.00 L8.3,71.03 L16.7,72.07 L25.0,73.10 L33.3,74.13 L41.7,75.17 L50.0,76.20 L58.3,77.23 L66.7,78.27 L75.0,79.30 L83.3,80.33 L91.7,81.37 L100.0,82.40 L108.3,83.43 L116.7,84.47 L125.0,85.50 L133.3,86.53 L141.7,87.57 L150.0,88.60 L158.3,89.63 L166.7,90.67 L175.0,91.70 L183.3,92.73 L191.7,93.77 L200.0,94.80 L208.3,95.83 L216.7,96.87 L225.0,97.90 L233.3,98.93 L241.7,99.97 L250.0,100.00 L258.3,100.00 L266.7,100.00 L275.0,100.00 L283.3,100.00 L291.7,100.00 L300.0,100.00 L308.3,100.00 L316.7,100.00 L325.0,100.00 L333.3,100.00 L341.7,100.00 L350.0,100.00 L358.3,100.00 L366.7,100.00 L375.0,100.00 L383.3,100.00 L391.7,16.67 L400.0,17.70 L408.3,18.73 L416.7,19.77 L425.0,20.80 L433.3,21.83 L441.7,22.87 L450.0,23.90 L458.3,24.93 L466.7,25.97 L475.0,27.00 L483.3,28.03 L491.7,29.07 L500.0,30.10 L508.3,31.13 L516.7,32.17 L525.0,33.20 L533.3,34.23 L541.7,35.27 L550.0,36.30 L558.3,37.33 L566.7,38.37 L575.0,39.40 L583.3,40.43 L591.7,41.47 L600.0,42.50 L608.3,43.53 L616.7,44.57 L625.0,45.60 L633.3,46.63 L641.7,47.67 L650.0,48.70 L658.3,49.73 L666.7,50.77 L675.0,51.80 L683.3,52.83 L691.7,53.87 L700.0,54.90 L708.3,55.93 L716.7,56.97 L725.0,58.00 L733.3,59.03 L741.7,60.07 L750.0,61.10 L758.3,62.13 L766.7,63.17 L775.0,64.20 L783.3,65.23 L791.7,66.27 L800.0,67.30 L808.3,68.33 L816.7,69.37 L825.0,70.40 L833.3,71.43 L841.7,72.47 L850.0,73.50 L858.3,74.53 L866.7,75.57 L875.0,76.60 L883.3,77.63 L891.7,78.67 L900.0,79.70 L908.3,80.73 L916.7,81.77 L925.0,82.80 L933.3,83.83 L941.7,84.87 L950.0,85.90 L958.3,86.93 L966.7,87.97 L975.0,89.00 L983.3,90.03 L991.7,91.07 L1000.0,92.10"></path>
</svg>
<span class="gs-sp-start" style="bottom: 30.00%">
<span class="gs-sp-start-label">180</span>
</span>
<span class="gs-sp-receipt" style="left: 39.17%" title="Arrivée prévue le 25 novembre : 500 unités">
<span class="gs-sp-receipt-label ">+500</span>
</span>
</div>
<div class="gs-sp-xaxis" aria-hidden="true">
<span class="gs-sp-xlabel is-today">Auj.</span>
<span class="gs-sp-xlabel" style="left: 19.17%">1 nov.</span><span class="gs-sp-xlabel" style="left: 44.17%">1 déc.</span><span class="gs-sp-xlabel" style="left: 70.00%">1 janv.</span>
</div>
</figure>
<footer class="gs-sp-foot">
<a class="gs-sp-credit" href="https://www.mangono.fr/goodstock/" target="_blank" rel="noopener">
<svg xmlns="http://www.w3.org/2000/svg" class="gs-sp-logo" width="18" height="18" aria-hidden="true" focusable="false" viewBox="0 0 116 116" fill="none">
<rect width="116" height="116" rx="58" fill="#FFD601"></rect>
<g clip-path="url(#gs-sp-logo-clip)">
<path d="M90.09 48.382C90.09 48.7484 90.1329 88.4785 90.1329 88.5039C90.1329 88.9754 89.7898 89.3781 89.3288 89.447L49.2506 95.2797C49.0504 95.3051 48.8432 95.2688 48.6645 95.1709L25.0642 81.9312C24.764 81.7607 24.5782 81.4415 24.5782 81.0932L24.639 41.403C24.639 41.3849 24.639 41.3704 24.639 41.3595C24.6497 41.1419 24.7319 40.9351 24.8748 40.7719C25.0178 40.6087 25.225 40.4926 25.4395 40.4636C36.9501 38.8023 49.6329 37.8483 61.1436 36.1869C62.9233 35.9294 64.6994 35.6682 66.4754 35.418C66.6756 35.3889 66.8721 35.4252 67.0508 35.5195C67.0615 35.5268 67.0687 35.5304 67.0794 35.5377C67.1401 35.5703 67.2045 35.603 67.2652 35.6392C67.3831 35.7045 68.5446 36.3357 68.759 36.4517C69.0127 36.5896 72.0646 38.2509 72.4148 38.4431C72.7865 38.6463 88.9607 47.4498 89.1215 47.5368C89.2323 47.5985 89.3431 47.6566 89.4539 47.7182C89.7362 47.8742 90.0828 48.0157 90.0828 48.3856L90.09 48.382ZM88.2603 87.0928V50.5221C88.2603 50.1123 87.9029 49.7967 87.5063 49.8547L86.3413 50.0179L50.5907 55.0853C50.2619 55.1288 50.0189 55.4154 50.0189 55.7527L50.0368 77.7815L50.051 92.4613C50.051 92.8712 50.4084 93.1831 50.8087 93.1287L87.6885 87.7603C88.0173 87.7131 88.2567 87.4266 88.2567 87.0928H88.2603ZM85.7409 48.1825C85.8945 48.1608 85.9303 47.954 85.7945 47.8814L66.4397 37.3441L29.5956 41.8129C29.2668 41.8528 29.1811 42.299 29.4741 42.4622L49.0647 53.2499C49.1898 53.3188 49.3327 53.3442 49.4721 53.3261L85.7409 48.1825ZM48.1785 91.5798L48.1463 55.3066C48.1463 55.0599 48.0141 54.835 47.7961 54.7153L27.4907 43.5395C27.0476 43.2929 26.5116 43.6193 26.508 44.1308L26.4544 80.1356C26.4544 80.3823 26.5866 80.6072 26.7974 80.7269L47.1921 92.1747C47.6353 92.4214 48.1785 92.0949 48.1785 91.5835V91.5798Z" fill="black"></path>
<path d="M88.2603 50.5222V87.0929C88.2603 87.4266 88.0173 87.7132 87.6921 87.7604L50.8122 93.1288C50.412 93.1868 50.0546 92.8713 50.0546 92.4614L50.0403 77.7816L50.0224 55.7528C50.0224 55.4155 50.2654 55.1289 50.5942 55.0854L86.3448 50.018L87.5098 49.8548C87.9065 49.7968 88.2638 50.1123 88.2638 50.5222H88.2603Z" fill="white"></path>
<path d="M85.7909 47.8815C85.9267 47.9541 85.891 48.1608 85.7373 48.1826L49.4686 53.3261C49.3292 53.3443 49.1863 53.3189 49.0612 53.25L29.4741 42.4623C29.1811 42.2991 29.2668 41.8529 29.5956 41.813L66.4397 37.3478L85.7945 47.8852L85.7909 47.8815Z" fill="white"></path>
<path d="M48.1427 55.3067L48.1749 91.58C48.1749 92.0951 47.6317 92.4179 47.1885 92.1712L26.7974 80.727C26.5866 80.6073 26.4543 80.3824 26.4543 80.1358L26.508 44.1309C26.508 43.6195 27.0476 43.293 27.4907 43.5397L47.7961 54.7191C48.0105 54.8388 48.1427 55.0637 48.1463 55.3103L48.1427 55.3067Z" fill="white"></path>
<path d="M75.0129 38.5666C74.6734 38.2438 74.2838 37.9717 73.905 37.7106C73.4726 37.4131 73.0259 37.1048 72.6829 36.7276C72.1683 36.1617 71.8824 35.429 71.6036 34.7217C71.4607 34.3589 71.3142 33.9817 71.1355 33.6226C69.9419 31.2285 67.4761 29.7268 65.0925 28.2759C64.5421 27.9422 63.9775 27.5976 63.4414 27.2494C62.6016 26.7053 61.7475 26.0923 61.1686 25.287C61.1114 25.2072 61.0543 25.1238 60.9864 25.0186C60.7934 24.7139 60.6254 24.3802 60.4646 24.0573C60.2037 23.5386 59.9357 23.0018 59.5462 22.5338C58.6528 21.4529 57.1519 20.7601 55.4294 20.6368C55.2364 20.6222 55.0363 20.615 54.8362 20.615C53.1851 20.615 51.602 21.0829 50.5514 21.4348C47.8533 22.338 45.3696 23.6946 43.1718 25.4647C42.1855 26.2591 41.3278 27.1333 40.6167 28.0728C39.3659 29.7232 39.566 30.6917 39.8662 31.283C39.4088 31.9141 39.3981 32.4401 39.4267 32.8826C39.4624 33.463 39.5374 34.0651 39.6125 34.6455C39.8519 36.5426 40.0985 38.5086 39.0228 40.1844C38.7512 40.6016 38.4082 40.9969 38.0758 41.3742C37.7328 41.7659 37.3825 42.1649 37.0967 42.6075C36.6178 43.3474 36.1818 44.461 36.8286 45.5456C37.3039 46.3472 38.1938 46.9893 39.2122 47.2577C39.6661 47.3774 40.1521 47.4391 40.656 47.4391C42.8788 47.4391 44.9908 46.2638 46.4488 44.2107C47.5281 42.6909 48.2785 41.1058 48.8789 39.0708C48.9861 38.7153 49.197 38.4034 49.4793 38.1966C49.733 38.008 49.9903 37.9173 50.2583 37.9173C50.7193 37.9173 51.2411 38.193 51.8593 38.7589C53.0922 39.887 54.1464 41.0078 55.4973 42.6256C56.0691 43.3148 56.6551 44.0185 57.2555 44.6932C58.8458 46.4814 61.0471 48.6832 64.0132 49.8258C64.971 50.1958 65.8822 50.3808 66.722 50.3808C67.2974 50.3808 67.8334 50.2901 68.3195 50.1124C69.9204 49.5248 70.9318 47.9251 70.7138 46.3509C72.2183 46.0897 73.4655 44.8455 73.6299 43.449C74.7448 43.4417 75.7848 42.6329 76.0528 41.5628C76.3065 40.558 75.9134 39.4045 75.02 38.5557L75.0129 38.5666Z" fill="black"></path>
<path d="M64.0025 49.8366C61.0364 48.694 58.8351 46.4922 57.2448 44.7039C56.6444 44.0293 56.0583 43.3256 55.4866 42.6364C54.1393 41.015 53.0851 39.8941 51.8486 38.7696C51.2304 38.2038 50.7086 37.9281 50.2476 37.9281C49.9796 37.9281 49.7259 38.0188 49.4686 38.2074C49.1863 38.4142 48.9754 38.7225 48.8682 39.0816C48.2678 41.1129 47.5209 42.698 46.4381 44.2215C45.366 45.7341 43.9366 46.7679 42.3678 47.2104C47.5138 47.0146 49.5186 41.2797 51.8129 42.8903C54.0964 44.4899 59.4783 50.1667 65.3784 50.2538C64.9317 50.1594 64.4671 50.0216 63.9954 49.8402L64.0025 49.8366Z" fill="#D9D9D9"></path>
<path d="M68.8412 39.2848C69.513 39.9813 70.3493 40.5399 70.9925 41.2544C71.6393 41.9727 72.0932 42.9375 71.8037 43.8262C71.6715 44.2397 71.3427 44.6315 70.8817 44.7149C70.142 44.8528 69.5523 44.1962 69.052 43.6775C68.0907 42.6764 66.8221 41.9509 65.8858 40.928C64.5993 39.5206 64.0561 37.6852 63.1591 36.0456C62.3122 34.4967 60.897 32.9805 59.0566 32.7447C58.9422 32.7302 58.8672 32.8536 58.9458 32.9334C59.7856 33.764 60.8541 34.5185 61.4188 35.5088C62.4337 37.2898 62.3551 39.517 63.5201 41.2182C64.3456 42.4188 65.5713 43.3402 66.8007 44.2035C67.4403 44.6532 68.1015 45.103 68.5374 45.7197C68.977 46.3363 69.1557 47.167 68.7626 47.809C68.13 48.8537 66.4683 48.8501 65.2354 48.4619C62.5087 47.6131 60.3574 45.6689 58.5527 43.6086C56.748 41.5519 55.1721 39.3029 53.0779 37.4893C51.9379 36.5026 50.2976 35.614 48.8825 36.2342C47.914 36.6586 47.4244 37.6525 47.0742 38.5811C46.5739 39.9051 46.188 41.2762 45.5233 42.5385C44.8586 43.8045 43.8687 44.9833 42.4857 45.5891C41.5172 46.0099 40.3451 46.1005 39.3337 45.756C38.9514 45.6254 38.401 45.4368 38.2366 45.0196C38.0437 44.5372 38.0401 44.0221 38.2652 43.5469C38.4868 43.0717 38.8656 42.6764 39.223 42.2773C40.2915 41.0695 41.2063 39.662 41.3385 38.1096C41.4743 36.4954 40.756 34.8703 41.0741 33.2743C41.46 31.3446 43.0217 30.2056 44.5584 29.0086C45.8556 28.0002 47.0778 27.1405 48.6287 26.5311C48.7681 26.4767 48.736 26.2772 48.5859 26.27C46.9813 26.1648 43.229 28.2541 41.3314 30.3942C41.2063 29.0811 42.4678 28.1199 43.4649 27.2602C45.7663 25.2724 48.5072 23.7091 51.4698 22.7007C52.6455 22.298 53.8856 21.9788 55.1399 22.0296C56.3942 22.0768 57.6772 22.5411 58.4384 23.4552C57.6021 23.1577 56.4979 23.2774 55.4937 23.9303C55.3615 24.0174 55.4401 24.2024 55.6009 24.1988C57.0125 24.177 58.3919 24.819 59.5104 25.6461C60.7648 26.571 61.8011 27.7245 63.0483 28.6567C65.1782 30.2455 67.9871 31.2503 69.2986 33.4593C70.0777 34.7724 70.2349 36.3938 71.2784 37.5473C72.1754 38.5448 73.6513 39.0853 74.2767 40.2424C74.4804 40.616 74.4947 41.1311 74.3053 41.4866C74.1588 41.7659 73.8836 41.9473 73.469 41.8856C73.0545 41.8239 72.7507 41.5664 72.5899 41.2291C71.9145 39.8216 70.4779 38.933 69.4916 37.7214C68.6161 36.6514 68.1229 35.3637 67.3974 34.1993C66.7649 33.1836 65.8715 32.2115 64.6994 31.8053C64.5743 31.7617 64.4742 31.9032 64.5707 31.9903C66.6899 33.9164 66.8471 37.2063 68.8448 39.2812L68.8412 39.2848Z" fill="white"></path>
<path d="M53.3459 76.113C53.3459 75.9897 53.3602 75.8664 53.3924 75.743C53.5604 75.0683 54.2072 74.4916 54.9076 74.4988C55.5401 74.5061 55.8189 74.9704 56.0798 75.4746C57.4485 78.0899 59.7106 80.1357 62.3729 81.3291C65.7929 82.8598 69.6238 82.9759 73.2082 82.0255C76.5424 81.1405 79.6514 79.3703 82.1065 76.9146C82.6497 76.3742 83.0964 75.685 83.9541 75.8119C84.4401 75.8845 84.8546 76.3343 84.9154 76.8639C85.0226 77.8106 84.3722 78.391 83.7611 78.9931C83.1178 79.6243 82.4424 80.2228 81.7348 80.7814C80.3233 81.895 78.7902 82.8526 77.1678 83.6143C76.2422 84.046 75.288 84.416 74.3124 84.7134C70.5887 85.8488 66.5148 85.9394 62.7875 84.7787C59.4175 83.7304 56.53 81.5395 54.5038 78.6267C54.0392 77.9557 53.3388 77.0126 53.3459 76.1166V76.113Z" fill="black"></path>
<path d="M65.1354 60.813L63.5201 65.0279C63.4665 65.1621 63.5773 65.3036 63.7202 65.2891C64.049 65.2528 64.367 65.1875 64.6851 65.144C65.0103 65.1005 65.5928 65.017 65.8501 64.9844C65.9144 64.9735 65.9716 65.0279 65.968 65.0932C65.9394 65.6409 65.8072 67.8101 65.3391 69.0905C65.1461 69.6346 64.8995 70.1606 64.5421 70.6176C64.367 70.8389 64.1705 71.042 63.9275 71.1944C63.4093 71.5172 62.9269 71.4592 62.4659 71.1109C62.0156 70.7736 61.744 70.2984 61.526 69.787C61.1007 68.7931 60.922 67.7448 60.8399 66.6675C60.7505 65.514 60.822 64.3714 61.0221 63.2396C61.1794 62.3401 61.4295 61.4659 61.8691 60.6606C62.1013 60.2326 62.3658 59.8372 62.7625 59.5434C63.1556 59.2568 63.5808 59.1553 64.0275 59.3657C64.2419 59.4672 64.4421 59.6232 64.61 59.7937C64.8209 60.0113 64.9924 60.2652 65.1282 60.5518C65.1675 60.6316 65.1675 60.7259 65.1354 60.8093V60.813Z" fill="black"></path>
<path d="M80.8021 62.8407C80.895 62.8262 80.9772 62.9023 80.9772 62.9966C80.9594 63.7475 80.82 66.3737 79.8158 68.0531C79.6407 68.3361 79.4513 68.6045 79.2047 68.8258C78.5722 69.3844 77.9039 69.3844 77.2821 68.7786C76.8961 68.405 76.6531 67.9298 76.4566 67.4329C76.1993 66.7799 76.042 66.0944 75.9491 65.4016C75.6883 63.4029 75.8133 61.4441 76.4494 59.5362C76.6317 58.9884 76.864 58.4589 77.2178 58.0018C77.4 57.766 77.6144 57.5411 77.8574 57.367C78.3578 57.0116 79.0439 57.0914 79.487 57.5158C79.8015 57.8168 79.9051 57.9837 80.1374 58.4117C80.1767 58.4843 80.1839 58.5749 80.1517 58.6511C79.6121 60.0585 79.0725 61.4768 78.515 62.9277C78.4757 63.0329 78.5579 63.1526 78.6687 63.1381C78.9939 63.1055 80.2303 62.9205 80.8021 62.837V62.8407Z" fill="black"></path>
</g>
<defs>
<clipPath id="gs-sp-logo-clip">
<rect width="65.7333" height="74.7556" fill="white" transform="translate(24.4889 20.6222)"></rect>
</clipPath>
</defs>
</svg>
Fourni par Goodstock
</a>
</footer>
</section>
L'appel part du serveur de votre site, jamais du navigateur de vos visiteurs : la clé d'API doit rester de votre côté. La projection évolue lentement, la réponse peut donc être gardée en cache quelques heures.
PATCH /api/v1/product/<référence>
Met à jour le nom, le stock, la visibilité web, le fournisseur et ses conditions d'achat, le prix de vente, le statut « en soldes » et les relations de remplacement. Tous les champs sont optionnels : seuls ceux que vous envoyez sont modifiés. L'appel s'applique à l'article désigné et à toutes ses variantes.
Une modification du stock, de la visibilité web, du statut « en soldes » ou du groupe de prix de vente crée un point de mesure dans l'historique de l'article, exactement comme le ferait une synchronisation par connecteur.
PATCH /api/v1/product/123456
X-Auth-Key: token_xxxxxxxxxxxxxxxxx
Content-Type: application/json
{
"stock": 150,
"supplier_name": "Savonnerie du Midi",
"supplier_price": 4.36,
"supplier_packaging_qty": 100.0,
"supplier_min_qty": 200.0,
"sell_price": 8.50,
"vat_rate": 0.20,
"sell_price_incl_tax": 10.20,
"discounted": true
}
Les champs du corps
| Champ | Type | Défaut | Description |
|---|---|---|---|
name | string | — | Nouvelle désignation. Appliquée au seul article dont le code correspond exactement, pas aux variantes. Une chaîne vide est ignorée. |
stock | int | — | Nouvelle quantité en stock. |
date | string | — | Bascule l'appel en mode historique : l'article n'est pas modifié, un point de mesure daté est ajouté. Voir plus bas. |
web_active | bool | — | Visibilité sur le site marchand. |
supplier_name | string | — | Nom du fournisseur. Obligatoire dès qu'un autre champ fournisseur est renseigné. |
supplier_product_code | string | — | Référence de l'article chez le fournisseur. |
supplier_product_name | string | — | Désignation chez le fournisseur. |
supplier_price | float | — | Prix d'achat unitaire, hors taxes sauf indication contraire. |
supplier_unit_qty_factor | float | 1.0 | Conversion entre l'unité fournisseur et la vôtre — 12 si le fournisseur vend par carton de douze. |
supplier_packaging_qty | float | — | Quantité de conditionnement. |
supplier_min_qty | float | — | Quantité minimale de commande. |
sell_price | float | — | Prix de vente hors taxes. |
vat_rate | float | — | Taux de TVA — 0.20 pour 20 %. |
sell_price_incl_tax | float | — | Prix de vente toutes taxes comprises. |
discounted | bool | — | Statut « en soldes ». Il n'y a pas de prix remisé séparé : ce booléen indique que le sell_price en vigueur est un prix soldé. |
replaced_skus | array | — | Références remplacées par cet article. [] supprime toutes les relations. |
replaced_by_sku | string | — | Référence qui remplace celui-ci. "" supprime la relation. |
action_if_supplier_not_found | string | raise | Fournisseur introuvable : raise lève une erreur, create le crée, skip ignore silencieusement. |
create_unknown_products | bool | false | Crée l'article s'il est introuvable, au lieu de refuser l'appel. |
multiply_price_by_unit_factor | bool | false | Multiplie supplier_price par le facteur d'unité avant enregistrement. |
prices_include_tax | bool | false | Considère supplier_price comme TTC et le ramène hors taxes. |
Règles de validation
sell_price,vat_rateetsell_price_incl_taxvont ensemble : les trois, ou aucun. Une partie seulement est refusée.- Dès qu'un champ fournisseur est renseigné,
supplier_namedevient obligatoire. replaced_skusdoit être une liste de chaînes,replaced_by_skuune chaîne,discountedun booléen.- Un point de mesure est créé dès que
stock,web_active,discountedou le groupe de prix de vente change. - Les articles de type pack n'acceptent pas cet appel.
Codes de retour
| Code | Signification |
|---|---|
200 | Succès — le corps de la réponse est vide |
401 | Jeton absent ou invalide |
422 | Données refusées : article ou fournisseur introuvable, groupe de prix incomplet, replaced_skus mal formé, article de type pack |
400 | Erreur interne |
Injecter un historique de stock
Le champ date change la nature de l'appel. C'est le mode à
employer pour reconstituer un historique connu par ailleurs — une reprise de
données, ou une remontée quotidienne d'inventaires passés.
Le même appel, avec et sans date
date
La quantité devient le stock d'aujourd'hui. C'est une correction d'inventaire : elle déplace le niveau courant, et le passé n'est pas touché.
date
La quantité est enregistrée à cette date-là dans l'historique. Le stock d'aujourd'hui ne bouge pas, et la qualification des journées passées est recalculée.
- L'article n'est jamais modifié : son stock, son prix et sa visibilité courants restent intacts.
- Un point de mesure est ajouté à la date demandée, sur l'article et ses variantes.
- Ce point est marqué « mesure uniquement » : il alimente les statistiques et les calculs de rupture, sans compter comme une synchronisation complète.
- Les champs non fournis reprennent la valeur actuelle de l'article.
- Rejouer le même appel à la même date met à jour le point existant plutôt que d'en créer un second : l'import est rejouable sans risque de doublon.
- Seuls
stock, le groupe de prix de vente,web_activeetdiscountedsont acceptés dans ce mode, et au moins l'un d'eux est requis. La date ne peut pas être dans le futur.
Formats de date acceptés
| Écriture | Interprétation |
|---|---|
2026-07-15 | 15 juillet 2026 à 00:00:00 UTC |
2026-07-15 09:30:00 | 15 juillet 2026 à 09:30:00 UTC |
2026-07-15T09:30:00 | 15 juillet 2026 à 09:30:00 UTC |
2026-07-15T11:30:00+02:00 | 15 juillet 2026 à 09:30:00 UTC — le décalage est converti |
2026-07-15T09:30:00Z | 15 juillet 2026 à 09:30:00 UTC |
Sans fuseau indiqué, la date est lue comme déjà exprimée en UTC, qui est le fuseau de stockage de Goodstock.
# Reprise de trois mois de niveaux de stock pour une référence. import requests from datetime import date, timedelta URL = "https://votre-instance.very-goodstock.com" ENTETES = {"X-Auth-Key": "token_xxxxxxxxxxxxxxxxx", "Content-Type": "application/json"} jour = date(2026, 4, 1) while jour <= date(2026, 6, 30): requests.patch( f"{URL}/api/v1/product/123456", headers=ENTETES, json={"date": jour.isoformat(), "stock": niveau_connu(jour)}, timeout=30, ).raise_for_status() jour += timedelta(days=1)
Une clé d'API, et tout le reste s'ouvre
Goodstock est construit sur Odoo, dont l'API externe est publique et documentée. La clé d'API remplace le mot de passe : elle se crée depuis votre profil, dans les préférences du compte, onglet « Sécurité du compte ». Elle n'expose que ce que son porteur a le droit de voir, et se révoque sans toucher au mot de passe.
C'est la voie à prendre dès qu'on sort de la fiche article : commandes fournisseurs et leurs lignes, attendus de réception, historiques de statuts journaliers, coûts de revient, périodes de fermeture des fournisseurs.
# Tout passe par un point d'entrée unique, en JSON. import requests URL = "https://votre-instance.very-goodstock.com/jsonrpc" BASE, LOGIN, CLE = "gs-votre-base", "vous@exemple.fr", "votre_cle_api" def appel(modele, methode, args, kwargs=None): corps = { "jsonrpc": "2.0", "method": "call", "params": { "service": "object", "method": "execute_kw", "args": [BASE, UID, CLE, modele, methode, args, kwargs or {}], }, } reponse = requests.post(URL, json=corps, timeout=60).json() if "error" in reponse: raise RuntimeError(reponse["error"]["data"]["message"]) return reponse["result"] # L'identification, une fois, donne l'identifiant d'utilisateur. UID = requests.post(URL, json={ "jsonrpc": "2.0", "method": "call", "params": {"service": "common", "method": "login", "args": [BASE, LOGIN, CLE]}, }, timeout=30).json()["result"] # Les commandes en cours de réception, en un appel. commandes = appel( "goodstock.purchase.order", "search_read", [[("state_id.name", "=", "En cours de récep.")]], {"fields": ["name", "partner_id", "date_order", "amount_total"], "limit": 50}, )
Le même point d'entrée sert à lire (search_read), à écrire (write, create) et à appeler les méthodes métier du modèle.
Les modèles que l'on interroge le plus
| Modèle | Ce qu'il porte |
|---|---|
goodstock.product | Les articles, leurs coûts, leurs niveaux de rotation |
goodstock.purchase.order | Les commandes fournisseurs et leur étape |
goodstock.purchase.order.line | Les lignes, avec la quantité proposée, la trace du calcul et les avertissements |
goodstock.awaiting | Les attendus de réception |
goodstock.reception.line | Les lignes de réception, quantité par quantité |
goodstock.product.supplierinfo | Les conditions d'achat : prix, délai, franco, conditionnement |
goodstock.partner.leave | Les périodes de fermeture des fournisseurs |
Ce qu'un assistant peut faire dans Goodstock
Pour le brancher, il faut une clé d'API liée à un utilisateur Goodstock. C'est tout.
Goodstock est construit sur Odoo, dont l'interface de programmation est publique et documentée depuis des années. Un modèle la connaît déjà : il n'y a rien à lui apprendre sur la façon de s'y brancher, et peu à lui expliquer sur les modèles décrits plus haut.
Et il ne se limite pas à consulter. Un assistant peut déclencher à distance ce que l'utilisateur dont il porte la clé ferait à l'écran : créer une fiche, corriger une condition d'achat, relancer un calcul. Ses droits sont exactement les siens, et seuls quelques traitements vraiment très sensibles restent réservés à l'interface.
Trois choses lui réussissent particulièrement. Lire une donnée qui n'est pas rangée — un courriel, un tableau reçu, un PDF. Rapprocher ce que deux écrans ne montrent jamais ensemble, et qu'un œil humain ne croise qu'en ouvrant deux onglets. Et saisir, c'est-à-dire porter dans Goodstock ce qu'il vient de lire.
Vous consultez un fournisseur avant de commander. Il répond par un PDF : des références, des quantités, des prix. L'assistant le lit et porte les lignes dans votre commande, puis s'arrête là — le reste est le travail habituel de Goodstock, qui compare ces prix à ceux qu'il attendait et signale ce qui a bougé. Quand une hausse déclenche une alerte
# Un fournisseur annonce par courriel que son délai passe à 28 jours. # L'assistant retrouve sa fiche, compare, et corrige si besoin. fiche = appel( "res.partner", "search_read", [[("name", "ilike", "Savonnerie du Midi")]], {"fields": ["lead_time"], "limit": 1}, )[0] if fiche["lead_time"] != 28: appel("res.partner", "write", [[fiche["id"]], {"lead_time": 28}])
À partir de là, les propositions de commande de ce fournisseur partent sur vingt-huit jours, sans que personne ait eu à ouvrir sa fiche. Le délai qu'un fournisseur tient vraiment
Par où commencer
Créez une clé sur un utilisateur limité en lecture, donnez-la à l'assistant que vous utilisez déjà avec les quelques modèles qui vous intéressent, et posez vos questions. C'est l'affaire d'une après-midi, et rien n'est modifié dans votre instance.
Si vous avez un usage en tête, parlons-en. L'interface est déjà là ; le reste est du cadrage. Prendre rendez-vous
Quelques bonnes pratiques
Groupez vos appels. Un search_read sur cinq cents
articles coûte moins cher que cinq cents appels sur un article. La même règle
vaut pour l'écriture : un seul write sur une liste d'identifiants
plutôt qu'un par fiche.
Espacez ce qui peut l'être. Une instance sert d'abord ses utilisateurs ; une reprise d'historique lancée en pleine journée ralentit tout le monde, y compris vous. Les traitements de masse se font la nuit, ou par lots avec une pause entre deux.
Prévenez-nous des gros chantiers. Une reprise de plusieurs centaines de milliers de points de mesure se prépare — nous savons dans quel ordre les charger et ce qu'il faut recalculer ensuite.
Ces chantiers tombent presque toujours pendant une mise en route ou un projet, c'est-à-dire à un moment où nous sommes déjà en lien. Il n'y a donc pas de démarche particulière à engager : la question se pose au fil des échanges, et le support s'efforce de répondre vite quand elle bloque.
Voir Goodstock en fonctionnement
Une heure : l'outil tourne devant vous sur un catalogue de démonstration, ruptures et saisonnalité comprises, puis nous le confrontons à votre situation.
Pas sûr d'en avoir besoin ? Trente questions, trois minutes, et un score sur 90 vous le dit.
Faire le diagnosticVous souhaitez utiliser Goodstock pour votre cabinet d'expertise comptable ? La mission de pilotage des stocks, côté cabinet
Lexique · Assistance · Conditions d'utilisation · Confidentialité · Gestion des données · Mentions légales