With the win, the Timbers (16-7-1, 49pts) earn a playoff berth for the third time in four seasons. The conference semifinal round is scheduled for September 3-5.
Portland has won five of its last six games and remains atop the Western Conference while defeating Calgary (4-16-5, 17pts) for the third time this season.
In the game-breaking play, Hugo Alcaraz-Cuellar dished a short cross to the left side for a streaking Afash, who spun the ball off his head and into the left side of the net for the dramatic match-winner in the 89th minute.
Calgary had an opportunity to equalize in stoppage time, as the ball bounced off several players inside the box, but Portland eventually cleared to preserve the victory.
It was the third goal in as many games for Afash, who also leveled the tying goal in Sunday’s 1-1 draw at Calgary.
The Timbers were awarded a penalty kick in the 39th minute after Alan Gordon was pulled down in the box by a Calgary defender. Alex Bengard stepped up to the ball and calmly slid it by the right side of Mustangs goalkeeper Lutz Pfannenstiel for the 1-0 lead.
Calgary evened things up in the 62nd when Jamie Auvigne beat the Portland defense and optioned to Geert Brusselers, who cracked a left-footed shot into the upper corner of the net, making it 1-1.
Portland created two scoring opportunities earlier in the 11th, when a hard-nosed shot from Byron Alvarez was turned back by the Calgary back line and a second look from Bengard was stopped by the Calgary ‘keeper.
Portland plays its final road game of the regular season Saturday at Minnesota. Kickoff is 4 p.m. (Pacific).
TIMBERS NOTES: The Timbers held a moment of silence before the game, as players wore black armbands and staff wore black ribbons in honor of Hannah Serrill, who died in a car accident last Thursday. The daughter of Timbers mascot “Timber Jim” Serrill, Hannah left behind a two-year-old daughter … playoff tickets will be on sale soon, at a date to be determined.
SCORING SUMMARY: Bengard, 39’ (PK); Brusselers, 62’ (Auvigne); Afash, 89’ (Alcaraz-Cuellar).
PENALTY SUMMARY: CAL Kolomiets-Raad, YC (17’); POR Winters, YC (20’), Sagare, YC (72’).
LINEUPS: CALGARY (4-16-5) Pfannenstiel GK, Sestito D, Richer D, Pesznecker D, Gillespie M, Brusselers M, Holdt M, Auvigne M, Kolomiets-Raad M, Jesic F (Frazao 85’), Zuniga F; PORTLAND (16-7-1) J. Saunders GK, Morrison D, Wilkinson D, Thompson D, Winters M, Gregor M (Miranda 55’), Bengard M (Benedetti 68’), Alcaraz-Cuellar M, Sagare M, Gordon F, Alvarez F (Afash 84’).