Clubs
| Club | Seasons | Apps | Goals | Assists |
|---|---|---|---|---|
| Oldham | 2025/26 – 2026/27 | 50 | 1 | 0 |
| Montserrat | 2018 – 2024 | 6 | 1 | 0 |
| Walsall | 2021/22 – 2024/25 | 115 | 4 | 2 |
| Crewe | 2020/21 – 2021/22 | 31 | 0 | — |
| Luton | 2019/20 | 4 | 1 | — |
| Doncaster | 2019/20 | 13 | 0 | 1 |
| Blackpool | 2014/15 – 2018/19 | 49 | 1 | — |
| Wigan | 2015/16 – 2017/18 | 51 | 3 | — |
| Rochdale | 2017/18 | 18 | 0 | — |
| Aberdeen | 2014/15 | 10 | 1 | — |
| West Brom | 2013/14 | 0 | 0 | — |
| Gillingham | 2013/14 | 3 | 1 | — |
| Tranmere | 2012/13 | 14 | 1 | — |
Transfers
| Date | From | To | Type |
|---|---|---|---|
| 24 Jan 2022 | Crewe | Walsall | Free |
| 27 Aug 2020 | Luton | Crewe | Free |
| 3 Jan 2020 | Doncaster | Luton | — |
| 2 Sept 2019 | Luton | Doncaster | Loan |
| 1 Sept 2019 | Blackpool | Luton | Free |
| 1 Jul 2018 | Wigan | Blackpool | — |
| 1 Feb 2018 | Rochdale | Wigan | — |
| 31 Aug 2017 | Wigan | Rochdale | Loan |
| 1 Aug 2014 | West Brom | Blackpool | Loan |
| 5 Jan 2014 | Gillingham | West Brom | — |
| 22 Nov 2012 | West Brom | Tranmere | Loan |
| 1 Jul 2025 | Walsall | Oldham | Free Transfer |
Season by season
| Season | Competition | Club | Apps | Starts | Min | Goals | Assists | Yellow | Red | Rating |
|---|---|---|---|---|---|---|---|---|---|---|
| 2026/27 | League Cup | Oldham | 1 | 1 | 74 | 0 | 0 | 0 | 0 | 6.20 |
| 2026/27 | League Two | Oldham | 10 | 10 | 834 | 0 | 0 | 1 | 0 | 6.66 |
| 2025/26 | League Two | Oldham | 39 | 39 | 3412 | 1 | 0 | 2 | 0 | 6.87 |
| 2024/25 | League Two | Walsall | 8 | 4 | 366 | 0 | 0 | 1 | 0 | 6.57 |
| 2024/25 | EFL Trophy | Walsall | 2 | 2 | 114 | 0 | 0 | 0 | 0 | 6.75 |
| 2024/25 | FA Cup | Walsall | 1 | 0 | 12 | 0 | — | 0 | 0 | — |
| 2024 | CONCACAF Nations League | Montserrat | 3 | 3 | 270 | 0 | 0 | 1 | 0 | 7.20 |
| 2023/24 | League Two | Walsall | 35 | 35 | 3107 | 1 | 2 | 2 | 0 | 6.95 |
| 2023/24 | League Cup | Walsall | 1 | 1 | 90 | 0 | — | 0 | 0 | 6.30 |
| 2023/24 | FA Cup | Walsall | 4 | 4 | 347 | 0 | — | 1 | 0 | 7.30 |
| 2023 | CONCACAF Nations League | Montserrat | 2 | 2 | 180 | 1 | — | 0 | 0 | 7.30 |
| 2022/23 | League Two | Walsall | 39 | 38 | 3295 | 2 | — | 8 | 0 | 6.83 |
| 2022/23 | League Cup | Walsall | 2 | 2 | 180 | 0 | — | 0 | 0 | 7.30 |
| 2022/23 | EFL Trophy | Walsall | 1 | 1 | 67 | 0 | — | 0 | 0 | — |
| 2022/23 | FA Cup | Walsall | 4 | 4 | 360 | 0 | — | 0 | 0 | 6.90 |
| 2022 | World Cup - Qualification CONCACAF | Montserrat | 1 | 1 | 90 | 0 | — | 0 | 0 | — |
| 2021/22 | League Two | Walsall | 18 | 18 | 1496 | 1 | — | 3 | 0 | 6.88 |
| 2021/22 | League One | Crewe | 11 | 11 | 990 | 0 | — | 1 | 0 | 6.80 |
| 2021/22 | EFL Trophy | Crewe | 2 | 2 | 180 | 0 | — | 0 | 0 | 6.30 |
| 2021/22 | League Cup | Crewe | 1 | 0 | 75 | 0 | — | 0 | 0 | 6.70 |
| 2021/22 | FA Cup | Crewe | 1 | 1 | 46 | 0 | — | 0 | 0 | — |
| 2020/21 | League One | Crewe | 15 | 11 | 898 | 0 | — | 0 | 0 | 6.48 |
| 2020/21 | EFL Trophy | Crewe | 1 | 1 | 90 | 0 | — | 0 | 0 | — |
| 2019/20 | Championship | Luton | 3 | 2 | 193 | 1 | — | 0 | 0 | 6.53 |
| 2019/20 | League One | Doncaster | 10 | 8 | 705 | 0 | 1 | 2 | 0 | 6.78 |
| 2019/20 | FA Cup | Luton | 1 | 1 | 90 | 0 | — | 0 | 0 | — |
| 2019/20 | EFL Trophy | Doncaster | 3 | 2 | 224 | 0 | — | 0 | 0 | — |
| 2018/19 | League One | Blackpool | 24 | 21 | 1926 | 0 | — | 0 | 1 | — |
| 2018/19 | League Cup | Blackpool | 1 | 1 | 82 | 0 | — | 0 | 0 | — |
| 2018/19 | EFL Trophy | Blackpool | 2 | 2 | 180 | 0 | — | 0 | 0 | — |
| 2018/19 | FA Cup | Blackpool | 3 | 3 | 300 | 0 | — | 0 | 0 | 7.07 |
| 2017/18 | League One | Rochdale | 15 | 14 | 1222 | 0 | — | 2 | 0 | — |
| 2017/18 | FA Cup | Rochdale | 3 | 3 | 270 | 0 | — | 1 | 0 | 7.70 |
| 2017/18 | League Cup | Wigan | 2 | 2 | 180 | 0 | — | 0 | 0 | — |
| 2017/18 | EFL Trophy | Wigan | 1 | 1 | 90 | 0 | — | 0 | 0 | — |
| 2016/17 | Championship | Wigan | 1 | 0 | 13 | 0 | — | 1 | 0 | 5.30 |
| 2016/17 | League Cup | Wigan | 1 | 1 | 90 | 0 | — | 0 | 0 | — |
| 2016/17 | Club Friendlies | Wigan | 1 | 1 | 90 | 0 | — | 0 | 0 | — |
| 2015/16 | League One | Wigan | 42 | 40 | 3380 | 3 | — | 4 | 0 | — |
| 2015/16 | FA Cup | Wigan | 1 | 1 | 90 | 0 | — | 1 | 0 | — |
| 2015/16 | EFL Trophy | Wigan | 2 | 1 | 107 | 0 | — | 0 | 0 | — |
| 2014/15 | Premiership | Aberdeen | 9 | 7 | 512 | 0 | — | 0 | 0 | — |
| 2014/15 | Championship | Blackpool | 19 | 19 | 1710 | 1 | — | 1 | 0 | — |
| 2014/15 | League Cup | Aberdeen | 1 | 1 | 90 | 1 | — | 0 | 0 | — |
| 2013/14 | League One | Gillingham | 3 | 3 | 270 | 1 | — | 0 | 0 | — |
| 2012/13 | League One | Tranmere | 13 | 10 | 1043 | 1 | — | 2 | 0 | — |
| 2012/13 | FA Cup | Tranmere | 1 | 1 | 90 | 0 | — | 0 | 0 | — |
Availability history
| Reason | From | Until | Days |
|---|---|---|---|
| Suspended | 16 Sept 2018 | 30 Sept 2018 | 14 |
| Suspended | 16 Sept 2018 | 26 Sept 2018 | 10 |
Trophies
| Competition | Season | Place |
|---|---|---|
| Premiership (Scotland) | 2014/2015 | 2nd Place |
| League One (England) | 2017/2018 | Winner |
| League One (England) | 2015/2016 | Winner |
