Importazione Ordini
Gli ordini bozza (Draft Order) di Shopify vengono recuperati attivamente da Flowlyze.
Le informazioni recuperate sugli ordini includono:
- il canale di vendita (Channel).
- le informazioni di base dell'ordine (per esempio nome, identificativo, ecc.).
- i prezzi associati all'ordine.
- il cliente associato (Customer): informazioni sul cliente associato all'ordine.
- gli indirizzi di spedizione e fatturazione (ShippingAddress e BillingAddress): dettagli degli indirizzi di spedizione e fatturazione dell'ordine.
- gli articoli presenti (LineItems): dettagli sugli articoli inclusi nell'ordine.
L'Adapter aggiunge un tag all'ordine per verificarne l'avvenuta esportazione (DRAFT_EXPORT) ed evitare invii duplicati
verso la destinazione, ma solo se l'header di sincronizzazione unica è impostato a true.
Questo comportamento consente di sincronizzare un ordine una sola volta, ignorando eventuali aggiornamenti successivi
(comportamento opzionale, configurabile tramite header).
Se l’header non è valorizzato, il tag non viene aggiunto e l’ordine può essere esportato più volte.
💡 Ordini bozza recenti ignorati per coerenza dei dati
Durante il processo di scaricamento degli ordini bozza, vengono esclusi gli ordini aggiornati negli ultimi 10 secondi. Questa scelta serve a garantire una maggiore consistenza dei dati, poiché subito dopo una modifica su Shopify alcune informazioni potrebbero non essere ancora completamente sincronizzate.
Configurando correttamente il flusso e l’utilizzo del valore incrementale, gli ordini temporaneamente esclusi verranno recuperati automaticamente all’iterazione successiva, garantendo che nessun dato venga perso.
Compatibilità con i piani Shopify
Utilizzando questo endpoint con uno store Shopify su piano Basic, saranno disponibili solo informazioni limitate sul cliente all'interno dei dati dell'ordine, a causa delle restrizioni dell'API di Shopify.
Configurazione del Flusso Ordini (attivo)
Dopo aver creato la destinazione, che nel caso di un flusso attivo può essere
un database o un endpoint, è necessario configurare il flusso attivando la schedulazione
(Schedulation Enabled) e impostandolo come segue:
| Campo | Valore | Note |
|---|---|---|
Name | es. active-flow-order | Nome della schedulazione |
Cron Expression | */5 * * * * | Ogni quanto si vuole eseguire il recupero degli ordini (es. */5 * * * * -> ogni 5 minuti) |
Source Type | http | Il tipo di sorgente che deve essere utilizzata |
Url | https://adapt.flowlyze.com/api/adp/shopify/ingress/get-draft-order-updated-after | Url dell'endpoint che deve essere richiamato (vedi nota a fine tabella) |
Method | GET | Il metodo con cui richiamare l'endpoint |
Headers :: x-api-key | ********** | L'api key di verifica per l'interazione con l'endpoint |
Headers :: x-shopify-graphql-url | https://SHOPIFYURL.myshopify.com/ | Url dello shopify con cui connettersi |
Headers :: x-shopify-access-token | shpat_CODICEALFANUMERICO | Secret della custom app creata per l'integrazione |
Headers :: x-last-draft-order-updated-processed" | es. 2024-11-15T12:00:00Z | Data da cui partire per recuperare gli ordini |
Headers :: x-sync-draft-order-once | true | Booleano per inserire l'ordine una sola volta, non propaga aggiornamenti (default false) |
Headers :: channel-code" | Your Shopify Store | Il nome o il codice del tuo shop di Shopify |
Headers :: x-number-of-draft-orders | 10 | Numero di ordini da recuperare ad ogni chiamata (default 10) |
Il valore dell'header x-last-draft-order-updated-processed su Flowlyze per poter recuperare gli ordini automaticamente secondo la data di ultimo aggiornamento
è necessario impostarlo come valore incrementale (vedi qui).
Infatti i campi da impostare nella voce Incremental fields del form del flusso (Setp 2 - Source) sono:
- Name: il nome della variabile associata al campo incrementale. Esempio di uso:
x-last-draft-order-updated-processed = {{lastDraftOrderUpdatedProcessed}}, il nome della variabile incrementale saràlastDraftOrderUpdatedProcessed - Message JSON Path: il campo da utilizzare per la lettura dell'incrementale nel corpo del messaggio json. Esempio:
updatedAt - Aggregator: criterio di aggregazione per determinare il valore del campo incrementale. Esempio:
max - Current Value: il valore associato al campo incrementale, che inizialmente può essere fornito vuoto così da poter recuperare anche gli ordini aggiornati meno recentemente
Esempio delle informazioni recuperate
{
"orderReference": "gid://shopify/Order/1243",
"orderReferenceName": "#1001",
"status": "OPEN",
"id": "gid://shopify/DraftOrder/1243775402291",
"orderNumber": null,
"orderName": "#D87",
"channel": "demoipaas",
"srcName": null,
"note": "2 gift card + 1 item",
"tags": [],
"test": false,
"orderNotes": {},
"paymentStatus": "PENDING",
"fulfillmentStatus": "UNFULFILLED",
"isPickupInStore": false,
"pickupInStoreLocation": null,
"shippingAddress": {
"firstName": "Mario",
"lastName": "Rossi",
"company": null,
"street1": "Via Roma, 16",
"street2": null,
"city": "Firenze",
"zip": "50051",
"province": null,
"provinceCode": null,
"country": null,
"countryCode": null,
"phone": "057-1487"
},
"billingAddress": {
"firstName": "Mario",
"lastName": "Rossi",
"company": null,
"street1": "Via Roma, 16",
"street2": null,
"city": "Firenze",
"zip": "50051",
"province": null,
"provinceCode": null,
"country": null,
"countryCode": null,
"phone": "057-1487"
},
"customer": {
"id": "gid://shopify/Customer/9289121628467",
"channel": null,
"email": "m.rossi@test.com",
"createdAt": null,
"updatedAt": null,
"firstName": "Mario",
"lastName": "Rossi",
"phone": null,
"locale": "en",
"tags": [],
"acceptsEmailMarketing": false,
"acceptsEmailMarketingDate": null,
"acceptsSmsMarketing": false,
"acceptsSmsMarketingDate": null,
"totalSpent": 0,
"ordersCount": 0
},
"cancelReason": null,
"cancelledAt": null,
"orderItems": [
{
"id": "gid://shopify/DraftOrderLineItem/58565284266291",
"sku": "",
"productId": "gid://shopify/Product/9289226256691",
"variantId": "gid://shopify/ProductVariant/49362251972915",
"imageUrl": null,
"bundleCode": null,
"name": "Gift Card - $100",
"requiresShipping": false,
"vendor": "Snowboard Vendor",
"isGiftCard": true,
"giftCards": [],
"metadata": null,
"shopTotals": {
"currencyCode": "EUR",
"unitPrice": 100,
"originalUnitPrice": 100,
"totalNetPrice": 100,
"totalPrice": 100,
"originalTotalPrice": 100
},
"customerTotals": {
"currencyCode": "EUR",
"unitPrice": 100,
"originalUnitPrice": 100,
"totalNetPrice": 100,
"totalPrice": 100,
"originalTotalPrice": 100
},
"taxLines": [],
"taxBreakdown": {},
"unitWeight": null,
"duties": {},
"discountAllocations": [],
"qtyOrdered": 1,
"qtyShipped": 0,
"qtyRefunded": 0,
"unitAmountDiscounted": 0,
"orderItemNotes": {},
"itemGroup": null
},
{
"id": "gid://shopify/DraftOrderLineItem/58565284299059",
"sku": "9000Redirect",
"productId": "gid://shopify/Product/9325815791923",
"variantId": "gid://shopify/ProductVariant/49503933530419",
"imageUrl": null,
"bundleCode": null,
"name": "1 Redirect Polo Nord",
"requiresShipping": false,
"vendor": "Nike",
"isGiftCard": false,
"giftCards": [],
"metadata": null,
"shopTotals": {
"currencyCode": "EUR",
"unitPrice": 43,
"originalUnitPrice": 43,
"totalNetPrice": 43,
"totalPrice": 43,
"originalTotalPrice": 43
},
"customerTotals": {
"currencyCode": "EUR",
"unitPrice": 43,
"originalUnitPrice": 43,
"totalNetPrice": 43,
"totalPrice": 43,
"originalTotalPrice": 43
},
"taxLines": [],
"taxBreakdown": {},
"unitWeight": null,
"duties": {},
"discountAllocations": [],
"qtyOrdered": 1,
"qtyShipped": 0,
"qtyRefunded": 0,
"unitAmountDiscounted": 0,
"orderItemNotes": {},
"itemGroup": null
},
{
"id": "gid://shopify/DraftOrderLineItem/58565284331827",
"sku": "",
"productId": "gid://shopify/Product/9289226256691",
"variantId": "gid://shopify/ProductVariant/49362251776307",
"imageUrl": null,
"bundleCode": null,
"name": "Gift Card - $10",
"requiresShipping": false,
"vendor": "Snowboard Vendor",
"isGiftCard": true,
"giftCards": [],
"metadata": null,
"shopTotals": {
"currencyCode": "EUR",
"unitPrice": 10,
"originalUnitPrice": 10,
"totalNetPrice": 10,
"totalPrice": 10,
"originalTotalPrice": 10
},
"customerTotals": {
"currencyCode": "EUR",
"unitPrice": 10,
"originalUnitPrice": 10,
"totalNetPrice": 10,
"totalPrice": 10,
"originalTotalPrice": 10
},
"taxLines": [],
"taxBreakdown": {},
"unitWeight": null,
"duties": {},
"discountAllocations": [],
"qtyOrdered": 1,
"qtyShipped": 0,
"qtyRefunded": 0,
"unitAmountDiscounted": 0,
"orderItemNotes": {},
"itemGroup": null
}
],
"shopTotals": {
"currencyCode": "EUR",
"subTotalPrice": 153,
"totalNetPrice": 153,
"totalPrice": 153,
"totalShippingPrice": 0,
"totalDiscounts": 0
},
"customerTotals": {
"currencyCode": "EUR",
"subTotalPrice": 153,
"totalNetPrice": 153,
"totalPrice": 153,
"totalShippingPrice": 0,
"totalDiscounts": 0
},
"taxExempt": false,
"taxesIncluded": true,
"taxLines": [],
"fulfillments": [],
"transactions": [],
"discounts": [],
"createdAt": "2025-12-03T13:34:07+00:00",
"updatedAt": "2025-12-03T13:34:20+00:00",
"processedAt": null,
"closedAt": null,
"returns": [],
"refunds": [],
"shippingLines": [],
"metafields": [],
"metadata": {},
"assignedLocations": []
}