The film begins with a pod of orcas swimming near the coastline of the Pacific Northwest. The pod is tracked down by a large group of whalers, and one of them, Willy (Keiko the orca), is snared in their nets and taken away to a local amusement park.
Sometime later in Astoria, OR, Jesse (Jason James Richter), a troublesome 12-year-old boy who has been on the streets since he was abandoned by his mother six years before, gets caught by the police for stealing food and vandalizing a theme park. Jesse's social worker Dwight earns him a reprieve by finding him a foster home and having him clean up the graffiti at the theme park. His foster parents are the kind and supportive Annie (Jayne Atkinson) and Glen Greenwood (Michael Madsen), but Jesse is initially unruly, hostile, and distrustful to Annie and Glen.
While working at the park, Jesse encounters Willy, the orca that was caught earlier. Willy is regarded as surly and uncooperative by the park staff, including his trainer Rae Lindley (Lori Petty), but he and Jesse strike up a bond. He also becomes friendly with Haida native Randolph Johnson (August Schellenberg), Willy's keeper. Jesse is able to get Willy to perform tricks and once his probation is finished, he is given a permanent job at the marina. Jesse also slowly warms to the Greenwoods and begins to settle into his new life.
The owner of the amusement park, Dial (Michael Ironside), sees the talent Jesse and Willy have together and makes plans to host "The Willy Show" in hopes of finally making money from Willy, who has thus far been a costly venture for him. On the day of the first performance, Willy is antagonized by the children banging constantly on his underwater observation area and refuses to perform. Willy smashes against the tank, causing damage to it. Jesse storms off in tears and plans to run away. Later, while at the tank, Jesse notices Willy's family calling to him and Dial's assistant Wade (Richard Riehle) and other men sneaking into the underwater observation area. They damage the tank enough that the water will gradually leak out in an effort to kill Willy and claim his $1,000,000 insurance.
Jesse, Randolph, and Rae hatch a plan to release Willy. They use equipment at the park to load Willy onto a trailer, and Jesse and Randolph steal Glen's truck to tow Willy to a marina. They try to stick to back roads to keep from being spotted with a gigantic orca, and eventually get stuck in the mud. Wade meanwhile notifies Dial that Willy is missing, and begin a search to find Willy.
Unable to move the trailer himself, Jesse calls Glen and Annie using a CB radio in Glen's truck. Annie and Glen show up and help free the truck, and continue on to the marina to release Willy. Dial knows where they are headed, and when they show up, he, Wade, and his henchmen are blocking the gate into the marina. Glen charges at them full speed in the truck, forcing the henchmen to scatter as the truck plows through the gate to the marina. Glen quickly turns the truck around and backs Willy into the water, flooding his truck in the process.
Willy is finally released into the water, but Dial and his goons attempt to stop them. During the struggle, Jesse gets Willy to swim away while the whaling ships close in with their nets. Jesse runs towards a wall of rocks, calling for Willy to follow him, which steers him away from the boats. Jesse goes to the edge of the rocks where Willy swims up to him and tells Willy that if he makes the jump (it will be the highest jump Willy has ever attempted), he'll be free. Jesse says a tearful goodbye, but pulls himself together and goes back to the top of the rocks. He says a prayer that Randolph taught him from a story from his tribe and throws his arm in the air, giving Willy the signal to jump. To the amazement of everyone, Willy makes the jump and is finally free to return to his family. Everyone cheers, Willy leaps out of the water in celebration, and Jesse happily jumps up and down, but stops when he realizes that he'll probably never see Willy again. He goes back to Glen and Annie who hug him as they look out into the sea. Willy calls out to Jesse in the distance and both say their final farewell.
The movie ends with Willy, who has found his family, and the entire pod swimming and jumping through the ocean.