Flower farm profit per acre is your sales minus every cost, including your own hours, divided by the acres you have in beds. University of Tennessee Extension’s 2025 zinnia budget shows $9,256 in sales and $3,089 left over on just 1,000 square feet, while a Virginia Tech extension guide cites $25,000 to $35,000 in value per acre for field-grown cut flowers.
I built this free calculator so you can run that math on your own beds in about a minute. When you are ready to turn your numbers into real prices for bouquets, CSA shares, weddings and market tables, the Flower Farm Pricing Toolkit is the spreadsheet I made to do it all in one place.
Flower Farm Profit Per Acre Calculator
Pick a crop to load University of Tennessee Extension’s 2025 budget numbers, then change anything to match your farm. Results update as you type.
Quick start
$
Count planted beds only, not paths. 1 acre is 43,560 square feet.
Fine-tune yield and costs (per 1,000 sq ft)
What the beds produce
%
What it costs you
% of sales
$
hrs
$
$
Nothing you type here is saved or sent anywhere.
How the profit per acre math works
1Stems soldplants x % sold x stems per plant
2Salesstems sold x price per stem
3Profitsales minus all costsmarketing, growing, your labor, overhead
4Per acreprofit per 1,000 sq ft x 43.56a ceiling, not a promise
Your labor is counted as a cost on purpose. If you leave it out, the profit looks bigger, but it is really unpaid wages. The line “what you earn per hour worked” puts it back so you can see what the beds actually paid you.
Why the per acre number can look too good
Scale a 1,000 square foot budget up to a full acre and the numbers jump. The field-acre estimates tell a different story.
Sales per acre: on paper vs. in the field
Small-plot budget scaled to an acreField-acre estimate
Multiply the zinnia budget by 43.56 and you get more than $130,000 of profit per acre and over 400,000 stems. The field-acre estimates are a small fraction of that. The gap is the part most profit calculators skip: an acre has paths and headlands, not every crop yields like zinnias, and you have to find a buyer for every stem you count. Use the per 1,000 sq ft result as your honest number, and treat the per acre line as a ceiling.
Same 1,000 square feet, very different profit
Crop choice moves your profit as much as acreage does. In University of Tennessee’s 2025 budgets, zinnias keep about a third of their sales after every cost, while single-stem sunflowers keep about an eighth. One zinnia plant gives about 8 stems; a single-stem sunflower gives 1. Switch the calculator’s starting numbers to compare them yourself.
Zinnias
$3,089 kept
of $9,256 in sales
33% of sales kept. 9,256 stems at $1.00. Many stems per plant.
Sunflowers, single stem
$629 kept
of $4,760 in sales
13% of sales kept. 2,800 stems at $1.70. One stem per plant.
These are the calculator’s starting numbers, taken from the University of Tennessee zinnia budget: 1,780 plants on 1,000 square feet, 65 percent marketed, 8 stems per plant, $1.00 a stem.
Profit: $9,256 minus $6,167 = $3,089 on 1,000 square feet
Break-even: about $0.59 a stem. Below that, every stem you sell costs you money.
Notice how much rides on the price per stem. That is the one number you control at the market table. If you are not sure what your stems really cost you, the free Flower Pricing Reality Check works out your cost per stem, and the Flower Farm Pricing Toolkit turns it into prices for every way you sell.
What the full toolkit adds
This page answers one question: does the space pay? The toolkit answers the next one, which is what to charge for every stem, bouquet and share you sell.
The next step: what to charge
Flower Farm Pricing Toolkit
17 tabs and 11 calculators in one spreadsheet
True cost per stem for 35 varieties, seed to sale
Bouquet, market, CSA and wedding prices with your labor built in
Works in Excel and Google Sheets, instant download
It depends far more on what you sell than on the acreage. A Virginia Tech extension guide cites $25,000 to $35,000 in value per acre for field-grown cut flowers, and that is sales, not profit. Subtract seed, marketing, overhead and your own hours to find profit. University of Tennessee’s 2025 zinnia budget leaves about a third of sales as profit after paying labor.
Is flower farming profitable on a small plot?
It can be. University of Tennessee Extension’s 2025 zinnia budget shows $9,256 in sales and $3,089 left after all costs, including paid labor, on just 1,000 square feet. Their single-stem sunflower budget leaves only $629 on the same space. Crop choice and price per stem make the difference, so run both through the calculator above.
How many stems can you grow in 1,000 square feet?
University of Tennessee Extension’s 2025 budgets estimate 9,256 marketable zinnia stems from 1,780 plants, assuming 65 percent are sold at 8 stems each, and 2,800 single-stem sunflowers on the same 1,000 square feet. Your own spacing, weather and pests will move these numbers, so track a full season of your harvest and use your real count.
What costs should I count when figuring flower farm profit?
Count marketing and selling costs, seed and plugs, soil and fertilizer, your labor hours at a real wage, and a share of tools, irrigation, cooler space and general overhead. University of Tennessee’s budgets add 20 percent of sales for marketing and 15 percent of production cost for overhead. Leaving out your own time is the most common way growers overstate profit.
Ready to price what those beds grow? The Flower Farm Pricing Toolkit does the math for bouquets, market bunches, weddings and CSA shares, with your labor already in it.
(function(){
var P={z:{pl:1780,mk:65,sp:8,pr:"1.00",mf:20,gc:959,lh:112,wg:15.87,fx:1579},s:{pl:4000,mk:70,sp:1,pr:"1.70",mf:20,gc:947,lh:68,wg:15.87,fx:1153}};
function $(id){return document.getElementById(id);}
function v(id){var x=parseFloat($(id).value);return isNaN(x)||x<0?0:x;}
function money(x){return (x<0?"-$":"$")+Math.round(Math.abs(x)).toLocaleString("en-US");}
function num(x){return Math.round(x).toLocaleString("en-US");}
function esc(s){return String(s).replace(/&/g,"&").replace(/</g,"<");}
$("ac-crop").addEventListener("change",function(){var p=P[this.value];for(var k in p){$("ac-"+k).value=p[k];}run();});
function bars(items,max){var h='<div class="bars">';items.forEach(function(it){var w=max>0?Math.max(0,it.v)/max*100:0;h+='<div class="b" title="'+esc(it.l+": "+it.t)+'"><span>'+esc(it.l)+'</span><div class="track"><div class="fill" style="width:'+w.toFixed(1)+'%;background:'+it.c+'"></div></div><span class="val">'+esc(it.t)+'</span></div>';});return h+'</div>';}
function line(stems,mf,flat,price,be){
var W=Math.max(300,Math.min(640,($('ac-out').clientWidth||560))),H=Math.round(W*0.42)+40,L=58,R=14,T=14,B=30;var xmax=Math.max(price*2,be*1.6,1);xmax=Math.ceil(xmax*4)/4;
function prof(p){return stems*p*(1-mf)-flat;}
var ymin=prof(0),ymax=prof(xmax);if(ymax<=0)ymax=Math.abs(ymin)*0.3;
function X(p){return L+(p/xmax)*(W-L-R);}function Y(y){return T+(ymax-y)/(ymax-ymin)*(H-T-B);}
var s='<svg viewBox="0 0 '+W+' '+H+'" role="img" aria-label="Line chart: profit per 1,000 square feet rises with price per stem; it crosses zero at the break-even price of $'+be.toFixed(2)+'.">';
[ymin,0,ymax].forEach(function(t){s+='<line x1="'+L+'" x2="'+(W-R)+'" y1="'+Y(t)+'" y2="'+Y(t)+'" stroke="'+(t===0?'#8a8579':'#ece6db')+'" stroke-width="1"/><text x="'+(L-6)+'" y="'+(Y(t)+4)+'" text-anchor="end">'+money(t)+'</text>';});
for(var i=0;i<=4;i++){var p=xmax*i/4;s+='<text x="'+X(p)+'" y="'+(H-10)+'" text-anchor="middle">$'+p.toFixed(2)+'</text>';}
s+='<line x1="'+X(0)+'" y1="'+Y(prof(0))+'" x2="'+X(xmax)+'" y2="'+Y(prof(xmax))+'" stroke="#1F7FA8" stroke-width="2.5" stroke-linecap="round"/>';
if(be>0&&be<=xmax){s+='<circle cx="'+X(be)+'" cy="'+Y(0)+'" r="5" fill="#D9622B" stroke="#fffdf9" stroke-width="2"/><text x="'+(X(be)+8)+'" y="'+(Y(0)+18)+'" style="fill:#1f1d1a;font-weight:600">break-even $'+be.toFixed(2)+'</text>';}
s+='<circle cx="'+X(price)+'" cy="'+Y(prof(price))+'" r="5" fill="#1F7FA8" stroke="#fffdf9" stroke-width="2"/><text x="'+(X(price)-8)+'" y="'+(Y(prof(price))-10)+'" text-anchor="end" style="fill:#1f1d1a;font-weight:600">you: '+money(prof(price))+'</text>';
s+='<rect class="hit" x="'+L+'" y="'+T+'" width="'+(W-L-R)+'" height="'+(H-T-B)+'" fill="transparent"/></svg>';
return {svg:s,X:X,L:L,R:R,W:W,xmax:xmax,prof:prof};
}
function run(){
var sqft=$("ac-unit").value==="acre"?v("ac-area")*43560:v("ac-area");var k=sqft/1000;
var stems=v("ac-pl")*(Math.min(v("ac-mk"),100)/100)*v("ac-sp");var price=v("ac-pr");var mf=Math.min(v("ac-mf"),100)/100;
var sales=stems*price,mkt=sales*mf,gc=v("ac-gc"),lab=v("ac-lh")*v("ac-wg"),fx=v("ac-fx");var flat=gc+lab+fx;var cost=mkt+flat;var net=sales-cost;
var perHour=v("ac-lh")>0?(net+lab)/v("ac-lh"):0;var be=stems*(1-mf)>0?Math.ceil(flat/(stems*(1-mf))*100)/100:0;
var h='<div class="hero'+(net<0?' neg':'')+'"><div class="k">'+(net<0?'These beds lose, per 1,000 sq ft':'You keep, per 1,000 sq ft of beds')+'</div><div class="v">'+money(net)+'</div><div class="small">'+num(stems)+' stems sold, '+money(sales)+' in sales, '+money(cost)+' in costs including your labor.'+(k!==1?' Your '+num(sqft)+' sq ft: <strong>'+money(net*k)+'</strong>.':'')+'</div></div>';
h+='<div class="tiles"><div class="tile"><div class="k">You earn per hour worked</div><div class="v">'+money(perHour)+'</div><div class="s">profit plus wage, per hour</div></div><div class="tile"><div class="k">Break-even price</div><div class="v">$'+be.toFixed(2)+'</div><div class="s">per stem, after all costs</div></div><div class="tile"><div class="k">Per acre ceiling</div><div class="v">'+money(net*43.56)+'</div><div class="s">only if every acre did this</div></div></div>';
if(sqft>=43560/4){h+='<p class="small" style="margin-top:10px">Heads up: an acre of beds at these numbers means selling '+num(stems*43.56)+' stems a season. A Virginia Tech extension guide cites $25,000 to $35,000 in value per acre for field-grown cut flowers. Line up buyers for this volume before you plant for it.</p>';}
if(net<0){h+='<p class="small" style="margin-top:10px;color:#9a3a14"><strong>These beds lose money.</strong> Raise your stem price above the break-even, cut costs, or sell more of what you grow.</p>';}
if(sales>0){var c="#D9622B",p="#1F7FA8";var items=[{l:"Marketing",v:mkt},{l:"Labor",v:lab},{l:"Overhead",v:fx},{l:"Growing",v:gc}].sort(function(a,b){return b.v-a.v;}).map(function(i){return {l:i.l,v:i.v/sales,t:Math.round(i.v/sales*100)+"¢",c:c};});items.push({l:net<0?"Loss":"You keep",v:Math.abs(net)/sales,t:(net<0?"-":"")+Math.round(Math.abs(net)/sales*100)+"¢",c:net<0?"#8a8579":p});
var mx=0;items.forEach(function(i){if(i.v>mx)mx=i.v;});
h+='<div class="chart-t">Where each $1 of sales goes</div><div class="legend"><span><i style="background:#D9622B"></i>Costs</span><span><i style="background:#1F7FA8"></i>Profit</span></div>'+bars(items,mx);}
var ln=line(stems,mf,flat,price,be);
h+='<div class="chart-t">Price per stem is your biggest lever</div><div style="position:relative" id="ac-lw">'+ln.svg+'<div class="tip" id="ac-tip"></div></div><p class="small">Profit per 1,000 sq ft at each stem price, with your other numbers held the same.</p>';
h+='<div class="cta"><p><strong>Your floor is $'+be.toFixed(2)+' a stem. Now set prices that clear it.</strong> The Flower Farm Pricing Toolkit turns your real costs into prices for bouquets, market bunches, CSA shares and weddings, with your labor built in.</p><div class="btns"><a class="btn" href="https://annakatherinepage.com/product/flower-farm-pricing-toolkit/">Get the $27 toolkit</a></div></div>';
$("ac-out").innerHTML=h;
var w=$("ac-lw"),tip=$("ac-tip"),svg=w.querySelector("svg");
w.addEventListener("mousemove",function(e){var r=svg.getBoundingClientRect();var sx=(e.clientX-r.left)/r.width*ln.W;if(sx<ln.L||sx>ln.W-ln.R){tip.style.display="none";return;}var pp=(sx-ln.L)/(ln.W-ln.L-ln.R)*ln.xmax;tip.innerHTML="$"+pp.toFixed(2)+" a stem: "+money(ln.prof(pp));tip.style.display="block";tip.style.left=Math.min(e.clientX-w.getBoundingClientRect().left+10,r.width-170)+"px";tip.style.top="0px";});
w.addEventListener("mouseleave",function(){tip.style.display="none";});
}
["ac-area","ac-unit","ac-pr","ac-pl","ac-mk","ac-sp","ac-mf","ac-gc","ac-lh","ac-wg","ac-fx"].forEach(function(id){$(id).addEventListener("input",run);$(id).addEventListener("change",run);});
run();
var rt;window.addEventListener('resize',function(){clearTimeout(rt);rt=setTimeout(run,200);});
})();
(function () {
var c = document.body.className;
c = c.replace(/woocommerce-no-js/, 'woocommerce-js');
document.body.className = c;
})();
Leave a Reply