Criar APK grátis

Notificações

AppMint Push - Notifique seus usuários

Envie notificações para todos que instalaram seu app, direto do AppMint no seu próprio projeto do Firebase - agende, edite depois de enviar, cancele, links diretos

1Como funciona#

O AppMint Push envia notificações para todos que instalaram seu app, de dentro do AppMint - envie agora, agende, edite depois de enviar, cancele, links diretos.

Toda mensagem pode ser desenhada: 8 modelos, sua própria cor, até 3 botões que abrem cada um sua própria página, opções de som e pop-up, e um banner, cartão, painel ou tela cheia nativo dentro do app enquanto ele está aberto. Uma prévia ao vivo mostra exatamente como ficará nos celulares dos usuários.

Ele roda no SEU PRÓPRIO projeto do Firebase: seus usuários, seu projeto, sem limites compartilhados, e nada seu hospedado pelo AppMint. O Firebase Cloud Messaging é grátis e sem limite de mensagens.

Você precisa de dois arquivos desse projeto - google-services.json (para a build) e uma chave de conta de serviço (para enviar). As próximas etapas obtêm os dois. Funciona com todos os modos de build: site, ZIP, HTML e IA.

AppMint Push e OneSignal são alternativas: ativar um desativa o outro.

2Crie um projeto do Firebase#

Vá ao Firebase Console e clique em 'Add project' (ou abra um projeto que você já tem). Um projeto gratuito do Firebase basta - não é preciso faturamento para notificações.

Um projeto pode abrigar vários dos seus apps.

3Adicione seu app e baixe o google-services.json#

No seu projeto do Firebase:

  • Clique em 'Add app' e escolha Android
  • Digite o nome do pacote EXATAMENTE como definido no assistente do AppMint (por exemplo com.yourname.yourapp) - um nome diferente faz as notificações nunca chegarem, e o AppMint recusa a build por isso
  • Clique em 'Register app' e baixe o google-services.json
  • Você pode pular as demais etapas do SDK - o AppMint cuida delas

4Ative e envie o arquivo#

No cartão Notificações push do assistente de build:

  • Ative o 'AppMint Push'
  • Toque em 'Upload google-services.json' e escolha o arquivo da etapa anterior

O assistente verifica se o arquivo contém o nome do seu pacote. Depois compile seu APK normalmente - durante a build, seu app é registrado para push no seu projeto.

Os usuários só instalam o app e o abrem uma vez. No Android 13+, é pedido a eles que permitam notificações depois que a primeira tela carrega.

Modelos, botões e estilos dentro do app exigem um app compilado com esta versão do AppMint ou mais recente. Uma build mais antiga ainda recebe todas as mensagens - e as mostra no estilo simples de sempre.

5Envie sua chave de conta de serviço (uma vez)#

O AppMint envia pelo seu projeto, então precisa de uma chave dele - o mesmo arquivo que o OneSignal pede.

No Firebase Console:

  • ⚙ Project settings → aba 'Service accounts'
  • Clique em 'Generate new private key' e confirme - um arquivo JSON é baixado

No AppMint: Home > Notifications → escolha seu app → 'Upload key' → escolha esse JSON.

O AppMint verifica a chave com um envio de teste ao seu projeto antes de guardá-la (criptografada), então um check verde significa que o próximo envio realmente sairá. Um envio por app; recompilar o app não exige enviá-la de novo, a menos que você troque de projeto do Firebase.

⚠️ Envie aqui a chave da CONTA DE SERVIÇO, não o google-services.json - a tela avisa se você as confundir. Para revogar o acesso depois, exclua a chave no Firebase Console.

6Envie sua primeira notificação#

Em Home > Notifications:

  • Escolha seu app
  • Escreva um título (mensagem, imagem e link são opcionais)
  • Confira o cartão Live preview
  • Toque em 'Send Notification'

Todo celular com seu app instalado a recebe.

Para a imagem, toque na caixa Image: 'Choose from device' (até 2 MB, PNG, JPEG ou WebP) ou 'Paste an image link' (https://). Uma imagem escolhida só é enviada quando você aperta Send - antes disso você pode escolher, trocar ou remover quantas vezes quiser.

7Escolha um modelo#

Design → Template define o layout da notificação. O texto sempre vem primeiro - uma imagem nunca cobre a mensagem:

  • Automático - cartão com imagem quando a mensagem tem uma imagem, caso contrário Padrão
  • Padrão - título e a mensagem inteira; uma imagem vira uma miniatura ao lado
  • Cartão com imagem - a imagem ABAIXO do título e da mensagem legíveis
  • Banner - um cartão preenchido com a sua cor, com um selo opcional
  • Promoção - um selo como '50% OFF' e um botão colorido (seu primeiro botão)
  • Lista - até 6 linhas curtas, por exemplo várias atualizações de pedido
  • Contagem regressiva - um cronômetro ao vivo que conta até uma data e hora escolhidas e depois sai da bandeja sozinho
  • Progresso - uma barra de progresso; edite e reenvie com um novo valor e a barra avança em todos os celulares sem vibrar de novo
  • Mínimo - título e uma linha, sem som, sem pop-up

Os tamanhos de texto e de imagem se adaptam ao tamanho de fonte de cada usuário, então nada é cortado em celulares com texto grande.

8Escolha uma cor#

Design → Colour dá cor ao ícone, banner, botões e contagem regressiva da notificação. Escolha uma das 9 cores prontas ou '+' para qualquer #RRGGBB.

Toda cor pronta fica legível em celulares claros e escuros. Uma cor personalizada é verificada nos dois: se for clara ou escura demais, a nota abaixo das cores avisa, e 'Fix contrast' na caixa de cor personalizada a ajusta para o tom mais próximo que funciona, mantendo o matiz. O texto em um botão ou banner colorido é escrito em preto ou branco automaticamente.

Use os blocos 'Light phone' / 'Dark phone' na Live preview para ver os dois.

9Adicione botões#

Design → Buttons: '+ Add button' (até 3). Cada um tem um rótulo (até 24 caracteres) e seu próprio link - por exemplo 'Track order' → #/orders/1042 e 'Help' → #/support. Deixe o link de um botão vazio para abrir o link principal.

Os botões aparecem sob a notificação na bandeja e na apresentação dentro do app. No modelo Promo, o primeiro botão vira o botão colorido grande do cartão.

10Enquanto o app está aberto#

Design → 'While the app is open' decide o que o usuário vê quando a mensagem chega enquanto ele usa seu app:

  • Design próprio do app (padrão) - o código do seu app a mostra (veja Caixa de entrada no app abaixo)
  • Banner superior - desliza de cima e se esconde sozinho após alguns segundos
  • Cartão central - um cartão sobre o app escurecido com a imagem, o texto e os botões
  • Painel inferior - o mesmo cartão subindo da parte de baixo
  • Tela cheia - uma imagem grande com os botões na parte de baixo

A apresentação segue o tema claro ou escuro do celular, e Voltar ou tocar fora a fecha. Quando ela é exibida, a mesma mensagem não vai também para a bandeja - o usuário já está olhando para ela.

Com 'In-app only' (Delivery → Show as), uma mensagem que chega com o app fechado é exibida na próxima vez que o usuário o abrir.

11Som, pop-up e horário#

Design → Behaviour:

  • Som - desligado para uma notificação silenciosa
  • Aparecer na tela - desligado para não interromper o que o usuário está fazendo (ela ainda chega à bandeja)
  • Dispensar automaticamente - remove a notificação da bandeja após de 30 segundos a 3 dias (Android 8 e mais recente)

Opções avançadas:

  • Imagem de ícone / avatar - uma imagem redonda ao lado do texto (link https://)
  • Chave de agrupamento - as mensagens que a compartilham ficam agrupadas sob um título
  • Chave de substituição - uma mensagem mais nova com a mesma chave SUBSTITUI a anterior no celular e na caixa de entrada, por exemplo um placar ao vivo

Os usuários também podem ajustar o som por tipo nas configurações de notificação do Android para o seu app.

Seu próprio som: no assistente, Integrate → Push Notifications → Notification sound (MP3, OGG, WAV, M4A, AAC, FLAC ou Opus, até 1 MB e 30 segundos). Ele toca em toda mensagem enviada com Som ligado. Os apps instalados o recebem com a atualização que o traz; cada usuário ainda pode alterá-lo nas configurações de notificação do Android.

12Teste, salve e reutilize#

  • Live preview - blocos Collapsed, Expanded e In-app, em um celular claro ou escuro, desenhados pelo mesmo código que roda nos celulares dos seus usuários
  • 'Test on this phone' - mostra a mensagem apenas no SEU celular, como uma notificação real ou como a apresentação dentro do app sobre a tela de Notificações. Nada é enviado aos usuários
  • Modelos salvos (ícone de livro no topo) - 'Save the current message as a template' guarda o texto, o link, a imagem e todas as escolhas de design neste celular; 'Use' os carrega de volta com um toque
  • No Histórico, 'Duplicate as a new message' começa uma nova mensagem a partir de qualquer anterior

13Agende para depois#

No cartão Delivery, toque em 'Schedule' em When e escolha uma data e hora. A notificação sai automaticamente naquele momento.

Até que ela seja enviada, você pode editá-la ou cancelá-la pela lista do Histórico abaixo.

14Corrija um erro depois de enviar#

Toque em qualquer notificação no Histórico:

  • 'Edit & resend' - carrega a mensagem de volta no editor com todo o design; 'Update & resend' então a substitui NO LUGAR em todos os dispositivos
  • 'Cancel' - remove de todos os celulares onde ainda não foi aberta, inclusive uma apresentação dentro do app ainda na tela
  • 'Delete' - igual a cancelar, e remove do seu histórico

⚠️ Uma notificação que o usuário já abriu ou dispensou não pode ser retirada.

15Abra uma página específica#

O campo opcional Link controla o que um toque abre (cada botão pode ter o seu):

  • Um endereço https:// completo (ótimo para apps de site)
  • Uma rota dentro do app como #/offers

O código do seu app também pode lê-lo a qualquer momento:

const link = window.WebToApk?.getLaunchUrl?.();
window.addEventListener('appmint:deep-link',
  e => goTo(e.detail.url));

16Caixa de entrada no app (opcional)#

Todo push também é guardado dentro do app instalado (os últimos 50), então seu app pode mostrar a própria tela de notificações com indicadores de não lidas. Isso funciona em TODOS os modos de build - inclusive apps de site (URL), onde você só adiciona estas poucas linhas ao seu próprio site.

Quando o shell já mostrou uma mensagem na tela (um estilo em 'While the app is open'), o evento diz presented: true - não desenhe um segundo banner nesse caso. Um app que desenha todos os próprios banners pode desligar os do shell com setPushPresentation('none').

Dispensar é um GESTO DE DESLIZAR, não um ✕ minúsculo, e é reversível - combine com um breve Desfazer:

const B = window.WebToApk;
const inbox = JSON.parse(B?.getPushInbox?.() ?? "[]");
// [{id,title,body,imageUrl,link,receivedAt,read,
//   template?,accent?,buttons?,badge?,inapp?...}]
const unread = inbox.filter(m => !m.read).length;

// live arrival while the app is open
window.addEventListener('appmint:push', e => {
  const d = e.detail;
  if (d.type === 'received' && !d.presented) showBanner(d.message);
  refreshInbox();   // fires for 'revoked' too
});

B?.markPushRead?.(id);        // "" = mark all read
B?.dismissPushMessage?.(id);  // swipe away
B?.restorePushMessage?.(id);  // ...Undo
B?.setPushPresentation?.('none'); // app draws its own

17Se nada chegar ao seu celular de teste#

Quase sempre é um limite do CELULAR DE TESTE, não do seu app nem dos seus usuários.

O Android permite cerca de 100 registros de push por celular. Toda instalação NOVA de um app que usa notificações ocupa um - então instalar build após build durante os testes pode esgotá-los, e esse celular para de receber para apps recém-instalados.

Libere vagas (isto é o que realmente funciona):

  • Desinstale apps de teste que você não precisa mais - o Android libera a vaga que cada um ocupava
  • Ou limpe os dados de um app de teste: Settings > Apps > [esse app] > Storage > Clear data - isso libera a vaga dele sem desinstalar
  • Em um emulador, apagar os dados dele zera todas as vagas de uma vez

Reiniciar o celular NÃO ajuda: esses registros são guardados permanentemente, e por isso sobrevivem a uma reinicialização. Limpar o cache do Google Play Services também não os libera.

Evite durante os testes:

  • Mantenha UM só nome de pacote enquanto itera - cada nome de pacote diferente ocupa uma vaga própria
  • Instale o novo APK POR CIMA do antigo em vez de desinstalar antes - uma atualização mantém o registro existente, uma reinstalação gasta um novo
  • Teste em um celular reserva ou em um emulador; apagar os dados de um emulador zera as vagas dele na hora
  • Exclua os apps de teste que você já terminou de usar

Confira também o básico: o app foi aberto pelo menos uma vez depois de instalado e as notificações estão permitidas para ele nas configurações do Android. O app se inscreve de novo a cada abertura, então se recupera sozinho assim que as vagas forem liberadas - não precisa recompilar.

18Limites e boas práticas#

  • Sem limite de quantas notificações você envia - o Firebase Cloud Messaging é grátis
  • Título de até 120 caracteres, mensagem de até 1000; os links de imagem e ícone devem ser https://
  • Até 3 botões (rótulos de 24 caracteres) e até 6 linhas de lista
  • No plano grátis, um anúncio curto passa antes de cada envio
  • Apps de teste: remova-os com o ícone de lixeira ao lado do seletor de apps - isso apaga apenas o histórico e a chave guardada no AppMint; seu projeto do Firebase não é tocado, e uma nova build adiciona o app de volta
  • Recompilar com um google-services.json NOVO do MESMO projeto não muda nada: sua chave continua valendo, as instalações existentes continuam recebendo
  • ⚠️ Mover o app para um projeto do Firebase DIFERENTE é uma ruptura total. Recompile com o novo google-services.json, envie a chave do novo projeto (o AppMint descarta a antiga, já que ela nunca poderia enviar pelo novo projeto) - e saiba que os celulares ainda com a versão ANTIGA param de receber até os usuários atualizarem. As notificações chegam a um projeto, e essas instalações ainda estão ouvindo o antigo
  • Envie com moderação: usuários desinstalam apps que os enchem de mensagens

19Escolha quem recebe#

Em 'Who gets it', uma mensagem vai para Everyone (o padrão) ou para os celulares que você escolher:

  • Países, idiomas, versões do Android e versões do app
  • Atividade - abriu o app nos últimos N dias, ou não o abre há N dias
  • Apenas celulares com as notificações ativadas
  • IDs de usuário e tags que a página do seu app define (próxima etapa)

Antes de enviar, a tela mostra quantos celulares a sua escolha alcança.

Mais formas de enviar:

  • Horário local de cada celular (em When) - por exemplo 09:00 no relógio de cada celular, fuso por fuso
  • Teste A/B - escreva uma versão B; cada versão vai para uma parte de teste do público e, depois da espera que você definir, a que tiver mais aberturas (ou toques) vai para todos os outros
  • Limite diário por celular - o máximo de mensagens que um celular recebe deste app em um dia; as mensagens acima disso são puladas para esse celular e aparecem como 'skipped (daily limit)'

O Histórico mostra, para cada mensagem, para quantos celulares ela foi, quantos falharam e quantos foram pulados.

⚠️ Escolher o público, horário local, testes A/B, automações e o limite diário só alcançam celulares com um app compilado a partir de 30 Sep 2026 (eles se registram sozinhos). Celulares com builds mais antigas ainda recebem envios para 'Everyone' - recompile e publique uma atualização para alcançá-los também dessa forma.

20Segmente usuários conectados e tags#

A página do seu app diz ao AppMint Push quem está conectado e o que saber sobre esta instalação. Assim você pode enviar para um usuário ou para todos com uma tag como plan = pro.

  • setPushUser - após o login, com o id da SUA PRÓPRIA conta (o id do banco de dados, nunca um e-mail ou número de telefone). Letras, dígitos e _ @ . : + - (até 128). Chame com "" ao sair da conta, ou o celular continua recebendo as mensagens desse usuário
  • setPushTag / setPushTags - um nome de tag (letras, dígitos e _, até 32) e um valor (até 128). "" remove uma tag; até 50 por instalação
  • getPushUser / getPushTags - leia o que este celular guarda

IDs e tags pertencem à instalação, não à conta: limpe também as tags específicas do usuário ao sair da conta. O celular informa a mudança alguns segundos depois (na próxima abertura, se estiver offline). O mesmo usuário conectado em dois celulares é alcançado nos dois.

const B = window.WebToApk;

// after sign-in: your own account id
B?.setPushUser?.(user.id);
B?.setPushTag?.('plan', user.isPro ? 'pro' : 'free');
B?.setPushTags?.(JSON.stringify({ city: 'pune', level: '12' }));

// on sign-out
B?.setPushUser?.('');
B?.setPushTag?.('plan', '');

// read back
const who = B?.getPushUser?.() ?? '';
const tags = JSON.parse(B?.getPushTags?.() ?? '{}');

21Automações#

Mensagens que saem sozinhas. Em Automations, toque em '+ New' e escolha uma:

  • Boas-vindas - N minutos após uma nova instalação (de 0 minutos a 30 dias). Cada celular recebe uma vez
  • Reengajamento - quando alguém não abre o app há N dias (1 a 180). Uma vez por ausência: um celular que volta e se afasta de novo recebe a mensagem de novo
  • Tag - N minutos depois que a página do seu app define uma tag, opcionalmente só para um valor. Só é enviada se a tag ainda estiver definida quando o tempo acabar

Carrinho abandonado: defina uma tag quando itens entrarem no carrinho e remova-a no checkout. Uma automação 'cart' com atraso de 60 minutos então lembra apenas quem saiu sem comprar. Definir o mesmo valor de novo não reinicia a contagem; depois que a tag for removida, defini-la de novo pode enviar mais uma vez.

As automações contam para o limite diário por celular e alcançam celulares com builds feitas a partir de 30 Sep 2026.

const B = window.WebToApk;

// items added to the cart
B?.setPushTag?.('cart', 'open');

// checkout finished, or the cart emptied: no reminder
B?.setPushTag?.('cart', '');

22Alcance usuários com as notificações desativadas#

Um celular com as notificações desativadas nunca mostra uma notificação na bandeja - mas sua mensagem ainda chega ao app, e uma mensagem dentro do app aparece na próxima vez que o usuário o abrir. Use isso para pedir que ele ative as notificações de novo:

  • Who gets it → Choose who → ative 'Notifications off'
  • Show as → In-app only (um Top banner ou Centre card em Design)
  • Design → Buttons → '+ “Turn on notifications” button'. O link dele é appmint://notifications/enable: um toque mostra o pedido de permissão ou abre as configurações de notificação do app quando o pedido não pode mais ser exibido

Quando o app tem celulares com notificações desativadas, a central de envio mostra 'Reach the N phones with notifications off' abaixo da chave do Firebase - um toque define as três opções. Assim que um usuário ativa as notificações, o celular dele sai desse público.

O botão exige um app compilado com esta versão do AppMint ou mais recente; builds mais antigas tratam o link como um link comum. appmint://notifications/settings abre a tela de configurações diretamente.

// Your page can offer the same thing itself:
const r = await window.AppMint?.enableNotifications?.();
// r = { state: 'granted' | 'prompt' | 'blocked' | 'unavailable',
//       changed, openedSettings }

// and hear a push button's result too:
window.addEventListener('appmint:notifications', e => {
  if (e.detail.state === 'granted') hideNotifBanner();
});

23Mensagens dentro do app#

Mensagens dentro do app são campanhas que você cria na central de envio: Push Notifications → 'In-app messages' → '+ New'. O app as baixa e as exibe por conta própria, sem push, quando o gatilho escolhido acontece:

  • Abertura do app - a N-ésima abertura do app
  • Uma página ou rota (/checkout, #/cart, /product/*)
  • Tempo no app - N segundos no app
  • Um evento que sua página registra (próxima etapa)
  • Uma tag de push
  • Notificações desativadas - combine com um botão 'Turn on notifications'
  • Atualização do app - a primeira abertura após uma atualização

Mostre-a como banner, modal, painel ou tela cheia. Cada mensagem tem uma frequência (uma vez por instalação por padrão), um público opcional e um horário opcional de início e fim. Requer o AppMint Push na build.

24Conte ao app o que aconteceu#

A parte da sua página é pequena: informe os momentos importantes com trackEvent. Uma mensagem cujo gatilho é 'When an event happens' com o mesmo nome aparece agora (ou após a espera que você escolheu). Nomes: letras, dígitos e _ . : - (até 64). Os eventos não são contados nem guardados em lugar nenhum; eles só decidem se uma mensagem aparece.

As mensagens de rota acompanham mudanças reais de URL (carregamento de páginas, pushState, rotas #hash) por conta própria. Uma tela que o endereço não mostra (uma aba, uma etapa de assistente) pode ser informada como rota com o evento appmint:route.

if (window.AppMint && AppMint.trackEvent) AppMint.trackEvent('checkout_done', { total: 42 });

// raw bridge: props as a JSON string ('' for none)
WebToApk.trackEvent('level:3', '');

// a view the address does not show, reported as a route
window.dispatchEvent(new CustomEvent('appmint:route', { detail: { path: '/cart' } }));

25Desenhe as mensagens você mesmo (opcional)#

Toda mensagem dispara appmint:inapp com { type: 'shown' | 'clicked' | 'dismissed', id, name } (e chama window.onAppMintInApp(detail) se você a definir).

Para desenhar as mensagens você mesmo, chame WebToApk.setInAppPresentation('none'): o app então não desenha nada e o evento 'shown' traz presented: false e a mensagem (título, corpo, imagem, botões). setInAppPresentation('auto') devolve o desenho ao app. WebToApk.getInAppCampaigns() lista o que esta instalação guarda ([{id, name}]).

Tudo isso exige o AppMint Push na build; em qualquer outra build os métodos respondem false / "[]".

window.addEventListener('appmint:inapp', e => {
  // e.detail = { type: 'shown' | 'clicked' | 'dismissed', id, name, presented?, message? }
  if (e.detail.type === 'shown' && e.detail.presented === false) drawMyBanner(e.detail.message);
});

WebToApk.setInAppPresentation('none');   // 'auto' gives drawing back to the app
const held = JSON.parse(WebToApk.getInAppCampaigns() || '[]');   // [{id, name}]

26Comece a partir de um modelo#

'+ New' abre uma galeria de mensagens prontas, cada uma com prévia ao vivo que você pode buscar ou filtrar por layout: Welcome, Rate us, Turn on notifications, What's new, Flash sale (com contagem regressiva ao vivo), Seasonal promo, New feature, Update available, Abandoned cart, Win back, Star survey, NPS score, Invite friends, Subscription offer, Streak, Tip, Permission explainer, Maintenance (fica até ser fechada), Terms update (sem botão de fechar) e Follow us. Um modelo preenche o layout, emoji ou imagem, texto, botões, gatilho e frequência - mude o que quiser antes de salvar. 'Blank message' começa vazia.

Star survey, Rate us e NPS fazem uma pergunta: uma fileira de 1 a 5 estrelas ou uma nota de 0 a 10. O primeiro botão espera uma resposta; a resposta é informada uma vez, quando a mensagem fecha, como um evento 'answered' appmint:inapp { value, question }, e a central de envio mostra a média de estrelas ou a nota NPS com a distribuição.

Os links dos botões também podem ser appmint://review (a janela de avaliação do Google Play), share:text (a janela de compartilhar), copy:text (a área de transferência), route:/page e event:name. O texto pode usar {app}, {store}, {name}, {streak} e {tag:key}, preenchidos em cada celular; {name|friend} dá uma palavra para quando não há valor. Uma mensagem cujo marcador não tem valor não é exibida. Requer um app compilado com esta versão ou mais recente.

window.addEventListener('appmint:inapp', e => {
  const d = e.detail;
  if (d.type === 'answered') {
    // d.question: 'stars' (1-5) or 'nps' (0-10); d.template e.g. 'survey_stars'
    if (d.question === 'nps' && d.value <= 6) openFeedbackForm();
  }
  if (d.type === 'clicked' && d.link === 'event:allow') askForLocation();
});

// {streak} and {tag:key} come from push tags
WebToApk.setPushTag('streak', '7');

Esta página é gerada a partir do Guia de Integração dentro do próprio app, então diz exatamente o que a versão atual diz. Leia em Markdown.

Conferido com o guia atual em 22/10/2026.