You learned how to grow. Nobody taught you how to price.
Growing took seasons of real work to learn. Pricing? You were handed
nothing at all. So you do what almost every new grower does, you walk the
market, glance at the booth two stalls down, and price a dollar under
whatever they’re asking. You quote a wedding by landing on a number that
feels reasonable, then quietly hope it was enough.
Here is the hard truth, and it is worth sitting with for a moment:
most first-year growers charge about half of what their flowers are
actually worth, and never find out, because nothing on the table tells
them. The flowers sell. The money feels fine in the moment. And then the
season ends and the income simply isn’t what the work should have earned.
It isn’t a growing problem. Your flowers are lovely. It’s a pricing
problem, and a pricing problem is a fixable problem.
And here is what makes this guide different from every “just charge
your worth” pep talk you’ve scrolled past. Most pricing advice
refuses to give you a number. It hands you a feeling and sends you off to
guess. This guide ends with an actual number, built on real 2025
wedding-market data, not somebody’s gut.
The Five Signs
Be honest with yourself
Check the box on every sign that sounds like you. Nobody is
watching. Your score appears at the bottom.
1You price by looking at the booth next door
Your prices are a reaction to whoever set up near you,
not a decision built from your own costs. If the grower beside you is
also underpricing (they probably are), you’ve just copied a mistake and
shaved a dollar off it.
What it costs you: an entire market’s prices,
anchored to a stranger’s guess.
2You’ve never calculated your cost per stem
You don’t know, to the penny, what a single zinnia or
dahlia stem costs you to grow. Without that number you have no floor,
which means no way of knowing whether a price is profitable or just
popular.
What it costs you: selling below cost on your
slow-yielding crops without ever realizing it.
3“How much?” makes you panic
A customer asks the price and your stomach drops. You
say a number a little too fast, a little too low, and feel strange about
it for the next ten minutes. That flinch is the sound of a price you
don’t trust.
What it costs you: every negotiation, before it
even starts, you’ve already discounted in your head.
4You shrink your biggest quotes
A big job lands, a wedding, an event, a bulk wholesale
order, and the number is finally large enough to scare you, so you shrink
it to feel safe. But these are your highest-margin sales. (For scale: The
Knot’s 2025 study puts the average wedding’s flower spend at
$2,800.) A low quote doesn’t win the job. It funds someone
else’s.
What it costs you: $1,500 or more, from a
single event, in one afternoon of work.
5You don’t know what your season will total
If someone asked what you’ll earn this year across
markets, CSA, weddings, and your stand, you’d have to shrug. You’ll find
out in October, the most expensive possible time to learn you priced too
low to hit your goal.
What it costs you: a whole season spent flying
blind, with no chance to correct course mid-flight.
You checked 0 of 5.
0–1Sharper than most growers. You’re close.
Lock in the one number below and your pricing is genuinely solid.
2–3You’re underpricing. It’s quietly costing
you a real slice of the season, and it is fixable, starting right
below.
4–5You’re working close to free. Hard to read,
harder to live. But every sign traces back to one missing number.
Keep going, we’ll find it.
You are closer than you think
Your pricing is mostly working, and that puts you ahead of most growers. The risk at your level is not one big mistake. It is drift: copying a neighbor’s price because it feels safe, holding last season’s number while your seed, soil, and supply costs creep up, and never once checking your prices against what your flowers actually cost you to grow. The calculator locks your number in with your real costs, so next season’s prices get set on purpose instead of by habit.
Some leaks, and every one of them is fixable
A score in this range usually means a few of your prices are fine and a few are quietly leaking money, and the hard part is knowing which is which. Guessing does not fix that, and neither does copying the farm down the road, because their costs are not your costs. The calculator works stem by stem: you enter what a bouquet actually costs you to grow, and it shows you the price that covers your costs and pays you for your time. Most growers who run their numbers find the leaks in the first few bouquets they check.
You are leaving real money on the table, and it is fixable this week
A score in this range means your prices are set well under what your costs call for, and the math on that is brutal once you see it. If a bouquet is priced just 3 dollars light, and you sell 30 bouquets a week across a 20 week season, that is 1,800 dollars gone in one season. Not lost to a competitor. Just gone. The calculator rebuilds your prices from your real costs, stem by stem, and you can run your main bouquets through it this week. It comes with a simple promise: Love it in 60 seconds or I’ll refund you. No questions, no forms.
Most local price ceilings are assumed, not tested. A grower guesses what her town will pay and prices under that guess for years, while her costs keep climbing. Start from your costs instead, so you know your real floor. Then test one small increase on one product and watch what actually happens. Most growers who try it find the ceiling was higher than the fear.
“Grocery store flowers are cheaper”
Grocery store bouquets are priced as loss leaders and shipped in from far away, often cut weeks before they reach the shelf. Your stems are a different product: cut days or even hours before your customer gets them, fresher, longer in the vase, and varieties that could never survive shipping. When a customer compares prices, you can say this: “These were cut this week on my farm, a few miles from here, and that is why they last.” One honest sentence usually ends the comparison.
“I don’t want to undercut other farmers”
Pricing from your real costs is how a local market stays healthy. When a grower prices below what her flowers cost to grow, buyers learn to expect a price nobody can sustain, and every grower in the area pays for that lesson. Charging what your flowers actually cost, including your time, is not undercutting anyone. It is the opposite. It protects your farm and the market everyone sells into.
Your score shows where you stand. The full breakdown
goes sign by sign: what each one costs you, why it happens to almost
every first-year grower, and the exact fix. Enter your email and it lands
in your inbox in a minute, plus a few short notes that walk you through
each fix.
Free. No course, no webinar. Unsubscribe in one click.
Done. Check your inbox in a minute for your full breakdown.
Every sign above comes from not knowing one number: what a single stem
costs you to grow. This is your floor, the price you must never,
ever sell below.
The Formula
Cost per stem = total cost to grow the crop
÷ ( plants × sellable stems per plant )
The bed behind the numbers: zinnias in the Cut + Bloom garden.
Worked example: a bed of zinnias
Seed, soil amendments & drip line (the crop)$120
Number of plants100
Sellable stems per plant, full season25
Total sellable stems (100 × 25)2,500
Cost per stem ($120 ÷ 2,500)≈ $0.05
Now, the trap most growers fall into.
Your cost per stem is tiny. So if you price by “cost plus a
little,” you land absurdly low: mark that nickel up 3× and a
20-stem bouquet is “worth” $3. You’d never charge $3, so you
charge $15 and feel generous. But a fair mixed-market bouquet runs
$25–$35. Cost-plus pricing didn’t protect you. It’s the very
reason you’re underpricing.
Cost per stem is your floor, not your price. Run your own worst
crop through it:
Find your cost-per-stem floor
Your cost per stem–
You are closer than you think
Lock your number in with your real costs before next season’s habits set. The calculator does the math in about a minute.
Some leaks, and every one of them is fixable
Find which of your prices leak and fix the math stem by stem. Seven dollars, about a minute per bouquet.
You are leaving real money on the table, and it is fixable this week
A few dollars under per bouquet adds up to thousands across a season. Run your real costs through the calculator this week, covered by the 60 second guarantee: love it or get refunded, no questions, no forms.
Your floor told you what not to go below. This tells you what
underpricing has already cost you, in real dollars, this season. It is the
most uncomfortable math in this guide, and also the most useful.
The gap, across one grower’s market season
Market bouquets sold this season (25/week × 20 weeks)500
What she charges per bouquet now$18
Fair mixed-market rate per bouquet$30
Gap per bouquet ($30 − $18)$12
Left in the field this season$6,000
And that is just one channel.
That $6,000 is market bouquets alone. It doesn’t count the wedding
quoted $1,500 too low, or the CSA shares priced by feel. Stacked across
every channel a grower sells through, a first season’s pricing gap
routinely clears five figures.
Now run your own. Be honest with the rates; a fair mixed-market bouquet
sells for $25–$35 in most regions:
You found your floor and saw your gap by hand, for one crop and one
channel. The Flower Farm Pricing Toolkit does exactly that, for
every variety and every way you sell, in minutes. Here is how this guide
hands straight off to it.
Selling subscriptions? Price the season, not the bouquet.
A subscription locks your price in for weeks, so a wrong number repeats all season. Price it from your per bouquet cost times the number of weeks, then add your delivery time like it is a real cost, because it is. The pattern that works: pickup priced lower, delivery priced meaningfully higher. If your subscription math feels like a guess, the toolkit walks it stem by stem.
Includes the subscription pricing worksheet: per bouquet cost, weeks, and delivery, priced as one season-long number.
Nine tabs in one file: cost per stem, stems per plant, bouquets, weddings, CSA, Bloom Bars, and a season forecast.
From this guide, into the toolkit
You worked out the cost-per-stem floor for one crop, by hand.
Tabs 2 & 3 hold it for all 35 varieties and turn each into a market and premium price.
You estimated the money left behind on a single channel.
Tab 7 forecasts your whole season across market, CSA, weddings, wholesale, and your stand.
The signs you checked: the panic quote, the scary big-job number.
Tabs 4, 5 & 6 build bouquet recipes, line-item wedding quotes, and bloom-bar pricing, each with the margin shown.
Picture
it: a customer asks “how much?” and you give the number, no
flinch and no mental math, without guessing and without undercharging.
That is the whole of it, simply having the number ready.
The Flower Farm Pricing Toolkit
Five calculators. One honest answer.
Real numbers for every channel you sell through, validated against The
Knot’s 2025 Real Weddings Study. Built for growers, not florists. You enter
your costs once; it prices everything you sell and forecasts your whole
season.
window.fluent_form_ff_form_instance_2_1 = {"id":"2","ajaxUrl":"https:\/\/annakatherinepage.com\/wp-admin\/admin-ajax.php","settings":{"layout":{"labelPlacement":"top","helpMessagePlacement":"with_label","errorMessagePlacement":"inline","asteriskPlacement":"asterisk-right"},"restrictions":{"denyEmptySubmission":{"enabled":false}}},"form_instance":"ff_form_instance_2_1","form_id_selector":"fluentform_2","rules":{"email":{"required":{"value":true,"message":"This field is required"},"email":{"value":true,"message":"This field must contain a valid email"}}},"debounce_time":300,"file_upload_settings":[]};
// --- Hero video: hide placeholder only once a real clip loads ---
(function () {
var v = document.getElementById('heroVideo');
var ph = document.getElementById('filmPlaceholder');
if (!v) return;
v.addEventListener('loadeddata', function () {
if (v.videoWidth > 0) ph.style.display = 'none';
});
v.addEventListener('error', function () { /* keep placeholder */ });
})();
// --- Scorecard: tally checked signs, light up the matching tier ---
(function () {
var boxes = document.querySelectorAll('.signbox');
var count = document.getElementById('scoreCount');
var tiers = document.querySelectorAll('.tier');
function band(n) { return n <= 1 ? '0-1' : n <= 3 ? '2-3' : '4-5'; }
function update() {
var n = 0;
boxes.forEach(function (b) {
if (b.checked) { n++; b.closest('[data-sign]').classList.add('checked'); }
else { b.closest('[data-sign]').classList.remove('checked'); }
});
count.textContent = n + ' of 5';
var active = band(n);
tiers.forEach(function (t) {
t.classList.toggle('on', t.getAttribute('data-tier') === active);
});
}
boxes.forEach(function (b) { b.addEventListener('change', update); });
update();
})();
// --- Cost-per-stem calculator ---
(function () {
var cost = document.getElementById('cropCost');
var plants = document.getElementById('plants');
var stems = document.getElementById('stems');
var out = document.getElementById('stemOut');
function calc() {
var c = parseFloat(cost.value), p = parseFloat(plants.value), s = parseFloat(stems.value);
if (!(c >= 0) || !(p > 0) || !(s > 0)) { out.textContent = '-'; return; }
var per = c / (p * s);
out.textContent = '$' + (per < 0.10 ? per.toFixed(3) : per.toFixed(2));
}
[cost, plants, stems].forEach(function (i) { i.addEventListener('input', calc); });
})();
// --- Money-left-behind calculator ---
(function () {
var bq = document.getElementById('bouquets');
var yp = document.getElementById('yourPrice');
var fp = document.getElementById('fairPrice');
var out = document.getElementById('gapOut');
function calc() {
var b = parseFloat(bq.value), y = parseFloat(yp.value), f = parseFloat(fp.value);
if (!(b > 0) || !(y >= 0) || !(f >= 0)) { out.textContent = '-'; return; }
var gap = (f - y) * b;
if (gap <= 0) { out.textContent = 'You’re at market'; out.style.fontSize = '1.3rem'; return; }
out.style.fontSize = '';
out.textContent = '$' + Math.round(gap).toLocaleString('en-US');
}
[bq, yp, fp].forEach(function (i) { i.addEventListener('input', calc); });
})();
// --- Email opt-in (demo handler; Fluent Forms takes over on WordPress) ---
(function () {
var f = document.getElementById('optinForm');
if (!f) return;
f.addEventListener('submit', function (e) {
e.preventDefault();
f.style.display = 'none';
var fine = document.getElementById('optinFine');
if (fine) fine.style.display = 'none';
document.getElementById('optinThanks').style.display = 'block';
});
})();
(function(){function route(){var sc=document.getElementById("scoreCount");var n=0;if(sc){var m=(sc.textContent||"").match(/(\d+)/);n=m?parseInt(m[1]):0;}var t=document.getElementById("frc-scorecta-text"),p=document.getElementById("frc-cta-primary"),s=document.getElementById("frc-cta-secondary");if(!t||!p||!s)return;if(n<=1){t.textContent="Solid footing. Lock in your price floor before market season, starting with your next bouquet.";p.textContent="Get the $7 bouquet calculator";p.setAttribute("href","/product/bouquet-market-pricing-calculator/");s.innerHTML="Want your whole farm priced? <a href=\"/product/flower-farm-pricing-toolkit/\" style=\"color:#2D4A2B;text-decoration:underline;\">See the $27 toolkit →</a>";}else if(n<=3){t.textContent="You\u2019re likely underpricing in at least one channel. Fix it across your whole farm, not just bouquets.";p.textContent="Get the full toolkit for $27";p.setAttribute("href","/cart/?add-to-cart=605");s.innerHTML="Only need bouquet pricing today? <a href=\"/product/bouquet-market-pricing-calculator/\" style=\"color:#2D4A2B;text-decoration:underline;\">Start with the $7 calculator →</a>";}else{t.textContent="You\u2019re not careless, you\u2019re missing a system. You need more than a bouquet price.";p.textContent="Get the full toolkit for $27";p.setAttribute("href","/cart/?add-to-cart=605");s.innerHTML="Includes the $7 calculator, plus wedding quotes, CSA, bloom bars, market bunches, and a season forecast.";}}var sc=document.getElementById("scoreCount");if(sc){try{new MutationObserver(route).observe(sc,{childList:true,characterData:true,subtree:true});}catch(e){}}if(document.readyState!=="loading")route();else document.addEventListener("DOMContentLoaded",route);})();
(function(){function go(){var sc=document.getElementById("scoreCount");var card=document.querySelector("#frc .scorecard");if(!sc||!card)return;if(!card.querySelector(".frc-wait")){var w=document.createElement("div");w.className="frc-wait";w.innerHTML="Check every sign above that sounds like you. Your result shows up right here.<br><span style=\"display:block;margin-top:10px;font-size:.95em;\">Just planning your first season? Your most important price is the first one you set. <a href=\"#frc-score-pitch\" style=\"color:#2D4A2B;text-decoration:underline;\">The tool below</a> runs the numbers before you ever guess.</span>";card.insertBefore(w,card.firstChild);}var m=(sc.textContent||"").match(/(\d+)/);var n=m?parseInt(m[1],10):0;card.classList.toggle("frc-has",n>0);}var sc=document.getElementById("scoreCount");if(sc){try{new MutationObserver(go).observe(sc,{childList:true,characterData:true,subtree:true});}catch(e){}}if(document.readyState!=="loading")go();else document.addEventListener("DOMContentLoaded",go);})();
(function () {
var c = document.body.className;
c = c.replace(/woocommerce-no-js/, 'woocommerce-js');
document.body.className = c;
})();
var fluentFormVars = {"ajaxUrl":"https://annakatherinepage.com/wp-admin/admin-ajax.php","forms":[],"step_text":"Step %activeStep% of %totalStep% - %stepTitle%","step_completed_text":"Completed","is_rtl":"","date_i18n":{"previousMonth":"Previous Month","nextMonth":"Next Month","months":{"shorthand":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"longhand":["January","February","March","April","May","June","July","August","September","October","November","December"]},"weekdays":{"longhand":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"shorthand":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]},"daysInMonth":[31,28,31,30,31,30,31,31,30,31,30,31],"rangeSeparator":" to ","weekAbbreviation":"Wk","scrollTitle":"Scroll to increment","toggleTitle":"Click to toggle","amPM":["AM","PM"],"yearAriaLabel":"Year","firstDayOfWeek":1},"pro_version":"","fluentform_version":"6.2.16","force_init":"","stepAnimationDuration":"350","upload_completed_txt":"100% Completed","upload_start_txt":"0% Completed","uploading_txt":"Uploading","choice_js_vars":{"noResultsText":"No results found","loadingText":"Loading...","noChoicesText":"No choices to choose from","itemSelectText":"Press to select","maxItemTextSingular":"Only %%maxItemCount%% option can be added","maxItemTextPlural":"Only %%maxItemCount%% options can be added"},"input_mask_vars":{"clearIfNotMatch":false},"nonce":"435158a9e2","file_delete_nonce":"f585d299e6","form_id":"2","step_change_focus":"1","has_cleantalk":"","pro_payment_script_compatible":""};
var fluentform_submission_messages_2 = {"file_upload_in_progress":"File upload in progress. Please wait...","javascript_handler_failed":"Javascript handler could not be loaded. Form submission has been failed. Reload the page and try again"};
var fluentform_payment_messages_2 = {"stock_out_message":"This Item is Stock Out","item_label":"Item","price_label":"Price","qty_label":"Qty","line_total_label":"Line Total","sub_total_label":"Sub Total","discount_label":"Discount","total_label":"Total","signup_fee_label":"Signup Fee","trial_label":"Trial","processing_text":"Processing...","confirming_text":"Confirming..."};
var fluentform_save_progress_messages_2 = {"copy_button":"Copy","email_button":"Email","email_placeholder":"Your Email Here","copy_success":"Copied"};
var fluentform_address_messages_2 = {"please_wait":"Please wait ...","location_not_determined":"Could not determine address from location.","address_fetch_failed":"Failed to fetch address from coordinates.","geolocation_failed":"Geolocation failed or was denied.","geolocation_not_supported":"Geolocation is not supported by this browser."};
var fluentform_gateway_messages_2 = {"request_failed":"Request failed. Please try again","payment_failed":"Payment process failed!","no_method_found":"No method found","processing_text":"Processing..."};
var fluentform_submission_messages_global = {"javascript_handler_failed":"Javascript handler could not be loaded. Form submission has been failed. Reload the page and try again"};
var fluentform_address_messages_global = {"please_wait":"Please wait ...","location_not_determined":"Could not determine address from location.","address_fetch_failed":"Failed to fetch address from coordinates.","geolocation_failed":"Geolocation failed or was denied.","geolocation_not_supported":"Geolocation is not supported by this browser."};
//# sourceURL=fluent-form-submission-js-extra
(function(){
try{
var mq=window.matchMedia("(max-width:639px)");
var bar=document.getElementById("akp-qb"),link=document.getElementById("akp-qb-link");
var check=document.getElementById("frc-check"),card=document.querySelector("#frc .scorecard");
var heroStart=document.getElementById("frc-hero-start"),topStart=document.querySelector(".frc-startcta");
if(!bar||!link||!check||!card){return;}
var H=48,done=false,focused=false,shown=false,lastReason="init";window.__akpqb=function(){return {done:done,focused:focused,shown:shown,mq:mq.matches,reason:lastReason};};
function anyChecked(){var b=document.querySelectorAll("input.signbox");for(var i=0;i<b.length;i++){if(b[i].checked){return true;}}return false;}
function onScreen(el){if(!el){return false;}var r=el.getBoundingClientRect();return r.bottom>0&&r.top<(window.innerHeight-H);}
function setShown(v){if(v===shown){return;}shown=v;bar.classList.toggle("akp-qb-show",v);}
function setPad(v){document.documentElement.classList.toggle("akp-qb-pad",v);}
function update(){
if(!mq.matches||done){lastReason=done?"done":"desktop";setShown(false);setPad(false);return;}
setPad(true);
var cr=card.getBoundingClientRect();
var cardEntered=cr.top<window.innerHeight;
if(cardEntered&&card.classList.contains("frc-has")&&cr.bottom>0){done=true;lastReason="seen";setShown(false);setPad(false);return;}
if(focused||cardEntered||onScreen(heroStart)||onScreen(topStart)){lastReason=focused?"focused":cardEntered?"cardEntered":"startVisible";setShown(false);return;}
if(anyChecked()){if(link.textContent!=="See my score"){link.textContent="See my score";link.setAttribute("href","#frc-score");}}
else if(link.textContent!=="Start the free check"){link.textContent="Start the free check";link.setAttribute("href","#frc-check");}
lastReason="show";setShown(true);
}
var ticking=false;
function queue(){if(ticking){return;}ticking=true;setTimeout(function(){ticking=false;update();},60);}
if(!card.id){card.id="frc-score";}
link.addEventListener("click",function(){setTimeout(update,120);setTimeout(update,700);});
window.addEventListener("scroll",queue,{passive:true});
document.addEventListener("scroll",queue,{passive:true,capture:true});
var lastY=window.pageYOffset;setInterval(function(){if(window.pageYOffset!==lastY){lastY=window.pageYOffset;update();}},200);
window.addEventListener("resize",queue);
if(mq.addEventListener){mq.addEventListener("change",queue);}else if(mq.addListener){mq.addListener(queue);}
document.addEventListener("change",function(e){if(e.target&&e.target.classList&&e.target.classList.contains("signbox")){setTimeout(update,0);}});
document.addEventListener("focusin",function(e){var t=e.target;if(t&&t.matches&&t.matches("input,textarea,select")&&!t.classList.contains("signbox")){focused=true;update();}});
document.addEventListener("focusout",function(e){var t=e.target;if(t&&t.matches&&t.matches("input,textarea,select")){focused=false;setTimeout(update,150);}});
try{new MutationObserver(queue).observe(card,{attributes:true,attributeFilter:["class"]});}catch(e){}
update();
setTimeout(update,800);
}catch(e){}
})();
(function(){
function rgb(c){var m=(c||"").match(/[0-9.]+/g);return m?m.map(Number):null;}
function lum(a){return (0.299*a[0]+0.587*a[1]+0.114*a[2])/255;}
function effbg(el){var n=el;while(n){var c=rgb(getComputedStyle(n).backgroundColor);if(c&&(c.length<4||c[3]>0.5))return c;n=n.parentElement;}return null;}
var sel="main h1,main h2,main h3,main h4,main p,main li,main span,#frc h1,#frc h2,#frc h3,#frc p,#frc span,#frc li";
document.querySelectorAll(sel).forEach(function(t){
var bg=effbg(t);
if(!bg) return;
if(lum(bg)<0.30){
var fc=rgb(getComputedStyle(t).color);
if(fc && lum(fc)<0.5){ t.style.setProperty("color","#f7f1e6","important"); }
}
});
})();