ERP integration playbook to sync in-store purchases

Prev Next

NewStore allows you to create financial transactions in an ERP system and sync them with the NewStore platform for all store orders (in-store purchases).

This integration playbook helps you integrate an ERP system used in your business with the NewStore platform, to sync all in-store purchases. The integration is achieved via the Event Stream.

For each in-store order placed in the NewStore platform, a sales transaction is created in the ERP, which includes:

  • Purchased items with prices and taxes

  • Payment details

Process overview

The following sequence diagram represents a typical integration of in-store orders in the NewStore platform with an ERP:

In this playbook:

  1. NewStore sends the order.opened event when the in-store purchase has been completed.

  2. The integration fetches all necessary details via GraphQL API. Payments are processed asynchronously, therefore it may take some time until all payment details are available.

  3. The integration creates a cash and carry sales transaction in the ERP by calling the ERP's API.

Exceptions

ERP unavailable

The integrations returns a 500 error, and the Event stream retries sending the macro event.

Payment details unavailable

In some cases, it takes more than a few seconds until payment processing at the PSP has been completed and the payment details become available in the platform. The integration moves the event into an internal queue (for example, SQS) for to reprocess later, and returns 200.

Exchange orders

The integration needs the store credit information to create a balanced transaction in the ERP. Consider adding store credit transactions to external payment events.

To identify an exchange order, see Event Stream documentation.

Sample GraphQL Query

Here is an example GraphQL query to retrieve all the information required to create a cash and carry sales transaction in the ERP.

query MyQuery {
  order(id: "012345Ab-CdEf-GhIj-KlMn-OpQrStUvWxYz", tenant: "dodici") {
    externalId
    placedAt
    demandLocationId
    currency
    isExchange
    isHistorical
    channel
    channelType
    shippingTax
    shippingTotal
    taxExempt
    taxStrategy
    taxTotal
    subtotal
    grandTotal
    discounts {
      edges {
        node {
          couponCode
        }
      }
    }
  }
}

The below is an example of a bad GraphQL query because it uses multiple contexts, and calls the same data in a nested format. All of these can slow down the response times and cause timeouts and slow down the integration.

query MyQuery {
  order(id: "012345Ab-CdEf-GhIj-KlMn-OpQrStUvWxYz", tenant: "dodici") {
    channelType
    channel
    externalId
  }
  paymentAccount(id: "012345Ab-CdEf-GhIj-KlMn-OpQrStUvWxYz", tenant: "dodici") {
    externalOrderId
    instruments {
      edges {
        node {
          id
        }
      }
    }
    order {
      channel
      channelType
      externalId
    }
  }
  fulfillmentRequestItem(fulfillmentRequestId: "012345Ab-CdEf-GhIj-KlMn-OpQrStUvWxYz", id: "012345Ab-CdEf-GhIj-KlMn-OpQrStUvWxYz", tenant: "dodici") {
    carrier
    productId
  }
}

ERP integration example with NetSuite

For integrations with NetSuite as an ERP system for endless aisle orders, see this example.

Related topics