Its main branch rises in Howard County, Iowa, near the city of Cresco.
The other counties it or its tributaries cover are Chickasaw, Winneshiek, Fayette, Clayton, Delaware, and Dubuque.
Tributaries include the Little Turkey River and Crane Creek.
Flowing from northwest to southeast, it flows through or near the cities of Spillville, Fort Atkinson, Eldorado (where it joins with the Little Turkey River), Clermont, Elgin, Elkader, Elkport, Garber, and Millville, before entering the Mississippi south of Guttenberg and across from Cassville, Wisconsin.
The watershed covers 1,083,200 acres (4,384 km2).