# Destinations

No **AgnosticData**, os **Destinations** referem-se aos locais para onde os dados capturados e processados podem ser enviados. Em outras palavras, são os sistemas, plataformas ou bancos de dados que recebem os eventos coletados pela plataforma, permitindo que os usuários aproveitem essas informações para análise, automação ou personalização de ações.

#### **Principais Características dos Destinations no AgnosticData**:

1. **Envio de Dados em Tempo Real**
   * Os eventos podem ser redirecionados para diferentes ferramentas de analytics, CRM, data warehouses ou sistemas internos.
2. **Destinos Agnósticos e Personalizáveis**
   * O AgnosticData permite que os dados sejam enviados para **múltiplos destinos simultaneamente**, garantindo flexibilidade para cada necessidade de negócio.
3. **Integração Direta com Ferramentas de Mercado**
   * Exemplos de **destinations** incluem:
     * **Plataformas de Analytics**: Mixpanel, Amplitude, Google Analytics, Adobe Analytics.
     * **CRM e Automação de Marketing**: Salesforce, HubSpot, RD Station.
     * **Data Warehouses e Bancos de Dados**: BigQuery, Snowflake, Redshift, PostgreSQL.
     * **Plataformas de Mensageria**: Twilio, Firebase, Cloudflare Workers, Dengage.
     * **APIs Customizadas**: O usuário pode configurar webhooks ou enviar dados para APIs específicas.
4. **Controle sobre os Próprios Dados**
   * Diferente de plataformas como Mixpanel e Amplitude, que armazenam os dados dentro de seus próprios sistemas, no **AgnosticData** o cliente **mantém a posse dos dados** e pode definir onde eles serão armazenados e processados.
5. **Redução de Custos**
   * Como a captura pode ser feita diretamente na origem, sem precisar de ETLs ou pipelines complexos, o custo de armazenamento e processamento de dados é menor do que depender de ferramentas de terceiros.

#### **Exemplo de Uso**

Se uma empresa deseja entender melhor o comportamento de seus usuários, pode configurar o AgnosticData para capturar eventos de interação no site e enviá-los simultaneamente para:

* **Google Analytics** (para métricas gerais de tráfego),
* **Amplitude** (para análise detalhada de cohort e retenção),
* **BigQuery** (para armazenamento e cruzamento com dados internos),
* **Salesforce** (para personalização da comunicação com leads e clientes).

Essa flexibilidade torna os **Destinations** uma peça central na estratégia **data-driven** do AgnosticData.

## Elastic Cloud

Para configurar uma instanância do Elastic Cloud para receber eventos do Agnostic Data é simples. Siga os passos.

#### Configurar tipos dados

Configurar os tipos dados ajudará o Elastic a inferir corretamente nos tipos de dados dos eventos. São  basicamente 4 tipos de dados que "treinamos" o Elastic para ele não se perder, são eles:&#x20;

`inserted_date, device_geohash, complete_data, items.item_id, items.id`

Para informar ao Elastic que desejamos esses tipos de dados realize os seguintes passos:

1. Navegue até a página "Dev Tools" em (<https://INSTANCIA/app/dev\\_tools#/console>)
2. Cole o conteúdo abaixo (de "Template de tipos") na área apropriada e clique no play (>) para enviar um request que irá realizar um PUT em `_index_template` com o template de nome `agnostic_template` e os tipos e formatos, conforme definidos abaixo.

<details>

<summary>Template de tipos</summary>

````json
```json

// PUT _index_template/agnostic_template
{
  "index_patterns": ["events_*"],
  "template": {
    "mappings": {
      "properties": {
          "inserted_date": {
                "type": "date",
                "format": "strict_date_optional_time||epoch_second"
          },
          "start_session": {
              "type": "date",
              "format": "strict_date_optional_time||epoch_second"
          },        
          "last_origin_ts": {
              "type": "date",
              "format": "strict_date_optional_time||epoch_second"
          },        
          "utm_case": {
              "properties": {
                  "attr_dts_ts": {
                    "type": "date",
                    "format": "strict_date_optional_time||epoch_second"
                  }
              }
          },
          "device_geohash": {
            "type": "geo_point"
          },
          "complete_data": {
            "properties": {
              "save": {
                "type": "boolean"
              }
            }
          },
          "items": {
              "properties": {
                "item_id": {
                  "type": "text"
                },
                "id": {
                  "type": "text"
                }
              }
          },  
          "relative_view": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword"
              }
            }
          },
          "user_id": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }                   
      }
    }
  }
}


// PUT /CLIENTE_HOOK/_settings
{
  "index.default_pipeline": "json_parser"
}

```
````

</details>

#### Gerar chaves de acesso

Gere as chaves de acesso para cadastrá-las no AgnosticData, assim você poder tirar todo o proveito desta integração. Para gerar a chave de acesso siga os passos:

1. Navegue até a página API em Stack Management -> Security -> Api Key. Exemplo: <https://INSTANCIA/app/management/security/api\\_keys>)
2. Clique em "CREATE API KEY"
3. Em name preencher com "agnostic-user-writer"
4. Selecionar "Personal API KEY"
5. Desabilitar "Restrict privileges", "Expire after time", "Include metadata"
6. Confirmar criação em "CREATE API KEY"
7. Na tela aparecerá uma chave copie-a e salve-a
8. Navegue até o arquivo/tela de configuração do projeto do AgnosticData e preenche na lista de destinations do elastic em settings.destinations.elastic com os valores
   1. is\_active: true,
   2. id: (você encontra no campo *Cloud Id* acessando as configurações da implantação em <https://cloud.elastic.co/deployments/>)
   3. index: events
   4. private\_key\_base64: (é chave copiada e salva e convertida em base64)
   5. url: copie em Elasticsearch clicando em "copy endpoint"

<details>

<summary>Exemplo de JSON de Configuração</summary>

```json
{
   "is_active": true,
   "id": "copie o Cloud Id da implantação do seu Elastic Cloud",
   "index": "events",
   "private_key_base64": "CHAVE_BASE_64",
   "url": "copie clicando em Copy endpoint da implantação"
}

```

</details>

#### Configurando Templates

Configuramos templates para garantir maior legibilidade de determinados campos de data e hora, por exemplo. Os campos que asseguramos que o elastic deverá manipular como esperado basta realizar um PUT , conforme explicado abaixo:

```javascript
PUT INSTANCIA/_index_template/agnostic_template
{
  "index_patterns": ["events_*"],
  "template": {
    "mappings": {
      "properties": {
          "inserted_date": {
                "type": "date",
                "format": "strict_date_optional_time||epoch_second"
          },
          "start_session": {
              "type": "date",
              "format": "strict_date_optional_time||epoch_second"
          },        
          "last_origin_ts": {
              "type": "date",
              "format": "strict_date_optional_time||epoch_second"
          },        
          "utm_case": {
              "properties": {
                  "attr_dts_ts": {
                    "type": "date",
                    "format": "strict_date_optional_time||epoch_second"
                  }
              }
          },
          "device_geohash": {
            "type": "geo_point"
          },
          "complete_data": {
            "properties": {
              "save": {
                "type": "boolean"
              }
            }
          },
          "items": {
              "properties": {
                "item_id": {
                  "type": "text"
                },
                "id": {
                  "type": "text"
                }
              }
          },  
          "relative_view": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword"
              }
            }
          },
          "user_id": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }                   
      }
    }
  }
}

```

#### Configurando seu primeiro Data View Kibana

Para visualizar seus eventos de forma apropriada, crie seu primeiro Data View Kibana. Nesta etapa vamos informar ao Elastic/Kibana que o campo "timestamp" será o `inserted_date`.&#x20;

Outro ponto importante nesta configuração de Data View é agregrar todos os índices em uma única visão.&#x20;

{% hint style="info" %}
Cada evento gera um índice específico, por exemplo, um evento de `click` irá gerar o índice *`event_PROJECT_ID_click`*, ou um evento `checkout_done`irá gerar um índice com todos os eventos checkout\_done e&#x6D;*`event_PROJECT_ID_checkout_done`*.
{% endhint %}

**Criando o data view**

1. Acesse app/kibana\_overview#/ (<https://INSTANCIA/app/kibana\\_overview#>)
2. Em `name` preencha com "events\_all"
3. Em `pattern` preencha com "events\_PROJECT\_ID\_\*" (isso irá agregar todos os índice em uma visão)
4. Em `Timestamp` field escolha "inserted\_date"
5. Clique em "save data view to kibana"

**Pronto! Agora você já explorar os dados de eventos, obter insights e gerar dashboards!**

## **Firestore (Firebase)**

Para receber os eventos analytics em real-time no Firestore do Fireabse é simples! São necessários apenas 3 informações para integrar o Firestore como *`destination`*&#x64;o AgnosticData. São elas:

````json
```json
            "firestore": {
              "id": "nome_do_projeto_do_firebase",
              "client_email": "firebase-adminsdk-XXXXXX@nome_do_projeto_do_firebase.iam.gserviceaccount.com",
              "private_key_base64": "private_key_as_base64"
            }
```
````

Vamos ao trabalho!

1. **Primeiro crie o seu projeto no Firebase**

Acesse a console em <https://firebase.google.com/?hl=pt-br> e depois "Criar projeto"

<figure><img src="https://2995894881-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBD2WDS4DaY1QhGFZ1hqU%2Fuploads%2FuRJlCvCdjPSgSCLWlvrZ%2Fimage.png?alt=media&#x26;token=52f33b7a-3db4-4528-8b7f-1df2b9d8ad85" alt=""><figcaption></figcaption></figure>

2. **Ativação do Google Analytics (opcional)**

Não é necessário ativar o Google Analytics ao criar o projeto no Firebase para ser utilizado como *`destination`*. Ative-o apenas se souber exatamente o que estiver fazendo.&#x20;

{% hint style="info" %}
**Lembre-se:** Utilizando o AgnosticData não é necessário colocar o pixel Meta ou Google Analytics em seu site ou aplicativo. O próprio AgnosticData irá automaticamente enviar os dados coletados para esses destinos quando configurados.&#x20;
{% endhint %}

<figure><img src="https://2995894881-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBD2WDS4DaY1QhGFZ1hqU%2Fuploads%2Fdp69Q2lwFFEFolRk5Jo4%2Fimage.png?alt=media&#x26;token=5ad64a85-fc9a-45bc-a205-c27ca545a57e" alt=""><figcaption></figcaption></figure>

3. **Gerar a chave do projeto**

Após o projeto criado, vamos gerar a chave do projeto Firebase.&#x20;

Esta chave será futuramente inserida nas configurações do seu projeto no AgnosticData onde os eventos do seu escopo serão enviados em tempo-real (sem atrasos).  A partir desta integração você terá seus dados, completamente do seu lado, para insights e modelagem de algoritmos inteligentes.&#x20;

1. Navegue até "Configurações do Projeto"
2. Aba "Contas de Serviço"
3. Clique em "Gerar nova chave privada"
4. Um arquivo JSON será gerado, salve-o em local seguro.&#x20;

<figure><img src="https://2995894881-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBD2WDS4DaY1QhGFZ1hqU%2Fuploads%2FhSa9hDMMobrZ5tf6dCer%2Fimage.png?alt=media&#x26;token=5af33491-9c11-4555-9f21-c6237bf1d4a9" alt=""><figcaption></figcaption></figure>

4. **Recuperar atributos necessários.**

Após *download* do JSON, recupere os atributos "client\_email" e "project\_id" que serão utilizados como `client_email` e `id` nas configurações do AgnosticData, respectivamente.

5. **Converta o private\_key em base64**

Por fim, converta o atributo `private_key` em base64 e adicione em `private_key_base64`. Se necessário utilize o script abaixo, passando o caminho do arquivo JSON como parâmetro, para gerar essa chave sem erros.&#x20;

{% hint style="warning" %}
CUIDADO! Não utilize sites públicos (conversores online) para converter a chave privada em base 64. Faça você mesmo!
{% endhint %}

```javascript
// recebe um caminho de entrada da chave de service account como uma chave JSON
// retira o campo "private_key" e converte para base64

const fs = require('fs');
const path = require('path');

const args = process.argv.slice(2);
const jsonPath = args[0];

const json = JSON.parse(fs.readFileSync(jsonPath, 'utf8'));
const privateKey = json.private_key;

const b64 = Buffer.from(privateKey).toString('base64');

console.log("\n", b64);
```

6. **Adicione ao AgnosticData**

Acesse a console, navegue até " Meus Destinos" e clique em **Firebase Firestore**.&#x20;

<figure><img src="https://2995894881-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBD2WDS4DaY1QhGFZ1hqU%2Fuploads%2FQykRDQz29mEGa8SpGVpy%2Fimage.png?alt=media&#x26;token=3cdc864c-dad3-4369-a904-feede9beeddf" alt=""><figcaption></figcaption></figure>

Em seguida, clique na aba "Configuração" e adicione os atributos recuperados nos passos 4 e 5.&#x20;

<figure><img src="https://2995894881-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBD2WDS4DaY1QhGFZ1hqU%2Fuploads%2FhoYsqHiag9DcV4ssEUo6%2Fimage.png?alt=media&#x26;token=8a2ee977-0384-45b9-9ed1-d0b5693132ba" alt=""><figcaption></figcaption></figure>

**🎉 Pronto! Agora você tem eventos anaytics em real-time completamente isolado 🔐 e em seu ambiente, sobre a gestão e a governança da sua empresa.**&#x20;
