{"id":229,"date":"2026-09-24T21:05:55","date_gmt":"2026-09-25T00:05:55","guid":{"rendered":"https:\/\/postping.com.br\/blog\/planilha-custo-por-cliente-agencia\/"},"modified":"2026-09-24T21:05:55","modified_gmt":"2026-09-25T00:05:55","slug":"planilha-custo-por-cliente-agencia","status":"publish","type":"post","link":"https:\/\/postping.com.br\/blog\/planilha-custo-por-cliente-agencia\/","title":{"rendered":"Planilha de custo por cliente: monte a sua em seis passos"},"content":{"rendered":"<p>No fim destes seis passos voc\u00ea tem uma planilha que responde, cliente por cliente, quanto custou atender aquele contrato no m\u00eas passado e qual linha comeu a margem. A contagem de artigos publicados vem do pr\u00f3prio WordPress de cada cliente, sem ningu\u00e9m contar \u00e0 m\u00e3o, e o resto sai de um registro de quatro campos que a equipe preenche numa linha. As f\u00f3rmulas abaixo est\u00e3o na grafia do Google Sheets em portugu\u00eas; no Excel e no LibreOffice mudam s\u00f3 os nomes.<\/p>\n<h2>Conte contas conectadas, n\u00e3o clientes<\/h2>\n<p>A primeira aba tem uma linha por conta de rede social conectada, n\u00e3o por cliente. Um cliente com um perfil comercial do Instagram, uma P\u00e1gina do Facebook e um canal do Telegram ocupa tr\u00eas linhas, e \u00e9 essa multiplica\u00e7\u00e3o que a planilha precisa ver desde o come\u00e7o. O trabalho recorrente de uma ag\u00eancia n\u00e3o gruda no contrato: gruda na conex\u00e3o, porque \u00e9 a conex\u00e3o que expira, que pede reautoriza\u00e7\u00e3o e que volta a exigir aten\u00e7\u00e3o depois de meses funcionando sozinha.<\/p>\n<p>Quatro colunas bastam nessa aba: o cliente, a conta conectada, a plataforma e o valor mensal que o contrato daquele cliente paga. O valor se repete nas tr\u00eas linhas do mesmo cliente, e isso \u00e9 de prop\u00f3sito: voc\u00ea vai dividir a mensalidade pelas conex\u00f5es mais adiante, e a repeti\u00e7\u00e3o deixa a divis\u00e3o vis\u00edvel em vez de escondida dentro de uma f\u00f3rmula.<\/p>\n<p>Ningu\u00e9m precisa economizar linha aqui. O Google documenta o teto de uma planilha em <strong>20 milh\u00f5es<\/strong> de c\u00e9lulas ou 100 MB para arquivos criados no Sheets ou convertidos para ele, ent\u00e3o uma carteira de cem clientes com cinco conex\u00f5es cada n\u00e3o encosta no limite da ferramenta em cen\u00e1rio nenhum. O gargalo \u00e9 a digita\u00e7\u00e3o, e \u00e9 por isso que o passo seguinte existe.<\/p>\n<p>Se a sua planilha atual \u00e9 um <code>.xlsx<\/code> que voc\u00ea vai converter, olhe antes as c\u00e9lulas de texto longo: na convers\u00e3o de Excel para Sheets, o Google descarta qualquer c\u00e9lula com mais de 50 mil caracteres. Quem tem hist\u00f3rico de atendimento colado dentro de uma \u00fanica c\u00e9lula perde exatamente esse hist\u00f3rico, em sil\u00eancio, e descobre semanas depois.<\/p>\n<h2>Puxe o volume publicado direto do WordPress<\/h2>\n<p>Para saber quantos artigos um cliente publicou em agosto, voc\u00ea n\u00e3o precisa abrir o painel dele nem pedir o n\u00famero para a reda\u00e7\u00e3o. A REST API do WordPress devolve essa contagem em um cabe\u00e7alho de resposta, e uma requisi\u00e7\u00e3o resolve:<\/p>\n<p><code>curl -sI \"https:\/\/siteDoCliente.com.br\/wp-json\/wp\/v2\/posts?per_page=1&amp;after=2026-08-01T00:00:00&amp;before=2026-09-01T00:00:00\"<\/code><\/p>\n<p>A resposta traz <code>x-wp-total<\/code> com o total de registros da cole\u00e7\u00e3o e <code>x-wp-totalpages<\/code> com o total de p\u00e1ginas. Rodando isso agora contra este blog, com o intervalo de setembro, o cabe\u00e7alho volta com <code>x-wp-total: 24<\/code>. O corpo da resposta n\u00e3o interessa: voc\u00ea pediu um post por p\u00e1gina s\u00f3 para o WordPress ter que contar a cole\u00e7\u00e3o inteira e devolver o resultado no cabe\u00e7alho.<\/p>\n<p>Existe um caminho errado que parece \u00f3bvio, que \u00e9 listar todos os posts e contar as linhas. Ele bate no teto de pagina\u00e7\u00e3o: <code>per_page<\/code> aceita de 1 a 100, e pedir mais devolve <code>400<\/code> com a mensagem <code>per_page precisa estar entre 1 (inclusivo) e 100 (inclusivo)<\/code>. Uma carteira de vinte clientes com dois anos de arquivo viraria centenas de requisi\u00e7\u00f5es paginadas para chegar a um n\u00famero que o cabe\u00e7alho entrega de gra\u00e7a.<\/p>\n<p>Quando esse passo falha, falha de dois jeitos. O primeiro \u00e9 tentar apontar uma c\u00e9lula da planilha direto para o endere\u00e7o: a fun\u00e7\u00e3o <code>IMPORTDATA<\/code> aceita apenas arquivos em formato <code>.csv<\/code> ou <code>.tsv<\/code>, ent\u00e3o um endpoint que devolve JSON n\u00e3o entra por ali, e nenhuma f\u00f3rmula nativa l\u00ea cabe\u00e7alho HTTP. Rode o <code>curl<\/code> por fora e cole os n\u00fameros, ou pe\u00e7a ao seu dev um script que gere um CSV com uma linha por cliente.<\/p>\n<p>O segundo \u00e9 o cabe\u00e7alho voltar vazio em ferramentas que rodam no navegador. Esse caso tem hist\u00f3ria documentada: o pedido para expor os cabe\u00e7alhos de pagina\u00e7\u00e3o em requisi\u00e7\u00f5es de outra origem foi aberto como bug no reposit\u00f3rio da WP REST API em 29 de outubro de 2014, porque sem <code>Access-Control-Expose-Headers<\/code> o navegador esconde <code>X-WP-Total<\/code> do c\u00f3digo JavaScript. Hoje o n\u00facleo do WordPress exp\u00f5e <code>X-WP-Total<\/code>, <code>X-WP-TotalPages<\/code> e <code>Link<\/code> por padr\u00e3o. Se o cabe\u00e7alho n\u00e3o chega, a suspeita cai num plugin de seguran\u00e7a, num proxy ou num CDN reescrevendo a resposta no caminho.<\/p>\n<h2>Registre a ocorr\u00eancia no dia em que ela acontece<\/h2>\n<p>A segunda aba \u00e9 um di\u00e1rio, e \u00e9 a parte da planilha que decide se ela vale algo. Cada vez que algu\u00e9m precisa voltar a uma conta que j\u00e1 estava funcionando, entra uma linha com quatro campos:<\/p>\n<ul>\n<li>a data, no formato que a sua planilha reconhece como data<\/li>\n<li>a conta conectada, escrita exatamente como aparece na primeira aba<\/li>\n<li>o motivo em tr\u00eas palavras, nunca mais que isso<\/li>\n<li>o tempo gasto, em minutos<\/li>\n<\/ul>\n<p>As tr\u00eas palavras do motivo existem para a coluna virar som\u00e1vel. \u201cReautorizar Instagram cliente\u201d repetido ao longo do ano \u00e9 um padr\u00e3o que aparece em qualquer soma condicional; \u201ctive que entrar na conta porque o acesso caiu de novo\u201d \u00e9 relato, e relato n\u00e3o agrupa.<\/p>\n<p>Boa parte dessas linhas tem prazo conhecido antes de acontecer. A Meta documenta que o token de acesso de longa dura\u00e7\u00e3o vale <strong>60 dias<\/strong>, que a renova\u00e7\u00e3o exige um token com pelo menos 24 horas de vida e ainda v\u00e1lido, e que um token que passa 60 dias sem renova\u00e7\u00e3o expira e n\u00e3o pode mais ser renovado. Cada conta conectada carrega esse rel\u00f3gio. Quando ele vence sem que ningu\u00e9m tenha renovado, a linha do di\u00e1rio deixa de ser de renova\u00e7\u00e3o e passa a ser de reconex\u00e3o completa, que custa mais e \u00e0s vezes depende do cliente do outro lado do telefone para autorizar.<\/p>\n<p>Se ningu\u00e9m na equipe registrou nada at\u00e9 hoje, esse passo n\u00e3o falha: ele demora. Comece com trinta dias de di\u00e1rio antes de acreditar em qualquer m\u00e9dia, e trate a aba vazia como resultado. Carteira sem registro de ocorr\u00eancia continua tendo ocorr\u00eancia, s\u00f3 com o custo delas saindo da margem sem aparecer em lugar nenhum. \u00c9 o mesmo racioc\u00ednio que sustenta <a href=\"https:\/\/postping.com.br\/blog\/custo-gestao-redes-sociais-vinte-clientes\/\">a conta de custo de uma carteira de vinte clientes<\/a>, e a planilha transforma aquele racioc\u00ednio em n\u00famero seu.<\/p>\n<h2>Converta minuto em dinheiro com um valor por hora s\u00f3<\/h2>\n<p>Na aba de fechamento, a primeira c\u00e9lula \u00fatil guarda um n\u00famero: quanto custa uma hora da pessoa que atende essas contas. Um n\u00famero, uma c\u00e9lula, e todas as f\u00f3rmulas apontando para ela. A tenta\u00e7\u00e3o \u00e9 escrever o valor dentro de cada linha, e ela cobra o pre\u00e7o no dia em que o custo da equipe muda: com a c\u00e9lula \u00fanica, voc\u00ea corrige um campo e a carteira inteira reprecifica.<\/p>\n<p>Com o di\u00e1rio preenchido, o custo de ocorr\u00eancia de cada conta \u00e9 uma soma condicional. No Sheets em portugu\u00eas, a fun\u00e7\u00e3o \u00e9 <code>SOMASES(intervalo_da_soma; intervalo_de_criterios1; criterio1)<\/code>, e a f\u00f3rmula soma os minutos daquela conta antes de converter para hora:<\/p>\n<p><code>=SOMASES(ocorrencias!D:D; ocorrencias!B:B; B2) \/ 60 * $B$1<\/code><\/p>\n<p>O erro comum nesse passo mora no valor por hora, n\u00e3o na f\u00f3rmula. Sal\u00e1rio dividido por horas do m\u00eas devolve um n\u00famero indefens\u00e1vel numa reuni\u00e3o, porque deixa de fora encargo, f\u00e9rias, ferramenta, hora de gest\u00e3o e o tempo em que a pessoa est\u00e1 dispon\u00edvel sem estar produzindo. N\u00e3o existe multiplicador padr\u00e3o para corrigir isso: a sua contabilidade tem o n\u00famero real e ele muda com o regime da empresa. A planilha exige duas coisas, que o valor esteja em uma c\u00e9lula s\u00f3 e que algu\u00e9m saiba dizer de onde ele veio.<\/p>\n<p>Quando o tempo n\u00e3o foi registrado em minutos e voc\u00ea s\u00f3 tem a contagem de ocorr\u00eancias, multiplique a contagem por um tempo fixo por tipo de ocorr\u00eancia e siga. O n\u00famero piora e continua audit\u00e1vel. Pinte essa coluna de outra cor e escreva \u201cestimado\u201d no cabe\u00e7alho: em tr\u00eas meses ningu\u00e9m lembra qual coluna era medida e qual era palpite, e uma planilha que mistura as duas sem marcar vira argumento contra voc\u00ea na hora da renova\u00e7\u00e3o.<\/p>\n<h2>Rateie o que a ferramenta n\u00e3o cobra por cliente<\/h2>\n<p>Quase toda ag\u00eancia paga alguma coisa mensal que atende a carteira toda: hospedagem, licen\u00e7a de plugin, ferramenta de agendamento, armazenamento. Esse custo n\u00e3o tem dono, e a decis\u00e3o de como reparti-lo muda qual cliente parece dar lucro.<\/p>\n<p>Divida pelo n\u00famero de contas conectadas, n\u00e3o pelo n\u00famero de clientes. A diferen\u00e7a aparece na hora: o cliente com uma conex\u00e3o absorve uma fatia, o cliente com quatro absorve quatro, e \u00e9 o segundo que de fato consome mais da ferramenta. Dividir por cliente devolve o resultado oposto ao real e favorece exatamente o contrato que mais d\u00e1 trabalho.<\/p>\n<p>Se a ferramenta \u00e9 cobrada por usu\u00e1rio, e n\u00e3o por site ou por conta, o rateio muda de base: divida pelas pessoas que operam e distribua pela carteira de cada uma. Nos dois casos, escreva numa c\u00e9lula ao lado qual base voc\u00ea usou. Rateio \u00e9 escolha, n\u00e3o medi\u00e7\u00e3o, e uma planilha que apresenta escolha como medi\u00e7\u00e3o perde a discuss\u00e3o no primeiro cliente que pedir para ver a conta. Na hora de virar pre\u00e7o, <a href=\"https:\/\/postping.com.br\/blog\/quanto-cobrar-gestao-redes-sociais-porte\/\">a faixa por porte de cliente<\/a> parte justamente daqui.<\/p>\n<h2>Verifique a planilha contra algo que n\u00e3o seja ela mesma<\/h2>\n<p>Tr\u00eas confer\u00eancias, na ordem. A primeira soma os minutos de todo o di\u00e1rio no m\u00eas e divide por 60: se o total passar das horas que aquela pessoa realmente trabalhou no per\u00edodo, o di\u00e1rio est\u00e1 contando duas vezes, em geral porque a mesma ocorr\u00eancia entrou pela m\u00e3o de quem tentou resolver e de quem resolveu. A segunda pega um cliente e roda o <code>curl<\/code> do passo 2 com o mesmo intervalo de datas usado na planilha. Se o <code>x-wp-total<\/code> n\u00e3o bater com o que a planilha diz, a diferen\u00e7a quase sempre \u00e9 fuso hor\u00e1rio na borda do m\u00eas, rascunho contado como publica\u00e7\u00e3o, ou um tipo de conte\u00fado que n\u00e3o \u00e9 <code>post<\/code>.<\/p>\n<p>A terceira cria a coluna de margem, com a mensalidade do cliente menos o custo de ocorr\u00eancia menos o rateio, ordena do menor para o maior e l\u00ea as tr\u00eas primeiras linhas. Se a primeira for um cliente que a equipe considerava tranquilo, a planilha acabou de pagar o trabalho de mont\u00e1-la.<\/p>\n<p>Boa parte das linhas do di\u00e1rio existe porque algu\u00e9m precisa renovar acesso na m\u00e3o antes que o rel\u00f3gio de 60 dias vire. \u00c9 o tipo de linha que d\u00e1 para tirar da planilha em vez de administrar: o Post Ping renova o acesso \u00e0 Meta automaticamente e conecta a conta pelo login oficial, sem ningu\u00e9m gerar token nem copiar ID. Ativar mais um cliente tamb\u00e9m passa a custar alguns minutos, com o mesmo fluxo atendendo dez ou cem blogs. O di\u00e1rio n\u00e3o zera: cliente que troca de senha, P\u00e1gina que perde permiss\u00e3o e conta que muda de gestor continuam gerando linha, e \u00e9 bom que continuem aparecendo. Se a sua carteira j\u00e1 est\u00e1 nesse tamanho, a p\u00e1gina <a href=\"https:\/\/postping.com.br\/agencias\">para ag\u00eancias<\/a> mostra como o desenho fica em escala.<\/p>\n<p>Feche a primeira rodada assim: escolha dois clientes, um que voc\u00ea acha lucrativo e um que voc\u00ea acha problem\u00e1tico, e leia as duas linhas campo por campo contra o contrato e contra o <code>x-wp-total<\/code> do m\u00eas. Se os dois n\u00fameros fizerem sentido para quem atende aqueles clientes no dia a dia, a planilha est\u00e1 pronta para rodar sozinha no fechamento do m\u00eas que vem. Se algum dos dois surpreender a equipe, n\u00e3o conserte a planilha: releia o di\u00e1rio daquele cliente linha por linha, porque o dado que surpreende costuma estar certo.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Planilha de custo por cliente para ag\u00eancia: puxe a contagem de artigos do WordPress pelo cabe\u00e7alho X-WP-Total e veja em qual conta conectada a margem some.<\/p>\n","protected":false},"author":1,"featured_media":228,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-229","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-agencias"],"_links":{"self":[{"href":"https:\/\/postping.com.br\/blog\/wp-json\/wp\/v2\/posts\/229","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/postping.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/postping.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/postping.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/postping.com.br\/blog\/wp-json\/wp\/v2\/comments?post=229"}],"version-history":[{"count":0,"href":"https:\/\/postping.com.br\/blog\/wp-json\/wp\/v2\/posts\/229\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/postping.com.br\/blog\/wp-json\/wp\/v2\/media\/228"}],"wp:attachment":[{"href":"https:\/\/postping.com.br\/blog\/wp-json\/wp\/v2\/media?parent=229"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/postping.com.br\/blog\/wp-json\/wp\/v2\/categories?post=229"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/postping.com.br\/blog\/wp-json\/wp\/v2\/tags?post=229"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}