Field mappings
Here are all the data mappings for the Engage - Shopify integration.
Contact data mapping
Engage  | Source data (Shopify)  | Notes  | 
Contact.externalId  | Customer.id  | |
Contact.contactType  | "member" or "contact"  | Only set on contact creation. according to "Customer contact type" setting  | 
Contact.firstName  | Customer.firstName  | |
Contact.lastName  | Customer.lastName  | |
Contact.email  | Customer.email  | |
Contact.gender  | voyado.gender  | Available as a customer metafield in Shopify.  | 
Contact.mobilePhone  | Customer.phone  | |
Contact.createdInStore  | Associated Store for Customer.locale  | Based on market configuration in Engage App in Shopify  | 
Contact.street  | Customer.defaultAddress.address1 , Customer.defaultAddress.address2  | |
Contact.city  | Customer.defaultAddress.city  | |
Contact.country  | Customer.defaultAddress.country  | |
Contact.countryCode  | Customer.defaultAddress.countryCodeV2  | |
Contact.language  | ||
Contact.externalId  | Shopify internal Id  | |
Contact.preferences.acceptsEmail  | Customer.emailMarketingConsent.marketingState == SUBSCRIBED  | Set on Contact creation and opt-in through an order  | 
Contact.preferences.acceptsSms  | Customer.smsMarketingConsent.marketingState == SUBSCRIBED  | Set on Contact creation and opt-in through an order  | 
Contact.preferences.acceptsPostal  | false  | Only set on Contact creation.  | 
Contact.consents[id="hasShopifyAccount"].value  | Customer.state == ACTIVE  | Set for all customers who have an account online  | 
Contact.consents[id="hasShopifyAccount"].source  | "Shopify"  | 
Receipt data mapping
Engage  | Source data (Shopify) - orders/create  | Source data (Shopify) - refunds/create  | Notes  | 
Receipt.contact.matchKey  | Associated Contact Voyado Contact ID  | ||
Receipt.contact.matchKeyType  | "contactId"  | ||
Receipt.uniqueReceiptId  | Order.id  | Refund.order.id  | |
Receipt.receiptNumber  | Order.name  | Refund.order.number  | |
Receipt.createdDate  | Order.createdAt  | Refund.createdAt  | |
Receipt.storeExternalId  | Associated Store External ID by Customer.locale retrieved from database  | Based on market configuration in Engage App in Shopify  | |
Receipt.currency  | Order.currencyCode  | Refund.order.currencyCode  | |
Receipt.exchangeRateToGroupCurrency  | The exchange rate between "voyado group currency" (see settings) and Order.currencyCode / Refund.order.currencyCode , retrieved from third party service (with 24-hours accuracy)  | ||
Receipt.totalGrossPrice  | Order.totalPriceSet.shopMoney.amount  | Refund.totalRefundedSet.shopMoney.amount  | |
Receipt.taxDetails  | Order.taxLines  | ||
Receipt.taxDetails[].description  | Order.taxLines[].title  | "Tax refund"  | |
Receipt.taxDetails[].value  | Order.taxLines[].priceSet.shopMoney.amount  | sum(Refund.refundLineItems[].totalTaxSet.shopMoney.amount)  | |
Receipt.paymentMethods[].type  | Order.transactions[].gateway  | Refund.transactions[].gateway  | |
Receipt.paymentMethods[].description  | Order.transactions[].paymentProvider.name  | Refund.transactions[].paymentProvider.name  | |
Receipt.paymentMethods[].value  | Order.transactions[].amountSet.shopMoney.amount  | Refund.transactions[].amountSet.shopMoney.amount  | |
Receipt.items[]  | Order.lineItems[]  | Refund.refundLineItems[]  | |
Receipt.items[].type  | "PURCHASE"  | "RETURN"  | |
Receipt.items[].quantity  | Order.lineItems[].quantity  | Refund.refundLineItems[].quantity  | |
Receipt.items[].grossPaidPrice  | Order.lineItems[].discountedTotalSet.shopMoney.amount  | Refund.refundLineItems[].priceSet.shopMoney.amount  | |
Receipt.items[].taxAmount  | Sum of Order.lineItems[].taxLines[*].priceSet.shopMoney.amount  | Refund.refundLineItems[].totalTaxSet.shopMoney.amount  | |
Receipt.items[].sku  | Order.lineItems[].sku  | Refund.refundLineItems[].lineItem.sku  | |
Receipt.items[].articleNumber  | Order.lineItems[].sku  | Refund.refundLineItems[].lineItem.sku  | |
Receipt.items[].discounts[].type  | Derived from type of Order.lineItems[].discountAllocations[].discountApplication  | See *A1  | |
Receipt.items[].discounts[].description  | Derived from type of Order.lineItems[].discountAllocations[].discountApplication  | See *A2  | |
Receipt.items[].discounts[].value  | Order.lineItems[].discountAllocations[].allocatedAmountSet.shopMoney.amount  | 
*A1 - Discount type mapping
DiscountApplication type  | Engage discount description  | 
AutomaticDiscountApplication  | 235  | 
DiscountCodeApplication  | 235  | 
ManualDiscountApplication  | 235  | 
ScriptDiscountApplication  | 235  | 
*A2 - Discount description mapping
DiscountApplication type  | Engage discount description  | 
AutomaticDiscountApplication  | "Automatic discount: ${AutomaticDiscountApplication.code}"  | 
DiscountCodeApplication  | "Discount code: ${DiscountCodeApplication.code}"  | 
ManualDiscountApplication  | "Manual discount: ${ManualDiscountApplication.description}"  | 
ScriptDiscountApplication  | "Script discount: ${ScriptDiscountApplication.title}"  | 
Cart abandonment
Engage  | Source  | 
[].CartReference  | AbandonedCheckout.cart_id  | 
[].Time  | AbandonedCheckout.updated_at  | 
[].ContactId  | Identified contact ID  | 
[].Language  | AbandonedCheckout.customer_locale  | 
[].Url  | AbandonedCheckout.abandoned_checkout_url  | 
[].Items[].Sku  | AbandonedCheckout.line_items[].sku  | 
[].Items[].Quantity  | AbandonedCheckout.line_items[].quantity  | 
Engage order notification
Engage  | Source (Shopify) - orders/*  | Source (Shopify) - refunds/create  | Notes  | 
contact.matchKey  | Order.email or Order.phone (based on customer identification method, see settings.)  | ||
contact.matchKeyType  | "email" or "phone" (based on customer identification method)  | ||
orderStatus  | See *B3  | ||
paymentStatus  | See *B4  | ||
orderNumber  | Order.name  | ||
createdDate  | Order.createdAt  | ||
shippingDate  | Order.fulfillments[0]?.createdAt  | ||
statusChangedDate  | Order.updatedAt  | ||
storeId  | Associated store ID for Order.customerLocale (see store locale mapping.)  | ||
currency  | Order.currencyCode  | ||
language  | Order.customerLocale.split('-')[0]  | ||
totalGrossPrice  | Order.totalPriceSet.shopMoney.amount  | ||
freightFee.value  | Order.shippingLine.discountedPriceSet.shopMoney.amount  | ||
freightFee.tax  | sum(Order.shippingLine.taxLines[].priceSet.shopMoney.amount  | ||
totalTax  | Order.totalTaxSet.shopMoney.amount  | ||
taxDetails[].description  | Order.taxLines[].title  | ||
taxDetails[].value  | Order.taxLines[].priceSet.shopMoney.amount  | ||
extraData.CreatedDate  | Order.createdAt  | ||
extraData.ShippingDate  | Order.fulfillments[0]?.createdAt  | ||
extraData.ReturnDate  | Order.refunds[0]?.createdAt  | ||
extraData.TrackingNumber  | Order.fulfillments?[0].trackingInfo.number  | ||
extraData.TrackingLinkHTML  | Order.fulfillments?[0].trackingInfo.url  | ||
extraData.ShippingMethod  | Order.shippingLine.code  | ||
extraData.ShippingAddressFirstName  | Order.shippingAddress.firstName  | ||
extraData.ShippingAddressLastName  | Order.shippingAddress.lastName  | ||
extraData.ShippingAddressStreet  | Order.shippingAddress.address1 + Order.shippingAddress.address2  | ||
extraData.ShippingAddressZipCode  | Order.shippingAddress.zip  | ||
extraData.ShippingAddressCity  | Order.shippingAddress.city  | ||
extraData.ShippingAddressCountry  | Order.shippingAddress.countryCodeV2  | ||
extraData.ShippingAddressPhone  | Order.shippingAddress.phone  | ||
extraData.ShippingAddressEmail  | Order.email  | ||
extraData.PaymentMethod  | Order.paymentGatewayNames.join(',')  | ||
extraData.BillingAddressFirstName  | Order.billingAddress.firstName  | ||
extraData.BillingAddressLastName  | Order.billingAddress.lastName  | ||
extraData.BillingAddressStreet  | Order.billingAddress.address1 + Order.billingAddress.address2  | ||
extraData.BillingAddressZipCode  | Order.billingAddress.zip  | ||
extraData.BillingAddressCity  | Order.billingAddress.city  | ||
extraData.BillingAddressCountry  | Order.billingAddress.countryCodeV2  | ||
extraData.BillingAddressPhone  | Order.billingAddress.phone  | ||
extraData.BillingAddressEmail  | Order.email  | ||
items[]  | Order.lineItems[LineItem.refundableQuantity > 0]  | Order.refunds[].refundLineItems[]  | |
items[].type  | "purchase"  | "return"  | |
items[].sku  | Order.lineItems[].sku  | Order.refunds[].refundLineItems[].sku  | |
items[].quantity  | Order.lineItems[].refundableQuantity  | Order.refunds[].refundLineItems[].quantity  | |
items[].grossPaidPrice  | Order.lineItems[].discountedTotalPriceSet.shopMoney.amount  | Order.refunds[].refundLineItems[].priceSet.shopMoney.amount  | |
items[].taxAmount  | sum(Order.lineItems[].taxLines[].priceSet.shopMoney.amount)  | Order.refunds[].refundLineItems[].totalTaxAmount.shopMoney.amount  | |
items[].description  | Order.lineItems[].name  | ||
items[].imageUrl  | Order.lineItems[].image.src  | ||
items[].discounts[].type  | Order.lineItems[].discountAllocations[].discountApplication  | See *B1  | |
items[].discounts[].description  | Order.lineItems[].discountAllocations[].discountApplication  | See *B2  | |
items[].discounts[].value  | Order.lineItems[].discountAllocations[].allocatedAmountSet.shopMoney.amount  | 
*B1 - Discount type mapping
DiscountApplication type  | Engage discount type  | 
AutomaticDiscountApplication  | 235  | 
DiscountCodeApplication  | 235  | 
ManualDiscountApplication  | 235  | 
ScriptDiscountApplication  | 235  | 
*B2 - Discount description mapping
DiscountApplication type  | Engage discount description  | 
AutomaticDiscountApplication  | "Automatic discount: ${AutomaticDiscountApplication.code}"  | 
DiscountCodeApplication  | "Discount code: ${DiscountCodeApplication.code}"  | 
ManualDiscountApplication  | "Manual discount: ${ManualDiscountApplication.description}"  | 
ScriptDiscountApplication  | "Script discount: ${ScriptDiscountApplication.title}"  | 
*B3 - Order status mapping
Condition  | Value  | 
Order.refunds  | "REFUNDED"  | 
Order.fulfillments  | "FULFILLED"  | 
Order.partialFulfillments  | "PARTIALLY_FULFILLED"  | 
Order.cancellations  | "CANCELLED"  | 
Otherwise  | "CONFIRMED"  | 
*B4 - Order payment status mapping
Condition  | Value  | 
Order.fullyPaid  | "PAID"  | 
Order.unpaid  | "UNPAID"  | 
Otherwise  | "PARTIALLY_PAID"  |