Portland saw two chances to grab a late lead as substitute midfielder Dairon Asprilla saw a close-range header bounce just over the crossbar in the 89th minute.
Moments later, Adi was played into the penalty box, took a touch and unleashed a right-footed effort, but Vancouver goalkeeper David Ousted made a point-blank stop.
Following the save, the Whitecaps scored the game-winning goal.
Portland saw its 11-match unbeaten streak against Western Conference opponents snapped.
The result also marked the Timbers first-ever loss at BC Place in the team’s MLS era (3-1-2). For the second time in four matches to start the season, Portland held an opponent without a corner kick.
WHITECAPS 2, TIMBERS 1
Portland 0 1—1
Vancouver 1 1—2
First half—1, Vancouver, Mezquida 1, 15th minute.
Second half—2, Portland, Adi 3, 82nd. 3, Vancouver, Earnshaw 1 (Morales), 90th.
Goalies—Portland, Adam Kwarasey; Vancouver, David Ousted.
Yellow Cards—Koffie, Vancouver, 12th; Powell, Portland, 30th; Beitashour, Vancouver, 58th; Waston, Vancouver, 88th.
Lineups
Portland—Adam Kwarasey, Alvas Powell, Nat Borchers, Liam Ridgewell, Darlington Nagbe, George Fochive (Gaston Fernandez, 75th), Rodney Wallace, Jorge Villafana, Diego Chara, Maximiliano Urruti (Dairon Asprilla, 65th), Fanendo Adi.
Vancouver—David Ousted, Steven Beitashour, Pa-Modou Kah, Sam Adekugbe, Kendall Waston, Erik Hurtado (Robert Earnshaw, 87th), Nicolas Mezquida (Kianz Froese, 58th), Matias Laba, Pedro Morales, Gershon Koffie (Deybi Flores, 72nd), Octavio Rivero.