A complete guide for farmers
MilkShelf gives your farm a custom signup page at yourfarm.milkshelf.com β this is your farm's permanent public link. Share it anywhere: your website, Facebook, a text message, or a QR code flyer on your fridge. Customers use it to subscribe, manage their subscription, and check for extra jars. You get a private dashboard to manage everything β orders, labels, capacity, emails, and more.
Here's the basic flow:
MilkShelf includes built-in card billing through Stripe. Customers enter a card when they sign up and are charged automatically on their pickup day β no chasing payments, no Venmo requests. By default you net your full jar price β a small processing fee is added to the customer's charge β or you can choose to absorb the fees yourself in Settings β Pricing. If a customer prefers to pay cash, that option is available too and their pickups are tracked the same way β unless the farm has turned on Require Card Payment, in which case new customers must use a card.
When someone visits your link, here's what they see:
They enter their phone number first. If they've signed up before, their info is pre-filled so they can make changes. If they're new, a blank form appears.
They choose a pickup day from your active days and select how many jars. Days that are full show as "(FULL)" and can't be selected. The jar dropdown adjusts based on what's available that day.
They choose weekly or β if you offer it β every two weeks. For biweekly customers, the system automatically manages scheduling to keep your weekly milk demand consistent β see below.
When a biweekly customer signs up, the system checks whether your existing biweekly customers are balanced. If they are, the new customer gets free choice of day and start date. If there's an unpaired customer, the system assigns the new customer to that customer's off week β so you always fill the same number of jars every week, regardless of who's biweekly. The new customer sees a note explaining why their day was pre-selected. If it doesn't work for them, they're directed to contact you directly. Jar counts are matched to the unpaired customer's jar count to keep things even.
If you'd rather let biweekly customers pick whatever day and start date they want β even if it leaves your weekly demand uneven β turn off the Auto-pair Every-2-Week Customers toggle in Settings β Pickup Frequency.
They choose when to get pickup reminders β the night before at 6 PM, the morning of at 8 AM, or no reminders.
If you've turned on a customer agreement in Settings β Customer Agreement, new customers read your agreement text and sign it with their typed name as part of signing up. It applies to new signups only β existing customers, including anyone who joined before you turned the agreement on, aren't asked to sign retroactively. You get a PDF copy of each signed agreement by email, and MilkShelf keeps a signed record of who signed, when, the exact text they agreed to, and its version.
So your pickup-day counts and printed labels stay stable, customers can't change their order in the final stretch before a pickup β from 8 PM the night before through the end of pickup day. Up until then they can freely add, remove, or adjust jars and add-ons. During the locked window they see a short note that editing is paused and when it reopens (the day after pickup). Anyone whose pickup isn't imminent β including customers on vacation that week β can edit as normal.
Beyond milk, you can offer extra products β eggs, butter, yogurt, cheese, whatever you have β that customers add right to their order. Add-ons are optional and stay hidden until you create your first one.
Open the Add-On Items section in Settings and click "Add an item." Give each one a name and a price. If you only have so much to go around, set a Capacity β the most you can hand out on a single pickup day (leave it blank for no limit, or set it to 0 to close an item temporarily). Reorder items with the arrows, or uncheck "Active" to hide one without deleting it.
Customers pick per add-on. Every pickup adds it to every order going forward β a weekly tub of yogurt, a standing dozen eggs. Just next pickup is a one-time extra for a single date β a one-off order of butter this week. They choose right on your signup page, alongside their milk.
Add-ons are charged automatically β nothing extra for you to collect. On per-pickup farms they're billed right alongside the milk: recurring ones every pickup, one-time ones on their pickup date.
On herdshare and monthly farms, milk bills on a monthly (or 4-week) cycle, but add-ons bill per distribution β for each week the add-on actually goes out. So a weekly yogurt is charged for each week it's handed out, and a one-time add-on is charged on its distribution date. This keeps add-on charges matched to what customers actually receive, no matter how the milk itself is billed.
Each customer's add-ons show up everywhere you need them β on Today's Orders, This Week, the Schedule, and their detail card when you search β so you always know exactly what to pack. One-time add-ons appear only on their date.
Every add-on prints its own label alongside the jar labels, showing its name and count (e.g. "Yogurt β 1 of 2"), so nothing gets missed at pickup. One-time add-on labels print only on the date they're for.
If you set a Capacity β say 10 dozen eggs a week β the order form tracks how many are left and won't let customers order past your limit, the same way pickup days fill up. When an item's gone for the week, customers can't add it until capacity opens back up.
Dashboard β Settings β Add-On Items
Your dashboard has five tabs across the top β Today, Customers, Schedule, Settings, and Payments. The Today tab is your morning routine β everything you need to fill jars and get them out the door:
Shows every active customer picking up today, their jar count, and any notes. Customers on vacation are automatically hidden. The total jar count is shown in the header.
Click or tap Print on Today's Orders (or Upcoming Orders) to print a delivery sheet right from your dashboard β on paper, or save it as a PDF from your browser's print dialog. It's grouped by pickup location and lists each customer with their jar count, a per-location subtotal, a grand total, and each customer's payment method (cash or card). Hand it to whoever does the drop-offs so they know how many jars to load for each location and who gets them.
Pick a collection date and tap "Generate Labels" to create labels for any pickup day. Labels download as a PDF ready to print on a standard thermal label printer. Each label shows the customer name, jar count, farm URL, and collection date. Vacation customers are automatically excluded.
Filled more jars than you have orders? Post the extra count here. Customers visiting your portal see a banner: "3 extra jars available today β help yourself while they last!" You can customize this message and it shows a timestamp so customers know it's fresh.
Jot a short dated reminder that shows up here on the Today tab on its date β and on the printed delivery sheet β so you can retire the whiteboard and sticky notes. Handy for a one-time pickup you sold to fill a vacation slot, or anything else you need to remember on a specific day. It's just a reminder: it doesn't create or change an order, and it never affects your totals, billing, or labels.
When a customer picks up their milk, all their jars are assumed to be out. Open the Jar Returns accordion, tap any jar circle to mark it π’ when it comes back, then tap Save. Jars still out show as π .
If a customer has more than 2Γ their jar subscription outstanding before their next pickup, MilkShelf automatically sends them a reminder email β and sends you a summary so you know who to expect jars from.
Use the day dropdown to switch between pickup days. Jar tracking can be turned on or off with the toggle in the Jar Returns header.
You control which days you offer pickup and how many jars are available each day. Only the days you check will appear on your customer portal β if you only do Wednesday and Saturday, those are the only options customers see.
Check the box next to each day you offer pickup and enter the jar limit. For example: Wednesday β 20 jars, Saturday β 30 jars. Unchecked days are hidden from customers.
As customers sign up for a day, the available count goes down. When a day hits zero, it shows as "(FULL)" on the signup form and new customers can't select it. If someone cancels or pauses, that capacity opens back up automatically.
By default customers can choose weekly or every two weeks. If you'd rather only run weekly pickups, turn off Offer Every-2-Week pickups in Settings β Pickup Frequency β new customers will then only see Weekly. Anyone already on an every-2-week schedule keeps it. When this is off, the Auto-pair Every-2-Week Customers toggle greys out, since there's nothing to pair.
MilkShelf calls each container a "jar" by default. If your farm bottles in jugs, switch Container from Jars to Jugs in Settings and that word follows everywhere you and your customers see it β the signup form, your dashboard, labels, and emails. Leave it on Jars and nothing changes.
Set what "one jar" means for your farm β half gallon, quart, gallon, etc. This shows on the signup form as "One jar is a half gallon" so customers know what they're ordering.
Enter what you charge per jar. This shows on your customer portal so customers know what to expect before signing up, and is included in their welcome email when they subscribe.
If you charge a deposit for jar returns, enter the amount here. It shows alongside your jar price on the portal. The deposit is the incentive that keeps jars coming back β jar return tracking helps you see exactly who still has jars out so you know where your deposits stand.
Dashboard β Settings tab β Pickup Days & Capacity, and Pricing & Deposits
The Schedule tab gives you a 4-week forward view of all your pickup days β so you can see at a glance how full each day is, which customers are coming, and where you have open slots.
Open your dashboard and tap the Schedule tab. It loads automatically from your current customer and capacity data β no setup needed beyond configuring your pickup days in Settings.
Each pickup day appears as a card showing the date, how many jars are expected out of your capacity, and a fill bar. Green-bordered cards have open slots β meaning off-week or vacationing customers have freed up space. Orange-bordered cards are full. Today's pickup is highlighted with a "TODAY" badge.
Tap any day card to expand the full customer list for that pickup, including jar counts and pickup frequency. Customers who are off that week (biweekly schedule) or on vacation are shown as tags below the card so you know exactly why a slot opened up.
When you have extra milk beyond your regular subscriptions, enter the available quantity in your MilkShelf dashboard. A banner automatically appears on your customer portal showing how many extra jars are available, with a timestamp so customers know it's current.
Enter the number of extra jars and optionally customize the message. When you set it to 0, customers see "No extras today β check back tomorrow!" so they don't have to ask. If you haven't customized the message, the banner just hides when the count is 0. This is great for days when you have more milk than usual or when customers are on vacation and you have surplus.
Dashboard β Today β Excess Jars
Instead of turning new customers away when you're full, you can enable a waitlist with a single toggle in your dashboard. Once on, customers visiting your signup page will see a "Join Waitlist" button. Here's how it works:
From your dashboard, you can view the waitlist, reorder priorities, and remove people. The whole cascade process is automatic β you don't have to manage it.
Dashboard β Customers β Waitlist
Keep track of how many jars each customer has at home. Open the Jar Returns accordion on your dashboard, tap the circles as you load your dishwasher each night, and hit Save. Takes about 30 seconds.
Today's pickup customers are listed with one circle per jar. Orange means the jar is still at the customer's place. Tap it to mark it returned (green). Switch days with the dropdown to catch up on any day you missed.
If a customer has more than twice their subscription jar count outstanding, MilkShelf automatically sends them a friendly reminder the day before their next pickup. You get a summary email too so you know who to expect jars from.
Dashboard β Today β Jar Returns
Look up any customer by name or phone number. From the search results you can pause, reactivate, or delete their subscription. Paused customers don't count toward your capacity and don't receive pickup reminders.
For customers who can't use the online form (or prefer not to), you can add them directly from the dashboard. Enter their name, phone, email, pickup day, frequency, and jar count.
Give an individual customer a percentage discount on their price β handy for a founding member, a family rate, or a staff discount. Set it on the add-customer form or when editing a customer, as a percentage with up to two decimal places (e.g. 12.5%). It applies only to that customer's recurring price β everyone else is unaffected β and card customers are automatically billed the discounted amount.
For customers who pay by cash or Venmo β anyone not on automatic card billing β you decide when they're Paid or Unpaid. Two ways: tap the Mark Paid / Mark Unpaid button on the customer in your Customers tab, or click their Paid/Unpaid badge right on Today's Orders or Upcoming Orders (you'll get a quick confirm first). Their printed label then shows PAID or UNPAID accordingly, and their dashboard status stays in sync. The mark stays put until you change it β it won't reset on its own, so for a recurring cash customer you'd re-mark them each cycle. Card customers are billed automatically and don't get this toggle; their paid status is handled for them.
Every customer has two notes fields. Customer Notes is anything the customer wrote on their own signup ("Special instructions, preferences, etc.") β they can see and edit this on the portal. π Private Farmer Notes is yours alone, with a yellow background so you can't mix them up β customers never see it and are never notified when you change it. Use it for payment notes, jar deposit status, delivery preferences, or anything else. Both fields appear on Today's Orders and Upcoming Orders so the relevant info is always in front of you on pickup day.
Export your full customer list as a CSV file. Useful for your own records or for importing into other tools.
Dashboard β Customers tab
MilkShelf sends emails on your behalf, branded with your farm logo. You don't have to write or send anything β it's all automatic.
Sent immediately when a customer signs up or updates their subscription. Shows their pickup day, jar count, frequency, and a link to your Google Maps directions. You can add a custom message that appears in this email (e.g., "Milk is available starting at 7am. Please bring your own cooler bag.").
Sent automatically before each pickup day. Customers choose whether they want the reminder the night before at 6 PM, the morning of at 8 AM, or no reminders. You can customize the reminder text and use placeholders like {customerName}, {pickupDay}, and {jars}.
Need to tell your customers something? Write a subject and message and send to everyone, a specific pickup day, your waitlist, or a custom group. Great for holiday closures, schedule changes, or seasonal updates.
Send yourself test versions of the confirmation, update, and reminder emails to see exactly what your customers will receive before you go live.
If your subscriptions exceed your capacity on any day, you get a daily alert email at 8 AM showing which days are over and by how many jars.
Dashboard β Settings β Email Settings
Your customer portal at yourfarm.milkshelf.com looks and feels like your farm, not like generic software.
Upload your logo and it appears on the customer portal and in every email. PNG with a transparent background works best. If you don't have a transparent version, the dashboard links to a free tool to remove the background.
Upload a screenshot or photo showing exactly where customers should pick up. This shows on the customer portal below the signup form.
Enter your full address and customers get a "Directions to Our Farm" link that opens in Google Maps with turn-by-turn navigation.
Post a message that appears on your customer portal. Useful for seasonal notes, holiday hours, or anything you want customers to see when they visit your page.
Customers can send you a message directly from the portal if they have questions or special requests. The message goes straight to your email.
Connect Stripe to collect payments automatically β customers are billed at signup and on a recurring schedule without any manual follow-up. Prefer to handle payments yourself? You can also add a link to Venmo, Square, or another payment page as a fallback.
Dashboard β Settings β Farm Settings
MilkShelf generates a printable flyer with a QR code that links directly to your customer portal. Print it and tape it anywhere customers will see it β your farm fridge, barn door, cooler, or pickup area.
Customers scan the QR code with their phone and it takes them straight to your signup page. No typing, no searching β just scan and subscribe. It's the fastest way to get new customers signed up on the spot.
Dashboard β Settings β QR Code Flyer
Generate jar labels for any pickup day in seconds. Labels are designed to print on standard thermal label printers and include everything your customers need to identify their order.
Each label shows the customer's name, jar count, your farm URL, and the collection date. Customers on vacation are automatically excluded so you never print a label for someone who isn't picking up.
Labels download as a PDF formatted for thermal label printers. Open the PDF and print directly β no resizing needed. If you don't have a thermal printer, the PDF works on regular paper too and can be cut apart.
Dashboard β Today β Labels
Going to a family reunion, conference, or just taking a week off? Set a Farm Vacation window in Settings β Farm Vacation. The night before your vacation starts, MilkShelf emails every active customer to let them know there'll be no pickups during the window β with a personal message from you if you wrote one β and automatically pauses every card customer's Stripe subscription so nobody is charged for weeks they aren't getting milk. The night your vacation ends, everything resumes: subscriptions un-pause, reminders restart, and your next pickup day runs as normal.
Biweekly customers whose off-week falls during your vacation are handled correctly β they won't get a duplicate "vacation" email or a Stripe pause they didn't need. Customers who are already on their own personal vacation through your absence are left alone so they don't get unpaused prematurely.
Customers can set vacation dates on the portal. During their vacation, they're automatically excluded from today's orders and don't receive pickup reminders. Their subscription stays active β they just skip those weeks. When the vacation ends, everything resumes automatically.
Customers can pause their subscription from the portal, or you can pause them from the dashboard using Search Customer. Paused customers don't count toward your capacity and don't get reminders. They can reactivate anytime.
MilkShelf can collect jar payments directly from your customers via card. When you connect your bank account in the Payments tab, customers see a "Card" or "Cash" option when they sign up β unless the farm has turned on Require Card Payment, in which case new customers must use a card. Card customers are charged automatically on whatever schedule you choose β no invoicing, no chasing payments. Automatic card billing is available to US farms; farms elsewhere collect payments directly.
By default, fees are added to the customer's charge; farms can choose to absorb the fees instead. With the default setting, processing fees (Stripe's ~2.9% + $0.30 and a 0.7% subscription billing fee, plus MilkShelf's 1.5%) are added on top of your jar price at checkout β you never see a deduction. For example, if your jar is $8.00, the customer pays $8.75. You receive $8.00 every time, deposited directly to your bank account.
If you charge a startup or membership fee when someone first joins β a sign-up fee, a one-time setup charge β set the amount in Settings β Pricing & Deposits β New Customer Fee. New card customers pay it once during their signup checkout, on top of their first charge; it never repeats. Leave it at zero if you don't charge one. (On herdshare farms this same idea is the per-share buy-in fee β see Herdshare Mode above.)
Set how customers are charged in Payments β Billing Mode:
Per Pickup β billed every pickup day, weekly or biweekly. Best for direct-sale farms where the charge ties to a physical pickup.
Monthly Herdshare β a flat per-share charge on the same day each month (1st through 28th). Unlocks when Herdshare Mode is on.
4-Week Herdshare β bills every 4 weeks from each shareholder's first distribution. Keeps shareholders on a steady 28-day cycle.
On per-pickup billing, customers are charged on their first pickup day, then on the same day every week (or every two weeks for biweekly customers). If someone signs up Monday for a Thursday pickup, their first charge is that Thursday β not Monday. This keeps billing and pickups in sync.
Example: Jane signs up Monday March 16th for a Thursday pickup. Her first charge hits Thursday March 19th. After that she's charged every Thursday β March 26th, April 2nd, and so on.
When you raise your price, MilkShelf asks whether to apply it to everyone or keep your current customers at the price they already pay. Choose "Keep current customers," and every active customer stays locked at their current price automatically β only new signups pay the new rate. No spreadsheets, no editing customers one at a time. Card customers keep their locked price even when they update their order, and if you ever want to move someone to your current price, a "Move to current price" button sits right on their customer card. Any per-customer discount still applies on top of their locked price.
Dashboard β Settings β Pricing (the choice appears when you save a changed price)
Card customers see a "Manage Card Payments" button on your portal. It opens Stripe's billing portal where they can update their card, view past charges, and download receipts β without involving you. You never see their card details, and they never have to call to fix a declined card.
When a charge fails (expired card, insufficient funds, etc.), a red banner appears at the top of your Today tab listing the affected customers. Stripe automatically retries the charge over the next several days. If a customer pays you another way in the meantime β cash at pickup, Venmo, anything β click "Mark as Paid" on the banner to clear the flag. The customer also shows an orange "Past due" badge in Search Customers results until resolved.
In Payments β Customer Billing Options there's a toggle: "Allow Customers to Switch to Cash." When on, card customers can cancel their card billing themselves from the portal and switch to paying you directly. Turn it off if you only want card customers and don't want self-serve downgrades.
The opposite control lives right next to it: "Require Card Payment." When on, it forces card at signup for that farm β new customers don't see a cash option at all. (Turning it on also disables Allow Switch to Cash.)
When a card customer sets vacation dates, their Stripe subscription is automatically paused on their vacation start date and resumes on their first pickup day after vacation ends β so they're never charged for a week they're skipping. When you pause a customer from the dashboard, their subscription pauses immediately and resumes when you reactivate them.
Example: Sarah picks up every Thursday. She sets a vacation from June 5th to June 12th. Her June 5th and June 12th charges are skipped automatically. Her subscription resumes June 19th β her first Thursday after vacation ends β with no action needed from you or Sarah.
Cash is always an option. Customers who choose cash at signup are handled exactly as before β no Stripe involved, no change to your current workflow. You collect payment however you normally do.
If a customer starts the card signup process but doesn't complete checkout, they show up in the Payments tab as "Unpaid." You can resend them a payment link or follow up directly. They'll also show an orange "Unpaid" badge in the Search Customer results.
Go to the Payments tab in your dashboard and click "Connect Bank Account." Stripe will walk you through a quick setup β you'll need your routing and account number. Once connected, your status shows "Payments Active" and customers will see the card option at signup.
The Payments tab is mission control for everything money-related: who's paid, who hasn't, what's coming in, and how customers are billed. You only need to spend time here if you're using MilkShelf for card billing.
Customers who started signup but didn't complete card checkout show up here. Each row has a "Resend Payment Link" button so you can nudge them, or you can delete the entry if they're not coming through.
Pick a time window β 7 days, 14, 30, 60, 90, 180, a full year, or any custom range β and MilkShelf calculates your expected revenue across all active customers based on their current subscriptions and pickup schedules. Cash projections assume customers pick up as scheduled. Useful for planning, taxes, or deciding whether to raise prices.
A live view from Stripe of every card customer with a charge due in the next 14 days. Shows the amount, the date, and the customer. Click "Load Upcoming Charges" to refresh.
Pick how card customers are charged: Per Pickup, Monthly Herdshare, or 4-Week Herdshare. See the previous section for what each one does. Monthly Herdshare asks you to set a Billing Anchor Day (1β28) β the day of the month all shareholders are billed.
Two toggles. "Require Card Payment" β when on, new customers must pay by card at signup and the cash option is hidden. "Allow Customers to Switch to Cash" β when on, card customers can cancel their own card billing from the portal and pay you directly; when off, they have to contact you to switch. Turning on Require Card Payment automatically turns off and disables Allow Switch to Cash (letting customers switch to cash would defeat requiring card).
The "Connect Bank Account" button launches Stripe Express onboarding. You'll enter your business details, routing and account number, and verify your identity β all through Stripe's hosted flow. Once finished, your status flips to "Payments Active" and customers see the card option at signup. Money is deposited directly to your bank by Stripe; MilkShelf never touches it.
Dashboard β Payments tab
We're happy to help. Whether you need help getting set up or just want to talk through how it works β reach out anytime!
Send Us a Message