In End-to-End Testing the functionality of a whole application is proved, by testing specific “flow” (pathway) within an application from start to finish.
End-to-End Tests are executed very late in the Test Pipeline, since they are very costly (take a long time to run, may require actual costly infrastructure to spin up, etc).
The effort to write and maintain End-to-End tests can be high, as they tend to be fragile due to their high complexity (involving many components, needing to synchronize steps in bootstrapping of resources, etc).
The gain / assurance-it-works from End-tp-End tests is very high, since they test a lot of stuff. However, they are not at all precise in what component failed, just that a component - or many components - failed the test.
End-to-End tests should always run on “production-like environments”.