Piccola schiarita circa il futuro di Ruslan Malinovskyi: dopo le dichiarazioni social della moglie sembra evidente che il futuro del calciatore ucraino sarà lontano da Bergamo. Stando a quanto rivelato da Sky, sono in corso contatti tra l'Atalanta e l'Olympique Marsiglia per parlare di uno scambio tra il centrocampista ex Genk e Cengiz Under, attaccante ex Roma che potrebbe tornare in Italia e andare a rafforzare la batteria offensiva a disposizione di Gasperini.

Entrato nel settore giovanile dello Šachtar a 13 anni, nel 2011 approda in prima squadra senza totalizzare presenze.

Nella stagione 2012-2013 è ceduto in prestito al Sevastopol'. Nella seconda divisione ucraina disputa 16 incontri, realizzando 1 gol. Il Sevastopol è promosso in Prem"jer-liha e il prestito è rinnovato, ma la squadra è sciolta a causa della guerra del Donbass.

Nel gennaio del 2014 passa in prestito allo Zorja. Il 6 aprile 2014 segna il primo gol in Prem"jer-liha nel 3-0 al Mariupol'. Chiude il campionato con 3 reti segnate in 8 presenze. Nella stagione successiva realizza una doppietta nei preliminari di Europa League contro il Feyenoord. È nominato miglior giovane del campionato ucraino.

Genk 

Il 1º gennaio 2016 si trasferisce in prestito al Genk. Esordisce nella Pro League belga il 15 gennaio, giocando titolare nella vittoria 2-1 sullo Zulte Waregem. Raccoglie complessivamente 15 presenze. Al termine della stagione lo Šachtar rinnova il prestito al Genk per un'ulteriore stagione. Rimane fuori a lungo per la rottura del legamento crociato. Il 10 febbraio 2017 segna il primo gol con la maglia del Genk nel successo esterno sul Sint-Truiden (0-3).

Il Genk esercita il diritto di riscatto, versando 2 milioni allo Šachtar.[10] Nella stagione 2017-2018 raggiunge per il secondo anno consecutivo quota 5 reti in campionato. Nel 2018-2019 è tra i protagonisti della cavalcata che conduce il Genk alla vittoria del campionato, stabilendo il record personale di 13 gol.

Il 16 luglio 2019 è annunciato il suo passaggio all'Atalanta, con cui firma un contratto triennale; il costo complessivo dell’operazione è di 13,7 milioni di euro più bonus ed una percentuale sulla futura rivendita[2]. Il 25 agosto debutta in Serie A (ed in generale con l'Atalanta) nella partita in casa della SPAL subentrando a Remo Freuler. Il 22 ottobre mette a segno su calcio di rigore la sua prima rete in maglia nerazzurra, nonché la sua prima rete assoluta in Champions League, nel match di Champions League perso per 5-1 dai bergamaschi contro il Manchester City. Il successivo 7 dicembre, contro il Verona, realizza invece la sua prima rete in Serie A. Durante la stagione si rivela una pedina importante per la squadra (in particolare nel girone di ritorno), seppur senza essere titolare fisso, con 8 gol in campionato.

Nella seconda stagione lui parte in sordina per poi aumentare di rendimento nel girone di ritorno. Il 18 aprile 2021 è autore del gol che permette all'Atalanta di battere in una partita di campionato, dopo 20 anni, la Juventus. In campionato ha fornito ben 11 assist, risultando essere il giocatore più prolifico per quanto concerne la seguente statistica.