Посылать запросы на unload/beforeunload события, как рекомендует
Алексей Николаев - не очень хорошая идея
Асинхронный запрос будет оборван в произвольное время, и может не дойти до сервера. Синхронный - заблокирует вкладку и создаст неприятный пользовательский опыт.
Специально для таких случаев есть
navigator.sendBeackon, который работает асинхронно, но не обрывается при закрытии вкладки (даже если сервер будет держать запрос пол часа - будет работать все ок, я проверял)
Правда если нужна поддержка IE или старых сафари (iOS10 и старее), то все же придется вернутся к синхронным запросам для этих браузеров