Do kadry pierwszej drużyny Lecha Poznań został włączony w 2009. W Ekstraklasie zadebiutował 18 października 2009 w meczu z Wisłą Kraków (1:0). W sezonie 2009/2010, w którym rozegrał 12 meczów, zdobył z Lechem Poznań mistrzostwo Polski. W marcu 2010 podpisał z poznańskim klubem pierwszy profesjonalny kontrakt, obowiązujący do 30 czerwca 2014[1]. W sierpniu 2010 wystąpił przez pełne 90. minut w przegranym spotkaniu o Superpuchar Polski z Jagiellonią Białystok (0:1). W sezonie 2010/2011 rozegrał w Ekstraklasie 13 meczów i zdobył w niej jednego gola – 31 października 2010 strzelił bramkę w spotkaniu z Wisłą Kraków (4:1). W sezonie 2010/2011 wystąpił także w czterech meczach Ligi Europy – zadebiutował w tych rozgrywkach 19 sierpnia 2010 w wygranym spotkaniu z Dnipro Dniepropietrowskiem (1:0), zaś pierwszego gola zdobył 4 listopada 2010 w wygranym meczu fazy grupowej z Manchesterem City (3:1). Do kwietnia 2011 występował w barwach Lecha również w Młodej Ekstraklasie.
W sezonie 2011/2012 rozegrał w Ekstraklasie 26 meczów, zdobywając cztery bramki w spotkaniach z Ruchem Chorzów (3:0; 19 sierpnia 2011), ŁKS-em Łódź (4:0; 3 grudnia 2011), Cracovią (3:1; 31 marca 2012) i Lechią Gdańsk (2:1; 15 kwietnia 2012). Sezon 2012/2013 rozpoczął jako podstawowy gracz poznańskiej drużyny. W Lidze Europy, w której Lech dotarł do trzeciej rundy eliminacji, wystąpił w sześciu meczach i zdobył dwa gole w spotkaniach z azerskim Xəzərem Lenkoranem (1:1; 19 lipca 2012) i szwedzkim AIK-iem Solna (1:0; 9 sierpnia 2012). W Ekstraklasie występował regularnie, choć nie zawsze w podstawowym składzie (12 razy wchodził na boisko z ławki rezerwowych). 10 maja 2013 w meczu z Widzewem Łódź (4:0) zdobył swoją jedyną ligową bramkę w sezonie 2012/2013. W sezonie 2013/2014 rozegrał w Ekstraklasie 33 mecze i strzelił trzy gole. Okresowo występował na pozycji prawego obrońcy, nominalnie zajmowanej przez Tomasza Kędziorę. Nie przedłużył wygasającego z końcem czerwca 2014 kontraktu z Lechem (poznański klub prowadził z nim negocjacje, przedstawiając kilka ofert nowej umowy) i na początku lipca 2014 stał się wolnym zawodnikiem[2].
Dalsza kariera
W lipcu 2014 podpisał umowę z Lechią Gdańsk. Zadebiutował w niej 19 lipca 2014 w meczu z Jagiellonią Białystok (2:2), w którym zmienił w 86. minucie Piotra Wiśniewskiego. W sezonie 2014/2015 rozegrał w Ekstraklasie 24 spotkania (13 w podstawowym składzie), ponadto wystąpił w sześciu meczach trzecioligowych rezerw gdańskiego klubu, dla których zdobył dwie bramki. Po zakończeniu rozgrywek Lechia nie przedłużyła z nim umowy[3]. W czerwcu 2015 trafił do Podbeskidzia Bielsko-Biała. W sezonie 2015/2016, w którym bielski klub spadł do I ligi, był jego podstawowym zawodnikiem – zagrał w 33 meczach, w których zdobył cztery bramki (jedną z rzutu karnego). Będąc graczem Podbeskidzia, dwukrotnie otrzymał nominację do tytułu najlepszego piłkarza miesiąca Ekstraklasy (w październiku 2015[4] i lutym 2016[5]).
W czerwcu 2016 przeszedł do Korony Kielce, z którą podpisał dwuletni kontrakt z opcją przedłużenia o rok[6]. W kieleckiej drużynie zadebiutował 17 lipca 2016 w przegranym meczu z Zagłębiem Lubin (0:4), zaś pierwszą bramkę strzelił 12 sierpnia 2016 w spotkaniu z Lechią Gdańsk (2:3). W sezonie 2016/2017 zdobył jeszcze trzy gole: 28 kwietnia 2017 w meczu z Lechem Poznań (2:3), 17 maja 2017 w spotkaniu z Wisłą Kraków (3:2) i 22 maja 2017 w meczu z Niecieczą KS (2:0; wybrany został do najlepszej jedenastki 35. kolejki Ekstraklasy[7]). Łącznie w sezonie 2016/2017 spędził na boisku 3143 minuty (36 meczów), zajmując 8. miejsce w klasyfikacji najwięcej grających zawodników[8]. W sezonie 2017/2018 rozegrał w Ekstraklasie 32 mecze i strzelił dwie bramki w spotkaniach z Wisłą Płock (2:0) i Niecieczą KS (3:0). Ponadto wystąpił w pięciu meczach Pucharu Polski, zdobywając gola w dogrywce wygranego spotkania 1/16 finału z Zagłębiem Sosnowiec (2:1). W rundzie jesiennej sezonu 2018/2019 utracił miejsce w podstawowym składzie Korony – w lidze rozegrał 14 spotkań (na 20 możliwych), w tym dziewięć w pierwszej jedenastce, a także zdobył jednego gola w rozegranym 8 grudnia 2018 zremisowanym meczu z Wisłą Płock (2:2).
W styczniu 2019 przeszedł na zasadzie transferu definitywnego do Zagłębia Sosnowiec, z którym podpisał półtoraroczny kontrakt. W tym okresie jego pozyskaniem zainteresowane były też: Górnik Zabrze, Dinamo Bukareszt i Dundee FC[9]. 24 sierpnia 2019 roku został piłkarzem Widzewa Łódź, podpisując dwuletni kontrakt z opcją przedłużenia[10]. W wygranym 2:1 meczu II ligi z rezerwami swojego byłego klubu - Lecha Poznań – strzelił pierwszą w karierze bramkę głową[11]. W sezonie 2019/20 rozegrał łącznie 29 meczów, w których zdobył 3 gole oraz zanotował 2 asysty i awansował z drużyną do I ligi[12]. W sezonie 2020/2021 był podstawowym zawodnikiem w I lidze, gdzie zespół zajął 9. miejsce w tabeli. Po zakończeniu sezonu trafił do Znicza Pruszków[13], gdzie w ciągu kolejnych dwóch sezonów rozegrał 34 spotkania, strzelając 2 bramki na poziomie II ligi. 11 stycznia 2023 odszedł ze Znicza[14]. 14 lutego 2023 r. zarejestrowany w Legii II Warszawa[15]. 11 marca 2023 r. zadebiutował w barwach rezerw stołecznego klubu, wchodząc na boisko w 46. minucie za Jakuba Kisiela, zdobywając w 50. minucie bramkę na 1:1 w wygranym 3:2 meczu III ligi przeciwko Pelikanowi Łowicz[16]. 7 czerwca 2023 r. zdobył z Legią II mazowiecki Puchar Polski[17].
W latach 2010–2011 wystąpił w barwach reprezentacji Polski U-20 w pięciu meczach Turnieju Czterech Narodów. W kadrze U-21 rozegrał dwa spotkania – 6 czerwca 2011 wystąpił w meczu towarzyskim z Grecją (1:2)[20], zaś 2 września 2011 zagrał w spotkaniu eliminacyjnym do młodzieżowych mistrzostw Europy z Albanią (3:0), w którym w 68. minucie zmienił Bartosza Salamona[21].