Butler joined Portsmouth's youth categories in 2004, aged 10, and signed a two-year scholarship with Pompey on 15 July 2010. On 26 June 2012, he signed a one-year professional deal. On 14 August 2012, he made his debut in the League Cup in a 3–0 defeat at Plymouth Argyle.
On 2 November 2012, Butler joined Havant & Waterlooville on a one-month youth loan deal from Portsmouth. He was assigned the number 3 shirt. In the following day, he made his debut for the Hawks in a 1–0 loss to Welling in a Conference South match. He was named the Hawks' player of the month for November. In the following month, he was named again as player of the month. He went on to make eight appearances during his time at Hawks.
Breakthrough
Butler was recalled on 8 January 2013, and was included on first-team squad due to player shortage. On 26 January 2013 he made his senior league debut in a League One match at Fratton Park, against Hartlepool United, starting the match. Butler finished the season with 17 league appearances, 15 as a starter. On 14 May 2013, he signed a new two-year contract with Pompey, running until June 2015. After struggling to find his old form, Butler signed with Aldershot Town on loan on 31 October. He returned to Portsmouth in December, after suffering a knee injury while on loan at Aldershot. On 11 March of the following year, after being fully recovered from injury, Butler rejoined Aldershot. He was a first-choice for Pompey in the 2014–15 season, but was still released on 18 May 2015.
On 28 June 2016, Butler joined League Two club Newport County on a two-year contract. He made his debut for Newport on 6 August 2016 against Mansfield Town. He scored his first goal for Newport on 7 January 2017 in the League Two match against Stevenage which Newport lost 3–1. In April 2018, Butler signed a new one-year contract to remain at Newport County. Butler was part of the Newport squad that completed the 'Great Escape' with a 2–1 victory at home to Notts County on the final dat of the 2016–17 season, which ensured Newport's survival in League Two. In May 2017, Butler was selected as Newport County Player of the Year and for the second successive season in May 2018. He was part of the team that reached the League Two playoff final at Wembley Stadium on 25 May 2019. Newport lost to Tranmere Rovers, 1-0 after a goal in the 119th minute. During his time at the club, Butler was awarded the English Football League player in the community two seasons in a row, due to his outstanding work in local community with the disabled and with young people suffering mental health issues.
Peterborough United
On 30 May 2019, it was announced that Butler had signed for League One club Peterborough United on a 3-year deal and would join the club in July.