Skip to content

Instantly share code, notes, and snippets.

@leomp12
Last active June 27, 2021 21:10
Show Gist options
  • Select an option

  • Save leomp12/349e62775d33c92671db3455c7a2e3d3 to your computer and use it in GitHub Desktop.

Select an option

Save leomp12/349e62775d33c92671db3455c7a2e3d3 to your computer and use it in GitHub Desktop.
E-Com Plus - Fluxo de integração para CRM

E-Com Plus - Fluxo de integração para CRM

O mínimo para uma integração completa entre o CRM e a plataforma de e-commerce deve ser:

  1. Cálculo de descontos (por cupom, UTM, e-mail do comprador...) diretamente no CRM para aplicação no checkout;
  2. Sincronização de pedidos.

fluxograma

Para esta implementação recomendamos a criação de um aplicativo da E-Com Plus, preferencialmente usando nosso template Application Starter.

Cálculo de descontos

No corpo do application, habilite o módulo apply_discount. Partindo do Application Starter basta descomentar a seguinte linha em functions/ecom.config.js:

apply_discount:       { enabled: true },

E depois editar o arquivo functions/routes/ecom/modules/apply-discount.js que receberá requisições POST com identificação do cliente, cupom (se houver), itens no carrinho e outros dados conforme o schema e deverá retornar retornar o desconto dispoível conforme o response schema.

Mais informações e exemplo simples está disponível no conteúdo inicial do próprio arquivo https://github.com/ecomplus/application-starter/blob/master/functions/routes/ecom/modules/apply-discount.js

Caso a intencão seja bypassar a requisição para um endpoint do CRM sem nenhum (ou quase) tratamento, o script pode ser editado para algo como:

const axios = require('axios')

exports.post = ({ appSdk, admin }, req, res) => {
  const { params, application } = req.body
  const { storeId } = req
  const response = {}
  const appData = Object.assign({}, application.data, application.hidden_data)
  if (appData.crm_endpoint) {
    return axios.post(appData.crm_endpoint, {
      params,
      storeId,
    })
      .then(({ data }) => res.send(data))
      .catch(console.error)
  }
  res.send({})
}

Neste exemplo o lojista deverá configurar crm_endpoint no painel através do admin_settings do aplicativo, também configurado em functions/ecom.config.js:

...
"admin_settings": {
  "crm_endpoint": {
    "schema": {
      "type": "string",
      "maxLength": 255,
      "format": "uri",
      "title": "URL para cálculo de desconto",
      "description": "Link disponível no seu painel do CRM"
    },
    "hide": true
  }
}
...

Sincronização de pedidos

Referência da API para leitura e manipulação de pedidos.

Seu aplicativo deverá ter autorização para ler (e talvez editar) pedidos. Partindo do Application Starter basta descomentar a seguinte linha em functions/ecom.config.js:

auth_scope: {
  // ...
  orders: [
    'GET',           // List/read orders with public and private fields
    // 'POST',          // Create orders
    // 'PATCH',         // Edit orders
    ...

Analogamente, talvez seu aplicativo também precise de autorização para manipulação de customers.

Para receber webhooks de novos pedidos e atualizações de status, adicione o seguinte procedure em functions/ecom.config.js:

procedures.push({
  title: app.title,
  triggers: [
    // Receive notifications when new order is created:
    {
      resource: 'orders',
      action: 'create',
    },
    // Receive notifications when order financial/fulfillment status changes:
    {
      resource: 'orders',
      field: 'financial_status',
    },
    {
      resource: 'orders',
      field: 'fulfillment_status',
    },
  ]
})

Em seguida os webhooks devem ser tratados em functions/routes/ecom/webhook.js, opcionalmente parseados e enviados para a API do CRM.

Em geral o webhook não terá o corpo completo do pedido, pode ser necessário ler o pedido completo a partir do order ID que será enviado no body do webhook como resource_id (quando o pedido é atualizado) ou inserted_id (novo pedido):

// functions/routes/ecom/webhook.js
// ...
const orderId = req.body.resource_id || req.body.inserted_id
const { response } = await appSdk.apiRequest(storeId, `orders/${orderId}.json`)
const order = response.data
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment