Whole Milk vs Plant Milk for Latte Art: Which Foams Best

Quick answer

Protein decides the foam, fat only finishes it. Whole milk carries 3.2 g of protein per 100 ml to build the film that traps the bubbles, plus 3.3 g of fat for the silky finish, and that pairing is why it remains the benchmark. Among plant drinks only soy matches that protein class, at roughly 2.9 g. Oat tops out near 1 g and survives on fibre and on the barista recipe, which adds an oil and an acidity regulator; below the gram mark, almond and coconut included, the foam collapses.

The essentials
  • Caseins make milk aerate, whey proteins make the foam last; fat stabilises nothing, it only textures
  • Protein per 100 ml: whole milk 3.2 g, soy 2.9 g, oat 1 g, almond 0.7 g, coconut 0.3 g
  • Skimmed milk foams higher (0.1 g fat) but the result is dry and coarse-bubbled
  • The barista label means added oil and an acidity regulator, not added protein
  • Whey proteins start unfolding at 65 °C, which is what sets the 60 to 65 °C ceiling

How do whole milk, semi-skimmed and plant drinks measure up against each other?

Latte art: silky microfoam poured over an espresso
Silky microfoam, the foundation of clean latte art, comes down first to the right protein-to-fat ratio.

Whole milk leads, semi-skimmed follows closely because it keeps the entire protein fraction, and among the plant drinks only soy belongs in the same protein class, barista oat owing its structure to the recipe far more than to protein. None of that gap shows up under steam before it shows up on the side of the carton. The table below summarises foaming ability, how each one pairs with coffee, how stable the foam is and what the composition looks like across the seven milks you meet most often at the bar. The ranking follows one rule: protein content governs how fine and how long-lived the foam is, fat content governs how it feels in the mouth.

Milk Microfoam ability Taste with coffee Stability Notes
Whole Excellent Round, sweet, balanced Very good Roughly 3.2 g protein and 3.3 g fat per 100 ml: the reference pairing
Semi-skimmed Very good Lighter, less coating Good About 3.4 g protein but only 1.6 g fat per 100 ml: structure kept, silkiness lost
Skimmed Good but dry Watery, little body Good (stiff foam) Protein untouched, about 0.1 g fat: lots of volume, coarse bubbles
Barista oat Excellent Mild, lightly sweet, cereal Very good Only about 1 g protein per 100 ml, offset by fibre, added oil and an acidity regulator
Soy Very good (barista) Pronounced, sometimes beany Good, can curdle The most protein-rich plant drink at roughly 2.9 g per 100 ml; can flocculate in acidic coffee
Almond Difficult Dry, nutty, sometimes bitter Weak Around 0.7 g protein per 100 ml: large bubbles that collapse within seconds
Coconut Limited Pronounced, sweet-exotic Weak to moderate Plenty of fat for about 0.3 g protein per 100 ml: unstable foam, dominant flavour

Figures per 100 ml. Dairy values are drawn from the USDA FoodData Central database; plant drink values are typical label figures and vary from brand to brand.

What actually holds a milk foam together?

Protein holds it together. Under steam, protein molecules migrate to the surface of every air bubble and knit a continuous film there, and that film is what stops neighbouring bubbles merging into one big void. Fat plays no structural part at all: it changes how the foam feels, not whether it survives.

Within dairy the job is split between two protein families, and the split matters more than most guides admit. Caseins account for roughly 80 per cent of milk protein. They are flexible, they reach the air-liquid interface fast, and they are the reason milk aerates readily in the first place. Whey proteins, chiefly beta-lactoglobulin, are rigid and slower to arrive, but once adsorbed they thicken and toughen the film. Foamability comes from the caseins; longevity comes from the whey fraction. A foam that climbs beautifully and then falls apart is a whey problem, not a casein one.

Heat separates the two families cleanly. Casein micelles tolerate steaming temperatures without trouble, whereas whey proteins begin unfolding around 65 °C and denature in earnest between 67 and 72 °C at milk pH. That unfolding exposes sulphur groups, which is where the cooked-milk note comes from, and it is the real reason behind the 60 to 65 °C service window rather than any arbitrary tradition.

Fat runs the opposite errand. Fat globules coat the microfoam, deliver the glossy, coating mouthfeel and soften espresso bitterness, but they also compete with protein for space at the bubble surface and cap the volume you can build. Hence the skimmed milk paradox: same protein, barely 0.1 g of fat per 100 ml, more foam, and a dry stiff texture nobody wants to pour. Whole milk, at 3.2 g protein and 3.3 g fat per 100 ml, wins neither contest outright. It wins the trade-off.

Sugar deserves a mention too. Lactose sits at about 4.7 g per 100 ml. It stabilises nothing, but it raises viscosity, which slows drainage between bubbles, and it supplies the perceived sweetness of a well-steamed jug without a grain of sugar being added.

Plant drinks obey the same arithmetic, and the gaps are stark. Soy arrives with roughly 2.9 g protein per 100 ml, close enough to dairy that it foams under its own power, provided its globulins do not meet an espresso acidic enough to precipitate them. Pea sits in similar territory. Oat falls to about 1 g, almond to 0.7 g, coconut to 0.3 g, and below the gram mark there is simply not enough material to build a lasting film. Oat compensates in two ways: beta-glucans, soluble fibres that thicken the liquid and slow drainage, and its sugar profile, since alpha-amylase hydrolysis of oat starch releases mostly maltose, which supplies both the cereal sweetness and a little body.

What does the barista label change in a plant drink?

A barista edition is the same plant base as the standard carton, reworked on two fronts: more added fat, and a buffering salt. The word itself carries no legal definition, so it describes a recipe rather than a certification, and the ingredient panel tells you everything.

The first lever is fat. Barista oat recipes typically carry an added vegetable oil, most often low erucic acid rapeseed oil, which lifts the fat content into semi-skimmed dairy territory. That oil builds no foam. What it does is thicken the emulsion, make it more forgiving under heat, and restore the coating mouthfeel that lean plant drinks conspicuously lack.

The second lever is dipotassium phosphate, an acidity regulator declared on many of these cartons. Espresso lands near pH 5, and that alone is acidic enough to precipitate plant proteins on contact. The buffering salt lifts the drink's pH so it holds together in the cup instead of curdling. This is the chemical reason a barista oat behaves where the same brand's standard line splits.

What a barista edition almost never adds is protein. Barista oat still hovers around 1 g per 100 ml, so its foam rests on viscosity and emulsion stability rather than on anything resembling the dairy protein film. Barista soy is the exception, since its native protein already does the structural work and the formulation only has to secure the pH. Recipes differ between manufacturers, so the ingredient list remains the only reliable arbiter.

Which milk suits which cup?

Read the composition, not the brand. For the cleanest poured patterns, whole milk remains unbeatable because it is the only option combining a high protein count with enough fat to give the surface its shine. Semi-skimmed keeps the entire protein fraction and gives up only the silkiness, which makes it the obvious pick for a lighter cup.

On the plant side there are two distinct logics. Barista soy competes on dairy's own terms, protein, so it delivers a dense foam and a genuine nutritional contribution, at the price of a more assertive flavour and real pH sensitivity. Barista oat wins differently, through fibre viscosity and formulation, with a mild taste that lets the coffee through, which is why it dominates most counters. Almond, rice and coconut all sit below one gram of protein per 100 ml and belong to drinkers choosing them for flavour or dietary reasons, never for foam quality.

In one line: protein decides whether the foam survives, fat decides how it feels, and whole milk is the only milk that sacrifices neither.

Frequently asked questions

Which milk foams best for latte art?

Whole milk is still the benchmark: its 3.2 g of protein per 100 ml stabilise the air bubbles and its 3.3 g of fat supply the silkiness, for a dense microfoam that pours easily. Among plant drinks, only soy comes close on protein at around 2.9 g, while barista oat owes its structure to fibre and formulation. Almond (0.7 g) and coconut (0.3 g) are the hardest, for want of protein.

Why does standard plant milk foam worse than barista milk?

Barista editions are reworked on two specific points. They carry an added vegetable oil, commonly rapeseed oil, which thickens the emulsion and restores the coating mouthfeel the standard carton lacks. And they carry an acidity regulator, usually dipotassium phosphate, which lifts the drink's pH so it does not precipitate against acidic espresso. Protein content barely moves.

What temperature should milk be for latte art?

The reference window is 60 to 65 °C, for dairy and plant milk alike, and the reason is chemical. Casein micelles cope with heat easily, but whey proteins start unfolding around 65 °C and denature in earnest between 67 and 72 °C, releasing the sulphur compounds behind the cooked-milk note. Plant drinks, soy and almond first, split in the same band.

Does skimmed milk foam better than whole milk?

Skimmed milk does rise higher, because it keeps its whole protein fraction alongside roughly 0.1 g of fat per 100 ml, so fat globules no longer compete with protein at the bubble surface. The result is voluminous but dry, coarse-bubbled and badly suited to fine latte art. Whole milk gives up a little volume and gains silkiness, shine and body.

Go further: Milk technology · Specialty coffee FAQ · All guides