Calendário de disponibilidade para desentupimento de ralo de chuveiro: implementação WordPress
Aprenda a criar calendário de agendamento para desentupimento de ralo de chuveiro com WordPress, plugins e automação de horários disponíveis.
Imagine um morador do Jardins, em São Paulo, às 22h de uma terça-feira: a água do chuveiro não desce, o ralo borbulha e o banheiro começa a alagar. Ele acessa o site da desentupidora pelo celular, mas o calendário mostra horários disponíveis apenas para daqui a três dias — ou pior, permite agendar para um domingo onde não há equipe de plantão. O cliente fecha a aba e liga para o concorrente. Esse cenário real ilustra por que um calendário de disponibilidade bem implementado não é apenas um recurso visual: é a diferença entre converter uma emergência em receita ou perdê-la para a concorrência.
No nicho de desentupimento de ralo de chuveiro, a urgência dita as regras. Diferente de agendamentos eletivos (consultas, aulas, beleza), aqui o cliente precisa de agora ou hoje. O calendário deve refletir capacidade real da equipe, zonas de atendimento geográficas, janelas de deslocamento no trânsito paulistano e regras de plantão noturno. Tudo isso rodando sobre WordPress, com performance para carregar em 3G e confiabilidade para não vender horário que não existe.
Este artigo detalha a arquitetura técnica para construir esse calendário: escolha de plugins, customização via hooks, sincronização externa, validação geográfica e tratamento de concorrência. O foco é código limpo, escalável e que sobreviva a updates de core e plugins.
Escolha da stack: plugin base vs. desenvolvimento custom
A primeira decisão arquitetural define o custo de manutenção nos próximos dois anos. Para calendários de serviço com regras complexas (zonas, plantão, capacidade por técnico), três caminhos principais existem:
- Plugin SaaS embarcado (Amelia, Bookly, Simply Schedule Appointments): menor time-to-market, updates de segurança delegados, mas personalização limitada aos hooks expostos.
- Plugin headless + frontend React/Vue (WP GraphQL + Amelia headless): controle total da UX, mas dobra a complexidade de deploy e cache.
- Custom post type + metaboxes + REST API própria: liberdade total, porém reinventa roda (conflitos, notificações, iCal, Google Sync).
Para 90% das desentupidoras de médio porte, a opção 1 com Amelia Business ou Bookly Pro resolve. Ambos expõem hooks PHP e filtros JS suficientes para injetar lógica de zona geográfica, bloqueio por capacidade técnica e validação de plantão. O custo de licença (300 a 600 reais/ano) paga-se na primeira emergência convertida que não vazou para o concorrente.
Se a operação exigir regras que nenhum plugin suporta (ex.: “só agenda se técnico mora a até 8 km do CEP e tem peça X no estoque”), migre para opção 2. Mas comece pela 1 e meça dor real antes de investir em custom.
Mapeamento de regras de negócio para configuração de plugin
Antes de escrever uma linha de código, liste todas as restrições que o calendário deve respeitar. Para desentupimento de ralo de chuveiro na Grande SP, o mapeamento típico inclui:
| Regra de negócio | Configuração no plugin | Hook de fallback |
|---|---|---|
| Atendimento 24h em dias úteis, 8h–20h sábados/feriados | Horários de funcionamento por dia da semana + exceções de feriado municipal | amelia_get_working_hours |
| Técnico atende no máx. 3 bairros adjacentes | Categoria “Zona” por funcionário + validação CEP no frontend | amelia_validate_booking |
| Intervalo mínimo 90 min entre chamados (deslocamento + serviço) | Buffer time por serviço + tempo de viagem por zona | amelia_get_available_slots |
| Plantão noturno: apenas 1 técnico, chamados “emergência” | Serviço “Emergência 2h” com capacidade 1 + tag de plantonista | amelia_before_booking_confirm |
| Bloqueio automático se chuva > 50mm (alagamento generalizado) | Integração API Climatempo → webhook desabilita slots | amelia_disable_time_slots |
Cada linha da tabela vira um ticket de configuração ou um snippet no functions.php / plugin custom. A coluna “Hook de fallback” é onde o código vive quando a UI do plugin não cobre o caso.
Validação geográfica no frontend: CEP → zona → slots permitidos
O maior vazamento de conversão ocorre quando o cliente vê horários “disponíveis” mas, ao confirmar, recebe “sem equipe na sua região”. A solução é filtrar antes de renderizar o calendário.
// functions.php ou plugin custom
add_filter( 'amelia_get_available_slots', 'dzj_filter_slots_by_cep', 10, 3 );
function dzj_filter_slots_by_cep( $slots, $service_id, $date ) {
$cep = isset( $_GET['cep'] ) ? sanitize_text_field( $_GET['cep'] ) : '';
if ( empty( $cep ) || ! dzj_cep_in_coverage_area( $cep ) ) {
return $slots; // sem CEP ou fora de cobertura: mostra todos (fallback)
}
$zone = dzj_get_zone_by_cep( $cep );
$allowed_employee_ids = dzj_get_employees_for_zone( $zone );
return array_filter( $slots, function( $slot ) use ( $allowed_employee_ids ) {
return in_array( $slot['employee_id'], $allowed_employee_ids, true );
} );
}
No frontend, um campo CEP com autocomplete (ViaCEP API) dispara fetch para /wp-json/amelia/v1/available-slots?cep=01452000 antes de montar o calendário. Se o CEP não for atendido, exiba mensagem clara: “Ainda não atendemos sua região — cadastre-se para aviso quando expandirmos”. Isso transforma frustração em lead futuro.
Sincronização bidirecional com Google Calendar da equipe técnica
A equipe de campo vive no Google Calendar. Se o agendamento do site não aparece lá, o técnico não vai. Se o técnico bloqueia horário no celular e o site continua vendendo, há overbooking. A sincronização bidirecional resolve os dois lados.
Configuração no Amelia (Settings → Google Calendar):
- OAuth2 com conta de serviço da desentupidora (não conta pessoal do dono).
- Um calendário por técnico (ex.:
tecnico-joao@dezjato.iam.gserviceaccount.com). - Mapeamento: Employee ID ↔ Calendar ID salvo em user meta
dzj_gcal_id. - Sync direction: Two-way (create/update/delete both sides).
- Conflict resolution: “Google wins” para bloqueios manuais do técnico; “Amelia wins” para novos agendamentos de clientes.
Teste de estresse: crie 5 agendamentos simultâneos no mesmo slot via script curl. Verifique se apenas 1 confirma e os outros 4 recebem erro 409. Se o plugin não garante atomicidade, implemente lock Redis:
add_action( 'amelia_before_booking_confirm', 'dzj_lock_slot_redis', 5 );
function dzj_lock_slot_redis( $booking_data ) {
$redis = wp_get_redis_client(); // via plugin Redis Object Cache
$lock_key = "dzj:slot_lock:{$booking_data['employee_id']}:{$booking_data['start_datetime']}";
$acquired = $redis->set( $lock_key, '1', ['nx', 'ex' => 30] );
if ( ! $acquired ) {
wp_die( json_encode(['error' => 'Slot acabou de ser preenchido. Atualize a página.']), 409 );
}
// lock liberado automaticamente em 30s ou no hook after_booking_confirm
}
Tratamento de emergências: fluxo "Urgência 2h" com prioridade
Ralo de chuveiro entupido à noite não espera amanhã. O calendário precisa de um canal prioritário que:
- Apareça acima dos horários normais no seletor.
- Tenha preço diferenciado (campo
price_modifierno serviço). - Dispare notificação push imediata para o plantonista (WhatsApp Business API + webhook).
- Bloqueie o técnico para outros agendamentos nas próximas 3h.
Implementação: crie serviço “Desentupimento ralo chuveiro — Emergência 2h” com capacity = 1 e tag = emergency. No frontend, detecte horário fora do comercial (antes das 8h, depois das 20h, fins de semana) e injete banner: “Precisa agora? Agendar emergência 2h — taxa de urgência aplicada”.
No painel admin, adicione coluna “Urgência” na lista de agendamentos e filtro rápido para o gerente de plantão visualizar só emergências do dia.
Métricas de conversão e gargalos do funil de agendamento
Um calendário bonito que não converte é enfeite. Instrumente cada etapa:
- Visualização do calendário → evento
calendar_viewed(service_id, date, cep). - Clique em slot →
slot_clicked(slot_id, employee_id, lead_time_minutes). - Preenchimento formulário →
form_started(campos obrigatórios vs. opcionais). - Confirmação →
booking_confirmed(valor, origem UTM, device). - Cancelamento/No-show →
booking_cancelled(motivo, antecedência).
Use GTM + dataLayer ou plugin de analytics nativo (ex.: Amelia → Google Analytics 4). Gere relatório semanal: “Taxa de abandono no passo 3 = 34% → campo ‘observações’ obrigatório assusta? Torne opcional.”
Cruze com dados de área do cliente para manutenção de coluna de esgoto em SP para identificar clientes recorrentes que agendam direto no painel logado vs. novos no site público.
Checklist de deploy e monitoramento contínuo
Antes de colocar no ar:
- Teste de carga: 100 usuários simultâneos buscando slots (k6 ou Loader.io).
- Falha de rede: simule Google Calendar API down → agendamento deve gravar local e retry em background.
- Feriado móvel (Carnaval, Corpus Christi): script anual popula exceções via WP-CLI.
- LGPD: checkbox “Autorizo contato WhatsApp” + link política de privacidade no formulário.
- Acessibilidade: navegação por teclado no calendário, labels ARIA nos slots, contraste 4.5:1.
- Backup: snapshot diário tabela
amelia_bookings+ export iCal semanal automático.
Pós-deploy: alerta no Slack se booking_confirmed cair 50% vs. média 7 dias (pode ser bug no calendário). Revisão mensal de slots ociosos por zona → realocar técnico ou abrir nova zona.
Um calendário de disponibilidade para desentupimento de ralo de chuveiro bem construído deixa de ser “aquele plugin de agendamento” e vira motor de receita previsível. A diferença está nos detalhes: validação de CEP antes de mostrar horários, sincronização que o técnico confia, canal de emergência que não quebra o fluxo normal e instrumentação que aponta onde o dinheiro escapa. Comece com plugin maduro, customize via hooks, meça tudo. E quando o cliente do Jardins acessar às 22h, ele verá: “Técnico disponível — chega em 40 min”. desentupimento de ralo de chuveiro na Grande SP
Implemente hoje, meça amanhã, ajuste sempre. O próximo alagamento não avisa.
Checklist prático
Perguntas frequentes
Qual plugin WordPress é mais indicado para criar calendário de disponibilidade para serviços de desentupimento?
O plugin Amelia ou Bookly são excelentes opções nativas para WordPress, pois oferecem gestão de horários, bloqueio de datas indisponíveis e integração com WooCommerce para pagamentos. Ambos permitem configurar intervalos entre atendimentos e definir capacidade por horário.
Como impedir agendamentos em feriados ou fora do horário comercial no calendário?
Configure regras de indisponibilidade recorrentes no plugin de agendamento, definindo dias da semana bloqueados (domingos/feriados) e janelas de horário permitidas. Use hooks como 'amelia_get_available_slots' para filtrar programaticamente slots inválidos antes de exibir ao cliente.
É possível sincronizar o calendário de desentupimento com Google Calendar da equipe técnica?
Sim, a maioria dos plugins premium oferece sincronização bidirecional via API do Google Calendar. Configure webhooks para criar eventos automaticamente quando houver novo agendamento e cancelar no calendário externo quando o cliente desmarcar pelo site.
Como exibir apenas horários com equipe disponível na região do cliente?
Implemente lógica de geolocalização no frontend que filtre slots baseada no CEP informado. Use a REST API do WordPress para consultar disponibilidade por zona de atendimento e retorne apenas horários onde há técnico alocado naquela região.
Qual a melhor forma de lidar com conflitos de agendamento simultâneo no mesmo horário?
Utilize transações de banco de dados (locking) ao processar o agendamento e implemente verificação de disponibilidade em tempo real via AJAX antes de confirmar. O plugin deve validar se o slot ainda está livre no momento exato do clique, não apenas no carregamento da página.
Como adicionar campos personalizados no formulário de agendamento para tipo de ralo e urgência?
Estenda o formulário nativo do plugin usando hooks de ação como 'amelia_before_booking_form' para adicionar select de tipo de ralo (chuveiro, pia, tanque) e radio de urgência (normal, emergência 2h). Salve esses dados como meta do agendamento para a equipe técnica.