---
title: Flexy
slug: flexy
description: Learn about the capabilities and configuration of the Flexy connector for seamless communication between your E-commerce platform and online business systems. This document explores the "Cadastro de Nota Fiscal" operation, offering insights into the neces
docTags: 
createdAt: 2023-06-06T19:53:41.000Z
---

## Objetivo/Resumo

A Flexy é uma plataforma de E-commerce que atua com soluções inteligentes de venda online. Este conector permite a comunicação da plataforma de e-commerce com sistemas que realizam a gestão do seu negócio online. Sendo eles: softwares de controle de estoque (ERP), de relacionamento com o cliente (CRM), e-mail marketing, assim como os necessários à operação e gestão de sua loja.

### Criando um fluxo utilizando o conector Flexy

Para criar um **fluxo&#x20;**&#x75;tilizando o conector Flexy é preciso criar uma conexão e em seguida configurar o fluxo.

### Criando conexão Flexy

OBS: [Clique aqui](docId:1pCVN0mJbFKUjHMhj86K-) e acesse nosso passo a passo para saber como criar uma conexão.

Estes são os seguintes parâmetros de configuração da conexão Flexy que serão requisitados na criação:

- **Nome**: parâmetro padrão em qualquer criação de uma conexão, te ajudará a identificar melhor sua conexão (campo obrigatório);
- **Descrição**: parâmetro padrão e opcional em qualquer criação de uma conexão, aqui você pode relatar detalhadamente para que fins servirá sua conexão;
- **Identidade**: identificação na URL: \<suaidentidade>.plataforma.flexy.com.br (campo obrigatório);
- **Tipo de Acesso**: referencia ao acesso que a conexão terá, sendo eles, acesso a loja ou ao shopping;
  - **Loja**: para acessar a loja preencha os seguintes campos;
    - **Token**: token de acesso da loja;
    - **Código da Loja**: codigo de referência da loja;
  - **Shopping**: para acessar o shopping preencha o seguinte campo;
    - **Token**: token de acesso do shopping;

### Configurando fluxo Flexy

Crie um fluxo e arraste o conector Flexy para o canvas.

OBS: [Clique aqui](docId\:OcJTBFHi9Rerkr2d6OwIP) e acesse nosso passo a passo para saber como criar um fluxo.

Selecione o conector e na aba de `Parametrização` preencha os seguintes parâmetros de configuração:&#x20;

- **Recurso**: entidade para qual será realizada a ação. No momento o conector dispões três recursos sendo eles, Pedidos, Produtos e Notas;
- **Operação**: ação que será realizada para o recurso selecionado.
  - Operações disponiveis para recurso ***Pedidos***:
    - **Listar Pedidos**: usado para buscar os pedidos da base, podendo informar o número do pedido caso queira buscar somente um, ou deixar o campo vazio para retornar todos os pedidos da base;
    - **Alteração de status de um pedido**: usado para alterar o status de um pedido, requer o corpo da requisição que pode ser enviado utilizando [Template](docId\:TReaJH8tvdyh6uKYEAQZP) ou [De/para](docId\:VOQdaUkjjknbSWVRHbzQW);
  - Operações disponiveis para recurso ***Produtos***:
    - **Alteração de estoque por centro de distribuição / SKU**: usado para alteração de estoques de um SKU para um centro de distribuição, requer o código do produto e o corpo da requisição que pode ser enviado utilizando [Template](docId\:TReaJH8tvdyh6uKYEAQZP) ou [De/para](docId\:VOQdaUkjjknbSWVRHbzQW);
    - **Listar Produtos**: usado para buscar os produtos da base, podendo informar o número do produto caso queira buscar somente um, ou deixar o campo vazio para retornar todos os produtos da base;
    - **Cadastro/Alteração de produtos**: usado para criar ou atualizar um produto, requer o corpo da requisição que pode ser enviado utilizando [Template](docId\:TReaJH8tvdyh6uKYEAQZP) ou [De/para](docId\:VOQdaUkjjknbSWVRHbzQW);
    - **Alteração de preço e/ou estoque de SKU**: usado para alteração de preços e estoques de um SKU, requer o código do produto e o corpo da requisição que pode ser enviado utilizando [Template](docId\:TReaJH8tvdyh6uKYEAQZP) ou [De/para](docId\:VOQdaUkjjknbSWVRHbzQW);
  - Operações disponiveis para recurso ***Notas:***
    - **Cadastro de Nota Fiscal**: usado para cadastro ou atualização de uma nota fiscal em um pedido, requer o corpo da requisição que pode ser enviado utilizando [Template](docId\:TReaJH8tvdyh6uKYEAQZP) ou [De/para](docId\:VOQdaUkjjknbSWVRHbzQW);

Na aba `Propriedades` selecione a conexão desejada, dê um nome ao passo e se necessário detalhe uma descrição.

## Na prática

Neste tópico criaremos um exemplo de um fluxo utilizando o conector da Flexy. O fluxo terá 3 passos porém será executado somente dois pois criaremos uma rule para identificar se o produto ja foi cadastrado ou não. O fluxo simulará uma integração com Bling, então teremos um payload de entrada referente a saída de uma busca da Bling.



![](https://api.archbee.com/api/optimize/G1NTw6yAi4RDUYbsU8csp/wd_DOzlmao0IIWXRsN9cM_image.png)

### Passo 'busca-produto'

Este passo fará uma busca nos produtos da Flexy utilizando o código do produto que é enviado no payload de entrada (*lembrando que esse payload de entrada simula o payload de saída de uma busca de produtos na Bling,&#x20;*[clique aqui](docId\:RLa13f-jTY-896sv2kzRK)*&#x20;para mais informações sobre nosso conector Bling*). Por fim informaremos o código do produto utilizando uma função de parâmetros dinâmicos da fluid (*para mais detalhes clique em&#x20;*[saiba mais](docId:0VQVPw6saqz2z1jGp8FwC)). Assim ficará a `Parametrização` do busca-produto:



::Image[]{src="https://api.archbee.com/api/optimize/G1NTw6yAi4RDUYbsU8csp/G9B6sQN6UNRrjMpou_7g6_image.png" size="70" width="426" height="606" position="center" darkWidth="426" darkHeight="606" showCaption="false"}

Na aba `Propriedades` informamos o nome do passo e a conexão criada com as credenciais da loja:



::Image[]{src="https://api.archbee.com/api/optimize/G1NTw6yAi4RDUYbsU8csp/YtTx1Qt-v-9GJZTzKxycL_image.png" size="70" width="419" height="564" position="center" darkWidth="419" darkHeight="564" showCaption="false"}

### Passo 'atualiza-produto'

Este passo terá uma rule mandatória que irá validar o retorno do passo 'busca-produto', se o retorno for vazio, o passo não será executado e pulará para o próximo pois não haverá produto para atualizar (*para mais detalhes sobre rules clique em* [saiba mais](docId\:lgqSmyrXokYm9hGjtOtKL)). Assim ficará a `Parametrização` do atualiza-produto:



::Image[]{src="https://api.archbee.com/api/optimize/G1NTw6yAi4RDUYbsU8csp/vPNYuBA3whcjJnvQIA3xW_image.png" size="70" width="420" height="602" position="center" darkWidth="420" darkHeight="602" showCaption="false"}

Para tratar os dados recebidos do passo anterior usamos o De/Para. E por fim utilizamos o Template para montar o corpo da requisição que a operação espera receber.&#x20;

Assim ficou nosso De/para:



```json
{
	"json_obj": {
		"product.name": "rule_descricao",
		"product.referenceCode": "rule_codigo",
		"product.ncm": "produto.class_fiscal",
		"product.categories": "rule_categoriaProdutos",
		"json_list&&product.images&&produto.imagem": "link",
		"json_obj&&product.descriptionGroup&&json_obj": {
			"product.descriptionGroup.descriptionOne": "produto.descricaoCurta",
			"product.descriptionGroup.descriptionTwo": "produto.descricaoComplementar",
			"product.descriptionGroup.descriptionThree": "produto.observacoes"
		},
		"json_list&&product.properties&&json_obj": {
			"referenceCode": "default_Cor",
			"value": "rule_marca"
		},
		"properties2": "produto.condicao",
		"json_list&&product.videos&&json_obj": {
			"code": "urlVideo"
		},
		"json_obj&&product.metaTags": {
			"product.metaTags.title": "rule_descricao",
			"product.metaTags.description": "produto.descricaoComplementar",
			"product.metaTags.keyword": "produto.observacoes"
		},
		"product.availableFor": "default_sale",
		"product.stockControl": "default_1",
		"json_list&&product.variants&&json_obj": {
			"price": "produto.preco",
			"presentation": "rule_descricao",
			"referenceCode": "rule_codigo",
			"master": "default_1",
			"eanCode": "produto.gtin",
			"json_obj": {
				"stock.quantity": "rule_estoqueAtual",
				"json_obj": {
					"distributionCenter.referenceCode": "default_96581798000262"
				}
			},
			"json_obj&&dimensionGroup": {
				"dimensionGroup.weight": "produto.pesoBruto",
				"dimensionGroup.width": "produto.larguraProduto",
				"dimensionGroup.height": "produto.alturaProduto",
				"dimensionGroup.depth": "produto.profundidadeProduto"
			}
		}
	}
}
```

*Para mais informações sobre como tratamos de/paras clique em&#x20;*[saiba mais](docId\:VOQdaUkjjknbSWVRHbzQW)*.*

*Se observar, alguns valores do nosso de/para estão sendo referenciado algumas rules, essas são rules internas, para mais informações acesse nossa documentação sobre&#x20;*[Rules](docId\:lgqSmyrXokYm9hGjtOtKL)*.*

Para nós o que será relevante é a rule mandatória que definirá o percurso do nosso fluxo, assim ficou nossa rule:



```json
[
    {
		"idRule": "flexy_atualiza_produto",
		"rule": "{\"if\" : [  {\"!=\": [{\"var\":\"busca-produto\"}, \"[]\"] }, true, false]}",
		"type": "mandatory",
		"description": "Verifica se existe o produto cadastrado. Se existir só executa a atualização. Se não existir, só executa o cadastro."
	}
	...
]
```



E por fim, o template no formato esperado pela Flexy:



```json
{
	"product": {
	  "availableFor": "{{ .mapping.product.availableFor }}",
	  "categories": {{ .mapping.product.categories }},
		"descriptionGroup": {
			"descriptionOne": "{{ removeAspasQuebraEHTML .mapping.product.descriptionGroup.descriptionOne }}",
			"descriptionTwo": "{{ removeAspasQuebraEHTML .mapping.product.descriptionGroup.descriptionTwo }}",
			"descriptionThree": "{{ removeAspasQuebraEHTML .mapping.product.descriptionGroup.descriptionThree }}"
		  },
	  "images":[
		  {{ range $index1, $value1 :=  .mapping.product.images }}{{- if $index1}},{{end }}"{{ $value1 }}"{{ end }}
	  ],
	"metaTags": {
	  "description": "{{ removeAspasQuebraEHTML .mapping.product.metaTags.description }}",
	  "keyword": "{{ removeAspasQuebraEHTML .mapping.product.metaTags.keyword }}",
	  "title": "{{ removeAspasQuebraEHTML .mapping.product.metaTags.title }}"
	},
	"name": "{{ .mapping.product.name }}",
	"referenceCode": "{{ .mapping.product.referenceCode | replace "_" "-"}}",
	"ncm":"{{ .mapping.product.ncm }}",
	"stockControl": "{{ .mapping.product.stockControl }}",
	  "variants":[
		  {{ $variant:= (index .mapping.product.variants 0) }}
		  {
			"dimensionGroup":
			{
			  "depth":"{{ $variant.dimensionGroup.depth }}",
			  "height":"{{ $variant.dimensionGroup.height }}",
			  "weight":"{{ $variant.dimensionGroup.weight }}",
			  "width":"{{ $variant.dimensionGroup.width }}"

			},
			"eanCode":"{{ $variant.eanCode }}",
			"master":"{{ $variant.master }}",
			"presentation":"{{ $variant.presentation }}",
			"price":"{{ $variant.price  }}",
			"referenceCode":"{{ $variant.referenceCode | replace "_" "-"}}",
			"stock":{
			  "quantity":{{ $variant.stock.quantity}}
			  }
		  }
		]

	}
  }
```

Na aba `Propriedades` informamos o nome do passo e a conexão criada com as credenciais da loja:



::Image[]{src="https://api.archbee.com/api/optimize/G1NTw6yAi4RDUYbsU8csp/iNL4PHQAZ_VkasLR-MMiU_image.png" size="70" width="418" height="562" position="center" darkWidth="418" darkHeight="562" showCaption="false"}

### Passo 'cadastra-produto'

Este passo também terá uma rule mandatória que irá validar o retorno do passo 'busca-produto', porém se o retorno for vazio, o passo será executado e cadastrará o produto na flexy (*para mais detalhes sobre rules clique em* [saiba mais](docId\:lgqSmyrXokYm9hGjtOtKL)). Assim ficará a `Parametrização` do cadastra-produto:



::Image[]{src="https://api.archbee.com/api/optimize/G1NTw6yAi4RDUYbsU8csp/yCE3V3gWTXL5VuHTPx7yp_image.png" size="70" width="421" height="601" position="center" darkWidth="421" darkHeight="601" showCaption="false"}

Para tratar os dados recebidos do passo anterior usamos o De/Para. E por fim utilizamos o Template para montar o corpo da requisição que a operação espera receber.&#x20;

Assim ficou nosso De/para:



```json
{
  "json_obj": {
    "product.name": "rule_descricao",
    "product.referenceCode": "rule_codigo",
    "product.ncm": "produto.class_fiscal",
    "product.categories": "rule_categoriaProdutos",
    "json_list&&product.images&&produto.imagem": "link",
    "json_obj&&product.descriptionGroup&&json_obj": {
      "product.descriptionGroup.descriptionOne": "produto.descricaoCurta",
      "product.descriptionGroup.descriptionTwo": "rule_descricaoComplementar",
      "product.descriptionGroup.descriptionThree": "rule_observacoes"
    },
    "json_list&&product.properties&&json_obj": {
      "referenceCode": "default_marca",
      "value": "rule_marca"
    },
    "properties2": "produto.condicao",
    "json_list&&product.videos&&json_obj": {
      "code": "urlVideo"
    },
    "json_obj&&product.metaTags": {
      "product.metaTags.title": "rule_descricao",
      "product.metaTags.description": "rule_descricaoComplementar",
      "product.metaTags.keyword": "rule_observacoes"
    },
    "product.availableFor": "default_sale",
    "product.stockControl": "default_1",
    "json_list&&product.variants&&json_obj": {
      "price": "produto.preco",
      "presentation": "rule_descricao",
      "referenceCode": "rule_codigo",
      "master": "default_1",
      "eanCode": "produto.gtin",
      "json_obj": {
        "stock.quantity": "rule_estoqueAtual",
        "json_obj": {
          "distributionCenter.referenceCode": "default_bike-no-vale"
        }
      },
      "json_obj&&dimensionGroup": {
        "dimensionGroup.weight": "produto.pesoBruto",
        "dimensionGroup.width": "produto.larguraProduto",
        "dimensionGroup.height": "produto.alturaProduto",
        "dimensionGroup.depth": "produto.profundidadeProduto"
      }
    }
  }
}
```

*para mais informações sobre como tratamos de/paras clique em&#x20;*[saiba mais](docId\:VOQdaUkjjknbSWVRHbzQW)**

*Se observar, alguns valores do nosso de/para também estão sendo referenciado algumas rules, essas são rules internas, para mais informações acesse nossa documentação sobre&#x20;*[Rules](docId\:lgqSmyrXokYm9hGjtOtKL)**

Para nós o que será relevante é a rule mandatória que definirá o percurso do nosso fluxo, assim ficou nossa rule:



```json
[
    {
		"idRule": "flexy_cadastra_produto",
		"rule": "{\"if\" : [  {\"!=\": [{\"var\":\"busca-produto\"}, \"[]\"] }, false, true]}",
		"type": "mandatory",
		"description": "Verifica se existe o produto cadastrado. Se existir só executa a atualização. Se não existir, só executa o cadastro."
	}
	...
]
```

E por fim, o template no formato esperado pela Flexy:



```json
{
	"product": {
	  "availableFor": "{{ .mapping.product.availableFor }}",
	  "categories":{{ .mapping.product.categories }},
		"descriptionGroup": {
			"descriptionOne": "{{removeAspasQuebraEHTML .mapping.product.descriptionGroup.descriptionOne }}",
			"descriptionTwo": "{{ removeAspasQuebraEHTML .mapping.product.descriptionGroup.descriptionTwo }}",
			"descriptionThree": "{{ removeAspasQuebraEHTML .mapping.product.descriptionGroup.descriptionThree }}"
		  },
	  "images":[
		  {{ range $index1, $value1 :=  .mapping.product.images }}{{- if $index1}},{{end }}"{{ $value1 }}"{{ end }}
	  ],
	"metaTags": {
	  "description": "{{removeAspasQuebraEHTML .mapping.product.metaTags.description }}",
	  "keyword": "{{ removeAspasQuebraEHTML .mapping.product.metaTags.keyword }}",
	  "title": "{{ removeAspasQuebraEHTML .mapping.product.metaTags.title }}"
	},
	"name": "{{ .mapping.product.name }}",
	"referenceCode": "{{  .mapping.product.referenceCode | replace "_" "-"}}",
	"ncm":"{{ .mapping.product.ncm }}",
	"stockControl": "{{ .mapping.product.stockControl }}",
	  "variants":[
		  {{ $variant:= (index .mapping.product.variants 0) }}
		  {
			"dimensionGroup":
			{
			  "depth":"{{ $variant.dimensionGroup.depth }}",
			  "height":"{{ $variant.dimensionGroup.height }}",
			  "weight":"{{ $variant.dimensionGroup.weight }}",
			  "width":"{{ $variant.dimensionGroup.width }}"

			},
			"eanCode":"{{ $variant.eanCode }}",
			"master":"{{ $variant.master }}",
			"presentation":"{{ $variant.presentation }}",
			"price":"{{ $variant.price  }}",
			"referenceCode":"{{  $variant.referenceCode | replace "_" "-"}}",
			"stock":{
			  "quantity":{{ $variant.stock.quantity}}
			  }
		  }
		]

	}
  }
```

Na aba `Propriedades` informamos o nome do passo e a conexão criada com as credenciais da loja:



::Image[]{src="https://api.archbee.com/api/optimize/G1NTw6yAi4RDUYbsU8csp/aJMj9W_KUCeViLj-uL-bI_image.png" size="70" width="415" height="561" position="center" darkWidth="415" darkHeight="561" showCaption="false"}

### Conclusão

Com todos os passos configurados basta disparar o fluxo informando o payload de entrada simulando o retorno da busca de produtos na bling, que seria algo pareciso com isso:

```json
{
    "produto": {
        "id": "15880597775",
        "codigo": "fld-citrino",
        "descricao": "Tênis Saucony Endorphin",
        "tipo": "P",
        "situacao": "Ativo",
        "unidade": "",
        "preco": "2000000.0000000000",
        "precoCusto": null,
        "descricaoCurta": "",
        "descricaoComplementar": "",
        "dataInclusao": "2022-06-07",
        "dataAlteracao": "2022-11-22",
        "imageThumbnail": null,
        "urlVideo": "",
        "nomeFornecedor": "",
        "codigoFabricante": "",
        "marca": "",
        "class_fiscal": "",
        "cest": "",
        "origem": "0",
        "idGrupoProduto": "0",
        "linkExterno": "",
        "observacoes": "",
        "grupoProduto": null,
        "garantia": null,
        "descricaoFornecedor": null,
        "idFabricante": "",
        "categoria": {
            "id": "4098280",
            "descricao": "Categoria padr\u00e3o"
        },
        "pesoLiq": "0.00000",
        "pesoBruto": "0.00000",
        "estoqueMinimo": "0.00",
        "estoqueMaximo": "0.00",
        "gtin": "",
        "gtinEmbalagem": "",
        "larguraProduto": "0",
        "alturaProduto": "0",
        "profundidadeProduto": "0",
        "unidadeMedida": "Cent\u00edmetros",
        "itensPorCaixa": 0,
        "volumes": 0,
        "localizacao": "",
        "crossdocking": "0",
        "condicao": "N\u00e3o Especificado",
        "freteGratis": "N",
        "producao": "P",
        "dataValidade": "0000-00-00",
        "spedTipoItem": "",
        "imagem": [
            {
                "link": "https://yt3.ggpht.com/ytc/AMLnZu9A574Fn2LsUmBlvFnNTQqsVGxI_W3KkF8uX6LwSA=s900-c-k-c0x00ffffff-no-rj",
                "validade": "S\/ Validade",
                "tipoArmazenamento": "externo"
            }
        ],
        "estoqueAtual": 200,
        "depositos": [
            {
                "deposito": {
                    "id": "14886475711",
                    "nome": "Geral",
                    "saldo": 200,
                    "desconsiderar": "N",
                    "saldoVirtual": 200
                }
            }
        ]
    }
}
```



![](https://api.archbee.com/api/optimize/G1NTw6yAi4RDUYbsU8csp/xQU_Cswt_pnHDMP-k4sY5_image.png)

Após o disparo, caso o produto já exista na Flexy:



![](https://api.archbee.com/api/optimize/G1NTw6yAi4RDUYbsU8csp/ENh74xxAVCyeOoxR0_mzM_image.png)

Caso o produto não exista na Flexy:



![](https://api.archbee.com/api/optimize/G1NTw6yAi4RDUYbsU8csp/LmikcaERIxDeOsJnLhFgi_image.png)

