Agendamento no seu site (embed)
Com o embed, o cliente escolhe o serviço, o horário e confirma a reserva
sem sair do seu site. Basta colar uma linha de código na página: o script
embed.js monta o agendamento num iframe seguro, servido por
https://calendar.sendeasy.app.
O jeito mais rápido é gerar o código no painel: Calendário → Página pública → Compartilhar. Lá você escolhe o calendário, o serviço, o formato, a cor e as campanhas, copia o código pronto e vê uma prévia.
Requisitos
- O recurso de agendamento no site liberado para a sua empresa.
- Um calendário de horários com tipos de evento (serviços) ativos. Calendários de hospedagem não têm embed: use o link do calendário.
- O seu site em https. Páginas em
httpou abertas como arquivo local não conseguem mostrar o agendamento.
Instalação
Cole o código onde o agendamento deve aparecer:
<script src="https://calendar.sendeasy.app/embed.js"
data-sendeasy-calendar="SEU_CALENDARIO"
data-mode="inline"
async></script>
SEU_CALENDARIO é o endereço do calendário, o mesmo do link
https://calendar.sendeasy.app/c/SEU_CALENDARIO.
Para colocar o agendamento dentro de um elemento seu (e não logo depois da tag), marque o elemento e carregue o script uma vez na página:
<div data-sendeasy-calendar="SEU_CALENDARIO" data-type="consulta-30"></div>
<script src="https://calendar.sendeasy.app/embed.js" async></script>
Formatos
data-mode | O que aparece |
|---|---|
inline (padrão) | O agendamento dentro da página, logo depois da tag (ou dentro do elemento marcado). A altura acompanha o conteúdo. |
popup | Um botão no lugar da tag. O clique abre o agendamento numa janela sobre a página. Num elemento marcado que não seja <script>, o próprio elemento vira o botão. |
button | Um botão flutuante fixo no canto inferior direito da página, que abre a mesma janela. |
A janela fecha no X, com Esc, com um clique fora dela ou pelo botão Fechar da confirmação.
Opções
- Name
data-sendeasy-calendar- Type
- obrigatório
- Description
Endereço do calendário (letras, números,
.,_,~e-, até 190 caracteres).
- Name
data-type- Type
- opcional
- Description
Endereço do serviço (tipo de evento), por exemplo
consulta-30. Abre direto nesse serviço, inclusive um serviço oculto. Sem ele, o cliente vê a lista de serviços.
- Name
data-mode- Type
- opcional
- Description
inline,popupoubutton. Outro valor virainline.
- Name
data-label- Type
- opcional
- Description
Texto do botão nos formatos
popupebutton, até 60 caracteres. Padrão:Agendar.
- Name
data-color- Type
- opcional
- Description
Cor do botão e dos destaques do agendamento, em hexadecimal (
#0f766eou#0a7).
- Name
data-lang- Type
- opcional
- Description
Idioma do agendamento:
pt,pt-BR,en,en-US,esoues-ES. Sem ele, vale o idioma do navegador do visitante.
- Name
data-utm-source, data-utm-medium, data-utm-campaign, data-utm-term, data-utm-content- Type
- opcional
- Description
Campanha da reserva, até 200 caracteres cada. A reserva já fica marcada como vinda do site (com o domínio, nunca o caminho da página); as UTM ajudam a separar páginas ou ações.
Valores fora do formato são ignorados: o agendamento abre com o padrão. Nenhum valor vira HTML: o texto do botão entra como texto puro.
API JavaScript
Com o embed.js na página, abra o agendamento a partir de qualquer botão seu:
<button type="button" id="agendar">Agendar</button>
<script src="https://calendar.sendeasy.app/embed.js" async></script>
<script>
document.getElementById('agendar').addEventListener('click', function () {
if (window.SendeasyCalendar) {
window.SendeasyCalendar.open({ calendar: 'SEU_CALENDARIO', type: 'consulta-30' })
}
})
</script>
window.SendeasyCalendar.open(opcoes)abre a janela e devolvetrue(oufalsecom calendário inválido). Opções:calendar(obrigatório),type,color,langeutm({ source, medium, campaign, term, content }).window.SendeasyCalendar.close()fecha a janela aberta.
Como o script carrega com async, confira se window.SendeasyCalendar já existe
antes de chamar.
Mensagens para o seu site (postMessage v1)
O agendamento avisa a página com postMessage. Toda mensagem tem o formato:
{ "source": "sendeasy", "v": 1, "type": "..." }
type | Campos | Quando |
|---|---|---|
ready | O agendamento carregou. | |
resize | height (px, até 20000) | A altura do conteúdo mudou. O embed.js já ajusta o formato inline sozinho. |
slot_selected | date (AAAA-MM-DD), time (HH:mm) | O cliente escolheu um horário. Data e hora locais do estabelecimento. |
booking.created | code, status, startAt | A reserva foi criada. code é o código de 8 caracteres (ou null), status é HOLD, PENDING_PAYMENT, AWAITING_APPROVAL, CONFIRMED ou CANCELLED, e startAt é o início em ISO 8601 (UTC). |
booking.payment_required | code | A reserva precisa de pagamento; o botão de pagamento abre o checkout numa nova aba. |
closed | O cliente fechou o agendamento (Esc ou Fechar), nos formatos popup e button. |
As mensagens não levam dado pessoal: nada de nome, e-mail, telefone, respostas, links de pagamento ou de gerenciamento. O agendamento não aceita mensagens da sua página. Sempre confira a origem antes de usar:
window.addEventListener('message', function (event) {
if (event.origin !== 'https://calendar.sendeasy.app') return
var data = event.data
if (!data || data.source !== 'sendeasy' || data.v !== 1) return
if (data.type === 'booking.created') {
// Exemplo: evento de conversão no Google Analytics 4
gtag('event', 'agendamento_criado', { status: data.status })
}
})
As mensagens só são enviadas para páginas https cuja origem o navegador
informa ao iframe. Origem desconhecida: nenhuma mensagem sai.
CSP do seu site
Se o seu site envia o cabeçalho Content-Security-Policy, libere o domínio do
calendário para o script e para o iframe:
Content-Security-Policy: script-src 'self' https://calendar.sendeasy.app; frame-src https://calendar.sendeasy.app
Some essas origens às diretivas que você já usa (script-src e frame-src, ou
child-src se o site não usa frame-src). Do lado da Sendeasy, o iframe
aceita ser exibido por qualquer site https.
Versão fixa com SRI (opcional)
/embed.js recebe correções automaticamente (cache de até um dia). Para fixar
uma versão com Subresource Integrity, leia a versão e o hash nos cabeçalhos da
resposta:
curl -sI https://calendar.sendeasy.app/embed.js | grep -i x-sendeasy-embed
e use os dois valores:
<script src="https://calendar.sendeasy.app/embed.js?v=VERSAO"
integrity="sha384-HASH"
crossorigin="anonymous"
data-sendeasy-calendar="SEU_CALENDARIO"
async></script>
Quando o script mudar, a versão antiga deixa de bater com o hash e o navegador não executa nada: atualize os dois valores.
Limites
- O pagamento sempre abre na aba de topo, numa nova aba, fora do seu site.
O checkout e os links de gerenciamento da reserva nunca podem ser exibidos
dentro de um
iframe. - Só sites
https. Páginashttpnão exibem o agendamento. - Só calendários de horários com tipos de evento. Hospedagem continua pelo link do calendário.
- O
iframenão guarda nada entre visitas (os navegadores bloqueiam o armazenamento de terceiros); a confirmação fica na tela até o cliente fechar. - A página do agendamento dentro do
iframenão é indexada pelos buscadores. Para aparecer no Google, use a sua Página pública e o Perfil da Empresa no Google. - Uma janela por vez: abrir outra fecha a anterior.
Problemas comuns
| Sintoma | O que conferir |
|---|---|
| Nada aparece | O recurso está liberado para a empresa? O endereço do calendário está certo? O console do navegador mostra bloqueio de CSP? |
| Página de erro dentro do quadro | O calendário não tem serviços ativos ou o serviço de data-type não existe. |
O agendamento não aparece em http | O site precisa estar em https. |
| O pagamento abre em outra aba | É o esperado: o checkout nunca roda dentro do seu site. Depois de pagar, o cliente recebe a confirmação pelos canais da reserva. |