Skip to main content

Debug Mode

A primeira ferramenta para troubleshooting é ativar o modo debug.

Ativar Debug

<TestlyProvider 
  apiKey="YOUR_API_KEY"
  config={{
    debug: true // ou process.env.NODE_ENV === 'development'
  }}
>

Logs que Você Verá

[Testly] 🚀 SDK initialized
[Testly] 🔑 API Key: testly_abc...xyz (valid)
[Testly] ✅ Experiment loaded: homepage-hero-test
[Testly] 👤 User ID: user_123abc
[Testly] 🎲 Assigned variant: variant-b
[Testly] 📊 Impression recorded
[Testly] 🎯 Conversion recorded: cta_clicked
[Testly] ❌ API ERROR: 401 Unauthorized
Recomendação: Sempre desenvolva com debug: true. Isso economiza horas de troubleshooting.

Problemas Comuns e Soluções

1. Nada Acontece / Variante Sempre Null

Sintomas:
const { variant } = useExperiment('test');
console.log(variant); // null
Possíveis Causas:
Como verificar:
console.log(process.env.NEXT_PUBLIC_TESTLY_API_KEY); // undefined?
Solução:
  1. Verifique se o arquivo .env.local existe
  2. Certifique-se de usar o prefixo correto:
    • Next.js: NEXT_PUBLIC_
    • Vite: VITE_
  3. Reinicie o servidor de desenvolvimento
  4. Verifique no dashboard se a API Key está ativa
.env.local
# ✅ Correto (Next.js)
NEXT_PUBLIC_TESTLY_API_KEY=testly_abc123...

# ❌ Errado (falta prefixo)
TESTLY_API_KEY=testly_abc123...
Como verificar:
  1. Acesse o dashboard
  2. Procure pelo experimentId usado no código
  3. Verifique se está marcado como “Ativo”
Solução:
  • Crie o experimento no dashboard
  • Ative o experimento
  • Use o ID exato (case-sensitive)
// ✅ Correto
useExperiment('homepage-hero-test')

// ❌ Errado (ID diferente)
useExperiment('homepage-hero')
useExperiment('HomePage-Hero-Test')
Como verificar:
// No seu componente
const { variant } = useExperiment('test');
// Se der erro "useExperiment must be used within TestlyProvider"
Solução: Certifique-se de que o TestlyProvider está em um nível superior:
// ✅ Correto
<TestlyProvider apiKey="...">
  <App>
    <MyComponent /> {/* pode usar useExperiment */}
  </App>
</TestlyProvider>

// ❌ Errado
<App>
  <MyComponent /> {/* NÃO pode usar useExperiment */}
  <TestlyProvider apiKey="...">
    ...
  </TestlyProvider>
</App>
Como verificar: Abra DevTools → Network → Procure por chamadas para api.testly.comPossíveis problemas:
  • ❌ Request bloqueado por CORS
  • ❌ Firewall corporativo bloqueando
  • ❌ Timeout (resposta demorada)
  • ❌ API fora do ar
Solução:
// Aumentar timeout
<TestlyProvider 
  config={{
    timeout: 10000 // 10 segundos
  }}
/>

// Ou verificar status da API
// https://status.testly.com

2. Loading Nunca Termina

Sintomas:
const { loading } = useExperiment('test');
console.log(loading); // sempre true
Diagnóstico:
useEffect(() => {
  console.log('Loading state:', loading);
  console.log('Variant:', variant);
  console.log('Error:', error);
}, [loading, variant, error]);
Soluções:
<TestlyProvider 
  config={{
    timeout: 8000 // Aumentar para 8s
  }}
/>
Verifique o status: https://status.testly.comImplemente fallback:
const { variant, loading } = useExperiment('test');

useEffect(() => {
  const timer = setTimeout(() => {
    if (loading) {
      console.error('Loading timeout - usando fallback');
      // Usar versão padrão
    }
  }, 10000);

  return () => clearTimeout(timer);
}, [loading]);
Limpar cache manualmente:
// No console do navegador
localStorage.clear();
location.reload();
Ou desativar cache temporariamente:
<TestlyProvider 
  config={{
    cacheEnabled: false // Apenas para debug
  }}
/>

3. Conversões Não São Registradas

Sintomas:
const { convert } = useExperiment('test');
convert('clicked'); // Nada acontece no dashboard
Diagnóstico com Debug:
const { convert } = useExperiment('test');

const handleClick = async () => {
  try {
    console.log('Chamando convert...');
    await convert('clicked');
    console.log('✅ Conversão registrada!');
  } catch (error) {
    console.error('❌ Erro:', error);
  }
};
Possíveis Causas:
Problema: Conversões só contam se o usuário VIU o experimento antes.Como verificar:
const { variant, loading } = useExperiment('test');

// Se loading for true, impressão ainda não foi registrada
if (!loading && variant) {
  // Agora pode converter
  convert('clicked');
}
Solução: Sempre aguarde o loading terminar:
const { variant, loading, convert } = useExperiment('test');

if (loading) return <Skeleton />;

return (
  <button onClick={() => convert('clicked')}>
    Clique Aqui
  </button>
);
Problema: Nome muito longo ou caracteres especiaisSolução:
// ✅ Bom
convert('button_clicked')
convert('form_submitted')
convert('trial_started')

// ❌ Ruim
convert('Botão Principal da Homepage Clicado!!!') // Muito longo
convert('clique@botão') // Caracteres especiais
convert('') // Vazio
Problema: Você chamou convert() duas vezes na mesma sessão
convert('clicked'); // ✅ Registrada
convert('clicked'); // ❌ Ignorada (dedupe)
Solução:
  • Use nomes diferentes para eventos diferentes
  • Ou desative dedupe (não recomendado)
<TestlyProvider 
  config={{
    dedupConversions: false // Permite duplicatas
  }}
/>
Problema: Sua API Key pode estar configurada como “read-only”Solução:
  1. Acesse o dashboard
  2. Vá em Configurações → API Keys
  3. Certifique-se que tem permissão de escrita
  4. Gere uma nova key se necessário

4. Variante Muda a Cada Refresh

Sintomas:
Refresh 1: variant-a
Refresh 2: variant-b
Refresh 3: variant-a
Isso NÃO deveria acontecer! O Testly garante consistência. Possíveis Causas:
Verificar:
<TestlyProvider 
  config={{
    cacheEnabled: true // Deve ser true (padrão)
  }}
/>
Verificar: Algum código está limpando localStorage?
// Procure por isso no seu código
localStorage.clear(); // ❌ Remove cache do Testly

// Ou limpe apenas o que você precisa
localStorage.removeItem('minha-chave'); // ✅ Específico
Problema: Se você passa userId customizado e ele muda
// ❌ Ruim - userId muda a cada render
const { variant } = useExperiment('test', {
  userId: Math.random().toString()
});

// ✅ Bom - userId consistente
const userId = user?.id || 'anonymous';
const { variant } = useExperiment('test', { userId });

5. Erro: “useExperiment must be used within TestlyProvider”

Sintoma:
Error: useExperiment must be used within TestlyProvider
Causa: Hook sendo usado fora do Provider Solução:
// ❌ Errado
function App() {
  const { variant } = useExperiment('test'); // Erro!
  
  return (
    <TestlyProvider apiKey="...">
      <Component />
    </TestlyProvider>
  );
}

// ✅ Correto
function App() {
  return (
    <TestlyProvider apiKey="...">
      <Component /> {/* useExperiment aqui dentro */}
    </TestlyProvider>
  );
}

function Component() {
  const { variant } = useExperiment('test'); // ✅ OK
  return <div>{variant}</div>;
}

6. TypeScript: Tipos Não Reconhecidos

Sintoma:
Cannot find module '@testly/react' or its corresponding type declarations
Soluções:
rm -rf node_modules package-lock.json
npm install
tsconfig.json
{
  "compilerOptions": {
    "moduleResolution": "node",
    "esModuleInterop": true,
    "skipLibCheck": true
  }
}
types/testly.d.ts
declare module '@testly/react' {
  export function TestlyProvider(props: any): JSX.Element;
  export function useExperiment(id: string, options?: any): any;
  export function useConversion(): any;
}

Ferramentas de Debugging

1. DevTools Network Tab

O que procurar:
Request URL: https://api.testly.com/v1/variants/assign
Method: POST
Status: 200 OK

Request Payload:
{
  "experimentId": "homepage-hero-test",
  "userId": "user_123"
}

Response:
{
  "success": true,
  "data": {
    "variantId": "variant-b"
  }
}
Status codes importantes:
StatusSignificadoSolução
200 OK✅ SucessoTudo certo
401 Unauthorized❌ API Key inválidaVerificar key
404 Not Found❌ Experimento não existeVerificar ID
429 Too Many Requests❌ Rate limitAguardar ou aumentar plano
500 Server Error❌ Erro no servidorContactar suporte

2. React DevTools

Verificar Provider:
  1. Abra React DevTools
  2. Procure por TestlyProvider na árvore de componentes
  3. Verifique as props:
    • apiKey está presente?
    • config está correto?
Verificar estado do hook:
  1. Selecione componente que usa useExperiment
  2. Veja os hooks na sidebar
  3. Verifique valores:
    • variant
    • loading
    • error

3. Console Logs Customizados

function DebugExperiment() {
  const { variant, loading, error, convert } = useExperiment('test');

  useEffect(() => {
    console.group('🔍 Testly Debug');
    console.log('Variant:', variant);
    console.log('Loading:', loading);
    console.log('Error:', error);
    console.log('Experiment ID:', 'test');
    console.log('Timestamp:', new Date().toISOString());
    console.groupEnd();
  }, [variant, loading, error]);

  return <div>{variant}</div>;
}

4. Verificar localStorage

// No console do navegador
Object.keys(localStorage)
  .filter(key => key.startsWith('testly-'))
  .forEach(key => {
    console.log(key, localStorage.getItem(key));
  });

// Output:
// testly-experiment-homepage-hero-test: {"variantId":"variant-b","userId":"user_123"}
// testly-impression-homepage-hero-test-variant-b: true

Checklist de Troubleshooting

Quando algo não funciona, siga esta ordem:
1

Ativar Debug Mode

config={{ debug: true }}
2

Verificar Console

Procure por erros vermelhos ou logs [Testly]
3

Verificar Network Tab

Há requests para api.testly.com? Qual o status?
4

Verificar Dashboard

Experimento existe? Está ativo?
5

Verificar API Key

Está no .env? Tem o prefixo correto? Servidor foi reiniciado?
6

Verificar Provider

Está envolvendo o componente correto?
7

Limpar Cache

localStorage.clear();
location.reload();
8

Testar em Navegação Anônima

Elimina problemas de cache/extensões

Casos Extremos

Next.js: Hydration Mismatch

Sintoma:
Warning: Text content did not match. Server: "variant-a" Client: "variant-b"
Causa: Servidor e cliente renderizam variantes diferentes Solução:
'use client'; // Forçar client-side

function MyComponent() {
  const { variant, loading } = useExperiment('test');
  const [mounted, setMounted] = useState(false);

  useEffect(() => {
    setMounted(true);
  }, []);

  if (!mounted || loading) {
    return <Skeleton />; // Sempre renderiza igual no servidor
  }

  return <div>{variant}</div>; // Apenas cliente vê variante
}

React Strict Mode (Double Render)

Sintoma: Logs aparecem duas vezes em desenvolvimento Causa: React 18 Strict Mode renderiza componentes duas vezes Solução: Isso é normal em desenvolvimento. Ignore ou desative Strict Mode:
// ❌ Strict Mode (desenvolvimento)
<React.StrictMode>
  <App />
</React.StrictMode>

// ✅ Sem Strict Mode (apenas se necessário)
<App />

CORS em Localhost

Sintoma:
CORS policy: No 'Access-Control-Allow-Origin' header
Solução: Use localhost ao invés de 127.0.0.1 ou configure proxy:
next.config.js
module.exports = {
  async rewrites() {
    return [
      {
        source: '/api/testly/:path*',
        destination: 'https://api.testly.com/v1/:path*'
      }
    ];
  }
};

Precisa de Ajuda?

Se nenhuma solução funcionou: Ao pedir ajuda, inclua:
- Versão do SDK: 1.x.x
- Framework: Next.js 14 / React 18
- Comportamento esperado vs atual
- Logs do debug mode
- Network tab screenshot (se relevante)
- Código relevante (remova API key!)

Próximos Passos