SlideShare uma empresa Scribd logo
1 de 91
O sistema genérico de perguntas
do Nubank
Luiz Dubas @luizdubas
Agenda
• Acquisition
• Idéia para o novo acquisition
• Implementação do novo acquisition
Acquisition
“Nu Minimal Keynote Template” © Nu Bank - 05.01.2014
• Porta de entrada para o Nubank
• Captura de documentos e
informações do cliente
Acquisition
Acquisition
24 a 37 telas
Acquisition
• CPF
• Senha
• Aviso de conta
criada
• RG
• Emissor do RG
• Estado civil
• Celular
• Permissão de
localização
• CEP
• Endereço
• Bairro
• Cidade
• Estado
• Permissão de
câmera
• Docs Front
• Docs Back
• Selfie
• Renda
• Limte
• Vencimento
• PIN
• Assinatura
• Contrato
• Data de nascimento
Acquisition
• CPF
• Senha
• Aviso de conta
criada
• RG
• Emissor do RG
• Estado civil
• Celular
• Permissão de
localização
• CEP
• Endereço
• Bairro
• Cidade
• Estado
• Permissão de
câmera
• Docs Front
• Docs Back
• Selfie
• Renda
• Limite
• Vencimento
• PIN
• Assinatura
• Contrato
• Data de nascimento
O que eles tem em comum?
Acquisition
• CPF
• Senha
• Aviso de conta
criada
• RG
• Emissor do RG
• Estado civil
• Celular
• Permissão de
localização
• CEP
• Endereço
• Bairro
• Cidade
• Estado
• Permissão de
câmera
• Docs Front
• Docs Back
• Selfie
• Renda
• Limite
• Vencimento
• PIN
• Assinatura
• Contrato
• Data de nascimento
Todas são telas de pergunta e resposta
Acquisition
• CPF
• Senha
• Aviso de conta
criada
• RG
• Emissor do RG
• Estado civil
• Celular
• Permissão de
localização
• CEP
• Endereço
• Bairro
• Cidade
• Estado
• Permissão de
câmera
• Docs Front
• Docs Back
• Selfie
• Renda
• Limite
• Vencimento
• PIN
• Assinatura
• Contrato
• Data de nascimento
E se não precisássemos mais de todas
essas perguntas?
Acquisition
• CPF
• Senha
• RG
• Emissor do RG
• Estado civil
• Celular
• CEP
• Endereço
• Bairro
• Cidade
• Estado
• Docs Front
• Docs Back
• Selfie
• Limite
• Vencimento
• PIN
• Contrato
• Data de nascimento
E se não precisássemos mais de todas
essas perguntas?
Acquisition
• CPF
• Senha
• RG
• Emissor do RG
• Estado civil
• Celular
• CEP
• Endereço
• Bairro
• Cidade
• Estado
• Docs Front
• Docs Back
• Selfie
• Limite
• Vencimento
• PIN
• Contrato
• Data de nascimento
Qualquer mudança tem que gerar
uma nova versão do app
Solução desejada
Fazer com que o backend saiba disso
Solução desejada
• Lógica centralizada
• Não precisaria atualizar o app a cada
mudança
• Fácil de adicionar/remover perguntas
• Mais fácil de se fazer testes A/B e
personalizar por cliente
Novo Acquisition
Novo Acquisition
SenhaCPFRead Only
Chunk
Step Step Step
Novo Acquisition
SenhaCPFRead Only
Chunk
Step Step Step
Novo Acquisition
Process
Answers
Chunk
Step Step Step
Novo Acquisition
New Chunk
Novo Acquisition
• O que é um step
• Como que ele vai navegar entre steps
e mandar as informações
• O que acontece se o app não
conhecer um step
Steps
Step
• Representa um pedaço do fluxo
• Pode ser uma pergunta ou um
anúncio
• Pode ter uma resposta
Tipos de Step
• Somente leitura
• Texto
• Escolha única
• Não tem resposta
Tipos de Step
• Somente leitura
• Texto
• Escolha única
• Não tem resposta
• Normalmente usado
para avisos
Tipos de Step
• Somente leitura
• Texto
• Escolha única • Pode ser usado para
fazer bifurcações
• Não tem resposta
• Normalmente usado
para avisos
Tipos de Step
• Somente leitura
• Texto
• Escolha única
• Pode conformar com
diferentes máscaras
Tipos de Step
• Somente leitura
• Texto
• Escolha única
• Pode conformar com
diferentes máscaras


• Pode ter mais de um
texto na tela
Tipos de Step
• Somente leitura
• Texto
• Escolha única
• Pode conformar com
diferentes máscaras


• Pode ter mais de um
texto na tela




• Tem diferentes
validações
Tipos de Step
• Somente leitura
• Texto
• Escolha única • Pode ser usado para
fazer bifurcações
Tipos de Step
• Somente leitura
• Texto
• Escolha única • Pode ser usado para
fazer bifurcações


• Pode ser apresentado
como uma matriz
Step
• Representa um pedaço do fluxo
• Pode ser uma pergunta ou um
anúncio
• Pode ter uma resposta
• É representado por um JSON
Step
{






}
"title": "<p>Para começar vamos precisar do seu
<em><strong>RG</strong></em>. Ok?</p>",
"input_configurations": [
{
"input_type": "text",
"hint": "<small><detail>Caso você não tenha um RG,
insira o número do seu RNE.</detail></small>",
"id": "document",
"required": true,
"validation_message": "<small><b>RG inválido.
nDigite novamente.</b></small>"
}
],
"forward_action": {
"redirect": {
"id": "document->document-uf",
"type": "step",
"value": "acq-flow.steps/document-uf"
}
},
"required": true
"type": "input",
"id": "acq-flow.steps/document",
Step
{






}
"title": "<p>Para começar vamos precisar do seu
<em><strong>RG</strong></em>. Ok?</p>",
"input_configurations": [
{
"input_type": "text",
"hint": "<small><detail>Caso você não tenha um RG,
insira o número do seu RNE.</detail></small>",
"id": "document",
"required": true,
"validation_message": "<small><b>RG inválido.
nDigite novamente.</b></small>"
}
],
"forward_action": {
"redirect": {
"id": "document->document-uf",
"type": "step",
"value": "acq-flow.steps/document-uf"
}
},
"required": true
"type": "input",
"id": "acq-flow.steps/document",
Step
{






}
"title": "<p>Para começar vamos precisar do seu
<em><strong>RG</strong></em>. Ok?</p>",
"input_configurations": [
{
"input_type": "text",
"hint": "<small><detail>Caso você não tenha um RG,
insira o número do seu RNE.</detail></small>",
"id": "document",
"required": true,
"validation_message": "<small><b>RG inválido.
nDigite novamente.</b></small>"
}
],
"forward_action": {
"redirect": {
"id": "document->document-uf",
"type": "step",
"value": "acq-flow.steps/document-uf"
}
},
"required": true
"type": "input",
"id": "acq-flow.steps/document",
Step
{






}
"title": "<p>Para começar vamos precisar do seu
<em><strong>RG</strong></em>. Ok?</p>",
"input_configurations": [
{
"input_type": "text",
"hint": "<small><detail>Caso você não tenha um RG,
insira o número do seu RNE.</detail></small>",
"id": "document",
"required": true,
"validation_message": "<small><b>RG inválido.
nDigite novamente.</b></small>"
}
],
"forward_action": {
"redirect": {
"id": "document->document-uf",
"type": "step",
"value": "acq-flow.steps/document-uf"
}
},
"required": true
"type": "input",
"id": "acq-flow.steps/document",
Step
{






}
"title": "<p>Para começar vamos precisar do seu
<em><strong>RG</strong></em>. Ok?</p>",
"input_configurations": [
{
"input_type": "text",
"hint": "<small><detail>Caso você não tenha um RG,
insira o número do seu RNE.</detail></small>",
"id": "document",
"required": true,
"validation_message": "<small><b>RG inválido.
nDigite novamente.</b></small>"
}
],
"forward_action": {
"redirect": {
"id": "document->document-uf",
"type": "step",
"value": "acq-flow.steps/document-uf"
}
},
"required": true
"type": "input",
"id": "acq-flow.steps/document",
Step
{






}
"title": "<p>Para começar vamos precisar do seu
<em><strong>RG</strong></em>. Ok?</p>",
"input_configurations": [
{
"input_type": "text",
"hint": "<small><detail>Caso você não tenha um RG,
insira o número do seu RNE.</detail></small>",
"id": "document",
"required": true,
"validation_message": "<small><b>RG inválido.
nDigite novamente.</b></small>"
}
],
"forward_action": {
"redirect": {
"id": "document->document-uf",
"type": "step",
"value": "acq-flow.steps/document-uf"
}
},
"required": true
"type": "input",
"id": "acq-flow.steps/document",
Step
{






}
"title": "<p>Para começar vamos precisar do seu
<em><strong>RG</strong></em>. Ok?</p>",
"input_configurations": [
{
"input_type": "text",
"hint": "<small><detail>Caso você não tenha um RG,
insira o número do seu RNE.</detail></small>",
"id": "document",
"required": true,
"validation_message": "<small><b>RG inválido.
nDigite novamente.</b></small>"
}
],
"forward_action": {
"redirect": {
"id": "document->document-uf",
"type": "step",
"value": "acq-flow.steps/document-uf"
}
},
"required": true
"type": "input",
"id": "acq-flow.steps/document",
Step
{






}
"title": "<p>Para começar vamos precisar do
seu <em><strong>RG</strong></em>. Ok?</p>",
"input_configurations": [
{
"input_type": "text",
"hint": "<small><detail>Caso você não tenha um RG,
insira o número do seu RNE.</detail></small>",
"id": "document",
"required": true,
"validation_message": "<small><b>RG inválido.
nDigite novamente.</b></small>"
}
],
"forward_action": {
"redirect": {
"id": "document->document-uf",
"type": "step",
"value": "acq-flow.steps/document-uf"
}
},
"required": true
"type": "input",
"id": "acq-flow.steps/document",
Scroll
Step
{






}
"title": "<p>Para começar vamos precisar do
seu <em><strong>RG</strong></em>. Ok?</p>",
"input_configurations": [
{
"input_type": "text",
"hint": "<small><detail>Caso você não tenha um RG,
insira o número do seu RNE.</detail></small>",
"id": "document",
"required": true,
"validation_message": "<small><b>RG inválido.
nDigite novamente.</b></small>"
}
],
"forward_action": {
"redirect": {
"id": "document->document-uf",
"type": "step",
"value": "acq-flow.steps/document-uf"
}
},
"required": true
"type": "input",
"id": "acq-flow.steps/document",Stack
Step
{






}
"title": "<p>Para começar vamos precisar do
seu <em><strong>RG</strong></em>. Ok?</p>",
"input_configurations": [
{
"input_type": "text",
"hint": "<small><detail>Caso você não tenha um RG,
insira o número do seu RNE.</detail></small>",
"id": "document",
"required": true,
"validation_message": "<small><b>RG inválido.
nDigite novamente.</b></small>"
}
],
"forward_action": {
"redirect": {
"id": "document->document-uf",
"type": "step",
"value": "acq-flow.steps/document-uf"
}
},
"required": true
"type": "input",
"id": "acq-flow.steps/document",Label
Step
{






}
"title": "<p>Para começar vamos precisar do seu
<em><strong>RG</strong></em>. Ok?</p>",
"input_configurations": [
{
"input_type": "text",
"hint": "<small><detail>Caso você não tenha um RG,
insira o número do seu RNE.</detail></small>",
"id": "document",
"required": true,
"validation_message": "<small><b>RG inválido.
nDigite novamente.</b></small>"
}
],
"forward_action": {
"redirect": {
"id": "document->document-uf",
"type": "step",
"value": "acq-flow.steps/document-uf"
}
},
"required": true
"type": "input",
"id": "acq-flow.steps/document",
Step
{






}
"title": "<p>Para começar vamos precisar do seu
<em><strong>RG</strong></em>. Ok?</p>",
"input_configurations": [
{
"input_type": "text",
"hint": "<small><detail>Caso você não
tenha um RG, insira o número do seu RNE.</
detail></small>",
"id": "document",
"required": true,
"validation_message": "<small><b>RG
inválido.nDigite novamente.</b></small>"
}
],
"forward_action": {
"redirect": {
"id": "document->document-uf",
"type": "step",
"value": "acq-flow.steps/document-uf"
}
},
"required": true
"type": "input",
"id": "acq-flow.steps/document",
Step
{






}
"title": "<p>Para começar vamos precisar do seu
<em><strong>RG</strong></em>. Ok?</p>",
"input_configurations": [
{
"input_type": "text",
"hint": "<small><detail>Caso você não
tenha um RG, insira o número do seu RNE.</
detail></small>",
"id": "document",
"required": true,
"validation_message": "<small><b>RG
inválido.nDigite novamente.</b></small>"
}
],
"forward_action": {
"redirect": {
"id": "document->document-uf",
"type": "step",
"value": "acq-flow.steps/document-uf"
}
},
"required": true
"type": "input",
"id": "acq-flow.steps/document",
Stack (Content)
Step
{






}
"title": "<p>Para começar vamos precisar do seu
<em><strong>RG</strong></em>. Ok?</p>",
"input_configurations": [
{
"input_type": "text",
"hint": "<small><detail>Caso você não
tenha um RG, insira o número do seu RNE.</
detail></small>",
"id": "document",
"required": true,
"validation_message": "<small><b>RG
inválido.nDigite novamente.</b></small>"
}
],
"forward_action": {
"redirect": {
"id": "document->document-uf",
"type": "step",
"value": "acq-flow.steps/document-uf"
}
},
"required": true
"type": "input",
"id": "acq-flow.steps/document",
TextField
Step
{






}
"title": "<p>Para começar vamos precisar do seu
<em><strong>RG</strong></em>. Ok?</p>",
"input_configurations": [
{
"input_type": "text",
"hint": "<small><detail>Caso você não
tenha um RG, insira o número do seu RNE.</
detail></small>",
"id": "document",
"required": true,
"validation_message": "<small><b>RG
inválido.nDigite novamente.</b></small>"
}
],
"forward_action": {
"redirect": {
"id": "document->document-uf",
"type": "step",
"value": "acq-flow.steps/document-uf"
}
},
"required": true
"type": "input",
"id": "acq-flow.steps/document",
Label
Step
{






}
"title": "<p>Para começar vamos precisar do seu
<em><strong>RG</strong></em>. Ok?</p>",
"input_configurations": [
{
"input_type": "text",
"hint": "<small><detail>Caso você não
tenha um RG, insira o número do seu RNE.</
detail></small>",
"id": "document",
"required": true,
"validation_message": "<small><b>RG
inválido.nDigite novamente.</b></small>"
}
],
"forward_action": {
"redirect": {
"id": "document->document-uf",
"type": "step",
"value": "acq-flow.steps/document-uf"
}
},
"required": true
"type": "input",
"id": "acq-flow.steps/document",
Step
{






}
"title": "<p>Para começar vamos precisar do seu
<em><strong>RG</strong></em>. Ok?</p>",
"input_configurations": [
{
"input_type": "text",
"hint": "<small><detail>Caso você não tenha um RG,
insira o número do seu RNE.</detail></small>",
"id": "document",
"required": true,
"validation_message": "<small><b>RG inválido.
nDigite novamente.</b></small>"
}
],
"forward_action": {
"redirect": {
"id": "document->document-uf",
"type": "step",
"value": "acq-flow.steps/document-uf"
}
},"required": true
"type": "input",
"id": "acq-flow.steps/document",
Stack
Step
{






}
"title": "<p>Para começar vamos precisar do seu
<em><strong>RG</strong></em>. Ok?</p>",
"input_configurations": [
{
"input_type": "text",
"hint": "<small><detail>Caso você não tenha um RG,
insira o número do seu RNE.</detail></small>",
"id": "document",
"required": true,
"validation_message": "<small><b>RG inválido.
nDigite novamente.</b></small>"
}
],
"forward_action": {
"redirect": {
"id": "document->document-uf",
"type": "step",
"value": "acq-flow.steps/document-uf"
}
},"required": true
"type": "input",
"id": "acq-flow.steps/document",
Button
Step
{






}
"title": "<p>Para começar vamos precisar do seu
<em><strong>RG</strong></em>. Ok?</p>",
"input_configurations": [
{
"input_type": "text",
"hint": "<small><detail>Caso você não tenha um RG,
insira o número do seu RNE.</detail></small>",
"id": "document",
"required": true,
"validation_message": "<small><b>RG inválido.
nDigite novamente.</b></small>"
}
],
"forward_action": {
"redirect": {
"id": "document->document-uf",
"type": "step",
"value": "acq-flow.steps/document-uf"
}
},
"required": true
"type": "input",
"id": "acq-flow.steps/document",
Step
{






}
"title": "<p>Para começar vamos precisar do seu
<em><strong>RG</strong></em>. Ok?</p>",
"input_configurations": [
{
"input_type": "text",
"hint": "<small><detail>Caso você não tenha um RG,
insira o número do seu RNE.</detail></small>",
"id": "document",
"required": true,
"validation_message": "<small><b>RG inválido.
nDigite novamente.</b></small>"
}
],
"forward_action": {
"redirect": {
"id": "document->document-uf",
"type": "step",
"value": "acq-flow.steps/document-uf"
}
},
"required": true
"type": "input",
"id": "acq-flow.steps/document",
Step
{






}
"title": "<p>Para começar vamos precisar do seu
<em><strong>RG</strong></em>. Ok?</p>",
"input_configurations": [
{
"input_type": "text",
"hint": "<small><detail>Caso você não tenha um RG,
insira o número do seu RNE.</detail></small>",
"id": "document",
"required": true,
"validation_message": "<small><b>RG inválido.
nDigite novamente.</b></small>"
}
],
"forward_action": {
"redirect": {
"id": "document->document-uf",
"type": "step",
"value": "acq-flow.steps/document-uf"
}
},
"required": true
"type": "input",
"id": "acq-flow.steps/document",
Step
{
"id": "acq-flow.steps/credentials-created",
"type": "read_only",
"title": "<h2><em><strong>Luiz, sua conta está criada!</strong></
em>nAgora vamos continuar com o pedido do cartão.</h2>",
"hint": "<small>Vamos precisar dos seus dados e de fotos do seu
documento, então tenha em mãos seu RG, CNG ou RNE. Infelizmente não
podemos aceitar passaportes ou carteiras de trabalho.</small>",
"actions": [
{
"button_type": "primary",
"text": "<label><em>VAMOS LÁ</em></label>",
"redirect": {
"id": "credentials-created->document",
"type": "step",
"value": "acq-flow.steps/document"
},
"type": "button"
},
{
"button_type": "text",
"text": "<small><em>Prefere ser chamado de <a>outro nome?</a></
em></small>",
"redirect": {
"id": "credentials-created->preferred-name",
"type": "step",
"value": "acq-flow.steps/preferred-name"
},
"type": "button"
}
]
}
Step
{
"id": "acq-flow.steps/credentials-created",
"type": "read_only",
"title": "<h2><em><strong>Luiz, sua conta está criada!</strong></
em>nAgora vamos continuar com o pedido do cartão.</h2>",
"hint": "<small>Vamos precisar dos seus dados e de fotos do seu
documento, então tenha em mãos seu RG, CNG ou RNE. Infelizmente não
podemos aceitar passaportes ou carteiras de trabalho.</small>",
"actions": [
{
"button_type": "primary",
"text": "<label><em>VAMOS LÁ</em></label>",
"redirect": {
"id": "credentials-created->document",
"type": "step",
"value": "acq-flow.steps/document"
},
"type": "button"
},
{
"button_type": "text",
"text": "<small><em>Prefere ser chamado de <a>outro nome?</a></
em></small>",
"redirect": {
"id": "credentials-created->preferred-name",
"type": "step",
"value": "acq-flow.steps/preferred-name"
},
"type": "button"
}
]
}
Title
Hint
Step
{
"id": "acq-flow.steps/credentials-created",
"type": "read_only",
"title": "<h2><em><strong>Luiz, sua conta está criada!</strong></
em>nAgora vamos continuar com o pedido do cartão.</h2>",
"hint": "<small>Vamos precisar dos seus dados e de fotos do seu
documento, então tenha em mãos seu RG, CNG ou RNE. Infelizmente não
podemos aceitar passaportes ou carteiras de trabalho.</small>",
"actions": [
{
"button_type": "primary",
"text": "<label><em>VAMOS LÁ</em></label>",
"redirect": {
"id": "credentials-created->document",
"type": "step",
"value": "acq-flow.steps/document"
},
"type": "button"
},
{
"button_type": "text",
"text": "<small><em>Prefere ser chamado de <a>outro nome?</a></
em></small>",
"redirect": {
"id": "credentials-created->preferred-name",
"type": "step",
"value": "acq-flow.steps/preferred-name"
},
"type": "button"
}
]
}
Step
{
"id": "acq-flow.steps/credentials-created",
"type": "read_only",
"title": "<h2><em><strong>Luiz, sua conta está criada!</strong></
em>nAgora vamos continuar com o pedido do cartão.</h2>",
"hint": "<small>Vamos precisar dos seus dados e de fotos do seu
documento, então tenha em mãos seu RG, CNG ou RNE. Infelizmente não
podemos aceitar passaportes ou carteiras de trabalho.</small>",
"actions": [
{
"button_type": "primary",
"text": "<label><em>VAMOS LÁ</em></label>",
"redirect": {
"id": "credentials-created->document",
"type": "step",
"value": "acq-flow.steps/document"
},
"type": "button"
},
{
"button_type": "text",
"text": "<small><em>Prefere ser chamado de <a>outro nome?</a></
em></small>",
"redirect": {
"id": "credentials-created->preferred-name",
"type": "step",
"value": "acq-flow.steps/preferred-name"
},
"type": "button"
}
]
}
Button
Step
Button
{
"id": "acq-flow.steps/credentials-created",
"type": "read_only",
"title": "<h2><em><strong>Luiz, sua conta está criada!</strong></
em>nAgora vamos continuar com o pedido do cartão.</h2>",
"hint": "<small>Vamos precisar dos seus dados e de fotos do seu
documento, então tenha em mãos seu RG, CNG ou RNE. Infelizmente não
podemos aceitar passaportes ou carteiras de trabalho.</small>",
"actions": [
{
"button_type": "primary",
"text": "<label><em>VAMOS LÁ</em></label>",
"redirect": {
"id": "credentials-created->document",
"type": "step",
"value": "acq-flow.steps/document"
},
"type": "button"
},
{
"button_type": "text",
"text": "<small><em>Prefere ser chamado de <a>outro nome?</a></
em></small>",
"redirect": {
"id": "credentials-created->preferred-name",
"type": "step",
"value": "acq-flow.steps/preferred-name"
},
"type": "button"
}
]
}
Step
Novo Acquisition
• O que é um step
• Como que ele vai navegar entre steps
e mandar as informações
• O que acontece se o app não
conhecer um step
Redirects e Instant Redirects
Redirect
• São eventos que podem ser enviados
pelo servidor ou executados durante
o fluxo
• Podem ser eventos síncronos ou
assíncronos
Tipos de Redirect
• Mudar de step (step)
• Criar chunk (chunk) *
• Mandar respostas (submit_response) *
• Terminar fluxo (end_flow)
Lifecycle
CoordinatorApp
URL do fluxo
Lifecycle
Coordinator
GET
Lifecycle
Coordinator
Redirect
{
"instant_redirect": {
"id": "create-chunk",
"type": "chunk",
"value": "https://create-chunk"
}
}
Lifecycle
Coordinator
{
"instant_redirect": {
"id": "create-chunk",
"type": "chunk",
"value": "https://create-chunk"
}
}
Redirect
Lifecycle
Coordinator
POST
{
"instant_redirect": {
"id": "create-chunk",
"type": "chunk",
"value": "https://create-chunk"
}
}
Lifecycle
Coordinator
Chunk
{
"id": "58deb6f6-0938-434c-94a8-eeffdd389406",
"dismissable": false,
"first_step": "acq-flow.steps/document",
"steps": [ ... ]
}
Lifecycle
Coordinator
{
"id": "58deb6f6-0938-434c-94a8-eeffdd389406",
"dismissable": false,
"first_step": "acq-flow.steps/document",
"steps": [ ... ]
}
Lifecycle
Coordinator
{
"id": "58deb6f6-0938-434c-94a8-eeffdd389406",
"dismissable": false,
"first_step": "acq-flow.steps/document",
"steps": [ ... ]
}
Lifecycle
Coordinator
{
"type": "input",
"title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>.
Ok?</p>",
"id": "acq-flow.steps/document",
"input_configurations": [
{
"input_type": "text",
"hint": "<small><detail>Caso você não tenha um RG, insira o número do seu
RNE.</detail></small>",
"id": "document",
"required": true,
"validation_message": "<small><b>RG inválido.nDigite novamente.</b></
small>"
}
],
"forward_action": {
"redirect": {
"id": "document->document-uf",
"type": "step",
"value": "acq-flow.steps/document-uf"
}
},
"required": true
}
Lifecycle
Coordinator
{
"type": "input",
"title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>.
Ok?</p>",
"id": "acq-flow.steps/document",
"input_configurations": [
{
"input_type": "text",
"hint": "<small><detail>Caso você não tenha um RG, insira o número do seu
RNE.</detail></small>",
"id": "document",
"required": true,
"validation_message": "<small><b>RG inválido.nDigite novamente.</b></
small>"
}
],
"forward_action": {
"redirect": {
"id": "document->document-uf",
"type": "step",
"value": "acq-flow.steps/document-uf"
}
},
"required": true
}
QuestionController
Step
Lifecycle
Coordinator
QuestionController
Step
{
"type": "input",
"title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>.
Ok?</p>",
"id": "acq-flow.steps/document",
"input_configurations": [
{
"input_type": "text",
"hint": "<small><detail>Caso você não tenha um RG, insira o número do seu
RNE.</detail></small>",
"id": "document",
"required": true,
"validation_message": "<small><b>RG inválido.nDigite novamente.</b></
small>"
}
],
"forward_action": {
"redirect": {
"id": "document->document-uf",
"type": "step",
"value": "acq-flow.steps/document-uf"
}
},
"required": true
}
Lifecycle
Coordinator
QuestionController
Step
{
"type": "input",
"title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>.
Ok?</p>",
"id": "acq-flow.steps/document",
"input_configurations": [
{
"input_type": "text",
"hint": "<small><detail>Caso você não tenha um RG, insira o número do seu
RNE.</detail></small>",
"id": "document",
"required": true,
"validation_message": "<small><b>RG inválido.nDigite novamente.</b></
small>"
}
],
"forward_action": {
"redirect": {
"id": "document->document-uf",
"type": "step",
"value": "acq-flow.steps/document-uf"
}
},
"required": true
}
Lifecycle
Coordinator
QuestionController
Step
{
"type": "input",
"title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>.
Ok?</p>",
"id": "acq-flow.steps/document",
"input_configurations": [
{
"input_type": "text",
"hint": "<small><detail>Caso você não tenha um RG, insira o número do seu
RNE.</detail></small>",
"id": "document",
"required": true,
"validation_message": "<small><b>RG inválido.nDigite novamente.</b></
small>"
}
],
"forward_action": {
"redirect": {
"id": "document->document-uf",
"type": "step",
"value": "acq-flow.steps/document-uf"
}
},
"required": true
}
Redirect and response
Lifecycle
Coordinator
QuestionController
Step
{
"type": "input",
"title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>.
Ok?</p>",
"id": "acq-flow.steps/document",
"input_configurations": [
{
"input_type": "text",
"hint": "<small><detail>Caso você não tenha um RG, insira o número do seu
RNE.</detail></small>",
"id": "document",
"required": true,
"validation_message": "<small><b>RG inválido.nDigite novamente.</b></
small>"
}
],
"forward_action": {
"redirect": {
"id": "document->document-uf",
"type": "step",
"value": "acq-flow.steps/document-uf"
}
},
"required": true
}
[

{ 

“id”: “acq-flow.steps/document”,

“response”: “12345678900”

}

]
Redirect and response
Lifecycle
Coordinator
{
"id": "58deb6f6-0938-434c-94a8-eeffdd389406",
"dismissable": false,
"first_step": "acq-flow.steps/document",
"steps": [ ... ]
}
Lifecycle
Coordinator
QuestionController
Step
{
"id": "acq-flow.steps/document-uf",
"title": "<p>E qual o <strong><em>estado</em></strong> de
emissão do seu RG?</p>",
"type": "list_choice",
"forward_action": {
"redirect": {
"id": "sync-with-backend",
"type": "submit_response",
"value": "https://submit_response"
}
},
"values": [ ... ],
"required": true
}
Lifecycle
Coordinator
QuestionController
Step Redirect and response
{
"id": "acq-flow.steps/document-uf",
"title": "<p>E qual o <strong><em>estado</em></strong> de
emissão do seu RG?</p>",
"type": "list_choice",
"forward_action": {
"redirect": {
"id": "sync-with-backend",
"type": "submit_response",
"value": "https://submit_response"
}
},
"values": [ ... ],
"required": true
}
Lifecycle
Coordinator
QuestionController
Step
[

{ 

“id”: “acq-flow.steps/document”,

“response”: “12345678900”

},

{

“id”: “acq-flow.steps/document-uf”,

“response”: “SP”

}

]
{
"id": "acq-flow.steps/document-uf",
"title": "<p>E qual o <strong><em>estado</em></strong> de
emissão do seu RG?</p>",
"type": "list_choice",
"forward_action": {
"redirect": {
"id": "sync-with-backend",
"type": "submit_response",
"value": "https://submit_response"
}
},
"values": [ ... ],
"required": true
}
Redirect and response
Lifecycle
Coordinator
QuestionController
Step
POST
Answers
{
"id": "acq-flow.steps/document-uf",
"title": "<p>E qual o <strong><em>estado</em></strong> de
emissão do seu RG?</p>",
"type": "list_choice",
"forward_action": {
"redirect": {
"id": "sync-with-backend",
"type": "submit_response",
"value": "https://submit_response"
}
},
"values": [ ... ],
"required": true
}
Redirect and response
Lifecycle
Coordinator
POST Process
Answers
Lifecycle
Coordinator
{
"instant_redirect": {
"id": "end-flow",
"type": "end_flow"
}
}
Redirect
Lifecycle
Coordinator
{
"instant_redirect": {
"id": "end-flow",
"type": "end_flow"
}
}
Redirect
Novo Acquisition
• O que é um step
• Como que ele vai navegar entre steps
e mandar as informações
• O que acontece se o app não
conhecer um step
Novo Acquisition
Steps conhecidos Novo step
Lifecycle
Coordinator
POST
{
"instant_redirect": {
"id": "create-chunk",
"type": "chunk",
"value": "https://create-chunk"
}
}
Lifecycle
Coordinator
POST
{
"instant_redirect": {
"id": "create-chunk",
"type": "chunk",
"value": "https://create-chunk"
}
}
[ “input”, “read_only“ ]
Novo Acquisition
• O servidor é responsável por garantir
a retrocompatibilidade
• Sempre que criarem um novo tipo de
step temos que gerar um nova versão
Novo Acquisition
• O que é um step
• Como que ele vai navegar entre steps
e mandar as informações
• O que acontece se o app não
conhecer um step
Casos de uso
• Atualização cadastral
• Atualizar renda mensal
• Contestação de compra
Obrigado!
https://nubank.workable.com/

Mais conteúdo relacionado

Semelhante a Sistema genérico de perguntas do Nubank

Workshop Hands-On APIX 2018 - Trilha Básica
Workshop Hands-On APIX 2018 - Trilha BásicaWorkshop Hands-On APIX 2018 - Trilha Básica
Workshop Hands-On APIX 2018 - Trilha BásicaSensedia
 
REQepay - Virtual Pago Plano de Negócio
REQepay - Virtual Pago Plano de NegócioREQepay - Virtual Pago Plano de Negócio
REQepay - Virtual Pago Plano de NegócioCLUBE CRÉDITOS
 
Big Solutions - Black Friday | 3DS e Antifraude, ferramentas indispensáveis p...
Big Solutions - Black Friday | 3DS e Antifraude, ferramentas indispensáveis p...Big Solutions - Black Friday | 3DS e Antifraude, ferramentas indispensáveis p...
Big Solutions - Black Friday | 3DS e Antifraude, ferramentas indispensáveis p...E-Commerce Brasil
 
Web Analytics e o Google Analytics - uma visão geral (Português - Brasil)
Web Analytics e o Google Analytics - uma visão geral (Português - Brasil)Web Analytics e o Google Analytics - uma visão geral (Português - Brasil)
Web Analytics e o Google Analytics - uma visão geral (Português - Brasil)Rodrigo Rubio
 
[GetNinjas] Business Intelligence Workshop @ Google Campus SP
[GetNinjas] Business Intelligence Workshop @ Google Campus SP[GetNinjas] Business Intelligence Workshop @ Google Campus SP
[GetNinjas] Business Intelligence Workshop @ Google Campus SPBernardo Srulzon
 
"Como aumentar conversão das vendas com autorizações" - Por Rodrigo Stoqui
"Como aumentar conversão das vendas com autorizações" - Por Rodrigo Stoqui"Como aumentar conversão das vendas com autorizações" - Por Rodrigo Stoqui
"Como aumentar conversão das vendas com autorizações" - Por Rodrigo StoquiE-Commerce Brasil
 

Semelhante a Sistema genérico de perguntas do Nubank (8)

Comércio Eletrônico e Métodos de pagamento on line - aula 03 - turma 01 e 02
Comércio Eletrônico e Métodos de pagamento on line - aula 03 - turma 01 e 02Comércio Eletrônico e Métodos de pagamento on line - aula 03 - turma 01 e 02
Comércio Eletrônico e Métodos de pagamento on line - aula 03 - turma 01 e 02
 
Workshop Hands-On APIX 2018 - Trilha Básica
Workshop Hands-On APIX 2018 - Trilha BásicaWorkshop Hands-On APIX 2018 - Trilha Básica
Workshop Hands-On APIX 2018 - Trilha Básica
 
REQepay - Virtual Pago Plano de Negócio
REQepay - Virtual Pago Plano de NegócioREQepay - Virtual Pago Plano de Negócio
REQepay - Virtual Pago Plano de Negócio
 
Big Solutions - Black Friday | 3DS e Antifraude, ferramentas indispensáveis p...
Big Solutions - Black Friday | 3DS e Antifraude, ferramentas indispensáveis p...Big Solutions - Black Friday | 3DS e Antifraude, ferramentas indispensáveis p...
Big Solutions - Black Friday | 3DS e Antifraude, ferramentas indispensáveis p...
 
Meios de pagamento para e-commerce
Meios de pagamento para e-commerceMeios de pagamento para e-commerce
Meios de pagamento para e-commerce
 
Web Analytics e o Google Analytics - uma visão geral (Português - Brasil)
Web Analytics e o Google Analytics - uma visão geral (Português - Brasil)Web Analytics e o Google Analytics - uma visão geral (Português - Brasil)
Web Analytics e o Google Analytics - uma visão geral (Português - Brasil)
 
[GetNinjas] Business Intelligence Workshop @ Google Campus SP
[GetNinjas] Business Intelligence Workshop @ Google Campus SP[GetNinjas] Business Intelligence Workshop @ Google Campus SP
[GetNinjas] Business Intelligence Workshop @ Google Campus SP
 
"Como aumentar conversão das vendas com autorizações" - Por Rodrigo Stoqui
"Como aumentar conversão das vendas com autorizações" - Por Rodrigo Stoqui"Como aumentar conversão das vendas com autorizações" - Por Rodrigo Stoqui
"Como aumentar conversão das vendas com autorizações" - Por Rodrigo Stoqui
 

Sistema genérico de perguntas do Nubank

  • 1. O sistema genérico de perguntas do Nubank Luiz Dubas @luizdubas
  • 2. Agenda • Acquisition • Idéia para o novo acquisition • Implementação do novo acquisition
  • 3. Acquisition “Nu Minimal Keynote Template” © Nu Bank - 05.01.2014 • Porta de entrada para o Nubank • Captura de documentos e informações do cliente
  • 6. Acquisition • CPF • Senha • Aviso de conta criada • RG • Emissor do RG • Estado civil • Celular • Permissão de localização • CEP • Endereço • Bairro • Cidade • Estado • Permissão de câmera • Docs Front • Docs Back • Selfie • Renda • Limte • Vencimento • PIN • Assinatura • Contrato • Data de nascimento
  • 7. Acquisition • CPF • Senha • Aviso de conta criada • RG • Emissor do RG • Estado civil • Celular • Permissão de localização • CEP • Endereço • Bairro • Cidade • Estado • Permissão de câmera • Docs Front • Docs Back • Selfie • Renda • Limite • Vencimento • PIN • Assinatura • Contrato • Data de nascimento O que eles tem em comum?
  • 8. Acquisition • CPF • Senha • Aviso de conta criada • RG • Emissor do RG • Estado civil • Celular • Permissão de localização • CEP • Endereço • Bairro • Cidade • Estado • Permissão de câmera • Docs Front • Docs Back • Selfie • Renda • Limite • Vencimento • PIN • Assinatura • Contrato • Data de nascimento Todas são telas de pergunta e resposta
  • 9. Acquisition • CPF • Senha • Aviso de conta criada • RG • Emissor do RG • Estado civil • Celular • Permissão de localização • CEP • Endereço • Bairro • Cidade • Estado • Permissão de câmera • Docs Front • Docs Back • Selfie • Renda • Limite • Vencimento • PIN • Assinatura • Contrato • Data de nascimento E se não precisássemos mais de todas essas perguntas?
  • 10. Acquisition • CPF • Senha • RG • Emissor do RG • Estado civil • Celular • CEP • Endereço • Bairro • Cidade • Estado • Docs Front • Docs Back • Selfie • Limite • Vencimento • PIN • Contrato • Data de nascimento E se não precisássemos mais de todas essas perguntas?
  • 11. Acquisition • CPF • Senha • RG • Emissor do RG • Estado civil • Celular • CEP • Endereço • Bairro • Cidade • Estado • Docs Front • Docs Back • Selfie • Limite • Vencimento • PIN • Contrato • Data de nascimento Qualquer mudança tem que gerar uma nova versão do app
  • 12. Solução desejada Fazer com que o backend saiba disso
  • 13. Solução desejada • Lógica centralizada • Não precisaria atualizar o app a cada mudança • Fácil de adicionar/remover perguntas • Mais fácil de se fazer testes A/B e personalizar por cliente
  • 19. Novo Acquisition • O que é um step • Como que ele vai navegar entre steps e mandar as informações • O que acontece se o app não conhecer um step
  • 20. Steps
  • 21. Step • Representa um pedaço do fluxo • Pode ser uma pergunta ou um anúncio • Pode ter uma resposta
  • 22. Tipos de Step • Somente leitura • Texto • Escolha única • Não tem resposta
  • 23. Tipos de Step • Somente leitura • Texto • Escolha única • Não tem resposta • Normalmente usado para avisos
  • 24. Tipos de Step • Somente leitura • Texto • Escolha única • Pode ser usado para fazer bifurcações • Não tem resposta • Normalmente usado para avisos
  • 25. Tipos de Step • Somente leitura • Texto • Escolha única • Pode conformar com diferentes máscaras
  • 26. Tipos de Step • Somente leitura • Texto • Escolha única • Pode conformar com diferentes máscaras 
 • Pode ter mais de um texto na tela
  • 27. Tipos de Step • Somente leitura • Texto • Escolha única • Pode conformar com diferentes máscaras 
 • Pode ter mais de um texto na tela 
 
 • Tem diferentes validações
  • 28. Tipos de Step • Somente leitura • Texto • Escolha única • Pode ser usado para fazer bifurcações
  • 29. Tipos de Step • Somente leitura • Texto • Escolha única • Pode ser usado para fazer bifurcações 
 • Pode ser apresentado como uma matriz
  • 30. Step • Representa um pedaço do fluxo • Pode ser uma pergunta ou um anúncio • Pode ter uma resposta • É representado por um JSON
  • 31. Step { 
 
 
 } "title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>. Ok?</p>", "input_configurations": [ { "input_type": "text", "hint": "<small><detail>Caso você não tenha um RG, insira o número do seu RNE.</detail></small>", "id": "document", "required": true, "validation_message": "<small><b>RG inválido. nDigite novamente.</b></small>" } ], "forward_action": { "redirect": { "id": "document->document-uf", "type": "step", "value": "acq-flow.steps/document-uf" } }, "required": true "type": "input", "id": "acq-flow.steps/document",
  • 32. Step { 
 
 
 } "title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>. Ok?</p>", "input_configurations": [ { "input_type": "text", "hint": "<small><detail>Caso você não tenha um RG, insira o número do seu RNE.</detail></small>", "id": "document", "required": true, "validation_message": "<small><b>RG inválido. nDigite novamente.</b></small>" } ], "forward_action": { "redirect": { "id": "document->document-uf", "type": "step", "value": "acq-flow.steps/document-uf" } }, "required": true "type": "input", "id": "acq-flow.steps/document",
  • 33. Step { 
 
 
 } "title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>. Ok?</p>", "input_configurations": [ { "input_type": "text", "hint": "<small><detail>Caso você não tenha um RG, insira o número do seu RNE.</detail></small>", "id": "document", "required": true, "validation_message": "<small><b>RG inválido. nDigite novamente.</b></small>" } ], "forward_action": { "redirect": { "id": "document->document-uf", "type": "step", "value": "acq-flow.steps/document-uf" } }, "required": true "type": "input", "id": "acq-flow.steps/document",
  • 34. Step { 
 
 
 } "title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>. Ok?</p>", "input_configurations": [ { "input_type": "text", "hint": "<small><detail>Caso você não tenha um RG, insira o número do seu RNE.</detail></small>", "id": "document", "required": true, "validation_message": "<small><b>RG inválido. nDigite novamente.</b></small>" } ], "forward_action": { "redirect": { "id": "document->document-uf", "type": "step", "value": "acq-flow.steps/document-uf" } }, "required": true "type": "input", "id": "acq-flow.steps/document",
  • 35. Step { 
 
 
 } "title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>. Ok?</p>", "input_configurations": [ { "input_type": "text", "hint": "<small><detail>Caso você não tenha um RG, insira o número do seu RNE.</detail></small>", "id": "document", "required": true, "validation_message": "<small><b>RG inválido. nDigite novamente.</b></small>" } ], "forward_action": { "redirect": { "id": "document->document-uf", "type": "step", "value": "acq-flow.steps/document-uf" } }, "required": true "type": "input", "id": "acq-flow.steps/document",
  • 36. Step { 
 
 
 } "title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>. Ok?</p>", "input_configurations": [ { "input_type": "text", "hint": "<small><detail>Caso você não tenha um RG, insira o número do seu RNE.</detail></small>", "id": "document", "required": true, "validation_message": "<small><b>RG inválido. nDigite novamente.</b></small>" } ], "forward_action": { "redirect": { "id": "document->document-uf", "type": "step", "value": "acq-flow.steps/document-uf" } }, "required": true "type": "input", "id": "acq-flow.steps/document",
  • 37. Step { 
 
 
 } "title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>. Ok?</p>", "input_configurations": [ { "input_type": "text", "hint": "<small><detail>Caso você não tenha um RG, insira o número do seu RNE.</detail></small>", "id": "document", "required": true, "validation_message": "<small><b>RG inválido. nDigite novamente.</b></small>" } ], "forward_action": { "redirect": { "id": "document->document-uf", "type": "step", "value": "acq-flow.steps/document-uf" } }, "required": true "type": "input", "id": "acq-flow.steps/document",
  • 38. Step { 
 
 
 } "title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>. Ok?</p>", "input_configurations": [ { "input_type": "text", "hint": "<small><detail>Caso você não tenha um RG, insira o número do seu RNE.</detail></small>", "id": "document", "required": true, "validation_message": "<small><b>RG inválido. nDigite novamente.</b></small>" } ], "forward_action": { "redirect": { "id": "document->document-uf", "type": "step", "value": "acq-flow.steps/document-uf" } }, "required": true "type": "input", "id": "acq-flow.steps/document", Scroll
  • 39. Step { 
 
 
 } "title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>. Ok?</p>", "input_configurations": [ { "input_type": "text", "hint": "<small><detail>Caso você não tenha um RG, insira o número do seu RNE.</detail></small>", "id": "document", "required": true, "validation_message": "<small><b>RG inválido. nDigite novamente.</b></small>" } ], "forward_action": { "redirect": { "id": "document->document-uf", "type": "step", "value": "acq-flow.steps/document-uf" } }, "required": true "type": "input", "id": "acq-flow.steps/document",Stack
  • 40. Step { 
 
 
 } "title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>. Ok?</p>", "input_configurations": [ { "input_type": "text", "hint": "<small><detail>Caso você não tenha um RG, insira o número do seu RNE.</detail></small>", "id": "document", "required": true, "validation_message": "<small><b>RG inválido. nDigite novamente.</b></small>" } ], "forward_action": { "redirect": { "id": "document->document-uf", "type": "step", "value": "acq-flow.steps/document-uf" } }, "required": true "type": "input", "id": "acq-flow.steps/document",Label
  • 41. Step { 
 
 
 } "title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>. Ok?</p>", "input_configurations": [ { "input_type": "text", "hint": "<small><detail>Caso você não tenha um RG, insira o número do seu RNE.</detail></small>", "id": "document", "required": true, "validation_message": "<small><b>RG inválido. nDigite novamente.</b></small>" } ], "forward_action": { "redirect": { "id": "document->document-uf", "type": "step", "value": "acq-flow.steps/document-uf" } }, "required": true "type": "input", "id": "acq-flow.steps/document",
  • 42. Step { 
 
 
 } "title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>. Ok?</p>", "input_configurations": [ { "input_type": "text", "hint": "<small><detail>Caso você não tenha um RG, insira o número do seu RNE.</ detail></small>", "id": "document", "required": true, "validation_message": "<small><b>RG inválido.nDigite novamente.</b></small>" } ], "forward_action": { "redirect": { "id": "document->document-uf", "type": "step", "value": "acq-flow.steps/document-uf" } }, "required": true "type": "input", "id": "acq-flow.steps/document",
  • 43. Step { 
 
 
 } "title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>. Ok?</p>", "input_configurations": [ { "input_type": "text", "hint": "<small><detail>Caso você não tenha um RG, insira o número do seu RNE.</ detail></small>", "id": "document", "required": true, "validation_message": "<small><b>RG inválido.nDigite novamente.</b></small>" } ], "forward_action": { "redirect": { "id": "document->document-uf", "type": "step", "value": "acq-flow.steps/document-uf" } }, "required": true "type": "input", "id": "acq-flow.steps/document", Stack (Content)
  • 44. Step { 
 
 
 } "title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>. Ok?</p>", "input_configurations": [ { "input_type": "text", "hint": "<small><detail>Caso você não tenha um RG, insira o número do seu RNE.</ detail></small>", "id": "document", "required": true, "validation_message": "<small><b>RG inválido.nDigite novamente.</b></small>" } ], "forward_action": { "redirect": { "id": "document->document-uf", "type": "step", "value": "acq-flow.steps/document-uf" } }, "required": true "type": "input", "id": "acq-flow.steps/document", TextField
  • 45. Step { 
 
 
 } "title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>. Ok?</p>", "input_configurations": [ { "input_type": "text", "hint": "<small><detail>Caso você não tenha um RG, insira o número do seu RNE.</ detail></small>", "id": "document", "required": true, "validation_message": "<small><b>RG inválido.nDigite novamente.</b></small>" } ], "forward_action": { "redirect": { "id": "document->document-uf", "type": "step", "value": "acq-flow.steps/document-uf" } }, "required": true "type": "input", "id": "acq-flow.steps/document", Label
  • 46. Step { 
 
 
 } "title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>. Ok?</p>", "input_configurations": [ { "input_type": "text", "hint": "<small><detail>Caso você não tenha um RG, insira o número do seu RNE.</ detail></small>", "id": "document", "required": true, "validation_message": "<small><b>RG inválido.nDigite novamente.</b></small>" } ], "forward_action": { "redirect": { "id": "document->document-uf", "type": "step", "value": "acq-flow.steps/document-uf" } }, "required": true "type": "input", "id": "acq-flow.steps/document",
  • 47. Step { 
 
 
 } "title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>. Ok?</p>", "input_configurations": [ { "input_type": "text", "hint": "<small><detail>Caso você não tenha um RG, insira o número do seu RNE.</detail></small>", "id": "document", "required": true, "validation_message": "<small><b>RG inválido. nDigite novamente.</b></small>" } ], "forward_action": { "redirect": { "id": "document->document-uf", "type": "step", "value": "acq-flow.steps/document-uf" } },"required": true "type": "input", "id": "acq-flow.steps/document", Stack
  • 48. Step { 
 
 
 } "title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>. Ok?</p>", "input_configurations": [ { "input_type": "text", "hint": "<small><detail>Caso você não tenha um RG, insira o número do seu RNE.</detail></small>", "id": "document", "required": true, "validation_message": "<small><b>RG inválido. nDigite novamente.</b></small>" } ], "forward_action": { "redirect": { "id": "document->document-uf", "type": "step", "value": "acq-flow.steps/document-uf" } },"required": true "type": "input", "id": "acq-flow.steps/document", Button
  • 49. Step { 
 
 
 } "title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>. Ok?</p>", "input_configurations": [ { "input_type": "text", "hint": "<small><detail>Caso você não tenha um RG, insira o número do seu RNE.</detail></small>", "id": "document", "required": true, "validation_message": "<small><b>RG inválido. nDigite novamente.</b></small>" } ], "forward_action": { "redirect": { "id": "document->document-uf", "type": "step", "value": "acq-flow.steps/document-uf" } }, "required": true "type": "input", "id": "acq-flow.steps/document",
  • 50. Step { 
 
 
 } "title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>. Ok?</p>", "input_configurations": [ { "input_type": "text", "hint": "<small><detail>Caso você não tenha um RG, insira o número do seu RNE.</detail></small>", "id": "document", "required": true, "validation_message": "<small><b>RG inválido. nDigite novamente.</b></small>" } ], "forward_action": { "redirect": { "id": "document->document-uf", "type": "step", "value": "acq-flow.steps/document-uf" } }, "required": true "type": "input", "id": "acq-flow.steps/document",
  • 51. Step { 
 
 
 } "title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>. Ok?</p>", "input_configurations": [ { "input_type": "text", "hint": "<small><detail>Caso você não tenha um RG, insira o número do seu RNE.</detail></small>", "id": "document", "required": true, "validation_message": "<small><b>RG inválido. nDigite novamente.</b></small>" } ], "forward_action": { "redirect": { "id": "document->document-uf", "type": "step", "value": "acq-flow.steps/document-uf" } }, "required": true "type": "input", "id": "acq-flow.steps/document",
  • 52. Step { "id": "acq-flow.steps/credentials-created", "type": "read_only", "title": "<h2><em><strong>Luiz, sua conta está criada!</strong></ em>nAgora vamos continuar com o pedido do cartão.</h2>", "hint": "<small>Vamos precisar dos seus dados e de fotos do seu documento, então tenha em mãos seu RG, CNG ou RNE. Infelizmente não podemos aceitar passaportes ou carteiras de trabalho.</small>", "actions": [ { "button_type": "primary", "text": "<label><em>VAMOS LÁ</em></label>", "redirect": { "id": "credentials-created->document", "type": "step", "value": "acq-flow.steps/document" }, "type": "button" }, { "button_type": "text", "text": "<small><em>Prefere ser chamado de <a>outro nome?</a></ em></small>", "redirect": { "id": "credentials-created->preferred-name", "type": "step", "value": "acq-flow.steps/preferred-name" }, "type": "button" } ] }
  • 53. Step { "id": "acq-flow.steps/credentials-created", "type": "read_only", "title": "<h2><em><strong>Luiz, sua conta está criada!</strong></ em>nAgora vamos continuar com o pedido do cartão.</h2>", "hint": "<small>Vamos precisar dos seus dados e de fotos do seu documento, então tenha em mãos seu RG, CNG ou RNE. Infelizmente não podemos aceitar passaportes ou carteiras de trabalho.</small>", "actions": [ { "button_type": "primary", "text": "<label><em>VAMOS LÁ</em></label>", "redirect": { "id": "credentials-created->document", "type": "step", "value": "acq-flow.steps/document" }, "type": "button" }, { "button_type": "text", "text": "<small><em>Prefere ser chamado de <a>outro nome?</a></ em></small>", "redirect": { "id": "credentials-created->preferred-name", "type": "step", "value": "acq-flow.steps/preferred-name" }, "type": "button" } ] } Title Hint
  • 54. Step { "id": "acq-flow.steps/credentials-created", "type": "read_only", "title": "<h2><em><strong>Luiz, sua conta está criada!</strong></ em>nAgora vamos continuar com o pedido do cartão.</h2>", "hint": "<small>Vamos precisar dos seus dados e de fotos do seu documento, então tenha em mãos seu RG, CNG ou RNE. Infelizmente não podemos aceitar passaportes ou carteiras de trabalho.</small>", "actions": [ { "button_type": "primary", "text": "<label><em>VAMOS LÁ</em></label>", "redirect": { "id": "credentials-created->document", "type": "step", "value": "acq-flow.steps/document" }, "type": "button" }, { "button_type": "text", "text": "<small><em>Prefere ser chamado de <a>outro nome?</a></ em></small>", "redirect": { "id": "credentials-created->preferred-name", "type": "step", "value": "acq-flow.steps/preferred-name" }, "type": "button" } ] }
  • 55. Step { "id": "acq-flow.steps/credentials-created", "type": "read_only", "title": "<h2><em><strong>Luiz, sua conta está criada!</strong></ em>nAgora vamos continuar com o pedido do cartão.</h2>", "hint": "<small>Vamos precisar dos seus dados e de fotos do seu documento, então tenha em mãos seu RG, CNG ou RNE. Infelizmente não podemos aceitar passaportes ou carteiras de trabalho.</small>", "actions": [ { "button_type": "primary", "text": "<label><em>VAMOS LÁ</em></label>", "redirect": { "id": "credentials-created->document", "type": "step", "value": "acq-flow.steps/document" }, "type": "button" }, { "button_type": "text", "text": "<small><em>Prefere ser chamado de <a>outro nome?</a></ em></small>", "redirect": { "id": "credentials-created->preferred-name", "type": "step", "value": "acq-flow.steps/preferred-name" }, "type": "button" } ] } Button
  • 56. Step Button { "id": "acq-flow.steps/credentials-created", "type": "read_only", "title": "<h2><em><strong>Luiz, sua conta está criada!</strong></ em>nAgora vamos continuar com o pedido do cartão.</h2>", "hint": "<small>Vamos precisar dos seus dados e de fotos do seu documento, então tenha em mãos seu RG, CNG ou RNE. Infelizmente não podemos aceitar passaportes ou carteiras de trabalho.</small>", "actions": [ { "button_type": "primary", "text": "<label><em>VAMOS LÁ</em></label>", "redirect": { "id": "credentials-created->document", "type": "step", "value": "acq-flow.steps/document" }, "type": "button" }, { "button_type": "text", "text": "<small><em>Prefere ser chamado de <a>outro nome?</a></ em></small>", "redirect": { "id": "credentials-created->preferred-name", "type": "step", "value": "acq-flow.steps/preferred-name" }, "type": "button" } ] }
  • 57. Step
  • 58. Novo Acquisition • O que é um step • Como que ele vai navegar entre steps e mandar as informações • O que acontece se o app não conhecer um step
  • 59. Redirects e Instant Redirects
  • 60. Redirect • São eventos que podem ser enviados pelo servidor ou executados durante o fluxo • Podem ser eventos síncronos ou assíncronos
  • 61. Tipos de Redirect • Mudar de step (step) • Criar chunk (chunk) * • Mandar respostas (submit_response) * • Terminar fluxo (end_flow)
  • 65. Lifecycle Coordinator { "instant_redirect": { "id": "create-chunk", "type": "chunk", "value": "https://create-chunk" } } Redirect
  • 70. Lifecycle Coordinator { "type": "input", "title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>. Ok?</p>", "id": "acq-flow.steps/document", "input_configurations": [ { "input_type": "text", "hint": "<small><detail>Caso você não tenha um RG, insira o número do seu RNE.</detail></small>", "id": "document", "required": true, "validation_message": "<small><b>RG inválido.nDigite novamente.</b></ small>" } ], "forward_action": { "redirect": { "id": "document->document-uf", "type": "step", "value": "acq-flow.steps/document-uf" } }, "required": true }
  • 71. Lifecycle Coordinator { "type": "input", "title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>. Ok?</p>", "id": "acq-flow.steps/document", "input_configurations": [ { "input_type": "text", "hint": "<small><detail>Caso você não tenha um RG, insira o número do seu RNE.</detail></small>", "id": "document", "required": true, "validation_message": "<small><b>RG inválido.nDigite novamente.</b></ small>" } ], "forward_action": { "redirect": { "id": "document->document-uf", "type": "step", "value": "acq-flow.steps/document-uf" } }, "required": true } QuestionController Step
  • 72. Lifecycle Coordinator QuestionController Step { "type": "input", "title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>. Ok?</p>", "id": "acq-flow.steps/document", "input_configurations": [ { "input_type": "text", "hint": "<small><detail>Caso você não tenha um RG, insira o número do seu RNE.</detail></small>", "id": "document", "required": true, "validation_message": "<small><b>RG inválido.nDigite novamente.</b></ small>" } ], "forward_action": { "redirect": { "id": "document->document-uf", "type": "step", "value": "acq-flow.steps/document-uf" } }, "required": true }
  • 73. Lifecycle Coordinator QuestionController Step { "type": "input", "title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>. Ok?</p>", "id": "acq-flow.steps/document", "input_configurations": [ { "input_type": "text", "hint": "<small><detail>Caso você não tenha um RG, insira o número do seu RNE.</detail></small>", "id": "document", "required": true, "validation_message": "<small><b>RG inválido.nDigite novamente.</b></ small>" } ], "forward_action": { "redirect": { "id": "document->document-uf", "type": "step", "value": "acq-flow.steps/document-uf" } }, "required": true }
  • 74. Lifecycle Coordinator QuestionController Step { "type": "input", "title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>. Ok?</p>", "id": "acq-flow.steps/document", "input_configurations": [ { "input_type": "text", "hint": "<small><detail>Caso você não tenha um RG, insira o número do seu RNE.</detail></small>", "id": "document", "required": true, "validation_message": "<small><b>RG inválido.nDigite novamente.</b></ small>" } ], "forward_action": { "redirect": { "id": "document->document-uf", "type": "step", "value": "acq-flow.steps/document-uf" } }, "required": true } Redirect and response
  • 75. Lifecycle Coordinator QuestionController Step { "type": "input", "title": "<p>Para começar vamos precisar do seu <em><strong>RG</strong></em>. Ok?</p>", "id": "acq-flow.steps/document", "input_configurations": [ { "input_type": "text", "hint": "<small><detail>Caso você não tenha um RG, insira o número do seu RNE.</detail></small>", "id": "document", "required": true, "validation_message": "<small><b>RG inválido.nDigite novamente.</b></ small>" } ], "forward_action": { "redirect": { "id": "document->document-uf", "type": "step", "value": "acq-flow.steps/document-uf" } }, "required": true } [
 { 
 “id”: “acq-flow.steps/document”,
 “response”: “12345678900”
 }
 ] Redirect and response
  • 77. Lifecycle Coordinator QuestionController Step { "id": "acq-flow.steps/document-uf", "title": "<p>E qual o <strong><em>estado</em></strong> de emissão do seu RG?</p>", "type": "list_choice", "forward_action": { "redirect": { "id": "sync-with-backend", "type": "submit_response", "value": "https://submit_response" } }, "values": [ ... ], "required": true }
  • 78. Lifecycle Coordinator QuestionController Step Redirect and response { "id": "acq-flow.steps/document-uf", "title": "<p>E qual o <strong><em>estado</em></strong> de emissão do seu RG?</p>", "type": "list_choice", "forward_action": { "redirect": { "id": "sync-with-backend", "type": "submit_response", "value": "https://submit_response" } }, "values": [ ... ], "required": true }
  • 79. Lifecycle Coordinator QuestionController Step [
 { 
 “id”: “acq-flow.steps/document”,
 “response”: “12345678900”
 },
 {
 “id”: “acq-flow.steps/document-uf”,
 “response”: “SP”
 }
 ] { "id": "acq-flow.steps/document-uf", "title": "<p>E qual o <strong><em>estado</em></strong> de emissão do seu RG?</p>", "type": "list_choice", "forward_action": { "redirect": { "id": "sync-with-backend", "type": "submit_response", "value": "https://submit_response" } }, "values": [ ... ], "required": true } Redirect and response
  • 80. Lifecycle Coordinator QuestionController Step POST Answers { "id": "acq-flow.steps/document-uf", "title": "<p>E qual o <strong><em>estado</em></strong> de emissão do seu RG?</p>", "type": "list_choice", "forward_action": { "redirect": { "id": "sync-with-backend", "type": "submit_response", "value": "https://submit_response" } }, "values": [ ... ], "required": true } Redirect and response
  • 84. Novo Acquisition • O que é um step • Como que ele vai navegar entre steps e mandar as informações • O que acontece se o app não conhecer um step
  • 87. Lifecycle Coordinator POST { "instant_redirect": { "id": "create-chunk", "type": "chunk", "value": "https://create-chunk" } } [ “input”, “read_only“ ]
  • 88. Novo Acquisition • O servidor é responsável por garantir a retrocompatibilidade • Sempre que criarem um novo tipo de step temos que gerar um nova versão
  • 89. Novo Acquisition • O que é um step • Como que ele vai navegar entre steps e mandar as informações • O que acontece se o app não conhecer um step
  • 90. Casos de uso • Atualização cadastral • Atualizar renda mensal • Contestação de compra