Clubs
| Club | Seasons | Apps | Goals | Assists |
|---|---|---|---|---|
| Tranmere | 2012/13 – 2026/27 | 12 | 1 | 3 |
| Oxford | 2022/23 – 2025/26 | 137 | 4 | 4 |
| Sheffield Wed | 2022/23 – 2024/25 | 91 | 2 | 5 |
| Wales | 2019 – 2022 | 7 | 0 | — |
| Cardiff | 2019/20 – 2021/22 | 117 | 11 | 4 |
| Rotherham | 2016/17 – 2018/19 | 137 | 17 | 9 |
| Falkirk | 2012/13 – 2016/17 | 142 | 14 | — |
| Workington | 2012/13 | 20 | 1 | — |
Transfers
| Date | From | To | Type |
|---|---|---|---|
| 1 Jul 2024 | Sheffield Wednesday | Oxford United | Free |
| 1 Jul 2022 | Cardiff | Sheffield Wednesday | Free |
| 27 Jun 2019 | Rotherham | Cardiff | £ 2.1M |
| 22 Jul 2016 | Falkirk | Rotherham | Free |
| 20 Aug 2012 | Tranmere | Workington | Loan |
| 1 Aug 2026 | Oxford United | Tranmere | Free agent |
| 2 Aug 2026 | Oxford United | Tranmere | Free agent |
Season by season
| Season | Competition | Club | Apps | Starts | Min | Goals | Assists | Yellow | Red | Rating |
|---|---|---|---|---|---|---|---|---|---|---|
| 2026/27 | League Two | Tranmere | 12 | 12 | 1080 | 1 | 3 | 2 | 0 | 7.14 |
| 2025/26 | League Cup | Oxford | 1 | 1 | 90 | 0 | 0 | 0 | 0 | 6.60 |
| 2025/26 | FA Cup | Oxford | 2 | 2 | 156 | 0 | 0 | 1 | 0 | 7.45 |
| 2025/26 | Championship | Oxford | 39 | 18 | 1966 | 1 | 0 | 9 | 0 | 6.92 |
| 2024/25 | Championship | Oxford | 45 | 41 | 3343 | 1 | 2 | 4 | 0 | 6.86 |
| 2024/25 | League Cup | Oxford | 2 | 1 | 32 | — | 0 | 0 | 0 | 6.90 |
| 2023/24 | Championship | Sheffield Wed | 34 | 25 | 2354 | 0 | 3 | 10 | 0 | 7.08 |
| 2023/24 | League Cup | Sheffield Wed | 2 | 1 | 89 | 0 | — | 1 | 0 | 6.75 |
| 2023/24 | FA Cup | Sheffield Wed | 1 | 1 | 90 | 0 | — | 0 | 0 | — |
| 2022/23 | League One | Sheffield Wed | 46 | 35 | 3220 | 2 | 2 | 7 | 0 | 7.10 |
| 2022/23 | League One | Oxford | 48 | 39 | 3142 | 2 | 2 | 6 | 0 | 7.10 |
| 2022/23 | FA Cup | Sheffield Wed | 4 | 4 | 331 | 0 | — | 1 | 0 | 6.75 |
| 2022/23 | League Cup | Sheffield Wed | 2 | 1 | 134 | 0 | — | 0 | 0 | 6.95 |
| 2022/23 | EFL Trophy | Sheffield Wed | 2 | 2 | 180 | 0 | — | 0 | 0 | — |
| 2022 | Friendlies | Wales | 1 | 1 | 61 | 0 | — | 0 | 0 | — |
| 2021/22 | Championship | Cardiff | 36 | 23 | 2098 | 2 | 2 | 8 | 0 | 6.91 |
| 2021/22 | League Cup | Cardiff | 2 | 2 | 180 | 0 | — | 1 | 0 | 7.50 |
| 2021/22 | FA Cup | Cardiff | 2 | 2 | 189 | 0 | — | 1 | 0 | 6.90 |
| 2020/21 | Championship | Cardiff | 42 | 36 | 3136 | 5 | 2 | 7 | 1 | 6.99 |
| 2020/21 | FA Cup | Cardiff | 1 | 1 | 63 | 0 | — | 0 | 0 | 7.30 |
| 2020 | Friendlies | Wales | 1 | 0 | 28 | 0 | — | 0 | 0 | — |
| 2020 | Euro Championship | Wales | 3 | 1 | 72 | 0 | — | 0 | 0 | 6.37 |
| 2019/20 | Championship | Cardiff | 29 | 19 | 1788 | 4 | — | 4 | 0 | 7.07 |
| 2019/20 | League Cup | Cardiff | 1 | 1 | 90 | 0 | — | 1 | 0 | 6.70 |
| 2019/20 | FA Cup | Cardiff | 4 | 4 | 390 | 0 | — | 2 | 0 | — |
| 2019 | Friendlies | Wales | 2 | 1 | 91 | 0 | — | 0 | 0 | — |
| 2018/19 | Championship | Rotherham | 41 | 41 | 3610 | 7 | 7 | 10 | 1 | 7.21 |
| 2018/19 | League Cup | Rotherham | 1 | 0 | 44 | 1 | — | 0 | 0 | 7.50 |
| 2018/19 | FA Cup | Rotherham | 1 | 1 | 90 | 0 | — | 0 | 0 | 6.70 |
| 2017/18 | League One | Rotherham | 47 | 41 | 3947 | 6 | 1 | 9 | 0 | 7.87 |
| 2017/18 | FA Cup | Rotherham | 1 | 1 | 90 | 1 | — | 0 | 0 | — |
| 2017/18 | League Cup | Rotherham | 2 | 1 | 90 | 0 | — | 0 | 0 | — |
| 2017/18 | EFL Trophy | Rotherham | 2 | 2 | 180 | 1 | — | 1 | 0 | — |
| 2016/17 | Championship | Rotherham | 40 | 31 | 3034 | 1 | 1 | 9 | 0 | 6.91 |
| 2016/17 | League Cup | Rotherham | 1 | 1 | 120 | 0 | — | 0 | 0 | — |
| 2016/17 | FA Cup | Rotherham | 1 | 1 | 90 | 0 | — | 0 | 0 | — |
| 2016/17 | League Cup | Falkirk | 1 | 1 | 90 | 1 | — | 0 | 0 | — |
| 2015/16 | Premiership | Falkirk | 4 | 4 | 360 | 1 | — | 1 | 0 | — |
| 2015/16 | Championship | Falkirk | 35 | 35 | 3150 | 6 | — | 5 | 0 | — |
| 2015/16 | Challenge Cup | Falkirk | 2 | 2 | 144 | 0 | — | 1 | 0 | — |
| 2015/16 | Scottish Cup | Falkirk | 2 | 2 | 180 | 1 | — | 0 | 0 | — |
| 2015/16 | League Cup | Falkirk | 3 | 3 | 270 | 0 | — | 2 | 0 | — |
| 2014/15 | Championship | Falkirk | 34 | 33 | 2926 | 3 | — | 10 | 0 | — |
| 2014/15 | League Cup | Falkirk | 3 | 3 | 300 | 0 | — | 0 | 0 | — |
| 2014/15 | Challenge Cup | Falkirk | 3 | 3 | 270 | 1 | — | 0 | 0 | — |
| 2014/15 | Scottish Cup | Falkirk | 5 | 5 | 450 | 0 | — | 0 | 0 | — |
| 2013/14 | Premiership | Falkirk | 4 | 4 | 390 | 0 | — | 2 | 0 | — |
| 2013/14 | Championship | Falkirk | 33 | 33 | 2922 | 1 | — | 6 | 0 | — |
| 2013/14 | Challenge Cup | Falkirk | 3 | 3 | 300 | 0 | — | 0 | 0 | — |
| 2013/14 | Scottish Cup | Falkirk | 1 | 1 | 90 | 0 | — | 0 | 0 | — |
| 2013/14 | League Cup | Falkirk | 3 | 3 | 270 | 0 | — | 1 | 0 | — |
| 2012/13 | Championship | Falkirk | 6 | 4 | 387 | 0 | — | 1 | 0 | — |
| 2012/13 | National League N / S | Workington | 19 | 18 | 1592 | 1 | — | 0 | 0 | — |
| 2012/13 | FA Cup | Workington | 1 | 1 | 90 | 0 | — | 0 | 0 | — |
Availability history
| Reason | From | Until | Days |
|---|---|---|---|
| Ankle Injury | 2 May 2025 | 12 Jul 2025 | 71 |
| Hamstring | 30 Dec 2023 | 12 Jan 2024 | 13 |
Trophies
| Competition | Season | Place |
|---|---|---|
| Scottish Cup (Scotland) | 2014/2015 | 2nd Place |
| Championship (Scotland) | 2015/2016 | 2nd Place |
| Piala Presiden (Indonesia) | 2025 | 2nd Place |
