WATCH: Uruguay beat Canada
WATCH: Uruguay beat CanadaSHARE
Lock Rodrigo Capo and Ignacio Dotti scored second-half tries as Uruguay rallied for the victory in the first match of the two-leg qualifier in front of 16,100 at BC Place Stadium.
The qualifier also doubles as the opening fixture of the six-nation pan-American tournament.
Uruguay will now be in the driver's seat as they host Canada next Saturday in the return leg in Montevideo to determine which team will enter Pool D next year alongside Australia, Wales, Georgia and Fiji.
Uruguay led 21-17 at the half with the help of three tries. But they fell behind early in the second half before regaining their composure and then holding on for the victory.
Uruguay captain Juan Manuel Gaminara said the players talked at half-time about not letting up.
"When we were attacking, we really generated some issues in their defence. We talked about continuing to do that. 'Don't stop because we are playing here in Canada. Really, really go for it,'" he said.
Rodrigo Silva opened the scoring for Los Teros in the first minute with a try. Canada responded by scoring 17 unanswered points.
Uruguay, who are ranked 18th in the world, pulled out the victory despite playing shorthanded after prop German Kessler was whistled for a yellow card in the second half.
Canada's coach Kingsley Jones said his team lacked speed in certain parts of their game.
"They won the collisions," Jones said. "Our line speed wasn't what we wanted, particularly in the first half. That allowed them to come out on the ball with momentum."
If Canada loses the series against Uruguay, the team has one more chance to qualify for the World Cup.
Tries: Olmstead, Van der Merwe, Penalty try, Blevins
Cons: Braid 2
Tries:Silva, Leivas, Arata, Dotti, Ortega
Cons: Berchesi 5
Canada: 15 Taylor Paris, 14 Jeff Hassler, 13 Ben LeSage, 12 Nick Blevins, 11 DTH van der Merwe, 10 Connor Braid, 9 Phil Mack (captain), 8 Tyler Ardron, 7 Matt Heaton, 6 Evan Olmstead, 5 Josh Larsen, 4 Brett Beukeboom, 3 Jake Ilnicki, 2 Ray Barkwill, 1 Hubert Buydens.
Replacements: 16 Benoit Piffero, 17 Djustice Sears-Duru, 18 Cole Keith, 19 Admir Cejvanovic, 20 Lucas Rumball, 21 Gordon McRorie, 22 Patrick Parfrey, 23 Brock Staller.
Uruguay: 15 Rodrigo Silva, 14 Leandro Leivas, 13 Juan Manuel Cat, 12 Andrés Vilaseca, 11 Nicolás Freitas, 10 Felipe Berchesi, 9 Santiago Arata, 8 Alejandro Nieto, 7 Franco Lamanna, 6 Juan Manuel Gaminara (captain), 5 Rodrigo Capó Ortega, 4 Ignacio Dotti, 3 Mario Sagario, 2 Germán Kessler, 1 Mateo Sanguinetti.
Replacements: 16 Carlos Pombo, 17 Matías Benítez, 18 Juan Echeverría, 19 Manuel Leindekar, 20 Rodolfo Garese, 21 Agustín Ormaechea, 22 Gastón Mieres, 23 Joaquín Prada.
Referee: Andrew Brace (Ireland)