Art Pricing Sheet Generator

Art Pricing Sheet Generator

Calculate and document prices for custom artwork based on hourly labor, material costs, and desired profit margins. All prices in USD ($).

COMMISSION PRICING BREAKDOWN

Hourly Rate: $0.00 | Profit Margin: 0%

Cost & Profit Summary

$0.00

Your Hourly Rate

0 hrs

Total Estimated Hours

0%

Total Profit Markup

Itemized Price List

Item Name Est. Hours Material Cost ($) Labor Cost ($) Overhead Cost ($) Subtotal ($) FINAL PRICE ($) Action
Define your hourly rate and add items in the other tabs.

Base Rate and Markup

The amount you want to earn *on top* of all costs (30 = 30% markup).

Covers non-billable costs: utilities, marketing, rent (10% of labor cost).

Add New Item / Size to Price List

Canvas, paints, digital subscription fee, etc.


Current Items (0)

No items added to the pricing list.

'; } pricingItems.forEach(item => { const itemDiv = document.createElement('div'); itemDiv.className = 'flex justify-between items-center p-3 mb-2 bg-white border border-gray-200 rounded-lg shadow-sm'; itemDiv.innerHTML = `
${item.name}
Hrs: ${item.hours} | Mat Cost: $${item.materialCost.toFixed(2)}
`; container.appendChild(itemDiv); }); document.getElementById('current-items-count').innerText = pricingItems.length; } function apgUpdateDashboard() { const rate = parseFloat(document.getElementById('inp-hourly-rate').value) || 0; const profitPct = parseFloat(document.getElementById('inp-profit-margin').value) / 100 || 0; const overheadPct = parseFloat(document.getElementById('inp-overhead-rate').value) / 100 || 0; const tbody = document.getElementById('apg-table-body'); tbody.innerHTML = ''; let totalEstimatedHours = 0; let totalEstimatedProfit = 0; let totalSubtotal = 0; if (pricingItems.length === 0) { tbody.innerHTML = 'Define your hourly rate and add items in the other tabs.'; } pricingItems.forEach(item => { const laborCost = item.hours * rate; const overheadCost = laborCost * overheadPct; const subtotal = item.materialCost + laborCost + overheadCost; const finalPrice = subtotal * (1 + profitPct); const profitAmount = finalPrice - subtotal; totalEstimatedHours += item.hours; totalEstimatedProfit += profitAmount; totalSubtotal += subtotal; const row = tbody.insertRow(); row.innerHTML = ` ${item.name} ${item.hours.toFixed(1)} $${item.materialCost.toFixed(2)} $${laborCost.toFixed(2)} $${overheadCost.toFixed(2)} $${subtotal.toFixed(2)} $${finalPrice.toFixed(2)} `; }); // --- Update Global Stats --- const avgMarkup = totalSubtotal > 0 ? (totalEstimatedProfit / totalSubtotal) * 100 : 0; document.getElementById('stat-hourly-rate').innerText = `$${rate.toFixed(2)}`; document.getElementById('stat-total-estimated-hours').innerText = `${totalEstimatedHours.toFixed(1)} hrs`; document.getElementById('stat-avg-markup').innerText = `${avgMarkup.toFixed(1)}%`; // Update PDF Header document.getElementById('out-pdf-rate').innerText = rate.toFixed(2); document.getElementById('out-pdf-profit').innerText = (profitPct * 100).toFixed(0) + '%'; } function apgDownloadPDF() { apgUpdateDashboard(); const element = document.getElementById('apg-print-area'); // Show PDF header and hide controls const headers = element.querySelectorAll('.pdf-header'); headers.forEach(h => h.style.display = 'block'); const controls = element.querySelectorAll('.pdf-hide'); controls.forEach(c => c.style.display = 'none'); // Reset sheet background for print const sheet = element.querySelector('.apg-tab-content'); sheet.style.backgroundColor = '#fff'; const opt = { margin: 0.4, filename: 'Art_Pricing_Sheet.pdf', image: { type: 'jpeg', quality: 0.98 }, html2canvas: { scale: 2 }, jsPDF: { unit: 'in', format: 'letter', orientation: 'landscape' } }; html2pdf().set(opt).from(element).save().then(function() { // Revert changes after download headers.forEach(h => h.style.display = 'none'); controls.forEach(c => c.style.display = 'table-cell'); sheet.style.backgroundColor = '#fff'; // Re-show button container that was hidden by pdf-hide class document.querySelector('.apg-btn-container').style.display = 'flex'; }); }
Scroll to Top