Calcula cuánto necesita generar tu negocio para ser rentable
Calcula tu coste por hora, tu facturación mínima mensual y el nivel de ventas que necesita tu negocio para cubrir sus gastos. La calculadora tiene en cuenta tu remuneración, gastos fijos, horas facturables y costes de personal.
Si vendes servicios, podrás calcular tu coste mínimo por hora. Si vendes productos, podrás estimar la facturación y las unidades que necesitas vender para cubrir los costes de tu negocio.
1. ¿Cómo genera ingresos tu negocio?
Esto hará que la calculadora te enseñe las preguntas que realmente necesitas.
2. Lo que necesitas obtener del negocio
Piensa en la cantidad mensual que quieres que tu actividad pueda destinar a remunerar tu trabajo, antes de tus impuestos personales.
3. Calcula tus horas facturables
No todas las horas que trabajas se pueden cobrar a clientes. Aquí calculamos tu capacidad real de facturación.
Las horas no facturables incluyen administración, presupuestos, captación, redes, formación, reuniones internas y otras tareas que no cobras directamente.
3. Calcula las ventas mínimas de tus productos
Usamos un producto medio para estimar cuánto necesitas vender cada mes. Introduce importes sin IVA cuando el IVA sea deducible.
Compra o fabricación, embalaje, comisiones y otros costes que aparecen al realizar esa venta.
4. Gastos fijos del negocio
Añade los costes que tienes aunque ese mes vendas poco o nada.
5. Equipo
Opcional. Añade personas cuyo coste soporta el negocio. Si generan horas facturables, indícalas.
El resultado es una estimación basada en los datos que introduces y sirve como referencia para analizar la rentabilidad de tu negocio.
(function(){
const root = document.getElementById('nvcalc-v5');
if (!root || root.dataset.ready === '1') return;
root.dataset.ready = '1';
const q = (s) => root.querySelector(s);
const qa = (s) => Array.from(root.querySelectorAll(s));
const euro0 = new Intl.NumberFormat('es-ES',{style:'currency',currency:'EUR',maximumFractionDigits:0});
const euro2 = new Intl.NumberFormat('es-ES',{style:'currency',currency:'EUR',minimumFractionDigits:2,maximumFractionDigits:2});
const num = (el) => Math.max(0, Number(el.value) || 0);
const gastosList = q('#gastos-list');
const equipoList = q('#equipo-list');
function gastoRow(concepto='', importe='', periodicidad='12'){
const row = document.createElement('div');
row.className = 'dynamic-row gasto-item';
row.innerHTML = `
`;
row.querySelector('.btn-del').addEventListener('click',()=>{row.remove(); calculate(false);});
row.addEventListener('input',()=>calculate(false));
equipoList.appendChild(row);
}
gastoRow('Cuota de autónomos',80,'12');
gastoRow('Gestoría',60,'12');
gastoRow('Dominio y hosting',150,'1');
q('#add-gasto').addEventListener('click',()=>gastoRow());
q('#add-equipo').addEventListener('click',()=>equipoRow());
function model(){return q('input[name="modelo"]:checked').value;}
function updateVisibility(){
const m = model();
q('#servicios-card').classList.toggle('hidden', m === 'productos');
q('#productos-card').classList.toggle('hidden', m === 'servicios');
q('#tarifaActual').closest('.field').classList.toggle('hidden', m === 'productos');
calculate(false);
}
qa('input[name="modelo"]').forEach(el=>el.addEventListener('change',updateVisibility));
function monthlyFixedNeed(){
const remuneration = num(q('#remuneracion'));
const gastosAnnual = qa('.gasto-item').reduce((sum,row)=>{
const amount = num(row.querySelector('.g-importe'));
const mult = Number(row.querySelector('.g-periodo').value) || 0;
return sum + amount * mult;
},0);
const teamMonthly = qa('.equipo-item').reduce((sum,row)=>sum + num(row.querySelector('.e-coste')),0);
return remuneration + gastosAnnual/12 + teamMonthly;
}
function billableHours(){
const daysWeek = Math.min(7,Math.max(1,num(q('#diasSemana'))));
const hoursDay = Math.min(16,Math.max(0,num(q('#horasDia'))));
const unavailable = num(q('#vacaciones')) + num(q('#festivos')) + num(q('#imprevistos'));
const workDaysAnnual = Math.max(0, 52*daysWeek - unavailable);
const ownMonthlyHours = workDaysAnnual * hoursDay / 12;
const ownBillable = ownMonthlyHours * Math.min(100,num(q('#pctFacturable'))) / 100;
const teamBillable = qa('.equipo-item').reduce((sum,row)=>sum + num(row.querySelector('.e-horas'))*52/12,0);
return ownBillable + teamBillable;
}
function productData(fixedNeed){
const price = num(q('#precioProducto'));
const variable = num(q('#costeVariable'));
if(price = price) return {ok:false,price,variable,cm:0,cmr:0,sales:0,units:0};
const cm = price-variable;
const cmr = cm/price;
return {ok:true,price,variable,cm,cmr,sales:fixedNeed/cmr,units:fixedNeed/cm};
}
function calculate(showError){
const m = model();
const fixedNeed = monthlyFixedNeed();
const hours = billableHours();
const prod = productData(fixedNeed);
const err = q('#form-error');
err.style.display='none';
err.textContent='';
let error='';
if(fixedNeed <= 0) error='Introduce al menos una remuneración o algún coste del negocio.';
if((m==='servicios' || m==='mixto') && hours 0 ? fixedNeed/hours : 0;
q('#result-label').textContent='Tu coste mínimo por hora';
q('#result-main').textContent=euro2.format(hourly);
q('#result-unit').textContent=' /hora';
q('#billable-hours').textContent=Math.round(hours)+' h/mes';
const current = num(q('#tarifaActual'));
if(current>0 && hourly>0){
const margin=(current-hourly)/current;
q('#current-margin').textContent=(margin*100).toFixed(1).replace('.',',')+' %';
q('#metric-current').classList.remove('hidden');
}
} else if(m==='productos'){
q('#result-label').textContent='Tus ventas mínimas estimadas';
q('#result-main').textContent=prod.ok ? euro0.format(prod.sales) : '—';
q('#result-unit').textContent=' /mes';
q('#product-margin').textContent=prod.ok ? (prod.cmr*100).toFixed(1).replace('.',',')+' %' : '—';
q('#min-units').textContent=prod.ok ? Math.ceil(prod.units)+' uds./mes' : '—';
} else {
const hourly = hours>0 ? fixedNeed/hours : 0;
q('#result-label').textContent='Tu estructura mínima a cubrir';
q('#result-main').textContent=euro0.format(fixedNeed);
q('#result-unit').textContent=' /mes';
q('#billable-hours').textContent=Math.round(hours)+' h/mes';
q('#product-margin').textContent=prod.ok ? (prod.cmr*100).toFixed(1).replace('.',',')+' %' : '—';
q('#min-units').textContent=prod.ok ? Math.ceil(prod.units)+' uds./mes si producto cubriera todo' : '—';
const current = num(q('#tarifaActual'));
if(current>0 && hourly>0){
const margin=(current-hourly)/current;
q('#current-margin').textContent=(margin*100).toFixed(1).replace('.',',')+' % si servicios cubrieran todo';
q('#metric-current').classList.remove('hidden');
}
}
return true;
}
q('#nv-form').addEventListener('submit',(e)=>{e.preventDefault();calculate(true);});
qa('#nv-form input, #nv-form select').forEach(el=>{
if(el.name!=='modelo') el.addEventListener('input',()=>calculate(false));
});
q('#report-demo').addEventListener('click',()=>{
alert('Aquí conectaremos el formulario de Elementor Pro con MailerLite y, después del registro, mostraremos el informe completo.');
});
updateVisibility();
})();
What is the hourly cost of a business?
The cost per hour indicates how much you need to earn for each billable hour to cover the costs of your business. It’s not the same as your selling price. To set a profitable rate, you should also consider the profit margin you want to achieve, the number of hours you can actually bill, and the costs associated with each service.
How do you calculate how much revenue you need to generate each month?
Your minimum revenue depends on your expenses, your compensation, your business structure, and—if you sell products—the margin you earn on each sale. This calculator uses that data to estimate the minimum revenue your business needs to generate before it starts turning a profit.
How do you calculate how much to charge per hour?
Your hourly cost sets the minimum you need to cover, but it shouldn’t automatically become your rate. To calculate how much to charge per hour, you need to add a margin that allows you to make a profit, cover unforeseen expenses, invest in the business, and compensate for the hours you can’t bill.