Das Dorf liegt auf vier lang gezogenen, schmalen Terrassen an den steilen Osthängen der Eichhalde (771 m ü. M.) und des Güggelibergs (752 m ü. M.), rund 70 bis 150 Höhenmeter über dem Seespiegel.
Zwischen den beiden Hügeln erstreckt sich eine kleine Hochebene, die im Westen durch den fast kreisrunden Tätschbüel-Hügel (715 m ü. M.) begrenzt wird.
Das Ufer des Hallwilersees ist mit Ausnahme des Weilers «Am See» weitgehend unverbaut. Ganz im Nordosten, in der Nähe von Alliswil, liegt der Weiler Schwaderhof.
Die Fläche des Gemeindegebiets beträgt 553 Hektaren, davon sind 96 Hektaren bewaldet und 46 Hektaren überbaut. Der höchste Punkt befindet sich auf 771 Metern auf der Eichhalde, die tiefste Stelle liegt auf 449 Metern am Seeufer.
Nachbargemeinden sind Leutwil im Nordwesten, Boniswil im Norden, Meisterschwanden im Osten, Beinwil am See im Süden, Reinach im Südwesten und Zetzwil im Westen.