Affiliate — Configuração
O que é um Affiliate?
Um affiliate na iFriend é uma agência de turismo afiliada que comercializa os serviços da iFriend.
Definição
- Affiliate = Agência: Uma agência de turismo que vende experiências, tours e serviços da iFriend
- Pode ter whitelabel: Nem todo affiliate possui whitelabel — é uma relação opcional
- Pode ter acesso ao agente: Affiliate com
whitelabel pode expor o agente iFriend sob seu próprio domínio
Relação entre conceitos
Affiliate (agência)
│
├── pode ter ──────► Whitelabel (domínio próprio)
│ │
│ └── pode expor ──► Agente iFriend
│ (viaEmbed ou API)
│
└── pode ter ──────► Markups de preço
(siteMarkupGuide, etc.)
Campos Reais do Affiliate
Baseado no código, um affiliate contém os seguintes campos:
Identificação
| Campo |
Tipo |
Descrição |
id |
int |
ID único do affiliate |
name |
str |
Nome da agência |
company |
str |
Nome da empresa (jurídico) |
Contato
| Campo |
Tipo |
Descrição |
phone |
str |
Telefone de contato |
emailComercial |
str |
Email comercial |
email |
str |
Email principal |
Endereço
| Campo |
Tipo |
Descrição |
address |
str |
Endereço linha 1 |
address2 |
str |
Endereço linha 2 |
city |
str |
Cidade |
state |
str |
Estado (UF) |
postcode |
str |
CEP |
neighborhood |
str |
Bairro |
Markups de Preço
| Campo |
Tipo |
Descrição |
siteMarkupGuide |
float |
Markup para guias (ex: 0.8 = 20% desconto) |
siteMarkupExperience |
float |
Markup para experiências |
siteMarkupTicket |
float |
Markup para ingressos |
siteMarkupTransfer |
float |
Markup para transfers |
siteMarkupPackage |
float |
Markup para pacotes |
Branding (Emails)
| Campo |
Tipo |
Descrição |
logoUrl |
str |
URL do logo para emails |
Operador (para API)
| Campo |
Tipo |
Descrição |
operatorMarkupGuide |
float |
Markup operacional guias |
operatorMarkupExperience |
float |
Markup operacional experiências |
operatorMarkupTicket |
float |
Markup operacional tickets |
operatorMarkupTransfer |
float |
Markup operacional transfers |
operatorMarkupPackage |
float |
Markup operacional pacotes |
Como é identificado
Método 1: Via JWT do usuário
# GET /affiliates?platformUser.user.userEmail={email}
affiliates = await client.get("/affiliates", {
"platformUser.user.userEmail": user_email,
"fields": ["id", "name", "siteMarkupExperience"]
})
affiliate = affiliates[0] if affiliates else None
Método 2: Via partner_code no JWT
# JWT contém custom_claims.partner_code
partner_code = jwt_context.get("custom_claims", {}).get("partner_code")
affiliates = await client.get("/affiliates", {
"partner_code": partner_code,
"fields": ["id", "name", "logoUrl"]
})
# SDK JS envia no metadata
affiliate_id = message_metadata.get("affiliate_id")
# Carrega config do affiliate para root_agent
affiliate_config = await AgentBuilder.load_affiliate_config(affiliate_id)
# GET /affiliates/{id}/root_agent
Fluxo de Identificação
1. Usuário faz request com JWT
│
2. Callback injeta affiliate no state
│ (via platformUser.user.userEmail)
│
3. Tools buscam dados do affiliate
│ (markup, logo, contato)
│
4. Resposta customizada
│ - Preço com markup
│ - Email com logo da agência
│ - WhatsApp da agência
Uso nos Módulos
1. precificação (markup de preço)
# ifriend_agent/tools/context/enrich_products.py
markup = _get_context_product_markup(affiliate, product)
if markup:
price = price_net / markup # Aplica markup
2. Emails (branding)
# ifriend_agent/tools/enviar_email_sendgrid_tool.py
logo_url = affiliate.get("logoUrl")
email = affiliate.get("emailComercial")
phone = affiliate.get("phone")
# Template usa logo do affiliate se disponível
3. Suporte (WhatsApp)
# ifriend_agent/tools/gerar_formulario_suporte_tool.py
affiliate_id = whitelabel.get("affiliate", {}).get("id")
affiliate = whitelabel.get("affiliate", {})
whatsapp = _resolve_contact_whatsapp() or affiliate.get("phone")
Configuração de Whitelabel (Opcional)
Um affiliate pode ter um whitelabel associado:
{
"id": 123,
"domain": "agencia.example.com",
"Affiliate": {
"id": 456,
"name": " Agência Exemplo",
"phone": "+5511999999999"
}
}
Neste caso:
- O whitelabel usa o affiliate para contato
- O WhatsApp de suporte vem do affiliate
- O dominio é exposed sob a marca do affiliate
Variáveis de Ambiente
| Variável |
Descrição |
ENABLE_WHITELABEL |
Habilita detecção por domínio |
WHITELABEL_DOMAINS |
Domínios permitidos (JSON) |
API Reference
Listar Affiliates
Buscar por Email
GET /affiliates?platformUser.user.userEmail=email@agencia.com&fields[]=id&fields[]=name
Buscar por ID
Buscar Configuração Root Agent
GET /affiliates/{id}/root_agent
Diferença: Affiliate vs Whitelabel
| Aspecto |
Affiliate |
Whitelabel |
| O que é |
Agência |
Domínio próprio |
| Relação |
Entidade principal |
Personalização do affiliate |
| Sempre existe |
Sim |
Opcional |
| Exibe agente |
Não |
Sim (se habilitado) |
| Domínio |
iFriend (theifriend.com) |
Próprio (agencia.com) |
Resumo
- Affiliate = agência com dados (nome, contato, markups, logo)
- Whitelabel = customização visual (domínio, cores, logo) atrelada ao affiliate
- Identificação = via JWT (user email ou partner_code) ou message_metadata (affiliate_id)