Veltman begon zijn voetbalcarrière in de E-jeugd als aanvaller bijIJmuiden.[2] In 2001 vertrok hij naarAjax. Hier doorliep hij de jeugdopleiding en werd hij verdediger. In de B2 stond hij op de nominatie om weggestuurd te worden. In de A-jeugd stond hij lang aan de kant met eenkruisbandblessure.
Op 19 augustus 2012 maakte Veltman zijn debuut voor Ajax, in een uitwedstrijd tegenN.E.C. (1-6 winst).[3] Dit seizoen speelt Veltman meestal bij de beloften, maar ook 7 wedstrijden in de Eredivisie, waarvan twee keer in de basis. Hij wordt kampioen met Ajax.
Op 5 augustus 2013 speelde Veltman mee metJong Ajax (2-0 winst) in deJupiler League wedstrijd tegenTelstar.[4] In de 89e minuut werd hij gewisseld vanwege een blessure waardoor hij naar eigen zeggen 2 maanden zou zijn uitgeschakeld.[5] Op 30 september 2013 maakte Veltman zijn rentree bij Jong Ajax in de Jupiler League wedstrijd thuis tegenFC Volendam, Veltman scoorde in deze wedstrijd zijn eerste officiële doelpunt in het betaald voetbal en voor Jong Ajax.[6] De rest van seizoen 2013/14 gaat hij zijn wedstrijden spelen in de eredivisie, en debuteert hij in de Champions League en Europa League. Op 22 oktober 2013 maakte Veltman zijn Europese debuut voor Ajax in deUEFA Champions League wedstrijd opCeltic Park tegenCeltic FC. Op 6 november 2013 stond Veltman wederom in de basis in de return tegenCeltic FC. Op 26 november 2013 pakte Veltman in de 48e minuut een rode kaart in de thuiswedstrijd in de Champions League tegenFC Barcelona bij een stand van 2-0. Na een terugspeelbal vanRicardo van Rhijn haalde Veltman de doorgebrokenNeymar neer, waarop de scheidsrechter een rode kaart gaf en een penalty aan Barcelona. Die werd benut doorXavi. De wedstrijd werd uiteindelijk gewonnen door Ajax met 2-1. Veltman zorgde er op 2 maart 2014 met zijn eerste officiële doelpunt voor dat AjaxDe Klassieker in de Kuip met 2-1 wist te winnen. Veltman wordt opnieuw kampioen met Ajax.
In seizoen 2014/15 blijft Veltman basisspeler, en speelt hij opnieuw in de Champions League en Europa League. De fouten die Veltman maakt krijgen de bijnaameen Veltmannetje.[7]
In de loop van seizoen 2015/16 wisselt de positie van Veltman, mede door een blessure bij rechtsbackKenny Tete, van centrumverdediger naar rechterverdediger. Dit zou jarenlang zijn positie bij Ajax blijven. In de Eredivisiewedstrijd tegenSC Cambuur (5–1) op 21 november 2015 speelde Veltman zijn 100ste officiële wedstrijd in dienst van Ajax. Hiermee werd hij de 158ste Ajacied die deze mijlpaal wist te bereiken. In deze wedstrijd was Veltman verantwoordelijk voor de openingstreffer.
In seizoen 2016-2017 speelde Ajax in de Europa League, en bereikte definale. Veltman speelde de meeste wedstrijden, inclusief de finale. TrainerPeter Bosz geeft Veltman de voorkeur boven Kenny Tete. In juli 2017 werd Veltman de nieuwe aanvoerder van Ajax. Hij neemt deze rol over van de naar Everton vertrokkenDavy Klaassen.
In april 2018 raakte Veltman geblesseerd aan de kruisband van zijn rechterknie, waardoor hij de rest van 2018 uitgeschakeld zou zijn. Hiermee kwam een einde aan een periode van vier en een half jaar in de basis van Ajax, verloor hij het aanvoerderschap aanMatthijs de Ligt en zijn plek in het elftal aanNoussair Mazraoui. Op 10 januari 2019 maakte Veltman zijn rentree in een oefenwedstrijd tegenFlamengo. Naar aanleiding van zijn terugkomst gaf hij aan dat hij besefte geduld te moeten hebben en zou moeten wachten op zijn kans.[8] Op 17 februari maakte hij via een invalbeurt tegen NAC Breda zijn rentree in de eredivisie. Aan het einde van het seizoen is hij door afwezigheid van Mazraoui alsnog belangrijk voor Ajax. Op 6 april 2019 stond hij tegen Willem II voor het eerst weer in de basis. Op 10 april 2019 speelde hij de gewonnen uitwedstrijd van de kwartfinale in de Champions League tegen Juventus de gehele 90 minuten mee. Ook in de verloren halve finale van de Champions League tegen Tottenham Hotspur krijgt hij speeltijd. Op 5 mei wint Veltman met Ajax zijn eerste KNVB Beker. Op 15 mei wordt hij voor de derde keer landskampioen.
In seizoen 2019/20 speelde Veltman na enkele jaren alleen als rechtsback te zijn ingezet, opnieuw als centrumverdediger. Hij kreeg, mede door het vertrek vanMatthijs de Ligt, veel speeltijd.[9] TrainerErik ten Hag gaf Veltman meestal de voorkeur bovenPerr Schuurs. Hij vormde het centrum van de verdediging samen metDaley Blind.
In juli 2020 tekende Veltman een driejarig contract bijBrighton & Hove Albion, dat hem voor zo’n 1 miljoen euro overnam vanAjax.[10] Nadat hij in zijn laatste twee seizoenen bij Ajax relatief weinig speelde, werd hij bij Brighton onder coachGraham Potter vanaf oktober 2020 weer basisspeler. Veltman speelde in zijn eerste drie jaar in dePremier League 93 wedstrijden en klom in die jaren met zijn teamgenoten op van achtereenvolgens een zestiende, naar een negende en vervolgens een zesde plaats in de eindstand in 2022/23. Voor Brighton was dat de hoogste eindklassering in de clubgeschiedenis en de eerste keer dat de club zich plaatste voor Europees voetbal, deEuropa League. Veltman verlengde in juli 2023 zijn contract bij de Engelse club tot medio 2025.[11]
Met het jeugdteam voor spelers onder 17 jaar nam Veltman deel aan het EK in 2009 voor spelers onder 17 dat in Duitsland werd gehouden. Op dit EK speelde Veltman mee in de wedstrijd in de groepsfase op 6 mei 2009 tegenEngeland.[12] Met Nederland –17 bereikte hij de finale waarin met 2–1 werd verloren van het gastland. Zijn eerste doelpunt als jeugdinternational maakte hij in het team voor spelers onder 19 jaar. Dit deed hij in een vriendschappelijke wedstrijd op 9 februari 2011 tegen de leeftijdsgenoten van Frankrijk. Daarnaast speelde hij ook nog acht wedstrijden voor Nederland –20. In oktober 2013 werd hij doorAlbert Stuivenberg opgeroepen voor de 29-koppige voorselectie vanJong Oranje. Veltman behoorde, door zijn oproep voor het Nederlands elftal, niet tot de definitieve selectie.
BondscoachLouis van Gaal maakte op 8 november 2013 bekend dat Veltman deel uitmaakte van de selectie van het Nederlands elftal voor de vriendschappelijke wedstrijden tegenJapan enColombia op 16 en 19 november 2013. Dit was voor Veltman de eerste keer dat hij werd opgeroepen voor Nederland. Op 19 november 2013 maakte Veltman zijn debuut voor het Nederland in devriendschappelijke wedstrijd tegen Colombia, die in 0–0 eindigde. Hij begon in de basis en speelde de volledige wedstrijd uit.[13] Op 5 mei 2014 werd Veltman door Van Gaal opgeroepen voor een trainingsstage inHoenderloo van hetNederlands voetbalelftal, ter voorbereiding op hetwereldkampioenschap.[14] Ook behoorde hij tot de voorselectie, die op 13 mei bekendgemaakt werd.[15] Van Gaal maakte op 31 mei 2014 bekend dat Veltman ook tot de definitieve WK-selectie behoorde.[16] Op 13 juni 2014 maakte Veltman zijn debuut op een WK-eindronde. In de wedstrijd tegen Spanje, die met 5–1 werd gewonnen, verving hij in de 77e minuutStefan de Vrij.[17] Tijdens de troostfinale op 12 juli 2014 kwam Veltman eveneens in actie voor Nederland. In de met 3-0 gewonnen wedstrijd tegen Brazilië verving hij in de 90e minuutJordy Clasie.[18]
Na het WK namGuus Hiddink het roer over bij het Nederlands elftal. Veltman werd elke keer geselecteerd door Hiddink, maar er werd verloren in elk van de drie wedstrijden onder hem dat Veltman speelde.
Na het ontslag van Guus Hiddink volgdeDanny Blind hem op als bondscoach van het Nederlands elftal. Door de tegenvallende prestaties bij Ajax werd Veltman in de eerste twee maanden van Danny Blind niet geselecteerd voor het Nederlands elftal, voor de eerste keer sinds zijn debuut. Blind gaf de voorkeur aanJeffrey Bruma (PSV) enStefan de Vrij (Lazio).[19] In november 2015 werd Veltman weer geselecteerd voor het Nederlands elftal, een maand na de uitschakeling van Nederland in dekwalificatie voor het EK 2016. Danny Blind selecteerde vanaf dat moment Veltman weer elke keer. Terwijl Veltman tot maart 2016 in Oranje alleen als centrale verdediger had gespeeld, gebruikte Blind hem vanaf dat moment als rechterverdediger. Dit zou zijn positie blijven.
In maart 2017 werd Danny Blind ontslagen, Dick Advocaat werd de nieuwe bondscoach. Onder hem lukte het Veltman en co. niet om zich alsnog te kwalificeren voor hetWereldkampioenschap voetbal 2018. Veltman kreeg één keer speelminuten in die kwalificatie, dat was in de thuiswedstrijd tegenLuxemburg. Vijf dagen daarvoor maakte Veltman zijn eerste doelpunten voor het Nederlands elftal. Hij scoorde twee keer in een 5-0 winst.
In maart 2018 werdRonald Koeman aangesteld als bondscoach van het Nederlands elftal. Mede door een blessure van Joel Veltman werd hij in het eerste jaar van Koeman niet geselecteerd. Hierdoor miste Veltman de in 2018 en 2019 gespeelde eerste editie van deUEFA Nations League. In september 2019 keerde Veltman terug bij Oranje en doet hij mee aan de kwalificatiewedstrijden voor het EK 2020. Op de rechtsbackpositie had hij concurrentie van vele spelers, van wieDenzel Dumfries de belangrijkste was.