Despite a number of errors during the 75-lap race, the Kaulig Racing driver prevailed in the #97 Quad Lock Chevrolet by a small margin over JR Motorsports’ Justin Allgaier (#7 Chevrolet).
Sam Mayer (#1 JR Motorsports Chevrolet) and van Gisbergen shared the front row for race start while the latter’s Kaulig team-mate AJ Allmendinger (#16 Chevrolet) was sent from 10th to the rear given he had to revert to a back-up car after a crash in Qualifying.
Mayer made a good launch from pole position but was turned around at the very first corner by van Gisbergen, allowing Riley Herbst (#98 Stewart-Haas Racing Ford) to grab the lead.
Allgaier took up second spot, from van Gisbergen, Cole Custer (#00 SHR Ford), and Sheldon Creed (#18 Joe Gibbs Racing Toyota), while Allmendinger had indeed taken the start after a radio issue meant he was late to leave pit lane.
After a settling-in period, van Gisbergen passed Allgaier for second place on the run to Turn 10 on Lap 14, then criss-crossed Herbst for the lead through the Turn 1/Turn 2/Turn 3 complex on Lap 16.
Allgaier passed Custer for second on Lap 19 before Herbst locked the rears and spun out of fourth position on Lap 22 at Turn 1, although he at least avoided nailing his team-mate just ahead.
Van Gisbergen led by two seconds when he pitted at the end of Lap 23 to flip the stage, which was won two laps later by Allgaier.
Once everyone else pitted in the break, van Gisbergen filtered back to the lead and shared the front row with Allgaier for the restart.
However, he was mugged by Allgaier and Creed as they came off Turn 12 to take the green flag again at the start of Lap 30, then ran wide at Turn 1 and clattered into Custer at Turn 2.
The New Zealander dropped back to eighth and, worse still, had a smoking right-front tyre due to bodywork damage.
The smoke cleared and van Gisbergen set about picking off those in front of him, rising to third with a move on Josh Bilicki (#19 JGR Toyota) on Lap 36 at Turn 7.
Almost as soon as he had done so, he sailed off the road at Turn 11 after the #97 Chevrolet became unsettled over a kerb and dropped back to seventh again.
Van Gisbergen regained one spot with a move on Herbst on Lap 38 and settled into sixth position as Allgaier circulated two seconds clear of Creed at the very head of the field, with Bilicki running third.
SVG passed Chandler Smith (#81 JGR Toyota) for fifth on Lap 49, with Stage 2 coming to a slightly premature end when yellow flags were waved during Lap 50 due to Matt DiBenedetto (#38 RSS Racing Ford) stopping on the side of the track, while a dog was also loose on the circuit.
After the stage break pit stops, Allgaier remained leader, from Creed, Bilicki and Custer, with van Gisbergen dropping five spots to 10th in the lane.
In a messy Lap 56 restart, Creed wrested first place from Allgaier by hanging tough as they rounded Turn 1, with Chandler Smith jumping to third, Ryan Truex (#20 JGR Toyota) assuming fourth, and Sam Mayer (#1 JRM Chevrolet) in fifth.
Van Gisbergen had gained three spots by the time he exited the chicane then passed Sage Karam (#26 Sage Hunt Racing Toyota) for sixth in the next few corners.
Herbst lost positions due to running long into the middle of the chicane while Bilicki ended up facing the wrong way.
Van Gisbergen wasted little time moving into the podium places, putting a move on Chandler Smith for third position on Lap 58 at Turn 7.
Allgaier had not long reclaimed the lead from Creed, who had Car #97 looming in his mirror, although the Supra driver kept the Kiwi at bay when van Gisbergen tried a pass at Turn 1/Turn 2/Turn 3 on Lap 61.
The Bathurst 1000 winner made the overtake on Lap 62 at Turn 7, by which time Allgaier was almost three seconds up the road, but a Caution on Lap 63 when Hailie Deegan (#15 AM Racing Ford) shed a flat tyre closed the field up again.
The restart came on Lap 67 and it was another poor one for van Gisbergen, who tucked into fourth as he negotiated Turn 1.
He re-passed Mayer through Turn 4/Turn 5 before the race came under Caution again on Lap 68 due to a multi-car incident at Turn 12.
Brennan Pool (#44 Alpha Prime Racing Chevrolet) spun, causing Blaine Perkins (#29 RSS Ford) to also loop around, and Brandon Jones (#9 JRM Chevrolet) was left with nowhere to go as he shunted into the tyre barrier, with several more caught up in the mess.
Creed was sent to the back under that Caution due to a breach on the previous restart, putting van Gisbergen back onto the front row as they filed up behind the Pace Car again.
The green flag waved with four laps to go, with Allgaier choosing the inside.
He dropped van Gisbergen as they sped up the main straight but this time #97 at least held second place into the chicane, from Sammy Smith (#8 JRM Chevrolet) and Mayer.
Second later, Allgaier missed the apex at Turn 4 and van Gisbergen got up the inside, completing the pass as they arrived at Turn 6.
However, he could not shake Car #7 and took a 0.386s lead to the white flag, as Mayer dropped back due to a flat tyre.
Van Gisbergen stayed ahead for the final 1.97mi around the Portland road course for his first Xfinity Series race win, by a margin of 0.941s.
Sammy Smith finished third, from Allmendinger, Ed Jones (#24 Sam Hunt Racing Toyota), Custer, Josh Williams (#11 Kaulig Chevrolet), Parker Kligerman (#48 Big Machine Racing Chevrolet), Parker Retzlaff (#31 Jordan Anderson Racing Chevrolet), and Herbst.
The NASCAR Xfinity Series continues next weekend at Sonoma Raceway.