I'm not sure about the following. I describe what I observe. I didn't debug it, because it went away after raising the memory_limit to 256MB (and there are still a lot of open tickets here :-() We had the problem, that a memory_limit fatal error occured, this errors was "catched" by \Varien_Db_Adapter_Pdo_Mysql::__destruct public function __destruct() { if ($this->_transactionLevel > 0) { trigger_error('Some transactions have not been committed or rolled back', E_USER_ERROR); } } and because the `transactionLevel > 0` the error was triggered, this error can be catched(?)... whatever... It ended here in one of the ifs I *think*: public function successAction() { $session = $this->getOnepage()->getCheckout(); if (!$session->getLastSuccessQuoteId()) { $this->_redirect('checkout/cart'); return; } $lastQuoteId = $session->getLastQuoteId(); $lastOrderId = $session->getLastOrderId(); $lastRecurringProfiles = $session->getLastRecurringProfileIds(); if (!$lastQuoteId || (!$lastOrderId && empty($lastRecurringProfiles))) { $this->_redirect('checkout/cart'); return; } In the end the order was written, the mail was send, but the cart was not cleared. Turn on debug mode, then you see hopefully the trigger_error('Some transactions have not been committed or rolled back', E_USER_ERROR); And as I said, in our case, this was triggered by a low memory_limit.