Fabbro (Bora-Hansgrohe) went solo with 22km to go but a late attack on the final climb by Guerreiro (EF Pro Cycling) and Van der Poel (Alpecin-Fenix) meant that the Bora-Hansgrohe rider was caught with 300 metres to go.
Simon Yates (Mitchelton-Scott) keeps the overall lead with no change to Rafał Majka (Bora-Hansgrohe) and Geraint Thomas (Ineos Grenadiers) by 16 and 39 seconds heading into the final individual time trial.
How it happened
The penultimate stage of the Tirreno-Adriatico 2020 started in Pieve Torina and took in a very lumpy route to Loreto where the riders joined the finishing circuit at around the half way point in the 181km stage.
A large break of 14 riders went up the road and got a maximum gap of four and a half minutes before the peloton, led by Astana.
The break included Van der Poel, Matteo Fabbro, Rubén Guerreiro, and the likes of Victor Campenaerts (NTT Pro Cycling), Martijn Tusveld (Team Sunweb), Julien Bernard (Trek-Segafredo) and Giovanni Visconti (Vini Zabù-KTM).
As the gap was slowly being eaten away by Astana, Carl Frederik Hagen (Lotto-Soudal) and Samuele Battistella (NTT Pro Cycling) attacked from the bunch with 51km to go.
Hagen was not able to follow the under 23 World Champion and dropped back to the peloton with the young Italian persevering with the effort.
With 38km to go there was a kick in the break made by Guerreiro, Fabbro and Van der Poel, while behind several moves ensued but none stuck as Battistella was brought back.
The break all came back together again and started to look at each other with riders sitting on with 29km to go as Tonelli, Barta and Campenaerts were the riders dropped as the break went back up to three minutes.
Guerreiro kicked as they hit the finishing climb for the penultimate time, he brought Fabbro out with him as the other riders could not follow with 26km to go.
But Van der Poel used the less steep gradients after they crossed the finish line once more to fire across to Guerreiro and Fabbro.
Some riders had attacked out of the peloton creating a large group where Jakob Fuglsang (Astana) decided to make a move to this new large group and straight over the top with 22km to go.
Fabbro then attacked the break quickly pulling out a good gap of 25 seconds.
Fuglsang, Matthew Holmes (Lotto-Soudal) and Benjamin Thomas (Groupama-FDJ) bridged to the riders dropped from the break and left them behind as they closed in on the chase group that were 30 seconds behind Fabbro.
Fabbro hit the final climb and kilometre with the gaps at 18 seconds to the chasers, 27 to the Fuglsang group and 55 seconds to the peloton.
Guerreiro and Van der Poel attacked hard with the peloton flying up the climb as Fabbro was all over his bike.
Van der Poel kicked hard and flew past Fabbro with 300 metres to go, leaving Guerreiro behind and taking the win by four seconds.
Alpecin-Fenix now have two wins in a row at the race after the Belgian champion, Tim Merlier, won the day before into Senigallia.
No change at the top of the general classification with Yates leading, still 16 seconds ahead of Majka and with 39 seconds to Thomas going into the final stage which is a 10.1km ITT, which suits Thomas down to the ground.
Tirreno-Adriatico 2020, stage seven – Pieve Torina to Loreto (181km)
1. Mathieu van der Poel (Ned) Alpecin-Fenix, in 4-19-23
2. Rubén Guerreiro (Por) EF Pro Cycling, at 4s
3. Matteo Fabbro (Ita) Bora-Hansgrohe, at same time
4. Wilco Kelderman (Ned) Team Sunweb, at 9s
5. Alex Aranburu (Esp) Astana, at 10s
6. Simon Yates (GBr) Mitchelton-Scott
7. Michael Woods (Can) EF Pro Cycling
8. Geraint Thomas (GBr) Ineos Grenadiers
9. Aleksandr Vlasov (Rus) Astana
10. Rafał Majka (Pol) Bora-Hansgrohe, all at same time.
Tirreno-Adriatico 2020 general classification
1. Simon Yates (GBr) Mitchelton-Scott, in 31-56-02
2. Rafał Majka (Pol) Bora-Hansgrohe, at 16s
3. Geraint Thomas (GBr) Ineos Grenadiers, at 39s
4. Aleksandr Vlasov (Rus) Astana, at 49s
5. Fausto Masnada (Ita) Deceuninck – Quick-Step, at 57s
6. Wilco Kelderman (Ned) Team Sunweb, at 59s
7. Michael Woods (Can) EF Pro Cycling, at 1-22
8. James Knox (GBr) Deceuninck – Quick-Step, at 1-26
9. Gianluca Brambilla (Ita) Trek-Segafredo, at 2-33
10. Jack Haig (Aus) Mitchelton-Scott, at 2-47