Markup cyclicality has been central for debating policy effectiveness and understanding business cycle fluctuations. However, measuring the cyclicality of markups is as important as understanding the microeconomic mechanisms underlying that cyclicality. The latter requires measurement of firm-level markups and separating supply from demand shocks. We construct a novel dataset with detailed (multi-) product-level prices for individual firms. By estimating a structural model of supply and demand, we evaluate how companies adjust prices and marginal costs as a response to shocks. We find that price markups respond positively to supply shocks and negatively to demand shocks. The mechanism explaining the observed markup behaviour is the same for both shocks: incomplete pass-through of changes along the marginal cost curve to price adjustments. These observed price and output responses are consistent with dynamic demand considerations. Finally, we use our estimated shocks to show how aggregate markup fluctuations in the sample period are mostly explained by aggregate demand shocks.