By the end of this post, you’ll be able to walk into any grocery aisle and pick the right non-dairy milk for whatever espresso drink you’re making — latte, cappuccino, or flat white — instead of grabbing whichever oat milk carton happens to say “barista” on the label. You’ll also understand why that same carton can behave completely differently depending on which coffee you pair it with.
To get there, a proper side-by-side test works well: five milks, three drink styles, and two different roast levels, all steamed and pulled under identical conditions so the only variable changing is the milk itself.
Setting Up the Test
Use the same machine, the same grind, the same 18-gram double shot dialed to roughly 27 seconds, and the same steaming pitcher for every round. The milks were oat, soy, almond, full-fat coconut, and a macadamia-blend milk marketed specifically for coffee use. Each one got steamed to the same target temperature — around 140°F, just below scalding — and I judged three things every time: how the microfoam held together, how the milk tasted against the coffee, and whether the coffee’s acidity caused any visible curdling.
Two roasts went into the mix as well, a lighter Ethiopian with pronounced acidity and a medium-dark Brazilian with lower acidity, because roast level turned out to matter almost as much as milk choice once the testing got underway.
Round One: Oat Milk in a Latte
Oat milk went first, and it’s worth explaining why it’s become the default recommendation almost everywhere. Oat milk carries natural starches that give it body close to whole dairy milk, and it steams into a stable, glossy microfoam without much effort. Poured over the Brazilian shot, the latte had a rounded, slightly sweet character that masked almost none of the espresso’s flavor.
The lighter Ethiopian roast told a different story. The foam held up fine, but the acidity of the coffee cut through the oat milk’s natural sweetness in a way that left the drink tasting thinner than expected. Nothing curdled, but the balance shifted noticeably — a reminder that “best milk” depends partly on what’s in the cup underneath it.
Round Two: Soy Milk in a Cappuccino
Soy milk has the highest protein content of the group, and protein is what really builds stiff, long-lasting foam — which made it a strong candidate for cappuccino, where foam structure matters more than in a latte. The cappuccino built with soy milk held its foam cap for several minutes without collapsing, longer than any other milk in the lineup.
The catch showed up with the lighter roast again: soy milk is more prone to curdling when it meets high-acid coffee at steaming temperature, and I did see faint separation at the surface with the Ethiopian shot, though it didn’t affect the taste in any way I could detect. With the lower-acid Brazilian roast, that issue disappeared entirely, and the soy cappuccino was arguably the most stable drink of the whole test.
Round Three: Almond Milk and the Curdling Problem
Almond milk was the one I expected the least from, and it mostly confirmed why. Low in both fat and protein, it struggled to build meaningful microfoam — what formed was thin and broke down within a minute of pouring. Flavor-wise it was pleasant enough on its own, with a light nuttiness that didn’t fight the coffee, but as a steaming milk it simply lacks the structural components that make dairy or oat milk work so well.
The real problem appeared with the Ethiopian roast: visible curdling within seconds of the coffee hitting the milk, small flecks separating out at the surface. Almond milk’s low protein content makes it more sensitive to acidity, and pairing it with a bright, high-acid shot is close to a guaranteed way to end up with a broken-looking drink, even if it still tastes fine underneath the visual mess.
Round Four: Coconut Milk’s Foam Ceiling
Full-fat coconut milk brought the richest mouthfeel of anything tested, and its natural sweetness paired beautifully with the Brazilian shot — this was the one drink in the whole test that tasted almost dessert-like without any added sugar. But coconut milk hit a hard ceiling on foam: its fat content works against protein-driven foam structure, so what I got was a soft, loose foam that never approached the stiffness soy or oat produced.
For a flat white, where foam is meant to stay minimal and silky rather than thick, that ceiling barely mattered. For a cappuccino, where a substantial foam cap is part of the drink’s identity, coconut milk fell noticeably short.
Round Five: Macadamia Blend and Pea-Protein Milks
The macadamia-blend milk, formulated with added pea protein specifically for baristas, was the closest match to dairy milk across every category I tracked. It steamed into tight, stable microfoam, resisted curdling with both roasts, and carried a mild, buttery flavor that stayed out of the coffee’s way rather than competing with it.
It also cost noticeably more per carton than the other four milks, which matters if you’re making these drinks daily rather than as an occasional treat. Performance and price moved in opposite directions here, and that trade-off is worth factoring in before assuming the specialty option is automatically the right call for your kitchen.
What the Side-by-Side Results Showed
| Milk | Foam Stability | Curdling Risk (Acidic Roast) | Best Drink Match |
|---|---|---|---|
| Oat | High | Low | Latte |
| Soy | Highest | Moderate | Cappuccino |
| Almond | Low | High | Not recommended for steaming |
| Coconut (full-fat) | Low-Moderate | Low | Flat white, sweeter drinks |
| Macadamia/pea blend | Highest | Low | Cappuccino, latte art |
Laid out this way, the pattern that emerged from the tasting becomes easier to see: protein content drives foam stability, fat content drives sweetness and mouthfeel, and roast acidity determines how much risk you’re taking on with lower-protein milks like almond.
Matching Milk to Drink and Roast
If you’re building a cappuccino and want that classic thick foam cap, soy or a barista-formulated pea-protein blend gave the most consistent results in this test, especially paired with a lower-acid roast. If you’re after a rounder, more balanced latte, oat milk remains a reliable default — just expect a slightly different flavor profile if your beans run bright and acidic. For a flat white, where foam takes a back seat to silkiness, coconut milk’s soft texture works in its favor rather than against it.
Almond milk, based on what showed up in this test, is the one I’d steer away from for steamed drinks specifically. It’s a fine milk for cold applications, but the low protein content that makes it light and mild also makes it the least forgiving option once heat and acidic coffee enter the picture.
What I’d Reach for First
If I had to recommend a single starting point for someone new to non-dairy espresso drinks, it would be a barista-formulated oat milk for everyday lattes and a soy milk for cappuccinos where foam structure matters most. Both held up reliably across roast levels in this test, and neither demands the price premium that specialty blends carry.
What does your usual espresso drink look like — heavy on foam, or more about a smooth, balanced pour? That answer alone will point you toward the right milk faster than any single “best overall” recommendation ever could.