Born in Dudley, West Midlands, Penn began his career at Birmingham City in their youth system in July 2001. He joined the youth system at Kidderminster Harriers in March 2002, and appeared in one youth team match against Wellington on 7 March before joining Scunthorpe United's youth system in July 2002. He joined Kidderminster Harriers on a free transferin the summer of 2005; shortly after he joined he had a short spell on loan at Alvechurch before breaking into the Kidderminster team. Penn joined newly promoted League Two club Burton Albion on 9 July 2009 on a two-year contract, for an undisclosed fee thought to be a club record. He scored his first goal for Burton on 15 August 2009 in a 5–2 win over Morecambe. Penn signed for League Two club Cheltenham Town on 23 May 2011 on a two-year contract, after he rejected a new contract with Burton. He scored his first goal for Cheltenham in an FA Cup second-round match away at Luton Town in December 2011, followed quickly by his second goal a week later in a home League Two match against Southend United. On 7 January 2013, Penn turned in a man of the match performance and scored the home team's goal in a 5–1 FA Cup third-round defeat at the hands of Premier League team Everton. Following the departure of club captain Alan Bennett in the January 2013 transfer window, Penn was named the new club captain by Cheltenham manager Mark Yates. Penn signed for Cheltenham's League Two rivals York City on 6 January 2014 on a two-and-a-half-year contract for an undisclosed fee. Penn turned down a new contract with York to join League Two club Carlisle United on 27 May 2016 on a one-year contract. On 22 September 2016, Penn joined National League club Gateshead on a one-month loan until 25 October, having only made two appearances for Carlisle. On 24 October 2016, the loan was extended until 26 December. On 13 January 2017, Penn signed for National League club Wrexham on a contract until the end of 2016–17, after leaving Carlisle by mutual consent. Penn rejoined Gateshead on 11 May 2017 on a one-year contract, after turning down a new contract with Wrexham because of family reasons. Penn re-signed for National League North club York City on 8 May 2018. He re-signed for York's National League North rivals Kidderminster Harriers on 9 November on a free transfer on a one-and-a-half-year contract. In November 2019 he served as caretaker manager of Kiddermisnter for two matches, before being replaced by James Shan, for whom he worked as assistant. When Shan departed to Solihull Moors on 11 February 2020, Penn was made manager of the club.
International career
Penn was capped eight times by England C, scoring one goal, from 2007 to 2009. Having been a regular member of the team for two years, he was named the England C Player of the Year for 2009.