The reaction is catalyzed by a base and a divalent metal such as calcium.  The intermediary steps taking place are aldol reactions, reverse aldol reactions, and aldose-ketose isomerizations. Intermediates are glycolaldehyde, glyceraldehyde,  dihydroxyacetone, and tetrose sugars.  In 1959, Breslow proposed a mechanism for the reaction, consisting of the following steps:
The reaction exhibits an induction period, during which only the nonproductive Cannizzaro disproportionation of formaldehyde (to methanol and formate) occurs.  The initial dimerization of formaldehyde to give glycolaldehyde (1) occurs via an unknown mechanism, possibly promoted by light or through a free radical process and is very slow.  However, the reaction is autocatalytic:  1 catalyzes the condensation of two molecules of formaldehyde to produce an additional molecule of 1.  Hence, even a trace (as low as 3 ppm) of glycolaldehyde is enough to initiate the reaction.  The autocatalytic cycle begins with the aldol reaction of 1 with formaldehyde to make glyceraldehyde (2). An aldose-ketose isomerization of 2 forms dihydroxyacetone (3).  A further aldol reaction of 3 with formaldehyde produces tetrulose (6), which undergoes another ketose-aldose isomerization to form aldotetrose 7 (either threose or erythrose).  The retro-aldol reaction of 7 generates two molecules of 1, resulting in the net production of a molecule of 1 from two molecules of formaldehyde, catalyzed by 1 itself (autocatalysis).   During this process, 3 can also react with 1 to form ribulose (4), which can isomerize to give rise to ribose (5), an important building block of ribonucleic acid. The reaction conditions must be carefully controlled, otherwise the alkaline conditions will cause the aldoses to undergo the Cannizzaro reaction.
The aldose-ketose isomerization steps are promoted by chelation to calcium.  However, these steps have been shown to proceed through a hydride shift mechanism by isotope labeling studies, instead of via an intermediate enediolate, as previously proposed.