I operate a small mail-order plant seed business. Through Etsy, eBay, and a few other websites, I sell packets of ornamental flower seeds to buyers across the United States. To date, I have fulfilled just over 30,000 orders across all sales channels.
Those 30,000 sales are not distributed evenly. When I started my shop back in high school, I fulfilled no more than 100 orders per month. As of December 2024, that figure is now closer to 2,000 per month.

This growth was made possible by developing a few home-brewed automation tools.
Multi-Variety Dispenser (MVD)
Filling, labeling, sealing, and shipping paper seed packets is quite tedious to perform by hand. The multi-variety dispenser is a simple machine that automates this repetitive process.

The machine consists of three main components:
- Dispensing module. Counts a specified number of seeds and dispenses them into a funnel.
- Control board. Activates and deactivates dispensing modules based on incoming data.
- Code scanner. Scans a barcodes and sends this information to the control board.
Over the next few paragraphs, I’ll demonstrate how this tool works.
The process starts when a seed packet is created. Here, I’m printing a packet for 100x Mimosa pudica seeds using my order fulfillment script:



The script generates a barcode and prints it on the bottom of the packet, along with growing information specific to the species and the buyer’s location. I’ll explain how the script generates custom packets later on–we’ll focus on the filling process for now.
The barcode represents a set of instructions for the MVD. These instructions indicate which dispenser must be activated, at what speed, and for how many rotations. In this case, the barcode reads “41-1200-04”, which tells the machine to activate dispenser #41 at a speed of 1200 μs per step for a total of 4 rotations.
When this packet is scanned, the information is sent to the control board:


The control board then activates the appropriate motor and executes the command printed on the seed packet:


The packet has been filled with approximately 100x Mimosa pudica seeds without any manual counting!
If we were to change the information in the barcode, the machine can be instructed to dispense another set of seeds. I’ll change the barcode and fill a packet with 250x Aquilegia vulgaris seeds, instead:



The seed quantity and variety was changed by simply altering the data on the barcode.
For clarity, it’s worth briefly explaining how those dispensers work. The dispenser is quite simple, featuring only a few key parts:

- Reservoir. A sealable reservoir storing up to two ounces of seeds.
- Counter. A rotator that removes a set volume of seeds from the reservoir.
- Lock Cap. A skirt with a screw hole, allowing the module to be firmly affixed to the array.
- Holster. Supports the stepper motor; includes a ramp to allow seeds to fall from the counter.
Each module plugs directly into the control board, next to an open stepper motor driver. This “plug-and-play” design allows the dispensers to be added and replaced easily, with no soldering required.
Note that the machine remains functional even when slots are left open. Motors can be removed for repairs or testing without interfering with the operation of the machine itself.

This design scales well. As more varieties are added to the catalog, additional dispensers can be added to the machine. Each unit is entirely 3D-printed from PLA–the speed at which new varieties are added is therefore limited only by the printing speed of my cheap Ender 3 V3 SE.
The MVD fills seed packets using data encoded in a barcode. The process of parsing order data and automatically generating such seed packets, however, is handled by a separate tool.
Order Fulfillment Suite
You may have noticed that the seed packets in the preceding demonstration featured location–specific growing recommendations. That is, the packet offers different growing instructions depending on the specific climate of the buyer:

The general growing instructions for this variety remain the same, however the timing recommendations vary based on the buyer’s address. To achieve this level of personalization, every seed packet must be generated on demand using buyer-specific information.
For example, a buyer places an order from Wasilla, AK 99623.

When this order is received, the program extracts the recipient’s ZIP code. Using a dataset of ZIP code-USDA zone pairs, the script determines the USDA hardiness zone in which the buyer is located.
In this case, ZIP code ‘99623’ corresponds to hardiness zone 4b.
The script then generates a map of the buyer’s state, highlighting their USDA hardiness zone.


highlighting hardiness
Zone 4b
The map is then resized and inserted onto the seed packet:

Voilà — the seed packet has been personalized for the buyer’s location.
What about the rest of the information on the packet? Germination instructions, sunlight requirements, and other growing details are specific to a given species. To ensure correct growing recommendations are given, the script alters the instructions on each packet according to the variety it contains.
For example, a buyer in California purchases A. vulgaris, L. polyphyllus, and M. pudica seeds. The script first identifies each species, then searches a database for their growing requirements:

The specifics are then extracted and overlayed on the seed packet:

Thus, the information on the seed packet reflects both the location of the buyer and the requirements of that seed variety.