Pourquoi envoyer vos commandes à eGrow
Un site web personnalisé est excellent pour prendre des commandes. Il n'est pas conçu pour gérer tout ce qui se passe après la commande — et pour le paiement à la livraison, c'est ce "après" qui détermine si l'argent est gagné ou perdu. Une fois qu'une commande atteint eGrow :
- La confirmation se fait d'elle-même — confirmation WhatsApp, l'agent IA ou votre centre d'appels, avec les réponses du client enregistrées sur la commande.
- L'expédition se fait en un clic (ou zéro) — le colis est créé auprès de votre société de livraison et le numéro de suivi est enregistré sur la commande ; les statuts se synchronisent automatiquement.
- Les clients sont tenus informés — les messages "commande reçue", "en route", "livraison échouée, pouvons-nous réessayer ?" sont envoyés depuis votre numéro WhatsApp sans que vous n'ayez à faire quoi que ce soit.
- Les retours diminuent — les adresses et les villes sont validées, les doublons sont signalés, les clients injoignables sont relancés et les paniers abandonnés peuvent être récupérés.
- Vous voyez les vrais chiffres — taux de confirmation, taux de livraison, retours, revenus par produit et par campagne (UTM), le tout en un seul endroit.
Votre site web reste votre site web. eGrow est le moteur des opérations qui le sous-tend.
Comment ça marche
- Vous créez une clé API personnelle dans eGrow (2 minutes).
- Lorsqu'un client passe une commande sur votre site, votre serveur envoie cette commande à l'API eGrow (
orderFullCreate). - eGrow répond avec l'ID de commande — et prend le relais.
C'est toute l'intégration. Tout ce qui suit est un détail.
Avant de commencer
- Un compte eGrow avec au moins un pipeline (celui par défaut convient).
- Un site web où vous contrôlez le code de paiement, ou un outil de codage IA qui peut le modifier pour vous.
- Une clé API personnelle depuis Settings → Developer → API Key.
Important : votre clé API donne un accès complet à votre compte. Appelez l'API eGrow depuis votre serveur (votre backend, une fonction sans serveur, un gestionnaire de route Next.js, un contrôleur Laravel…), jamais depuis le navigateur, et ne commettez jamais la clé sur Git. Stockez-la comme variable d'environnement, par exemple EGROW_API_KEY.
Étape 1 : Obtenez votre clé API
- Dans eGrow, ouvrez Settings → Developer → API Key.
- Cliquez sur Générer et copiez la clé (elle commence par
egrow_). - Enregistrez-la dans l'environnement de votre projet sous le nom
EGROW_API_KEY.
Étape 2 : Envoyez la commande
L'API eGrow est GraphQL. Vous envoyez toujours une requête POST au même endpoint avec un corps JSON qui contient une query et ses variables.
- Endpoint :
https://api5.egrow.com/graphql - En-têtes :
Authorization: Bearer YOUR_API_KEYetContent-Type: application/json - Mutation :
orderFullCreate— crée une commande complète (client, adresse, produits, prix) en un seul appel.
La mutation
mutation CreateOrder($input: OrderFullCreateInput!) {
orderFullCreate(input: $input) {
order { id orderNumber }
userErrors { field message code }
}
}Les variables (une vraie commande COD)
{
"input": {
"orderExternalId": "WEB-10245",
"orderNumber": "10245",
"orderType": "Order",
"paymentMethod": "COD",
"financialStatus": "Pending",
"currency": "MAD",
"phone": "+212612345678",
"email": "[email protected]",
"customer": {
"firstName": "Amina",
"lastName": "El Idrissi",
"phone": "+212612345678",
"email": "[email protected]"
},
"shippingAddress": {
"firstName": "Amina",
"lastName": "El Idrissi",
"phone": "+212612345678",
"address1": "12 Rue Al Massira, Apt 4",
"city": "Casablanca",
"province": "Casablanca-Settat",
"countryCode": "MA"
},
"lineItems": [
{
"title": "Leather wallet — brown",
"sku": "WAL-BR-01",
"externalProductId": "prod_88",
"quantity": 2,
"price": 149.00,
"imageUrl": "https://yourshop.ma/img/wallet-brown.jpg"
}
],
"subtotal": 298.00,
"shippingPrice": 30.00,
"note": "Customer prefers delivery after 6pm",
"tags": ["website"],
"utmParameters": { "source": "facebook", "campaign": "ramadan-2026" }
}
}À quoi sert chaque champ
| Champ | Ce qu'il faut envoyer |
|---|---|
orderExternalId | Votre propre ID de commande. Envoyez-le toujours — il permet à eGrow de reconnaître la même commande si vous l'envoyez deux fois, et vous permet de la mettre à jour plus tard. |
orderNumber | Le numéro que le client voit (facultatif — eGrow en génère un s'il est vide). |
customer | firstName, lastName, phone, email. Le numéro de téléphone est ce qu'utilise la confirmation WhatsApp — envoyez-le au format international (+212…). |
shippingAddress | address1, city, province, countryCode (+ nom et téléphone). La ville est ce dont votre société de livraison a besoin, alors envoyez-la exactement comme le client l'a choisie. |
lineItems | Une entrée par produit : title, quantity, price (prix unitaire), et idéalement sku / externalProductId afin qu'eGrow puisse faire correspondre votre catalogue et compter le stock. |
subtotal, shippingPrice | Nombres, dans la currency de la commande. |
paymentMethod, financialStatus | "COD" + "Pending" pour le paiement à la livraison ; "Paid" si le client a payé en ligne. |
orderType | "Order" pour une commande normale, "AbandonedCart" pour pousser un panier abandonné afin qu'eGrow puisse le récupérer (ajoutez abandonedCheckoutUrl). |
note, tags, utmParameters | Facultatif. Les notes s'affichent pour vos agents ; les tags vous aident à filtrer ; les paramètres UTM vous donnent les revenus par campagne. |
pipelineId, storeId | Facultatif. Laissez-les de côté pour utiliser vos valeurs par défaut ; définissez-les si vous gérez plusieurs pipelines ou magasins. |
La réponse
{
"data": {
"orderFullCreate": {
"order": { "id": 1834512, "orderNumber": "10245" },
"userErrors": []
}
}
}Enregistrez order.id à côté de votre propre commande. Si userErrors n'est pas vide, rien n'a été créé — le message vous indique quel champ corriger.
Étape 3 : Exemples de code
Chaque exemple fait la même chose : construire les variables à partir de vos données de paiement et les envoyer par POST. Remplacez la clé par votre variable d'environnement.
cURL (testez-le depuis votre terminal)
curl -X POST https://api5.egrow.com/graphql \
-H "Authorization: Bearer $EGROW_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "mutation CreateOrder($input: OrderFullCreateInput!) { orderFullCreate(input: $input) { order { id orderNumber } userErrors { field message code } } }",
"variables": { "input": { "orderExternalId": "WEB-10245", "paymentMethod": "COD", "currency": "MAD",
"customer": { "firstName": "Amina", "lastName": "El Idrissi", "phone": "+212612345678" },
"shippingAddress": { "address1": "12 Rue Al Massira", "city": "Casablanca", "countryCode": "MA", "phone": "+212612345678" },
"lineItems": [ { "title": "Leather wallet — brown", "sku": "WAL-BR-01", "quantity": 2, "price": 149 } ],
"subtotal": 298, "shippingPrice": 30 } }
}'Node.js / Next.js (gestionnaire de route ou route API)
// app/api/checkout/route.js — runs on the server, the key never reaches the browser
const MUTATION = `mutation CreateOrder($input: OrderFullCreateInput!) {
orderFullCreate(input: $input) { order { id orderNumber } userErrors { field message code } }
}`;
export async function sendOrderToEgrow(order) {
const input = {
orderExternalId: String(order.id),
orderNumber: String(order.number),
orderType: "Order",
paymentMethod: order.paidOnline ? "CARD" : "COD",
financialStatus: order.paidOnline ? "Paid" : "Pending",
currency: "MAD",
phone: order.customer.phone,
email: order.customer.email,
customer: { firstName: order.customer.firstName, lastName: order.customer.lastName,
phone: order.customer.phone, email: order.customer.email },
shippingAddress: { firstName: order.customer.firstName, lastName: order.customer.lastName,
phone: order.customer.phone, address1: order.address.line1,
city: order.address.city, province: order.address.region, countryCode: "MA" },
lineItems: order.items.map(i => ({ title: i.name, sku: i.sku, externalProductId: String(i.productId),
quantity: i.qty, price: i.unitPrice, imageUrl: i.image })),
subtotal: order.subtotal,
shippingPrice: order.shipping,
note: order.note || undefined,
tags: ["website"],
utmParameters: order.utm || undefined,
};
const res = await fetch("https://api5.egrow.com/graphql", {
method: "POST",
headers: { "Authorization": `Bearer ${process.env.EGROW_API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ query: MUTATION, variables: { input } }),
});
const json = await res.json();
const result = json.data?.orderFullCreate;
if (!result || result.userErrors?.length) {
throw new Error("eGrow rejected the order: " + JSON.stringify(result?.userErrors ?? json.errors));
}
return result.order; // { id, orderNumber } — store it with your order
}PHP (Laravel, WordPress, PHP pur)
function sendOrderToEgrow(array $order): array {
$mutation = 'mutation CreateOrder($input: OrderFullCreateInput!) {
orderFullCreate(input: $input) { order { id orderNumber } userErrors { field message code } }
}';
$input = [
'orderExternalId' => (string)$order['id'],
'paymentMethod' => 'COD',
'financialStatus' => 'Pending',
'currency' => 'MAD',
'phone' => $order['phone'],
'customer' => ['firstName' => $order['first_name'], 'lastName' => $order['last_name'], 'phone' => $order['phone']],
'shippingAddress' => ['address1' => $order['address'], 'city' => $order['city'], 'countryCode' => 'MA', 'phone' => $order['phone']],
'lineItems' => array_map(fn($i) => ['title' => $i['name'], 'sku' => $i['sku'], 'quantity' => (int)$i['qty'], 'price' => (float)$i['price']], $order['items']),
'subtotal' => (float)$order['subtotal'],
'shippingPrice' => (float)$order['shipping'],
];
$ch = curl_init('https://api5.egrow.com/graphql');
curl_setopt_array($ch, [
CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 20,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('EGROW_API_KEY'), 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode(['query' => $mutation, 'variables' => ['input' => $input]]),
]);
$json = json_decode((string)curl_exec($ch), true);
curl_close($ch);
$result = $json['data']['orderFullCreate'] ?? null;
if (!$result || !empty($result['userErrors'])) {
throw new RuntimeException('eGrow rejected the order: ' . json_encode($result['userErrors'] ?? $json['errors'] ?? null));
}
return $result['order']; // ['id' => …, 'orderNumber' => …]
}Python (Django, FastAPI, Flask)
import os, requests
MUTATION = """mutation CreateOrder($input: OrderFullCreateInput!) {
orderFullCreate(input: $input) { order { id orderNumber } userErrors { field message code } }
}"""
def send_order_to_egrow(order):
payload = {
"orderExternalId": str(order["id"]),
"paymentMethod": "COD", "financialStatus": "Pending", "currency": "MAD",
"phone": order["phone"],
"customer": {"firstName": order["first_name"], "lastName": order["last_name"], "phone": order["phone"]},
"shippingAddress": {"address1": order["address"], "city": order["city"], "countryCode": "MA", "phone": order["phone"]},
"lineItems": [{"title": i["name"], "sku": i["sku"], "quantity": i["qty"], "price": i["price"]} for i in order["items"]],
"subtotal": order["subtotal"], "shippingPrice": order["shipping"],
}
r = requests.post("https://api5.egrow.com/graphql",
headers={"Authorization": f"Bearer {os.environ['EGROW_API_KEY']}", "Content-Type": "application/json"},
json={"query": MUTATION, "variables": {"input": payload}}, timeout=20)
result = r.json().get("data", {}).get("orderFullCreate")
if not result or result.get("userErrors"):
raise RuntimeError(f"eGrow rejected the order: {result and result.get('userErrors')}")
return result["order"] # {"id": …, "orderNumber": …}Conseil : envoyez la commande à eGrow après l'avoir enregistrée de votre côté, et faites-le dans une tâche de fond ou juste après le rendu de la page de remerciement, afin qu'un réseau lent ne bloque jamais votre client. Si l'appel échoue, réessayez plus tard avec le même orderExternalId.
Mettre à jour une commande déjà envoyée
Le client a changé l'adresse, ou vous avez annulé la commande sur votre site ? Utilisez orderCreateOrUpdate avec le même orderExternalId — il prend exactement la même entrée, et eGrow met à jour la commande existante au lieu d'en créer une seconde. C'est aussi le choix le plus sûr si vous n'êtes pas sûr qu'une commande ait déjà été envoyée.
mutation UpsertOrder($input: OrderCreateOrUpdateInput!) {
orderCreateOrUpdate(input: $input) {
order { id orderNumber }
userErrors { field message code }
}
}Testez avant d'écrire du code
L'API Playground (Settings → Developer → Playground) dispose d'une action Ajouter une commande qui construit cette requête exacte à partir d'un formulaire, l'exécute et affiche la réponse en direct. Cliquez sur Remplir avec des données fictives, exécutez-la, et vous verrez une nouvelle commande apparaître dans votre liste de commandes. Copiez ensuite le cURL généré — c'est le même appel que ci-dessus, avec les vrais ID de pipeline et de magasin de votre compte.
Attention : le Playground et l'API agissent tous deux sur votre compte réel. Utilisez votre propre numéro de téléphone comme client test, et supprimez les commandes test par la suite.
Laissez votre codeur IA le faire : une invite que vous pouvez coller
Si votre site a été construit avec Claude, Codex, Cursor, Lovable, Bolt ou un outil similaire, vous n'avez pas à écrire tout cela vous-même. Collez l'invite ci-dessous dans le même outil, dans votre projet, et il trouvera votre code de paiement et ajoutera l'intégration. L'assistant est déjà dans votre code : il trouvera le paiement, respectera votre stack et vos conventions, et ajoutera l'intégration. Rien à remplir.
Integrate this project's checkout with eGrow so every new order is sent to eGrow through its API.
You are already in the codebase: find where an order is saved, use the language, framework and
conventions this project already has, and reuse my existing order/customer/product objects.
1. Add a server-side function (e.g. sendOrderToEgrow) that POSTs JSON to https://api5.egrow.com/graphql
with headers Authorization: Bearer <EGROW_API_KEY> and Content-Type: application/json.
Read the key from an environment variable named EGROW_API_KEY. It must never reach the browser.
2. Send this GraphQL mutation:
mutation CreateOrder($input: OrderFullCreateInput!) {
orderFullCreate(input: $input) { order { id orderNumber } userErrors { field message code } }
}
and map my order into `input` like this:
orderExternalId = my order id (always), orderNumber, orderType "Order",
paymentMethod "COD" + financialStatus "Pending" (or "Paid" when paid online), currency "MAD",
phone, email, customer {firstName,lastName,phone,email},
shippingAddress {firstName,lastName,phone,address1,city,province,countryCode "MA"},
lineItems [{title,sku,externalProductId,quantity,price (unit price),imageUrl}],
subtotal, shippingPrice, note, tags ["website"], utmParameters {source,medium,campaign,content,term}.
Phone numbers must be in international format (+212…). Leave out fields I don't have.
3. Call it right after the order is saved, without blocking the customer's confirmation page
(background job, queue, or after the response is sent). On failure log the error and retry
later with the same orderExternalId — never create the same order twice.
4. Store the returned order.id and orderNumber on my order record (add a field if needed).
5. Treat a non-empty userErrors as a failure and include its messages in the log.
6. Add a small script or test that sends one sample order and prints the response.
Show me the diff, then run the test.Conseil : si votre outil IA prend en charge le MCP (Claude Code, Cursor et d'autres le font), connectez-le au serveur MCP d'eGrow sous Settings → Developer → MCP. L'agent pourra alors vérifier son propre travail : "la commande test est-elle arrivée dans eGrow ?" — et vous pourrez lui poser des questions comme "combien de commandes ont été livrées cette semaine ?" depuis le même chat.
Invite pour les mises à jour et les annulations
Extend the eGrow integration: when an order is edited or cancelled on my site, send it again with
the mutation orderCreateOrUpdate (input type OrderCreateOrUpdateInput, same fields as before,
same orderExternalId) so eGrow updates the existing order instead of creating a new one.Dépannage
| Ce que vous voyez | Ce que cela signifie |
|---|---|
| 401 Unauthorized | La clé est manquante, incorrecte ou a été régénérée. Vérifiez l'en-tête Authorization: Bearer … et la variable d'environnement sur le serveur qui effectue l'appel. |
| 403 Forbidden | La requête a été bloquée avant d'atteindre l'API — généralement un en-tête User-Agent manquant ou un client qui envoie le corps sous forme de données de formulaire. Envoyez du JSON avec Content-Type: application/json. |
userErrors is not empty | Un champ est invalide. Le field vous indique lequel — le plus souvent un numéro de téléphone qui n'est pas au format international, une ville vide, ou un article sans titre ni quantité. |
| La commande a été créée deux fois | Vous avez réessayé sans orderExternalId, ou utilisé orderFullCreate pour une mise à jour. Envoyez toujours orderExternalId, et utilisez orderCreateOrUpdate pour les réessais et les modifications. |
| Les messages de confirmation ne sont pas envoyés | La commande est arrivée, mais l'automatisation s'exécute sur le pipeline dans lequel elle a atterri. Vérifiez le pipeline et l'étape de la commande dans eGrow, et que votre numéro WhatsApp est connecté. |
| Les produits ne correspondent pas à votre catalogue | Envoyez le même sku ou externalProductId que vous utilisez dans les produits d'eGrow, afin que le stock et les rapports correspondent. |
Et ensuite ?
- Connectez votre société de livraison sous Intégrations, et activez l'automatisation qui crée le colis dès qu'une commande est confirmée.
- Activez la confirmation automatique des commandes via WhatsApp afin que les nouvelles commandes soient confirmées pendant que vous dormez.
- Poussez les paniers abandonnés avec
orderType: "AbandonedCart"et laissez eGrow les récupérer. - Explorez le reste de l'API — clients, produits, pipelines — dans le Playground.