O documento descreve o novo sistema de aquisição de clientes do Nubank, que consiste em um fluxo dinâmico de perguntas representado por "steps". Cada step representa uma parte do fluxo, como uma pergunta ou anúncio, e é definido por um objeto JSON que especifica seus detalhes como tipo, texto, ação seguinte e validações. Isso permite que o fluxo seja definido centralizadamente e personalizado facilmente.
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
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
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"
}
]
}
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