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.

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 http ou 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-modeO 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.
popupUm 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.
buttonUm 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, popup ou button. Outro valor vira inline.

  • Name
    data-label
    Type
    opcional
    Description

    Texto do botão nos formatos popup e button, até 60 caracteres. Padrão: Agendar.

  • Name
    data-color
    Type
    opcional
    Description

    Cor do botão e dos destaques do agendamento, em hexadecimal (#0f766e ou #0a7).

  • Name
    data-lang
    Type
    opcional
    Description

    Idioma do agendamento: pt, pt-BR, en, en-US, es ou es-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 devolve true (ou false com calendário inválido). Opções: calendar (obrigatório), type, color, lang e utm ({ 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": "..." }
typeCamposQuando
readyO agendamento carregou.
resizeheight (px, até 20000)A altura do conteúdo mudou. O embed.js já ajusta o formato inline sozinho.
slot_selecteddate (AAAA-MM-DD), time (HH:mm)O cliente escolheu um horário. Data e hora locais do estabelecimento.
booking.createdcode, status, startAtA 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_requiredcodeA reserva precisa de pagamento; o botão de pagamento abre o checkout numa nova aba.
closedO 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áginas http não exibem o agendamento.
  • Só calendários de horários com tipos de evento. Hospedagem continua pelo link do calendário.
  • O iframe nã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 iframe nã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

SintomaO que conferir
Nada apareceO 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 quadroO calendário não tem serviços ativos ou o serviço de data-type não existe.
O agendamento não aparece em httpO 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.

Essa informação foi útil?