Klaas-Jan Huntelaar had a penalty saved by Bernd Leno, before Eric Maxim Choupo-Moting and Leroy Sané into the break with a comfortable lead.
Julian Brandt and Karim Bellarabi levelled the game after the restart before Javier Hernandez crowned a superb show of strength.
Schalke storm ahead after dominant opening
Schalke started the game like a team who knew their Champions League hopes depended on winning the game, and they were afforded the best possible opportunity within five minutes. Ömer Toprak brought down Leroy Sané in the area and Wolfgang Stark duly pointed to the spot. Klaas-Jan Huntelaar was tasked with converting, though Bernd Leno was determined not to be beaten and kept out the Dutchman's penalty in the bottom left corner.
Leno again came to Leverkusen's rescue, keeping out Max Meyer's snapshot at his near post. However, the hosts would not be kept quiet for much longer. The Werkself back-line continued to back off when Schalke ran at their defence, and Eric Maxim Choupo-Moting punished them. His shot from the edge of the area caught Toprak's toe, capping off a miserable 15 minutes for the Turk and deflecting the ball over the helpless Leno; six games without conceding, gone.
Leverkusen fall further behind
That seemed to spark the visitors into life and Kevin Kampl came close in the aftermath, as a cross managed to run all the way across goal to the penalty spot. His shot was goalbound but Junior Caicara appeared from right-back to make a crucial intervention. The revival was merely momentary, and things got even worse for the visitors.
A speedy Schalke break saw Meyer and Sané coming forward with pace, with the former squaring for his attacking partner to slice open the Leverkusen defence. Sané slotted past the oncoming Leno, giving the hosts a deserved second. There would be more bad news for the visitors when Tin Jedvaj's attempts to block the shot saw the defender collide with his goalkeeper, forcing him off for Benjamin Heinrichs. That was the final major moment of a forgettable half for Roger Schmidt's side.
Werkself work their way back into the game, and how
Schmidt knew change was necessary after the break and opted to bring Stefan Kießling on for Lars Bender, allowing Kampl to drop deeper and have more of an influence. The visitors were renewed in their charge for a way back into the game and nearly found it inside five minutes of the restart. Karim Bellarabi finally got on the ball and sped towards goal, with Ralf Fährmann only just doing enough to turn the shot onto the post.
Their heads could have dipped over being denied by the woodwork, Leverkusen came forward in their droves and got the goal their early play had deserved. Bellarabi bundled foward once more and flicked a delicate pass into the path of Julian Brandt, who managed to prod past the advancing Fährmann to hand the visitors some hope.
Seeing was believing, and two minutes later they were level. Schalke had capitulated and their opponents were only too happy to take advantage. A hopeful ball forward from Heinrichs found Bellarabi in an awkward position out on the byline and he took everyone by surprise with a volley that crept past the bemused Fährmann.
Incredibly, the hosts would give up a third goal and Leverkusen the lead for the first time. Schalke were on the attack but a lightning quick counter soon had the visitors through on goal, with Brandt slipping in Javier Hernandez. The Mexican remained ice-cool to finish for his 17th of the season; the comeback was complete.
It could have been even better for Schmidt and his men, only to see the bar deny Charles Aranguiz and Kampl go close twice in quick succession. The game was almost too open, with it resembling a basketball match more than one of football. At the other end, Huntelaar was halted by a stunning stop from Leno.
Despite Choupo-Moting firing just past the post late on, Schalke's late efforts were in vain. They sit seventh on 45 points, now nine behind Leverkusen and four back from Hertha BSC. Two more wins will secure Leverkusen's place in the Champions League next season, and can start with a game against their nearest rivals, Hertha, next Saturday. Schalke, on the other hand, travel to lowly Hannover 96.