Eu verifico wuando o usuário tenta acessar o sistema. O frontend chama uma API para validar o acesso e outra para autenticar, caso o acesso esteja válido.

O pagamento por recorrência depende do seu Gateway de pagamento. Mas, são bem parecidos no final.

Todo pagamento é registrado no banco de dados, isso é importante para auditoria, controle fiscal etc.

O status de pagamento é atualizado por uma outra API, que é meu webhook para o Gateway de pagamento. O Gateway de acordo com o evento, pago, não pago etc .. vai mandar um json (por exemplo) para você! aí você segue a documentação e de acordo com a resposta faz o que quiser, no caso atualizar o pagamento.

a verificação da assinatura você pode deixar de responsabilidade do Gateway ou cuidar 100% dela (eu prefiro). assim o Gateway só recebe pagamento mesmo e não gerencia assinatura.

existe uma tabela no banco de dados que cruza o pagamento, com o usuário e o plano. com isso voce consegue validar. acho desnecessário validar em toda hora que usuário recarregar a página, somente no login constuma ser suficiente.

mas depende muito da tua aplicação, imagina se o chatgpt faz apenas no login a quantidade de "dinheiro" que é perdida?

Se tua aplicação foi feita para o usuário não deslogar, já tem que pensar em uma nova resolução, acredito que validar quando chamar algum serviço é bom, mas deixar a validação apenas no login fica meio que uma quebra de segurança. A não ser que tu implemente um tempo limite do token de autenticação de 3H, coisa assim.

exato! você pode validar no middleware também! chamando a mesma rota para validar o acesso do usuário, além de aproveitar e devolver o usuário atualizado para o front tbm! cada caso é um caso