How do you calculate how much revenue you need to generate each month?

.nvcalc{ --nv-ink:#353533; --nv-muted:#6f6b67; --nv-line:#e1dad3; --nv-green:#acc1a1; --nv-green-soft:#e5ece2; --nv-gold:#f3b543; --nv-gold-soft:#fbe8c4; --nv-white:#ffffff; --nv-danger:#9c3c32; --nv-radius:18px; } .nvcalc, .nvcalc *{ box-sizing:border-box; } .nvcalc-wrap{ width:100%; max-width:1180px; margin:0 auto; padding:44px 20px 0; background:transparent !important; } .nvcalc{ width:100%; max-width:1120px; min-width:0; margin:0 auto; padding:38px 30px 36px; background:var(--nv-green-soft); border-radius:36px; color:var(--nv-ink); font-family:Arial,Helvetica,sans-serif; line-height:1.45; box-shadow:0 8px 24px rgba(53,53,51,.05); overflow:hidden; } .nvcalc h1, .nvcalc h2, .nvcalc h3, .nvcalc p{ margin-top:0; } .nvcalc h1{ max-width:900px; margin-bottom:14px; font-size:clamp(36px,5vw,62px); line-height:1.06; overflow-wrap:anywhere; } .nvcalc .intro{ max-width:840px; margin-bottom:30px; color:var(--nv-muted); font-size:20px; } .nvcalc .layout{ display:grid; grid-template-columns:minmax(0,1.5fr) minmax(300px,.8fr); gap:24px; align-items:start; } .nvcalc .layout > *, .nvcalc .stack, .nvcalc .card, .nvcalc .result{ min-width:0; } .nvcalc .stack{ display:grid; gap:18px; } .nvcalc .card{ padding:22px; background:var(--nv-white); border:1px solid var(--nv-line); border-radius:var(--nv-radius); } .nvcalc .card h2{ margin-bottom:6px; font-size:22px; line-height:1.2; } .nvcalc .sub{ margin-bottom:18px; color:var(--nv-muted); font-size:14px; } .nvcalc .grid2{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:14px; align-items:start; } .nvcalc .grid3{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:14px; align-items:start; } .nvcalc .field{ display:grid; min-width:0; gap:6px; align-content:start; grid-auto-rows:max-content; } .nvcalc label{ font-size:14px; font-weight:700; } .nvcalc .help{ color:var(--nv-muted); font-size:12px; font-weight:400; line-height:1.35; } .nvcalc input, .nvcalc select{ width:100%; min-width:0; height:46px; min-height:46px; padding:10px 12px; color:var(--nv-ink); background:#fff; border:1px solid #cfc8c1; border-radius:10px; font-size:16px; } .nvcalc input:focus, .nvcalc select:focus, .nvcalc button:focus{ outline:3px solid rgba(243,181,67,.28); outline-offset:1px; border-color:var(--nv-gold); } .nvcalc .choice{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:10px; } .nvcalc .choice label{ display:flex; min-width:0; align-items:center; gap:8px; padding:13px; background:#fff; border:1px solid var(--nv-line); border-radius:12px; cursor:pointer; } .nvcalc .choice input{ width:auto; min-height:auto; flex:0 0 auto; } .nvcalc .dynamic-list{ display:grid; gap:10px; margin-top:12px; } .nvcalc .dynamic-row{ display:grid; grid-template-columns:1.4fr .7fr .7fr 44px; gap:8px; align-items:end; min-width:0; } .nvcalc .dynamic-row.invest{ grid-template-columns:1.4fr .7fr .6fr 44px; } .nvcalc .dynamic-row.team{ grid-template-columns:1.2fr .65fr .65fr 44px; } .nvcalc .mini-label{ display:block; margin-bottom:4px; color:var(--nv-muted); font-size:11px; letter-spacing:.04em; text-transform:uppercase; } .nvcalc button{ max-width:100%; min-height:44px; padding:10px 14px; border:0; border-radius:11px; font-size:15px; font-weight:700; line-height:1.25; cursor:pointer; white-space:normal !important; overflow-wrap:anywhere; word-break:normal; } .nvcalc .btn-add{ margin-top:12px; background:var(--nv-green-soft); color:var(--nv-ink); } .nvcalc .btn-del{ width:44px; min-width:44px; padding:0; background:#f3efeb; color:var(--nv-muted); } .nvcalc .btn-main{ width:100%; margin-top:4px; background:var(--nv-gold); color:var(--nv-ink); font-size:17px; } .nvcalc .result{ position:sticky; top:18px; width:100%; padding:24px; color:#fff; background:var(--nv-ink); border-radius:22px; overflow:hidden; } .nvcalc .result .eyebrow{ margin-bottom:10px; color:#d2ccc5; font-size:12px; letter-spacing:.11em; line-height:1.35; text-transform:uppercase; } .nvcalc .result .big{ display:flex; flex-wrap:wrap; align-items:baseline; gap:4px 8px; max-width:100%; margin:0 0 10px; color:var(--nv-gold); font-size:clamp(40px,6vw,66px); font-weight:800; line-height:1; overflow-wrap:anywhere; } .nvcalc .result .big #result-main{ min-width:0; } .nvcalc .result .unit{ flex:0 0 auto; color:#fff; font-size:18px; font-weight:600; line-height:1.2; white-space:nowrap; } .nvcalc .result .warning{ margin:12px 0 20px; color:#dedbd7; font-size:14px; line-height:1.55; } .nvcalc .result .secondary{ display:grid; gap:14px; margin-top:16px; padding-top:16px; border-top:1px solid #565650; } .nvcalc .metric{ display:grid; grid-template-columns:minmax(0,1fr) auto; gap:10px 14px; align-items:start; } .nvcalc .metric span{ min-width:0; color:#d0cbc5; font-size:13px; line-height:1.45; } .nvcalc .metric b{ max-width:170px; color:#fff; font-size:17px; line-height:1.35; text-align:right; overflow-wrap:anywhere; } .nvcalc .cta{ width:100%; min-width:0; margin-top:20px; padding:16px; color:var(--nv-ink); background:var(--nv-green-soft); border-radius:14px; } .nvcalc .cta p{ margin:0 0 12px; font-size:13px; line-height:1.5; } .nvcalc .cta button{ display:block; width:100% !important; max-width:100% !important; height:auto !important; min-height:48px; padding:12px 14px !important; color:var(--nv-ink); background:var(--nv-green); border-radius:12px; font-size:15px !important; line-height:1.25 !important; text-align:center; white-space:normal !important; overflow-wrap:anywhere !important; } .nvcalc .notice{ margin-top:10px; color:var(--nv-muted); font-size:12px; } .nvcalc .error{ display:none; margin-bottom:14px; padding:10px 12px; color:var(--nv-danger); background:#fff2f0; border:1px solid #e8b8b2; border-radius:10px; font-size:14px; } .nvcalc .hidden{ display:none !important; } .nvcalc .pill{ display:inline-block; margin-bottom:12px; padding:6px 10px; background:var(--nv-gold-soft); border-radius:999px; font-size:12px; font-weight:700; } .nvcalc .info{ margin-top:12px; padding:12px 14px; color:#4a5146; background:var(--nv-green-soft); border-radius:10px; font-size:13px; } .nvcalc-seo{ width:100%; max-width:1120px; margin:42px auto 0; padding:0 6px 50px; color:#353533; font-family:Arial,Helvetica,sans-serif; line-height:1.65; } .nvcalc-seo h2{ margin:30px 0 10px; color:#353533; font-size:clamp(24px,3vw,32px); line-height:1.2; } .nvcalc-seo h2:first-child{ margin-top:0; } .nvcalc-seo p{ max-width:880px; margin:0; color:#5f5b57; font-size:17px; } @media(max-width:860px){ .nvcalc-wrap{ padding-top:32px; } .nvcalc{ padding:30px 22px 28px; border-radius:30px; } .nvcalc h1{ font-size:clamp(34px,7vw,52px); } .nvcalc .intro{ font-size:18px; } .nvcalc .layout{ grid-template-columns:1fr; } .nvcalc .result{ position:static; top:auto; } } @media(max-width:640px){ .nvcalc-wrap{ padding:24px 10px 0; } .nvcalc{ padding:22px 12px 24px; border-radius:24px; } .nvcalc h1{ margin-bottom:12px; font-size:clamp(30px,10vw,42px); line-height:1.08; } .nvcalc .intro{ margin-bottom:22px; font-size:16px; line-height:1.5; } .nvcalc .stack{ gap:14px; } .nvcalc .card{ padding:16px; border-radius:16px; } .nvcalc .card h2{ font-size:20px; } .nvcalc .grid2, .nvcalc .grid3, .nvcalc .choice{ grid-template-columns:1fr; } .nvcalc .dynamic-row, .nvcalc .dynamic-row.team{ grid-template-columns:1fr; gap:8px; padding:12px 0; border-bottom:1px solid var(--nv-line); } .nvcalc .dynamic-row:first-child{ padding-top:0; } .nvcalc .dynamic-row:last-child{ padding-bottom:0; border-bottom:0; } .nvcalc .dynamic-row .concept{ grid-column:auto; } .nvcalc .dynamic-row .btn-del{ justify-self:end; } .nvcalc .result{ padding:20px 16px; border-radius:20px; } .nvcalc .result .eyebrow{ font-size:11px; letter-spacing:.08em; } .nvcalc .result .big{ gap:5px 7px; font-size:clamp(38px,14vw,54px); line-height:.98; } .nvcalc .result .unit{ font-size:16px; } .nvcalc .result .warning{ font-size:14px; } .nvcalc .metric{ grid-template-columns:1fr; gap:3px; } .nvcalc .metric b{ max-width:100%; font-size:18px; text-align:left; } .nvcalc .cta{ padding:14px; } .nvcalc .cta p{ font-size:14px; } .nvcalc .cta button{ padding:12px 10px !important; font-size:14px !important; } .nvcalc-seo{ margin-top:30px; padding:0 4px 36px; } .nvcalc-seo h2{ margin-top:24px; font-size:24px; } .nvcalc-seo p{ font-size:16px; } } @media(max-width:380px){ .nvcalc-wrap{ padding:20px 6px 0; } .nvcalc{ padding:18px 9px 20px; border-radius:20px; } .nvcalc h1{ font-size:28px; } .nvcalc .card{ padding:14px; } .nvcalc .result{ padding:18px 13px; } .nvcalc .result .big{ font-size:40px; } .nvcalc .cta{ padding:12px; } .nvcalc .cta button{ font-size:13px !important; } }
Calculadora gratuita

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 = `
Concepto
Importe
PeriodicidadMensualTrimestralAnual
`; row.querySelector('.g-periodo').value = periodicidad; row.querySelector('.btn-del').addEventListener('click',()=>{row.remove(); calculate(false);}); row.addEventListener('input',()=>calculate(false)); row.addEventListener('change',()=>calculate(false)); gastosList.appendChild(row); } function equipoRow(nombre='', coste='', horas=''){ const row = document.createElement('div'); row.className = 'dynamic-row team equipo-item'; row.innerHTML = `
Persona o función
Coste mensual
Horas facturables/sem.
`; 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.