---
title: "Entrar no Pro — eu.dev.br"
url: "https://eu.dev.br/pro/entrar/"
markdown_url: "https://eu.dev.br/pro/entrar.MD"
description: "Digite seu email para receber o link de acesso à área Pro. Sem senha, sem fricção: o link funciona por 10 minutos e usa o mesmo email da sua assinatura."
date: "2026-05-26"
author: ""
---

# Entrar no Pro — eu.dev.br

Digite seu email para receber o link de acesso à área Pro. Sem senha, sem fricção: o link funciona por 10 minutos e usa o mesmo email da sua assinatura.


# entrar no pro

Digite o email da sua assinatura. Mandamos um link de acesso pra você (válido por 10 minutos, uso único).

<div id="entrar-form-wrap" style="margin:var(--s-6) 0;border:2px solid var(--ink);padding:var(--s-6);">
<form id="entrar-form" novalidate>
<label for="entrar-email" style="display:block;text-transform:uppercase;letter-spacing:0.08em;font-size:12px;color:var(--muted);margin-bottom:var(--s-2);">// email</label>
<input type="email" id="entrar-email" name="email" required autocomplete="email" inputmode="email" placeholder="voce@email.com" style="display:block;width:100%;font-family:var(--mono);font-size:16px;padding:12px;border:2px solid var(--ink);background:var(--bg);color:var(--ink);box-sizing:border-box;margin:0;">
<input type="hidden" id="entrar-return" name="return" value="/">
<button type="submit" id="entrar-submit" class="pro-cta" style="display:inline-block;margin-top:var(--s-5);" data-umami-event="paywall:login-request" data-umami-event-location="pro-entrar">enviar link de acesso →</button>
<p id="entrar-msg" style="margin:var(--s-4) 0 0;font-size:12px;color:var(--muted);min-height:1.4em;"></p>
</form>
</div>

<div id="entrar-confirm" style="display:none;border:2px solid var(--lime);padding:var(--s-6);margin:var(--s-6) 0;">
<p style="margin:0 0 var(--s-3);text-transform:uppercase;letter-spacing:0.08em;font-size:12px;color:var(--muted);">// link enviado</p>
<p style="margin:0;"><strong>se este email é uma assinatura ativa, o link já está chegando.</strong></p>
<p style="margin:var(--s-3) 0 0;font-size:13px;">Confere a caixa de entrada (e o spam, se demorar). O link vale por <strong>10 minutos</strong>. Se passar, é só pedir outro aqui.</p>
<p style="margin:var(--s-4) 0 0;font-size:12px;color:var(--muted);">// remetente: <span style="font-family:var(--mono);">pro&#64;eu.dev.br</span></p>
</div>

## ainda não é assinante?

Volta para [/pro/](/pro/) e escolhe entre mensal (R$ 9,99) ou anual (R$ 69,93 com 5 meses grátis).

## perdeu o email?

Esquece a assinatura — esquece também o login. Pede outro link aqui, ele só vai chegar se a assinatura estiver ativa.

Não vendemos seu email, nem usamos pra marketing fora do Pro. Privacidade simples.

<script>
(function () {
  var form = document.getElementById('entrar-form');
  var emailInput = document.getElementById('entrar-email');
  var returnInput = document.getElementById('entrar-return');
  var msg = document.getElementById('entrar-msg');
  var submit = document.getElementById('entrar-submit');
  var formWrap = document.getElementById('entrar-form-wrap');
  var confirmBox = document.getElementById('entrar-confirm');

  // Pull return URL from query string (for post-login redirect)
  try {
    var params = new URLSearchParams(window.location.search);
    var ret = params.get('return');
    if (ret) returnInput.value = ret;
  } catch (e) { /* noop */ }

  form.addEventListener('submit', function (e) {
    e.preventDefault();
    var email = emailInput.value.trim().toLowerCase();
    if (!email || email.indexOf('@') < 0) {
      msg.style.color = 'var(--red, #FF003C)';
      msg.textContent = '✗ digita um email válido.';
      return;
    }
    msg.style.color = 'var(--muted)';
    msg.textContent = 'enviando…';
    submit.disabled = true;
    submit.textContent = 'enviando…';

    fetch('https://pro.eu.dev.br/_auth/login', {
      method: 'POST',
      headers: { 'content-type': 'application/json' },
      body: JSON.stringify({ email: email, return: returnInput.value }),
      credentials: 'include'
    })
      .then(function (r) { return r.json().then(function (j) { return { status: r.status, body: j }; }); })
      .then(function (res) {
        if (res.status === 200) {
          formWrap.style.display = 'none';
          confirmBox.style.display = 'block';
          if (window.umami && typeof window.umami.track === 'function') {
            window.umami.track('paywall:login-sent', { location: 'pro-entrar' });
          }
        } else {
          msg.style.color = 'var(--red, #FF003C)';
          msg.textContent = '✗ ' + (res.body.error || 'erro ao enviar — tenta de novo daqui a pouco.');
          submit.disabled = false;
          submit.textContent = 'enviar link de acesso →';
        }
      })
      .catch(function (e) {
        msg.style.color = 'var(--red, #FF003C)';
        msg.textContent = '✗ erro de rede: ' + e + '. tenta de novo.';
        submit.disabled = false;
        submit.textContent = 'enviar link de acesso →';
      });
  });
})();
</script>
