Clubs
| Club | Seasons | Apps | Goals | Assists |
|---|---|---|---|---|
| Bristol Rovers | 2010/11 – 2026/27 | 252 | 66 | 2 |
| Wycombe | 2026/27 | 0 | 1 | 0 |
| MK Dons | 2023/24 – 2024/25 | 59 | 13 | 2 |
| Walsall | 2024/25 | 12 | 3 | 1 |
| Port Vale | 2022/23 – 2023/24 | 36 | 11 | — |
| Fleetwood | 2021/22 – 2022/23 | 20 | 6 | 2 |
| Portsmouth | 2019/20 – 2021/22 | 84 | 20 | 5 |
| Ipswich | 2018/19 | 17 | 1 | 1 |
| Wales U21 | 2015 – 2017 | 14 | 3 | — |
| Hartlepool | 2015/16 | 2 | 0 | — |
Transfers
| Date | From | To | Type |
|---|---|---|---|
| 1 Sept 2023 | Port Vale | Milton Keynes Dons | — |
| 11 Aug 2022 | Fleetwood Town | Port Vale | — |
| 7 Jan 2022 | Portsmouth | Fleetwood Town | — |
| 1 Jul 2019 | Ipswich | Portsmouth | — |
| 23 Jul 2018 | Bristol Rovers | Ipswich | € 840K |
| 21 Feb 2016 | Hartlepool | Bristol Rovers | — |
| 19 Jan 2016 | Bristol Rovers | Hartlepool | Loan |
| 3 Feb 2025 | Milton Keynes Dons | Walsall | Loan |
| 1 Jun 2025 | Walsall | Milton Keynes Dons | — |
| 29 Jul 2025 | Milton Keynes Dons | Bristol Rovers | Free Transfer |
| 27 Jul 2025 | Milton Keynes Dons | Bristol Rovers | Free agent |
Season by season
| Season | Competition | Club | Apps | Starts | Min | Goals | Assists | Yellow | Red | Rating |
|---|---|---|---|---|---|---|---|---|---|---|
| 2026/27 | EFL Trophy | Bristol Rovers | 2 | 0 | 45 | 1 | 0 | 0 | 0 | 7.74 |
| 2026/27 | League Two | Bristol Rovers | 10 | 5 | 530 | 2 | 0 | 2 | 0 | 6.36 |
| 2025/26 | League Cup | Bristol Rovers | 1 | 1 | 61 | 0 | 0 | 0 | 0 | 6.30 |
| 2025/26 | EFL Trophy | Bristol Rovers | 4 | 2 | 105 | 2 | 0 | 0 | 0 | 6.90 |
| 2025/26 | League Two | Bristol Rovers | 38 | 23 | 1960 | 11 | 2 | 7 | 0 | 6.81 |
| 2024/25 | League Two | Walsall | 12 | 9 | 641 | 3 | 1 | 1 | 0 | 6.56 |
| 2024/25 | League Cup | MK Dons | 1 | 1 | 88 | 0 | 0 | 0 | 0 | 7.00 |
| 2024/25 | EFL Trophy | MK Dons | 3 | 2 | 197 | 2 | 1 | 0 | 0 | 7.43 |
| 2024/25 | FA Cup | MK Dons | 1 | 0 | 33 | 0 | — | 1 | 0 | — |
| 2024/25 | League Two | MK Dons | 19 | 3 | 504 | 3 | 1 | 2 | 1 | 6.56 |
| 2023/24 | League Two | MK Dons | 33 | 6 | 1117 | 8 | — | 3 | 0 | 6.89 |
| 2023/24 | League One | Port Vale | 1 | 1 | 71 | 0 | — | 0 | 0 | 7.30 |
| 2023/24 | EFL Trophy | MK Dons | 2 | 2 | 127 | 0 | — | 0 | 0 | 6.80 |
| 2023/24 | League Cup | Port Vale | 1 | 1 | 65 | 0 | — | 0 | 0 | 6.70 |
| 2022/23 | League One | Port Vale | 33 | 27 | 2377 | 11 | — | 7 | 0 | 6.70 |
| 2022/23 | League One | Fleetwood | 2 | 1 | 108 | 0 | — | 0 | 0 | 6.70 |
| 2022/23 | EFL Trophy | Port Vale | 1 | 1 | 90 | 0 | — | 0 | 0 | — |
| 2021/22 | League One | Fleetwood | 18 | 16 | 1336 | 6 | 2 | 2 | 0 | 7.02 |
| 2021/22 | League One | Portsmouth | 11 | 1 | 160 | 0 | 2 | 0 | 0 | 7.02 |
| 2021/22 | EFL Trophy | Portsmouth | 2 | 1 | 124 | 3 | — | 0 | 0 | 9.20 |
| 2021/22 | FA Cup | Portsmouth | 1 | 1 | 60 | 1 | — | 0 | 0 | — |
| 2020/21 | League One | Portsmouth | 25 | 11 | 1197 | 4 | — | 3 | 0 | 6.82 |
| 2020/21 | FA Cup | Portsmouth | 3 | 1 | 152 | 1 | 1 | 0 | 0 | 7.60 |
| 2020/21 | EFL Trophy | Portsmouth | 2 | 1 | 98 | 1 | — | 0 | 0 | 7.00 |
| 2020/21 | League Cup | Portsmouth | 1 | 0 | 27 | 0 | — | 0 | 0 | 6.70 |
| 2019/20 | League One | Portsmouth | 30 | 19 | 1721 | 5 | 1 | 7 | 0 | 6.85 |
| 2019/20 | League Cup | Portsmouth | 1 | 1 | 78 | 2 | — | 1 | 0 | 8.30 |
| 2019/20 | EFL Trophy | Portsmouth | 5 | 3 | 249 | 3 | — | 0 | 0 | 7.00 |
| 2019/20 | FA Cup | Portsmouth | 3 | 2 | 157 | 0 | 1 | 0 | 0 | 7.35 |
| 2018/19 | Championship | Ipswich | 16 | 9 | 776 | 1 | 1 | 2 | 0 | 6.66 |
| 2018/19 | FA Cup | Ipswich | 1 | 0 | 10 | 0 | — | 0 | 0 | — |
| 2017/18 | League One | Bristol Rovers | 44 | 41 | 3495 | 12 | — | 8 | 0 | — |
| 2017/18 | League Cup | Bristol Rovers | 3 | 3 | 225 | 2 | — | 1 | 0 | 6.95 |
| 2017/18 | EFL Trophy | Bristol Rovers | 1 | 1 | 90 | 0 | — | 0 | 0 | — |
| 2017/18 | FA Cup | Bristol Rovers | 1 | 0 | 30 | 0 | — | 0 | 0 | — |
| 2017 | UEFA U21 Championship | Wales U21 | 10 | 8 | 597 | 2 | — | 1 | 0 | — |
| 2016/17 | League One | Bristol Rovers | 37 | 25 | 2243 | 8 | — | 8 | 0 | — |
| 2016/17 | EFL Trophy | Bristol Rovers | 1 | 0 | 10 | 0 | — | 0 | 0 | — |
| 2016/17 | FA Cup | Bristol Rovers | 2 | 1 | 134 | 0 | — | 1 | 0 | — |
| 2016/17 | League Cup | Bristol Rovers | 2 | 2 | 144 | 1 | — | 0 | 0 | — |
| 2015/16 | League Two | Hartlepool | 2 | 2 | 124 | 0 | — | 0 | 0 | — |
| 2015/16 | League Cup | Bristol Rovers | 1 | 1 | 90 | 1 | — | 0 | 0 | — |
| 2015/16 | FA Cup | Bristol Rovers | 1 | 1 | 90 | 0 | — | 0 | 0 | — |
| 2015 | UEFA U21 Championship | Wales U21 | 4 | 3 | 245 | 1 | — | 2 | 0 | — |
| 2015/16 | League Two | Bristol Rovers | 22 | 10 | 1060 | 5 | — | 4 | 0 | — |
| 2014/15 | National League | Bristol Rovers | 37 | 9 | 1355 | 14 | — | 2 | 0 | — |
| 2014/15 | FA Cup | Bristol Rovers | 2 | 1 | 112 | 3 | — | 0 | 0 | — |
| 2013/14 | League Two | Bristol Rovers | 25 | 9 | 955 | 1 | — | 5 | 0 | — |
| 2013/14 | FA Cup | Bristol Rovers | 2 | 1 | 81 | 0 | — | 1 | 0 | — |
| 2013/14 | League Cup | Bristol Rovers | 1 | 1 | 90 | 0 | — | 0 | 0 | — |
| 2013/14 | EFL Trophy | Bristol Rovers | 1 | 1 | 90 | 0 | — | 0 | 0 | — |
| 2012/13 | League Two | Bristol Rovers | 13 | 10 | 796 | 3 | — | 3 | 0 | — |
| 2010/11 | League One | Bristol Rovers | 1 | 0 | 15 | 0 | — | 0 | 0 | — |
Availability history
| Reason | From | Until | Days |
|---|---|---|---|
| Suspended | 22 Sept 2019 | 25 Sept 2019 | 3 |
| Suspended | 22 Oct 2017 | 29 Oct 2017 | 7 |
| Suspended | 19 Oct 2016 | 23 Oct 2016 | 4 |
Trophies
| Competition | Season | Place |
|---|---|---|
| National League (England) | 2014/2015 | 2nd Place |
