From its source at the outlet of Holmes Lake in the Monashee Mountains of British Columbia, the Kettle River flows south to Midway, British Columbia. Along the way it is joined by many tributaries, most notably the West Kettle River. Below Midway, the river loops south, crossing the Canada-US border into the United States, through Ferry County, Washington, before flowing north back into Canada, passing by Grand Forks, British Columbia, where the Granby River joins. After flowing east for about , the river turns south again, just south of Christina Lake, entering the United States again. It then flows south, forming part of the Ferry-Stevens County line, before joining the Columbia River near Kettle Falls, Washington. The Columbia River at this point is a large reservoir impounded behind Grand Coulee Dam, called Lake Roosevelt. The Kettle enters the lake at the Columbia's river mile 706. The Kettle River is undammed, making it one of the extremely few rivers with constant flow in the Pacific Northwest.