When a contract receives Ether, it checks if the data sent (msg.data) is empty. If empty and receive() exists, receive() runs to accept Ether. If msg.data is not empty or receive() is missing, fallback() runs. This lets contracts handle plain Ether transfers and calls with data differently. The execution table shows steps where receive() or fallback() is called based on msg.data. Variables msg.data and Function Called change accordingly. Key moments clarify why fallback() runs sometimes even with empty msg.data. The visual quiz tests understanding of which function runs in different cases.