---
title: "Enquete no Discord com bot: enquete nativa, reações ou botões"
description: "Crie enquetes no Discord com discord.js v14: use a enquete nativa pelo campo poll, compare com reações e botões, limite o voto único e leia o resultado."
url: "https://streethosting.com.br/guias/bots-discord/bot-discord-enquetes-votacao"
category: "bots-discord"
slug: "bot-discord-enquetes-votacao"
datePublished: "2026-11-13"
dateModified: "2026-11-13"
author: "Equipe StreetHosting"
difficulty: "intermediario"
language: "pt-BR"
keywords:
  - "enquete discord bot"
  - "discord.js poll"
  - "votação discord bot botões"
  - "enquete discord reações"
  - "discord bot criar enquete slash command"
---

# Enquetes e votações no Discord com bot: qual formato escolher

O Discord tem enquete nativa e o bot consegue enviar uma com um campo na mensagem. Veja quando ela basta, quando reações ou botões fazem mais sentido, como limitar a um voto e como ler o resultado.

> **Resposta rápida**
>
> Para uma votação simples, envie a enquete nativa: no discord.js v14 basta passar `poll` em `channel.send()`, com pergunta, respostas e `duration` em horas. O Discord conta os votos e garante o voto único com `allowMultiselect: false`. Use reações ou botões só quando precisar de regras próprias, como voto por cargo.

## Enquete nativa, reações ou botões

Antes de existir a enquete nativa, todo bot fazia votação com reações. Hoje há três caminhos, e cada um resolve um problema diferente.

|  | Enquete nativa | Reações | Botões |
| --- | --- | --- | --- |
| Quem conta os votos | O Discord | Você, lendo as reações | Você, no seu banco |
| Voto único | Sim, pela opção da própria enquete | Só com código que remove as outras reações | Sim, com chave por usuário |
| Duração | Definida na criação e encerrada sozinha | Você precisa agendar | Você precisa agendar |
| Regras por cargo ou peso | Não | Difícil | Sim |
| Máximo de opções | 10 | Limitado pelas reações da mensagem | 25 botões |
| Esforço de código | Baixo | Médio | Maior |

Na dúvida, comece pela enquete nativa. Ela já tem barra de progresso, contagem ao vivo, encerramento automático e funciona no celular sem nada extra. Reações servem para o improviso de uma pergunta rápida, e botões entram quando o voto precisa obedecer a uma regra do seu servidor.

## Enviar a enquete nativa pelo bot

O campo `poll` existe nas versões atuais do discord.js v14. Se o seu projeto é antigo, rode `npm install discord.js@latest` antes. O bot também precisa da permissão **Send Polls** (Enviar Enquetes) no canal, além de ver o canal e enviar mensagens.

O exemplo abaixo é um comando `/enquete` com a pergunta, as opções separadas por ponto e vírgula, a duração e a opção de múltipla escolha:

```
const { SlashCommandBuilder, MessageFlags } = require('discord.js');

const enquete = new SlashCommandBuilder()
  .setName('enquete')
  .setDescription('Cria uma enquete neste canal')
  .addStringOption((o) =>
    o.setName('pergunta').setDescription('A pergunta').setMaxLength(300).setRequired(true)
  )
  .addStringOption((o) =>
    o.setName('opcoes').setDescription('Opções separadas por ponto e vírgula').setRequired(true)
  )
  .addIntegerOption((o) =>
    o.setName('horas').setDescription('Duração em horas').setMinValue(1).setMaxValue(168)
  )
  .addBooleanOption((o) =>
    o.setName('multipla').setDescription('Permitir mais de uma resposta')
  );

// no handler de interactionCreate
if (interaction.commandName === 'enquete') {
  const pergunta = interaction.options.getString('pergunta', true);
  const opcoes = interaction.options
    .getString('opcoes', true)
    .split(';')
    .map((t) => t.trim())
    .filter(Boolean);

  if (opcoes.length < 2 || opcoes.length > 10 || opcoes.some((t) => t.length > 55)) {
    return interaction.reply({
      content: 'Use de 2 a 10 opções, com até 55 caracteres cada.',
      flags: MessageFlags.Ephemeral,
    });
  }

  const mensagem = await interaction.channel.send({
    poll: {
      question: { text: pergunta },
      answers: opcoes.map((text) => ({ text })),
      duration: interaction.options.getInteger('horas') ?? 24, // em horas
      allowMultiselect: interaction.options.getBoolean('multipla') ?? false,
    },
  });

  await interaction.reply({
    content: `Enquete criada. ID da mensagem: ${mensagem.id}`,
    flags: MessageFlags.Ephemeral,
  });
}
```

Os limites que o Discord impõe: pergunta de até 300 caracteres, no máximo 10 respostas de até 55 caracteres cada, e duração em horas, de 1 até 768 (32 dias). Cada resposta aceita também um emoji, no campo `emoji` ao lado do texto. Depois de enviada, a enquete não pode ser editada.

Para registrar o comando e entender o handler, veja [criar bot Discord com slash commands](https://streethosting.com.br/guias/bots-discord/criar-bot-discord-slash-commands).

## Ler o resultado e encerrar antes

Quando o prazo acaba, o Discord fecha a enquete e posta o resultado no canal. Se o seu bot precisa dos números (para premiar, abrir uma discussão ou registrar em um banco), busque a mensagem e leia o objeto `poll`:

```
async function lerResultado(canal, idDaMensagem) {
  const mensagem = await canal.messages.fetch(idDaMensagem);
  const poll = mensagem.poll;
  if (!poll) return null;

  const respostas = poll.answers.map((r) => ({ texto: r.text, votos: r.voteCount }));
  const total = respostas.reduce((soma, r) => soma + r.votos, 0);

  return {
    pergunta: poll.question.text,
    final: poll.resultsFinalized, // true quando a contagem foi fechada
    total,
    respostas: respostas.sort((a, b) => b.votos - a.votos),
  };
}

// encerrar antes do prazo (só funciona em enquetes enviadas pelo próprio bot)
await mensagem.poll.end();

// quem votou em uma resposta
const resposta = mensagem.poll.answers.first();
const votantes = await resposta.fetchVoters({ limit: 100 });
```

Enquanto a enquete está aberta, a contagem do Discord é aproximada. O campo `resultsFinalized` indica quando o número é definitivo, então só grave resultado no banco depois que ele for `true`.

Para reagir a cada voto em tempo real, ligue a intent `GuildMessagePolls` no cliente e escute `Events.MessagePollVoteAdd` e `Events.MessagePollVoteRemove`. Ela não é privilegiada, então não precisa de liberação no portal. Se o seu bot só envia a enquete e lê o resultado no fim, não precisa dessa intent.

> **Dica**
>
> Guarde o ID da mensagem da enquete junto com o motivo dela no seu banco. É com esse ID que você volta depois, mesmo que o bot tenha reiniciado, para ler o resultado final.

## Enquete com reações

O formato clássico: o bot manda uma mensagem e coloca uma reação por opção. Cada pessoa vota clicando na reação. É a forma mais rápida de fazer uma pergunta sem estrutura nenhuma:

```
const NUMEROS = ['1\uFE0F\u20E3', '2\uFE0F\u20E3', '3\uFE0F\u20E3', '4\uFE0F\u20E3', '5\uFE0F\u20E3'];

async function enqueteReacoes(canal, pergunta, opcoes) {
  const linhas = opcoes.map((texto, i) => `${NUMEROS[i]} ${texto}`);
  const mensagem = await canal.send(`**${pergunta}**\n\n${linhas.join('\n')}`);
  for (let i = 0; i < opcoes.length; i++) {
    await mensagem.react(NUMEROS[i]);
  }
  return mensagem;
}
```

O custo aparece quando você quer voto único. O Discord não impede que a pessoa marque duas reações, então o bot precisa escutar `messageReactionAdd`, descobrir as outras reações do mesmo usuário na mensagem e remover cada uma. Isso exige a intent `GuildMessageReactions`, partials para mensagens antigas e várias chamadas à API a cada voto. Também não há prazo: você precisa agendar o encerramento por conta própria.

> **Atenção**
>
> Reações como votação são fáceis de manipular. Quem tem a permissão de adicionar reações pode votar em várias opções se o bot cair, e o bot não vê o que aconteceu enquanto esteve offline. Para qualquer coisa que valha de verdade, prefira a enquete nativa ou botões com registro no banco.

## Enquete com botões

Botões dão controle total. Você decide quem pode votar, guarda cada voto no seu banco e escolhe como mostrar o resultado. O desenho é simples: cada botão carrega a opção no `customId` e uma tabela com chave primária por mensagem e usuário garante o voto único.

```
const Database = require('better-sqlite3');
const { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder, MessageFlags } = require('discord.js');

const db = new Database('dados.db');
db.exec(`CREATE TABLE IF NOT EXISTS votos (
  mensagem_id TEXT NOT NULL,
  user_id     TEXT NOT NULL,
  opcao       INTEGER NOT NULL,
  PRIMARY KEY (mensagem_id, user_id)
)`);

const votar = db.prepare(`INSERT INTO votos (mensagem_id, user_id, opcao) VALUES (?, ?, ?)
  ON CONFLICT (mensagem_id, user_id) DO UPDATE SET opcao = excluded.opcao`);
const contar = db.prepare('SELECT opcao, COUNT(*) AS n FROM votos WHERE mensagem_id = ? GROUP BY opcao');

function montarEmbed(pergunta, opcoes, mensagemId) {
  const contagem = Object.fromEntries(contar.all(mensagemId).map((l) => [l.opcao, l.n]));
  const linhas = opcoes.map((texto, i) => `**${texto}**: ${contagem[i] ?? 0} voto(s)`);
  return new EmbedBuilder().setTitle(pergunta).setDescription(linhas.join('\n'));
}

// botões: customId = voto:<opcao>
function montarBotoes(opcoes) {
  const linha = new ActionRowBuilder().addComponents(
    opcoes.slice(0, 5).map((texto, i) =>
      new ButtonBuilder().setCustomId(`voto:${i}`).setLabel(texto).setStyle(ButtonStyle.Primary)
    )
  );
  return [linha];
}

// no handler de interactionCreate
if (interaction.isButton() && interaction.customId.startsWith('voto:')) {
  const opcao = Number(interaction.customId.split(':')[1]);
  votar.run(interaction.message.id, interaction.user.id, opcao);

  // as opções e a pergunta saem do embed original ou de uma tabela sua
  await interaction.update({ embeds: [montarEmbed(PERGUNTA, OPCOES, interaction.message.id)] });
}
```

Um voto repetido troca a escolha em vez de somar, e a contagem sai direto do banco, então um reinício não apaga nada. Para limitar por cargo, confira `interaction.member.roles.cache.has(ID)` antes de gravar. Cada linha de botões comporta 5 botões e uma mensagem tem até 5 linhas, no total de 25. Para encerrar, troque os botões por uma versão desabilitada e guarde o resultado. O guia sobre [botões e menus interativos](https://streethosting.com.br/guias/bots-discord/bot-discord-botoes-menus-interativos) detalha esse ciclo de vida.

- Use a enquete nativa para votar uma pergunta aberta, como o próximo evento.
- Use botões para votações valendo algo, como eleição de moderador com um cargo mínimo.
- Use reações só para o improviso do dia a dia.

Quem coleta ideias dos membros ao longo do tempo pode combinar isso com o [sistema de sugestões](https://streethosting.com.br/guias/bots-discord/bot-discord-sistema-sugestoes), deixando as mais votadas virarem enquete.

## Cuidados para a votação dar certo

Alguns detalhes separam uma enquete que funciona de uma que gera reclamação no servidor.

- **Limite quem cria enquete.** Use `setDefaultMemberPermissions` no comando ou confira um cargo antes de enviar. Sem isso, qualquer pessoa enche o canal de enquetes.
- **Escolha o canal certo.** O bot cria a enquete no canal onde o comando foi usado. Se você quer um canal fixo de votações, busque o canal pelo ID e envie lá, conferindo antes se o bot tem Send Polls nele. Permissões de canal podem negar o que o servidor permite.
- **Pense na duração.** Para decisões do dia a dia, 24 horas basta. Para algo que envolve a comunidade toda, dê uns 3 a 7 dias, para quem entra pouco no Discord conseguir votar.
- **Anuncie o resultado.** O Discord já posta o resultado ao fim do prazo, mas um bot que lê o resultado e responde com o vencedor, marcando um cargo de avisos, dá o fechamento que as pessoas esperam.
- **Trate erros.** Se o comando falhar por falta da permissão, avise de forma clara em vez de deixar a interação sem resposta. O Discord dá só 3 segundos para a primeira resposta; use `deferReply()` se o processamento demorar.

Com isso você cobre os casos mais comuns. Se uma votação precisa ser auditável, como eleição de moderador, guarde os votos no seu banco com botões, porque a enquete nativa mostra quem votou, mas não deixa você impor regras de elegibilidade.

## Onde rodar na StreetHosting

A enquete nativa não exige nada de especial: o bot só precisa estar ligado na hora em que alguém usa o comando. Para os botões e os eventos de voto, ele precisa ficar online o tempo todo. Na [hospedagem de bots da StreetHosting](https://streethosting.com.br/bots) você sobe o código em Node.js em um container com painel, e o plano Discord Essential custa R$ 9,99 por mês, com 1 GB de RAM, 2 GB de NVMe e um banco MariaDB para guardar os votos. Um bot de enquetes é leve e cabe com folga nesse plano.

## Perguntas frequentes

### O bot consegue criar a enquete nativa do Discord?

Sim. No discord.js v14, atual, a mensagem aceita o campo poll, com pergunta, respostas, duração em horas e a opção de múltipla escolha. O bot precisa da permissão Send Polls no canal. Versões antigas da biblioteca não conhecem esse campo, então atualize o pacote.

### Dá para editar uma enquete depois de enviada?

Não. Pergunta, respostas e duração ficam fixas. O que dá para fazer é encerrar antes com poll.end(), caso o bot tenha enviado a enquete, ou criar outra.

### Como garantir um voto só por pessoa?

Na enquete nativa, deixe allowMultiselect como false e o próprio Discord impede mais de uma resposta. Em reações, o bot precisa remover as outras reações do usuário. Em botões, uma chave primária por mensagem e usuário no banco resolve.

### Qual a duração máxima da enquete nativa?

A duração é informada em horas e o Discord aceita de 1 hora até 768 horas, que são 32 dias. Se você não informar, o padrão é 24 horas.

### Quando devo preferir botões em vez da enquete nativa?

Quando você precisa de regras que a enquete nativa não oferece: voto só de quem tem certo cargo, voto com peso diferente, resultado escondido até o fim ou registro dos votos no seu banco.

## Guias relacionados

- [Botões e menus de seleção no bot Discord com discord.js v14](https://streethosting.com.br/guias/bots-discord/bot-discord-botoes-menus-interativos.md)
- [Sistema de sugestões no Discord com votação, aprovação e thread](https://streethosting.com.br/guias/bots-discord/bot-discord-sistema-sugestoes.md)
- [Como fazer sorteios no Discord com um bot de giveaway](https://streethosting.com.br/guias/bots-discord/bot-discord-sorteios-giveaway-comunidade.md)
- [Como criar bot Discord com slash commands](https://streethosting.com.br/guias/bots-discord/criar-bot-discord-slash-commands.md)

## Produtos citados

- https://streethosting.com.br/bots

## Dados estruturados

```json
[
  {
    "@context": "https://schema.org",
    "@type": [
      "Article",
      "TechArticle"
    ],
    "headline": "Enquetes e votações no Discord com bot: qual formato escolher",
    "name": "Enquete no Discord com bot: enquete nativa, reações ou botões",
    "abstract": "O Discord tem enquete nativa e o bot consegue enviar uma com um campo na mensagem. Veja quando ela basta, quando reações ou botões fazem mais sentido, como limitar a um voto e como ler o resultado.",
    "description": "Crie enquetes no Discord com discord.js v14: use a enquete nativa pelo campo poll, compare com reações e botões, limite o voto único e leia o resultado.",
    "datePublished": "2026-11-13",
    "dateModified": "2026-11-13",
    "author": {
      "@type": "Organization",
      "name": "Equipe StreetHosting"
    },
    "publisher": {
      "@type": "Organization",
      "name": "StreetHosting",
      "url": "https://streethosting.com.br"
    },
    "inLanguage": "pt-BR",
    "mainEntityOfPage": {
      "@type": "WebPage",
      "@id": "https://streethosting.com.br/guias/bots-discord/bot-discord-enquetes-votacao"
    }
  },
  {
    "@context": "https://schema.org",
    "@type": "FAQPage",
    "mainEntity": [
      {
        "@type": "Question",
        "name": "O bot consegue criar a enquete nativa do Discord?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Sim. No discord.js v14, atual, a mensagem aceita o campo poll, com pergunta, respostas, duração em horas e a opção de múltipla escolha. O bot precisa da permissão Send Polls no canal. Versões antigas da biblioteca não conhecem esse campo, então atualize o pacote."
        }
      },
      {
        "@type": "Question",
        "name": "Dá para editar uma enquete depois de enviada?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Não. Pergunta, respostas e duração ficam fixas. O que dá para fazer é encerrar antes com poll.end(), caso o bot tenha enviado a enquete, ou criar outra."
        }
      },
      {
        "@type": "Question",
        "name": "Como garantir um voto só por pessoa?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Na enquete nativa, deixe allowMultiselect como false e o próprio Discord impede mais de uma resposta. Em reações, o bot precisa remover as outras reações do usuário. Em botões, uma chave primária por mensagem e usuário no banco resolve."
        }
      },
      {
        "@type": "Question",
        "name": "Qual a duração máxima da enquete nativa?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "A duração é informada em horas e o Discord aceita de 1 hora até 768 horas, que são 32 dias. Se você não informar, o padrão é 24 horas."
        }
      },
      {
        "@type": "Question",
        "name": "Quando devo preferir botões em vez da enquete nativa?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Quando você precisa de regras que a enquete nativa não oferece: voto só de quem tem certo cargo, voto com peso diferente, resultado escondido até o fim ou registro dos votos no seu banco."
        }
      }
    ]
  }
]
```
