Você fica sabendo de tudo
Pedido de reembolso chega por e-mail e no painel. Cancelamento e reembolso aprovado chegam no seu webhook.
Área do cliente
Um link por compra, gerado pela API: o cliente entra com um código no e-mail, vê os pagamentos, abre o recibo, troca o cartão, cancela a assinatura e pede reembolso. O reembolso só sai quando você aprova.
As perguntas que mais lotam o suporte de quem vende online, respondidas numa página só, no celular do cliente.
Você no controle
O cliente pede, você decide. A área do cliente organiza o pedido com motivo e anexos, e o dinheiro só volta quando você aprova no painel.
O cliente resolve o simples sozinho, e o que mexe com dinheiro passa por você, com aviso em cada passo.
Pedido de reembolso chega por e-mail e no painel. Cancelamento e reembolso aprovado chegam no seu webhook.
O cliente digita o e-mail da compra e entra com um código de 6 dígitos. Sem o e-mail, ninguém entra.
Cada link abre uma compra de um cliente. Ele não vê outras compras nem outras lojas.
Cartão vencido? O cliente troca sozinho, e a cobrança em atraso passa no cartão novo na hora.
Gere links com a chave de teste e veja a área do cliente antes de mandar pros clientes.
Vem com a conta: você paga só as taxas das vendas, como sempre.
Pela API
Cada link abre uma compra de um cliente: ele não vê outras compras nem outras lojas. Gere na hora da venda ou só quando ele pedir ajuda.
POST /v2/customer-portal/create com o customerId e o checkoutId. Chamar de novo devolve o mesmo link.curl -X POST https://api.abacatepay.com/v2/customer-portal/create \
-H "Authorization: Bearer $ABACATEPAY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"customerId": "cust_abc123xyz",
"checkoutId": "bill_abc123xyz"
}'const res = await fetch("https://api.abacatepay.com/v2/customer-portal/create", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.ABACATEPAY_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
customerId: "cust_abc123xyz",
checkoutId: "bill_abc123xyz",
}),
});
const { data, error } = await res.json();
if (error) throw new Error(error);
// mande data.url no e-mail ou no botão "Minha assinatura"
console.log(data.url);import os
import requests
res = requests.post(
"https://api.abacatepay.com/v2/customer-portal/create",
headers={"Authorization": f"Bearer {os.environ['ABACATEPAY_API_KEY']}"},
json={
"customerId": "cust_abc123xyz",
"checkoutId": "bill_abc123xyz",
},
)
body = res.json()
if body["error"]:
raise Exception(body["error"])
# mande body["data"]["url"] pro seu cliente
print(body["data"]["url"])<?php
$ch = curl_init("https://api.abacatepay.com/v2/customer-portal/create");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("ABACATEPAY_API_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"customerId" => "cust_abc123xyz",
"checkoutId" => "bill_abc123xyz",
]),
]);
$body = json_decode(curl_exec($ch), true);
// mande $body["data"]["url"] pro seu cliente
echo $body["data"]["url"];{
"data": {
"id": "cpl_abc123xyz",
"url": "https://portal.abacatepay.com/k3J9xQ2mP7vL1nR8sT4wY6zA0bC5dE2f",
"customerId": "cust_abc123xyz",
"checkoutId": "bill_abc123xyz",
"devMode": false,
"createdAt": "2026-10-29T12:00:00.000Z"
},
"success": true,
"error": null
}A área do cliente abre com o nome e o logo da sua loja, e o link vai onde você já conversa com o cliente: no e-mail, no app ou no WhatsApp.
Um botão no e-mail de boas-vindas ou de cada cobrança, com o link daquela compra.
Gere o link quando o cliente clicar e mande ele direto pra área, já na compra certa.
Em vez de procurar o recibo, o atendente manda o link, e a próxima dúvida o cliente resolve sozinho.
Meios de pagamento e recursos na mesma conta da sua área do cliente.
O que mais perguntam os lojistas antes de mandar o link pros clientes.
É uma página pronta da AbacatePay onde o seu cliente vê e resolve sozinho o que comprou na sua loja: pagamentos, recibos, assinatura e pedido de reembolso. Você manda um link e ele não precisa chamar o seu suporte.
Ver os pagamentos daquela compra, com status e forma de pagamento, abrir o recibo de cada um, trocar o cartão da assinatura, cancelar a assinatura no fim do período já pago e pedir o reembolso de um pagamento recente.
Não. Ele pede o reembolso com o motivo, uma descrição e até 3 anexos, e você aprova ou nega no painel. O pedido vale até 7 dias depois do pagamento, um por pagamento. Aprovado, o valor volta pelo mesmo meio: Pix de volta pra conta que pagou ou estorno no cartão.
Você tem 5 dias. Sem resposta, o pedido passa pro time da AbacatePay, que decide. Quando o cliente diz que não reconhece a cobrança, o pedido já começa com a gente, por ser suspeita de fraude.
Pela API: POST /v2/customer-portal/create com o customerId e o checkoutId da compra. A resposta traz a url, que você manda pro cliente. Chamar de novo com os mesmos dados devolve o mesmo link, então não precisa guardar.
Não precisa. Ele abre o link e digita o e-mail da compra. Se bater com o do cadastro, recebe um código de 6 dígitos, válido por 10 minutos, e a sessão dura 1 hora. Sem acesso ao e-mail, ninguém entra, mesmo com o link.
Não. Cada link mostra uma compra de um cliente na sua loja, e mais nada.
O pedido de reembolso chega por e-mail e no painel. O cancelamento dispara o webhook subscription.cancelled com o motivo que o cliente escolheu, e o reembolso aprovado, o checkout.refunded, como se tivesse sido feito por você.
Com a assinatura em dia, não: só as próximas cobranças passam a ir pro cartão novo. Se houver uma cobrança em atraso, ela é cobrada no cartão novo na hora.
Nada. A área do cliente vem com a conta: você paga só as taxas das vendas, R$ 0,80 fixo no Pix e, no cartão, de 5,42% + R$ 0,60 à vista a 17,37% + R$ 0,60 em 12x, recebendo no dia seguinte. Sem mensalidade e sem adesão.
Sim. Por enquanto a AbacatePay é só pra CNPJ. MEI serve.
Sem mensalidade e sem adesão.
Crie a conta, gere o primeiro link da área do cliente e deixe o seu suporte pro que precisa de gente.
Sem mensalidade. Aprovação não leva semanas.
