In Haarlem kwam het eerste en tijdelijke station buiten het centrum en de stadswallen van Haarlem te liggen.
In 1842 werd het tijdelijke station, dat net buiten de Amsterdamse Poort stond, vervangen door een station op de definitieve locatie aan de noordkant van het centrum, in de buurt die bekend staat als de Stationsbuurt. Bij deze verplaatsing kwam ook de overbrugging van het Spaarne, door middel van de Spaarnespoorbrug, in gebruik. Het station is een van de weinige 19e-eeuwse stations in Nederland die binnen een 17e-eeuwse omwalling werden gebouwd.
Het oorspronkelijke stationsgebouw uit 1842 werd in 1867 verbouwd en in 1906-1908 vervangen door een nieuw gebouw van Dirk Margadant aan de nu hooggelegen spoorlijn. Kenmerkend zijn de twee verschillende in- en uitgangsgebouwen en de situering van de wachtkamers en restauratie op het eilandperron. Het is het enige station in Nederland in de art nouveau of jugendstil-stijl, en een van de markantste gebouwen in de stad Haarlem. In het gebouw zijn vele tegeltableaus aangebracht (zie afbeelding).
Een van de weinige grote veranderingen sinds de bouw van het stationsgebouw is de aanleg van het derde perron langs spoor 8 in 1953, waarvan de architectuur contrasteert met de rest van het gebouw.
In de gebouwen op het grote middenperron bevonden zich, naast dienstruimten, ook wachtzalen en andere reizigersfaciliteiten, waaronder twee zalen voor de stationsrestauratie. Een van deze gebouwen is sinds 2011 in gebruik als een kleine bibliotheek met wachtruimte en koffieautomaat.
Op 15 september 2008 was er een groot feest ter gelegenheid van het honderdjarig bestaan van het huidige stationsgebouw van Haarlem.
Stationsoverkapping
Een van de drie uitgangsgebouwen
Tegeltableau 100 jaar spoorwegen; 1839-1939 door Zenith Gouda
Het station vanuit de lucht
Filmopname op het perron voor de film Het meisje met het rode haar
De sporen in station Haarlem werden in 1927 geëlektrificeerd als onderdeel van de elektrificatie van de Oude Lijn. Ook de lijn naar IJmuiden werd toen elektrisch. De lijn naar Zandvoort werd in 1935 geëlektrificeerd. Het locomotievendepot werd datzelfde jaar opgeheven.
Lange tijd stopte aan het derde perron (spoor 8) de intercity uit Limburg naar Zandvoort. Vanaf 1996 was dit het aankomst- en vertrekspoor voor de intercity's naar Heerlen en Maastricht, maar sinds december 2006 stopt de trein van Amsterdam naar Zandvoort op dit spoor en sinds december 2011 ook die naar Uitgeest. De intercity's van de Oude Lijn stoppen nu in beide richtingen aan het grote middenperron (sporen 3 en 6).
Sinds de invoering van de dienstregeling 2012 rijden doorgaande intercitytreinen Amsterdam - Den Haag - Rotterdam - Zeeland weer de oude route (van voor 1986) over Haarlem, onder meer om ruimte te maken voor Fyra-treinen op het traject Amsterdam Centraal - Schiphol. Ook de treinen Haarlem - Alkmaar hebben nu de benaming intercity maar rijden alleen in de spits in één richting, zodat het aantal intercity's in dit spoorwegknooppunt sterk is gestegen. Vanaf de dienstregeling van 2018 reden in de ochtendspits 6 treinen naar Haarlem en in de middagspits 6 treinen van Haarlem. Na de afschaling van de dienstregeling in 2020 vervielen deze treinen. Vanaf de dienstregeling 2025 zijn weer 2 treinen voorzien, in de ochtendspits 2 treinen naar Haarlem en in de middagspits 2 treinen van Haarlem.[3]
Voor de splitsing van de lijnen naar Uitgeest, Zandvoort en Leiden is er een klein opstelterrein waar ongebruikt materieel staat. Tevens ligt op dit opstelterrein een spoor waar museum-materieel wordt opgeknapt
Rijdt op weekdagen overdag 1x/uur en vormt een halfuurdienst met series 2300 (tussen Amsterdam Centraal en Roosendaal) en 6500 (tussen Roosendaal en Vlissingen). 's Avonds en in het weekend rijdt deze serie 2x/uur.
Rijdt alleen op weekdagen overdag en rijdt 1x/uur. Vormt tussen Amsterdam Centraal en Roosendaal een halfuursdienst met serie 2200. 's Avonds en in het weekend rijdt serie 2200 2x/uur.
Nachtnet. Rijdt tweemaal per dag in de nachten van vrijdag op zaterdag en zaterdag op zondag in beide richtingen.
Bussen
Dit station beschikt over een groot aantal buslijnen, hieronder een overzicht. Connexxion beheert de concessies Haarlem/IJmond en Amstelland-Meerlanden, Qbuzz beheert de concessie Zuid-Holland Noord.
↑Bron: NS Dashboard, Reizigersgedrag 2023 Haarlem, Aantal instappers, uitstappers en overstappers van NS-trein op NS-trein (per gemiddelde werkdag). NB: dit cijfer betreft de reizigers van NS, dus exclusief reizigers van andere vervoerders.