סקיפיו קיבל בינתיים ידיעות על כך שצבאו של חניבעל הגיע לצפון איטליה. הוא הופתע מכך שחניבעל הצליח לחצות את הרי האלפים ואף להכניע את הטאורינים, אולם גם חניבעל היה מבולבל, שכן לא ציפה שמצביא רומאי ינטוש את הלגיונות שלו בגאליה ויחזור לאיטליה, ולא ידע מה גודלו של הצבא שעמד לרשות סקיפיו. סקיפיו העריך שהצבא הקרתגי חלש ומותש מאוד בעקבות תלאות המסע דרך האלפים, כפי שניתן להבין ממשפט מתוך נאום שההיסטוריון ליוויוס שם בפיו: "יִרְאתי היחידה היא שכאשר תלחמו [נגד הצבא הקרתגי] יתגלה כי האלפים הם אלו שכבשו את חניבעל", ולכן לא חשש להתעמת איתו. בפני חניבעל עמדה אפשרות להתחמק מקרב, בחירה שנראתה נכונה לאור מצבם הירוד של חייליו, אולם החליט להילחם משום שידע שניצחון מרשים יעודד את השבטים הגאליים להצטרף אליו, וכן משום שבלאו הכי היה חייב לחבור אל כוחות האינסוברים והבויים שהבטיחו לו סיוע, מהלך שבהכרח היה מפגיש אותו עם צבאו של סקיפיו. חניבעל רצה להעלות את המורל של חייליו, ועל כן לקח כמה גאלים שנפלו בשבי, עינה אותם קשות, ולאחר מכן, כשהם פצועים וחבולים, הציג אותם בפני חייליו והציב בפניהם כלי נשק גאלים, וכן סוסים ובגדים יקרים, ושאל אותם אלו שניים מהם מוכנים להילחם זה בזה, בתנאי שהמנצח שיהרוג את השני יזכה בחירותו ובכל המתנות. כולם הסכימו פה אחד, חניבעל הטיל גורל והזוכים נאבקו זה בזה עד שאחד מהם הרג את השני וזכה בחירותו ובמתנות. לאחר המחזה קם חניבעל והסביר לחיילים את אשר רצה להמשיל להם, מצבם דומה למצבם של השבויים, לא נותרה בפניהם כל ברירה, אם ילחמו יהיה להם כל עושרה של רומא, אולם לסגת אי אפשר. למחרת צעד חניבעל כדי להיפגש עם הבויים, בעוד סקיפיו צעד כדי למצוא אותו. סקיפיו חצה את נהר הפו ואת נהר טיקינוס (בשמו המודרני טיצ'ינו), ובאזור פאביה נפגשו כוחות החלוץ של הצבאות היריבים. לחניבעל היה יתרון קל בפרשים, ובקרב טיקינוס הובסו הרומאים, סקיפיו עצמו נפצע וניצל רק הודות לבנו (לימים סקיפיו אפריקנוס). לאחר הקרב נסוגו הרומאים אל מעבר לנהר פו. חניבעל רצה לדלוק אחריהם, אך הרומאים הרסו את הגשרים ולקח זמן עד שנמצא מקום שבו יכלו המהנדסים הקרתגים לבנות גשר חדש.
קרב טיקינוס היה התנגשות קטנה ובלתי חשובה, ויש שאינם מחשיבים אותו כקרב של ממש. אולם למרות זאת, הקרב זעזע את הרומאים, שנוכחו לדעת שצבאו של חניבעל אינו חלש כפי שחשבו. סקיפיו ואנשיו נסוגו לעבר נהר הטרביה (יובל של נהר פו) והתבצרו במושבה הרומאית פלנקטיה (פיאצ'נצה). חניבעל כבש את העיר קלאסטידיום, שהיוותה בסיס אספקה רומאי חשוב, ונע לכיוון מחנהו של סקיפיו על נהר הטרביה. הסנאט הזעיק את הקונסול השני, טיבריוס סמפרוניוס לונגוס, מסיציליה, וצבאו של האחרון הגיע לצפון איטליה בנובמבר. היה זה סוף שנת 218 לפנה"ס, ושנת הכהונה של סקיפיו וסמפרוניוס כקונסולים עמדה להיגמר. סמפרוניוס היה להוט לזכות בניצחון על חניבעל שיאפשר לו לזכות בכהונה שנה נוספת. סקיפיו הפצוע, לעומת זאת, רצה לתת לחייליו לנוח במהלך החורף ולתקוף באביב, אולם באותו זמן זכו פרשיו של סמפרוניוס בניצחון זעום על קבוצת פרשים של חניבעל שבזזה שטחים גאליים. הניצחון הלהיב את סמפרוניוס, שרצה לצאת למערכה מהר ככל האפשר. מכיוון שסקיפיו היה פצוע, הייתה הסמכות המלאה בידי סמפרוניוס, שתכנן לצאת לקרב כבר למחרת ההתנגשות. חניבעל ניצל עד תום את להיטות אויבו, וגרר אותו למלכודת מתוחכמת על נהר הטרביה: בדצמבר נפגשו הצבאות בקרב טרביה, שנערך על פי התנאים של חניבעל. הקרב הסתיים בניצחון קרתגי מוחץ, והרומאים איבדו במהלכו 26–32 אלף חיילים.
לאחר הניצחון נהרו כמעט כל שבטי הגאלים של עמק הפו להצטרף לצבאו של חניבעל, פרט לשבט הקנומאנים, וחיזקו מאוד את כוחו. החבירה עם השבטים הגאליים איפשרה לחניבעל להניח לצבאו לנוח במשך החורף. הרומאים הבינו שהגנה על עמק הפו אינה אפשרית יותר, והחליטו למנוע מחניבעל לחדור למרכז איטליה ולאיים על רומא עצמה. כצפוי, סמפרוניוס וסקיפיו לא נבחרו שוב לקונסולים, ובמקומם נבחרו כקונסולים של שנת 217 לפנה"ס גאיוס סרוויליוס גמינוס וגאיוס פלאמיניוס נפוס. סרוויליוס קיבל את הפיקוד על שארית צבאו של סקיפיו באזור ארימיניום (רימיני), ואילו פלאמיניוס קיבל תחת פיקודו את שארית צבאו של סמפרוניוס באזור ארטיום (ארצו). הצבא הרומאי תוגבר בארבעה לגיונות חדשים, כדי לפצות על האבדות שספג בקרב טרביה. משני מקומות אלו ניתן היה לפעול בקלות נגד חניבעל, כאשר בכל דרך בה ינוע מעמק הפו אל מרכז איטליה, הוא ילכד בין שני הצבאות. מיד לאחר שהתפנו מעברי האפנינים משלג, פלש חניבעל מבולוניה דרך מעבר קולינה אל אטרוריה. פלאמיניוס הופתע, ופנה דרומה כדי להגן על רומא עצמה. חניבעל עקב אחריו וניסה לגרור אותו להילחם בקרב על ידי ביזת האזור. יועציו של פלאמיניוס דחקו בו להמתין לכוח של סרוויליוס שאמור לחבור אליו, אולם פלאמיניוס רצה לזכות בכל התהילה לבדו, ועם צבאו בן ה-40,000 איש תכנן להציב מארב לחניבעל בארטיום. חניבעל ניחש את כוונות אויבו, עקף אותו והמשיך קדימה. חניבעל רצה להתחמק מפלאמיניוס, ועל כן הצעיד את חייליו במהירות רצחנית. בשל הצעידה המאומצת חלו רבים מחייליו של חניבעל ואף הוא עצמו לקה בדלקת קשה בעינו, כאשר קיצרו את הדרך באזור ביצות בפירנצה, אולם הוא סירב לעצור כדי לטפל בחולים. כאשר נודע לפלאמיניוס שחניבעל עקף אותו ודבר לא מפריד בינו לבין רומא, מיהר לרדוף אחריו. חניבעל ארב לו באגם טראסימנו, והשמיד את צבאו בקרב טראסימנוס. כ-15,000 רומאים כולל פלאמיניוס עצמו נהרגו.
6,000 לוחמים רומאים הצליחו להימלט משדה הקרב ומצאו מקלט בכפר אטרוסקי סמוך. חניבעל שלח את מהרבעל בראש כוח פרשים ללכוד אותם. מהרבעל הקיף את הכפר והרומאים נכנעו לאחר שהובטח להם שלא יפגעו בהם. חניבעל כינס את כולם והודיע להם שמהרבעל לא היה מוסמך להבטיח להם את חייהם בשמו. הוא כלא את השבויים הרומאים, בעוד את בעלי בריתם שחרר לבתיהם באומרו שהוא בא להילחם ברומאים ולא באיטלקים. בדרך זו קיווה למשוך אחריו את בעלי בריתם של הרומאים.
האסטרטגיה הפביאנית.
ההיסטוריון היווני פלוטרכוס מתאר את שאירע ברומא לאחר קרב טראסימנוס:
הקונסול השני סרוויליוס לא ידע על המפלה ורצה להגיע אל פלאמיניוס במהירות האפשרית. הוא שלח אליו את גאיוס קנטיניוס עם כמה אלפי פרשים אל אגם טראסימנוס. מרגליו של חניבעל סיפרו לו על כך, והוא שלח את מהרבעל עם יחידת פרשים כדי לעצור אותו. מקום ההתנגשות אינו נזכר במקורות, אולם ההיסטוריון בן זמננו ג'ון לייזנבי (John Lazenby) מעריך שהיא נערכה באזור אסיזי. לטענת ליוויוס ופוליביוס, בהתנגשות הראשונה נהרגו כמחצית מהפרשים הרומאים וביום שלמחרת נשבו כולם, אם כי אפיאנוס טוען ש-3,000 נהרגו, 800 נלקחו בשבי והשאר נמלטו. קרב זעיר זה זעזע את רומא המזועזעת בלאו הכי והוחלט למנות דיקטטור. למשרה אחראית זו נבחר פאביוס מאקסימוס.
חניבעל חצה את אומבריה ופיקנום ללא הפרעה. הוא בחר שלא לעלות על רומא, כיוון שלא היו עמו מכונות מצור וחייליו נזקקו למנוחה. כעבור עשרה ימים מקרב טראסימנוס, הגיע אל חופי הים האדריאטי. היה זה אזור פורה למדי. חניבעל הניח לחייליו לבזוז ולרצוח בערים שעבר בהן, משום שהיה חייב לפצות אותם אחרי כל התלאות שעברו. חניבעל נתן לחייליו זמן לנוח ודאג שיטפלו בסוסים החולים. הוא גם דאג להשיג לחייליו נשק חדש מהשלל שנלקח מהרומאים. מכיוון שחנה על החוף, הוא גם הצליח להעביר ידיעות לקרתגו על ניצחונותיו. ידיעות אלו התקבלו בהתלהבות בקרתגו, שכן במקביל, התנהלה המערכה בהיספניה לרעת קרתגו. לאחר מכן התקדם חניבעל אל איאפיגה (בפוליה המודרנית). אזור זה היה מחולק בין שלושה שבטים: הדאוניים, הפאוקטיים והמסאפיים. חניבעל פלש אל ארץ הדאוניים, והשחית באופן שיטתי את האזור שסביב המושבה הרומאית לוקריה (בלוצ'רה המודרנית). לאחר מכן הוא קבע את בסיסו באיאפיגה, ופעל כדי להביא את כולה תחת שליטתו. ליוויוס טוען שחניבעל נכשל בכיבוש העיר ספולטום (Spoletum), אולם סופרים אחרים אינם מזכירים את המאורע ולכן סביר יותר להניח שהקרב על ספולטום היה לא יותר מפשיטה קטנה שערך אחד מקציניו של חניבעל.
פאביוס, הדיקטטור החדש, הבין בינתיים שחייליו עתירי הניסיון של חניבעל עדיפים על החיילים הרומאים בקרב. הוא החליט להימנע מכל קרב ישיר עם חניבעל, ולנצל את היתרונות שהיו לרומאים: אספקה בלתי מוגבלת ומספר חיילים גדול. כדי להחליש את חניבעל הוא החליט לנקוט בטקטיקה של אדמה חרוכה ולדאוג שלחניבעל לא תהיה אספקה. הוא יצא עם ארבעה לגיונות יחד עם המגיסטר אקוויטום מרקוס מינוקיוס רופוס, וחנה באיקאי (בטרויה המודרנית), מרחק של שישה קילומטרים ממחנהו של חניבעל. כאשר שמע חניבעל על כך, מיהר והוציא את חייליו מחוץ למחנה, אולם משראה שהרומאים לא יוצאים לקרב החזיר את חייליו. פאביוס עקב מאז תמיד אחרי חניבעל, ומכיוון שנהנה מאספקה בלתי מוגבלת, לא התיר לחייליו לעצור ולאסוף מזון. הוא עשה זאת כדי שכל החיילים יישארו מלוכדים כגוף אחד. מכיוון שהכיר היטב את האזור, הוא תמיד תפס את העמדות הנוחות לפני שחניבעל הגיע אליהם, ולקח בשבי או הרג חיילים של חניבעל שיצאו מהמחנה לאסוף צידה. טקטיקה זו זכתה לכינוי "האסטרטגיה הפביאנית", ועל אף שהוכיחה עצמה כיעילה, ברומא היא נחשבה לפחדנות. החיילים, ובייחוד המגיסטר אקוויטום מינוקיוס, לחצו שוב ושוב על פאביוס לצאת לקרב, וכאשר סירב, זכה לכינוי "מורו של חניבעל".